Subject: Re: Any way to get virtual addr from pci_mapreg_map()?
To: Dave Huang <khym@bga.com>
From: Chris G. Demetriou <cgd@pa.dec.com>
List: tech-kern
Date: 08/12/1997 15:51:19
> > Do you know off-hand whether the mapping registers say that the region
> > is prefetchable or not?  (I'm just wondering for my own curiosity; it
> > doesn't affect anything i've said here.)
> 
> How can I tell? Is this the PCI_MAPREG_MEM_CACHEABLE bit from pcireg.h? If
> so, no, it's not set on my 53c875 (ASUS SC875 card).

OK, right, that's what I was thinking of.

Given your reply, I can tell you that there are alpha systems on which
that card could not have its memory accessed linearly.  8-)


> So, I've got everything using the bus_space_* stuff, and it seems to be
> working just fine... except I tried using bus_space_write_multi_4 to
> copy the microcode over to the card, and it made my machine reboot. So,
> I'm currently using bus_space_write_4 in a loop, which works okay.

Are you sure you want to be using bus_space_write_multi_* rather than
bus_space_write_region_*?

i assume that your copy loop looks something like:

	u_int32_t script[];

	while (script left to copy) {
		bus_space_write_4(t, h, byteoffset, script[instoffset]);
		instoffset++;
		byteoffset += 4;
	}

bus_space_write_multi_* writes the contents of a region of memory to a
_single_ bus space location (i.e. writes the same location in bus
space multiple times), while bus_space_write_region_* writes the
contents of a region of memory to a region of bus space. 


> I think it's a gcc optimizer bug, but I'm not sure... it looks like gcc
> isn't paying attention to the list of registers that are used by the
> __asm() code in bus_space_write_multi_4. The following demonstrates the
> bug when compiled with -O or -O2:
> [ ... ]

This is interesting, but it may be unrelated to your problem (if
you're using the wrong function 8-)

I wonder if anybody is still seeing reboot problems with the lpt
driver...


chris