Re: Unable to read memory mapped PCI memory the second time == freezeup..

Jes Sorensen (Jes.Sorensen@cern.ch)
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/