Messages in this thread | | | Subject | Re: Unable to read memory mapped PCI memory the second time == freezeup.. | From | Jes Sorensen <> | Date | 11 Jul 1999 14:03:51 +0200 |
| |
>>>>> "Jeff" == Jeff Garzik <jgarzik@pobox.com> writes:
Jeff> Read linux/Documentation/IO-mapping.txt, and then use read?() Jeff> and write?() for MMIO. For example:
Jeff> byArgh = readb(global_vmemaddr); if(byArgh==0) Jeff> printk(KERN_DEBUG "byArgh\n"); writeb (0x5a, global_vmemaddr); Jeff> byArgh = readb(global_vmemaddr);
There is a number of memory barrier instructions missing in that example, you need to put an mb() in after the writeb to make sure the compiler doesn't cache the value written to the register. On architectures which do not guarantee write ordering this shows up even more since the CPU may decide to issue the instructions in a different order (though this is mainly of interest if you are accessing several different registers in the mapped area). Anyway the correct way to do things is this way:
byArgh = readb(global_vmemaddr); if(byArgh==0) printk(KERN_DEBUG "byArgh\n"); writeb (0x5a, global_vmemaddr); mb(); byArgh = readb(global_vmemaddr);
You are absolutely right about the use of readb/writeb though, one should _never_ access PCI shared memory directly.
Jes
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |