Prev: [PATCH 03/11] time: Kill off CONFIG_GENERIC_TIME
Next: KVM: MMU: track dirty page in speculative path properly
From: H. Peter Anvin on 14 Jul 2010 15:00 So I suggest the following changes... On 07/13/2010 07:19 PM, Jesse Barnes wrote: >> >> static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn) >> { >> int pos; >> u32 pcie_cap = 0, cap_data; >> printk("fixed_bar_cap, bus: %p devfn: %u\n", bus, devfn); >> pos = PCIE_CAP_OFFSET; >> while (pos) { while (pos >= PCIE_CAP_OFFSET) { >> printk("Before read..\n"); >> if (raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, >> devfn, pos, 4, &pcie_cap)) >> return 0; >> printk("pcie_cap: %u", pcie_cap); >> - if (pcie_cap == 0xffffffff) - return 0; + if (PCI_EXT_CAP_ID(pcie_cap) == 0x0000 || + PCI_EXT_CAP_ID(pcie_cap) == 0xffff) + break; >> printk("Checking vendor..\n"); >> if (PCI_EXT_CAP_ID(pcie_cap) == PCI_EXT_CAP_ID_VNDR) { >> printk("reading domain_nr\n"); >> raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, >> devfn, pos + 4, 4, &cap_data); >> printk("cap_data: %u\n", cap_data); >> if ((cap_data & 0xffff) == PCIE_VNDR_CAP_ID_FIXED_BAR) >> return pos; >> } >> >> pos = pcie_cap >> 20; pos = (pcie_cap >> 20) & 0xffc; >> printk("pos after shift: %i\n", pos); >> } >> >> printk("Returning from fixed_bar_cap\n"); >> return 0; >> } >> >> > > I thought a related bug was fixed already; the code should be returning > all zeros for non-existent BAR reads. > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: H. Peter Anvin on 14 Jul 2010 15:10 On 07/14/2010 11:59 AM, Jesse Barnes wrote: > > Changes look ok to me, though I'd prefer not hitting this code at all > on non-Moorestown if at all possible. > I guess that's okay in the short term, but I'm guessing fixed BARs in some form is eventually going to make it into the general PCI spec. -hpa -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Ben Greear on 14 Jul 2010 15:30 On 07/14/2010 11:52 AM, H. Peter Anvin wrote: > So I suggest the following changes... > > On 07/13/2010 07:19 PM, Jesse Barnes wrote: >>> >>> static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn) >>> { >>> int pos; >>> u32 pcie_cap = 0, cap_data; >>> printk("fixed_bar_cap, bus: %p devfn: %u\n", bus, devfn); >>> pos = PCIE_CAP_OFFSET; >>> while (pos) { > > while (pos>= PCIE_CAP_OFFSET) { > >>> printk("Before read..\n"); >>> if (raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, >>> devfn, pos, 4,&pcie_cap)) >>> return 0; >>> printk("pcie_cap: %u", pcie_cap); >>> > - if (pcie_cap == 0xffffffff) > - return 0; > > + if (PCI_EXT_CAP_ID(pcie_cap) == 0x0000 || > + PCI_EXT_CAP_ID(pcie_cap) == 0xffff) > + break; This seems to work for me. I'm using this patch against 2.6.34.y: diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c index 1cdc02c..ee93fd0 100644 --- a/arch/x86/pci/mrst.c +++ b/arch/x86/pci/mrst.c @@ -61,13 +61,14 @@ static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn) if (!raw_pci_ext_ops) return 0; - while (pos) { + while (pos >= PCIE_CAP_OFFSET) { if (raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, devfn, pos, 4, &pcie_cap)) return 0; - if (pcie_cap == 0xffffffff) - return 0; + if (PCI_EXT_CAP_ID(pcie_cap) == 0x0000 || + PCI_EXT_CAP_ID(pcie_cap) == 0xffff) + break; if (PCI_EXT_CAP_ID(pcie_cap) == PCI_EXT_CAP_ID_VNDR) { raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, @@ -76,7 +77,7 @@ static int fixed_bar_cap(struct pci_bus *bus, unsigned int devfn) return pos; } - pos = pcie_cap >> 20; + pos = (pcie_cap >> 20) & 0xffc; } return 0; Thanks, Ben > >>> printk("Checking vendor..\n"); > >>> if (PCI_EXT_CAP_ID(pcie_cap) == PCI_EXT_CAP_ID_VNDR) { >>> printk("reading domain_nr\n"); >>> raw_pci_ext_ops->read(pci_domain_nr(bus), bus->number, >>> devfn, pos + 4, 4,&cap_data); >>> printk("cap_data: %u\n", cap_data); >>> if ((cap_data& 0xffff) == PCIE_VNDR_CAP_ID_FIXED_BAR) >>> return pos; >>> } >>> >>> pos = pcie_cap>> 20; > > pos = (pcie_cap>> 20)& 0xffc; > >>> printk("pos after shift: %i\n", pos); >>> } >>> >>> printk("Returning from fixed_bar_cap\n"); >>> return 0; >>> } >>> >>> >> >> I thought a related bug was fixed already; the code should be returning >> all zeros for non-existent BAR reads. >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo(a)vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Ben Greear <greearb(a)candelatech.com> Candela Technologies Inc http://www.candelatech.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: H. Peter Anvin on 14 Jul 2010 16:00 On 07/14/2010 12:01 PM, Pan, Jacob jun wrote: > > Can we use PCI_EXT_CAP_NEXT to replace this line? > pos = (pcie_cap >> 20) & 0xffc > Presumably, I haven't checked the definition of that macro, but that would be the logical semantics. -hpa -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Ben Greear on 15 Jul 2010 12:40 On 07/14/2010 12:55 PM, H. Peter Anvin wrote: > On 07/14/2010 12:01 PM, Pan, Jacob jun wrote: >> >> Can we use PCI_EXT_CAP_NEXT to replace this line? >> pos = (pcie_cap>> 20)& 0xffc >> > > Presumably, I haven't checked the definition of that macro, but that > would be the logical semantics. > > -hpa Are one of you guys going to submit a fix upstream (and hopefully to stable)? Since you guys actually understand the code, probably best that you do it.... Thanks, Ben -- Ben Greear <greearb(a)candelatech.com> Candela Technologies Inc http://www.candelatech.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
First
|
Prev
|
Next
|
Last
Pages: 1 2 3 Prev: [PATCH 03/11] time: Kill off CONFIG_GENERIC_TIME Next: KVM: MMU: track dirty page in speculative path properly |