pci_bus_for_each_resource, transparent bridges and rsrc_nonstatic.c

Dominik Brodowski linux at dominikbrodowski.net
Tue Mar 23 14:02:37 EDT 2010


> I'm concerned that this changes a resource that PCMCIA doesn't own,
> i.e., this struct resource actually lives in the pci_dev of an upstream
> bridge or in the host bridge data.

Oh yes, you're right -- my patch was badly broken. Brown paper-bag style.

> > +
> >  			if (res == &ioport_resource)
> >  				continue;
> 
> If you make PCMCIA smart enough to avoid these low ports, do we still
> need these &ioport_resource and &iomem_resource checks?  Having two
> mechanisms will lead to more complicated behavior and more special
> cases.

Well, it aren't only the low ports (<0x100) I'm concerned about, it's also
(and especially on pre-2008 systems) ports in higher areas
(0x100 < x < 0xffff). If we don't use _CRS, we need to be more careful to
avoid accidentally hitting wrong I/O-ports.

> > -			dev_printk(KERN_INFO, &s->cb_dev->dev,
> > -				   "pcmcia: parent PCI bridge I/O "
> > -				   "window: 0x%llx - 0x%llx\n",
> > -				   (unsigned long long)res->start,
> > -				   (unsigned long long)res->end);
> > +			dev_info(&s->cb_dev->dev, "pcmcia: parent PCI bridge "
> > +				"window: %pR\n", res);
> 
> Jesse applied a patch from me to make this %pR change just a few days ago.

Okay, I'll leave that alone then.

Thanks,
	Dominik

From: Dominik Brodowski <linux at dominikbrodowski.net>
Date: Tue, 23 Mar 2010 16:05:00 +0100
Subject: [PATCH] pcmcia: do not use ioports < 0x100 on x86

On x86 systems using ACPI _CRS information -- now the default for
post-2008 systems -- the PCI root bus no longer pretends to be
offering the root ioport_resource. To avoid accidentally hitting
some platform / system device, use only I/O ports >= 0x100 for
PCMCIA devices on x86.

Reported-by: Komuro <komurojun-mbn at nifty.com>
CC: Bjorn Helgaas <bjorn.helgaas at hp.com>
Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>

diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c
index 4663b3f..dcc6021 100644
--- a/drivers/pcmcia/rsrc_nonstatic.c
+++ b/drivers/pcmcia/rsrc_nonstatic.c
@@ -810,6 +810,13 @@ static int adjust_io(struct pcmcia_socket *s, unsigned int action, unsigned long
 	unsigned long size = end - start + 1;
 	int ret = 0;
 
+#if defined(CONFIG_X86)
+	/* on x86, avoid anything < 0x100 for it is often used for
+	 * legacy platform devices */
+	if (start < 0x100)
+		start = 0x100;
+#endif
+
 	if (end < start)
 		return -EINVAL;
 



More information about the linux-pcmcia mailing list