pci_bus_for_each_resource, transparent bridges and rsrc_nonstatic.c
Bjorn Helgaas
bjorn.helgaas at hp.com
Mon Mar 22 19:11:33 EDT 2010
On Monday 22 March 2010 04:52:35 pm Dominik Brodowski wrote:
> Hey,
>
> On Mon, Mar 22, 2010 at 03:28:55PM -0700, Bjorn Helgaas wrote:
> > On Monday 22 March 2010 02:51:21 pm Dominik Brodowski wrote:
> > > On Mon, Mar 22, 2010 at 01:36:03PM -0700, Bjorn Helgaas wrote:
> > > > > You can still use subtractive-decoded resources, but then you have to add
> > > > > them to /etc/pcmcia/config.opts and run pcmcia-startup-bridges (or echo the
> > > > > resource to a sysfs file).
> > > >
> > > > It's too bad we still have such manual configuration.
> > >
> > > Agreed.
> > >
> > > > Is there still
> > > > information there that we can't figure out automatically?
> > >
> > > That's unknown to me -- are there any ISA-capable systems being sold? If so,
> > > then I suspect the answer may be "yes".
> > >
> > > > > Now, "usecrs" is only used on 2008-or-newer systems where we _hope_ that all
> > > > > resource "consumers" are accounted for. So the problem might be mitigated.
> > > > > However, I wouldn't dare to use ioports 0x0-0xff anyways for they usually
> > > > > are used for onboard legacy devices...
> > > >
> > > > Right. But PCMCIA is at no greater risk than regular PCI, right?
> > > > It looks like both will allocate only above PCIBIOS_MIN_IO (0x1000).
> > >
> > > No, PCMCIA will happily allocate below this limit.
> >
> > I saw "#define PCIBIOS_MIN_CARDBUS_IO PCIBIOS_MIN_IO" in yenta_socket.c
> > and assumed it would take care of this, but I didn't look any deeper.
> >
> > I'm still confused about why PCMCIA is "special" in this regard and
> > why pci=use_crs breaks it. Can you make up an example that illustrates
> > the problem?
>
> Consider the following case:
Thanks! Sorry to be so dense here ...
> (1) The root PCI bus has _CRS I/O 0000-0cf7; 0d00-ffff "produced";
>
> the (transparent) PCI-PCI bridge offers, as bus resources, to
> downstream users 0x4000-0x4fff plus everything else because of
> subtractive decoding;
>
> there is a yenta-style PCI-CardBus/PCMCIA bridge below this
> PCI-PCI bridge.
>
> (2) There are some I/O ports which react rather unfriendly to being read or
> written. Let's assume they're at 0x100-0x10f; and let's also assume that
> the BIOS writers forgot to mention them at all in the ACPI _CRS
> settings; no other part of the kernel knows about it.
>
> 0000-0cf7 : PCI Bus 0000:00
> ...
> 00f0-00ff : fpu
> 0170-0177 : 0000:00:1f.2
>
>
> (3) A PCMCIA card is inserted. It needs an I/O port resource of size 8. The
> PCMCIA subsystem looks in its own resource database which I/O ports it
> may use; there, it finds not only 0x4000-0x4fff but (with a small
> exception) 0x0000-0xffff; as 0x0000-0x00ff are already assigned, it
> happily assigns the first free area -- 0x100-0x108 -- to the PCMCIA
> card.
>
> 0000-0cf7 : PCI Bus 0000:00
> ...
> 00f0-00ff : fpu
> 0100-0108 : pcmcia0.0
> 0170-0177 : 0000:00:1f.2
>
> (4) The PCMCIA card and the PCMCIA driver are set up to work with an IO
> resource at 0x100-0x108. As soon as they attempt to use this resource,
> bad things happen (lockups, etc.) because of the reasons spelled out at
> (2).
We'd have exactly the same situation if we assigned I/O port 0x100
to a PCI device. Why can't we use the same strategy PCI uses to
avoid it?
> => It is only an issue if the ACPI resource descriptions are incomplete. It
> is worse for PCMCIA because it happily assigns resources below 0x1000, where
> such system/platform devices usually listen to. And usecrs worsens the
> situation also in another regard: on my own laptop (a pre-2008 model),
> pci=use_crs makes the PCI-PCI bridge to be marked as "transparent", while
> pci=nocrs means the PCI-PCI bridge is assumed to be "non-transparent".
Sorry to be slow again... The pci=use_crs and pci=nocrs options only
affect the PCI host bridge; they don't affect PCI-PCI bridges at all,
except that they change the set of resources available for subtractive-
decode PCI-PCI bridges to forward. (Strictly speaking, they don't
affect the *behavior* of the PCI-PCI bridges, they only affect our
*idea* of what they're doing.)
I'm thinking of the code in pci_setup_device() where we set dev->transparent
based on the bridge's class code. Obviously, you must be thinking
of something else.
My intention was that on pre-2008 systems like your laptop, my patches
would not change any behavior at all, unless you boot with "pci=use_crs".
Are you seeing an unexpected change on your system?
Bjorn
More information about the linux-pcmcia
mailing list