tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pci_mapreg_map(9) and prefetchable BARs



On Wed, Aug 10, 2011 at 08:04:16AM +0100, David Laight wrote:
> On Tue, Aug 09, 2011 at 06:11:29PM -0500, David Young wrote:
> > On Tue, Aug 09, 2011 at 05:38:43PM -0400, Michael wrote:
> > > Hello,
> > > 
> > > Why would it fail if the BAR is marked as prefetchable but someone
> > > requests a non-prefetchable mapping? The bit is just a hint.
> > 
> > My phrasing was probably awkward.  It wouldn't fail in that case.
> > 
> > Here's the proposal:
> > 
> > 1 Safety first: pci_mapreg_map() should map every BAR as
> >   if it is non-prefetchable (i.e., non-cached, non-write
> >   combining, order enforced) unless the caller passes the hint
> >   BUS_SPACE_MAP_PREFETCHABLE.
> > 
> > 2 pci_mapreg_map() should turn on caching, write-combining, et cetera,
> >   on a prefetchable BAR if the caller passes BUS_SPACE_MAP_PREFETCHABLE.
> > 
> > 3 pci_mapreg_map() should return 1 (indicating an error) before it
> >   violates #1.
> 
> Do we have any way for a driver to map different parts of a BAR
> with different options?

You can get the region's address & size using pci_mapreg_info(),
divide the region, and bus_space_map() each division with different
options.

I don't think that we can divide a region in any old way, though.  The
options may apply on the page level.

> Or even the same part of the a BAR with different options?

It seems like mapping different/same parts of a BAR with different
options could lead to behavior that is machine-dependent at best and
unpredictable at worst.  Sometimes I have wondered what happens on x86
when you have N virtual aliases for the same physical page, e.g., one
that is write-combining, one uncached, and one write-back---also, how
would those mappings ever happen except by mistake?

Dave

-- 
David Young             OJC Technologies
dyoung%ojctech.com@localhost      Urbana, IL * (217) 344-0444 x24


Home | Main Index | Thread Index | Old Index