On Sun, Jan 13, 2008 at 12:24:15AM -0700, Matthew Wilcox wrote:Oops. I forgot to check the ordering of mmconfig vs direct probing, so that patch would end up just using mmconfig for everything. Not what we want. Also, there's three bits of mmconfig-shared that're probing using conf1, even if it might have failed. And if we're going to use raw_pci_read() when conf1 might have failed and mmconf isn't set up yet, we need to check raw_pci_ops in raw_pci_read(). Add the check in raw_pci_write too, just for symmetry. I don't like it that mmconfig_32 prints a message and mmconfig_64 doesn't, but fixing that is not part of this patch. Interdiff: diff -u b/arch/x86/pci/common.c b/arch/x86/pci/common.c --- b/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -31,7 +31,7 @@ int raw_pci_read(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 *val) { - if (reg < 256) + if (reg < 256 && raw_pci_ops) return raw_pci_ops->read(domain, bus, devfn, reg, len, val); if (raw_pci_ext_ops) return raw_pci_ext_ops->read(domain, bus, devfn, reg, len, val); @@ -41,7 +41,7 @@ int raw_pci_write(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 val) { - if (reg < 256) + if (reg < 256 && raw_pci_ops) return raw_pci_ops->write(domain, bus, devfn, reg, len, val); if (raw_pci_ext_ops) return raw_pci_ext_ops->write(domain, bus, devfn, reg, len, val); diff -u b/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c --- b/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c @@ -28,7 +28,7 @@ static const char __init *pci_mmcfg_e7520(void) { u32 win; - pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0xce, 2, &win); + raw_pci_read(0, 0, PCI_DEVFN(0,0), 0xce, 2, &win); win = win & 0xf000; if(win == 0x0000 || win == 0xf000) @@ -53,7 +53,7 @@ pci_mmcfg_config_num = 1; - pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0x48, 4, &pciexbar); + raw_pci_read(0, 0, PCI_DEVFN(0,0), 0x48, 4, &pciexbar); /* Enable bit */ if (!(pciexbar & 1)) @@ -118,7 +118,7 @@ int i; const char *name; - pci_direct_conf1.read(0, 0, PCI_DEVFN(0,0), 0, 4, &l); + raw_pci_read(0, 0, PCI_DEVFN(0,0), 0, 4, &l); vendor = l & 0xffff; device = (l >> 16) & 0xffff; diff -u b/arch/x86/pci/mmconfig_32.c b/arch/x86/pci/mmconfig_32.c --- b/arch/x86/pci/mmconfig_32.c +++ b/arch/x86/pci/mmconfig_32.c @@ -132,8 +132,10 @@ int __init pci_mmcfg_arch_init(void) { - printk(KERN_INFO "PCI: Using MMCONFIG\n"); - raw_pci_ops = &pci_mmcfg; + printk(KERN_INFO "PCI: Using MMCONFIG for %s config space\n", + raw_pci_ops ? "extended" : "all"); + if (!raw_pci_ops) + raw_pci_ops = &pci_mmcfg; raw_pci_ext_ops = &pci_mmcfg; return 1; } diff -u b/arch/x86/pci/mmconfig_64.c b/arch/x86/pci/mmconfig_64.c --- b/arch/x86/pci/mmconfig_64.c +++ b/arch/x86/pci/mmconfig_64.c @@ -144,7 +144,8 @@ return 0; } } - raw_pci_ops = &pci_mmcfg; + if (!raw_pci_ops) + raw_pci_ops = &pci_mmcfg; raw_pci_ext_ops = &pci_mmcfg; return 1; } -- Intel are signing my paycheques ... these opinions are still mine "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." --
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| James Bottomley | Re: Announce: Linux-next (Or Andrew's dream :-)) |
| Michal Piotrowski | Re: 2.6.21-rc5-mm4 |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Frans Pop | svc: failed to register lockdv1 RPC service (errno 97). |
| Lovich, Vitali | RE: [PATCH] Packet socket: mmapped IO: PACKET_TX_RING |
git: | |
