1999-07-11 12:06:14

by Jes Sorensen

[permalink] [raw]
Subject: Re: Unable to read memory mapped PCI memory the second time == freezeup..

>>>>> "Jeff" == Jeff Garzik <[email protected]> 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