Commit 78e5ad79 authored by Bjorn Helgaas's avatar Bjorn Helgaas

Merge branch 'pci/enumeration'

- Convert pci-host-common.c platform .remove() callback to .remove_new()
  returning 'void' since it's not useful to return error codes here (Uwe
  Kleine-König)

- Log a message about updating AMD USB controller class code (so dwc3, not
  xhci, claims it) only when we actually change it (Guilherme G.  Piccoli)

- Use PCI_HEADER_TYPE_* instead of literals in x86, powerpc, SCSI lpfc
  (Ilpo Järvinen)

- Clean up open-coded PCIBIOS return code mangling (Ilpo Järvinen)

- Fix 64GT/s effective data rate calculation to use 1b/1b encoding rather
  than the 8b/10b or 128b/130b used by lower rates (Ilpo Järvinen)

* pci/enumeration:
  PCI: Fix 64GT/s effective data rate calculation
  x86/pci: Clean up open-coded PCIBIOS return code mangling
  scsi: lpfc: Use PCI_HEADER_TYPE_MFD instead of literal
  powerpc/fsl-pci: Use PCI_HEADER_TYPE_MASK instead of literal
  x86/pci: Use PCI_HEADER_TYPE_* instead of literals
  PCI: Only override AMD USB controller if required
  PCI: host-generic: Convert to platform remove callback returning void
parents 996e337f ac4f1897
...@@ -54,7 +54,7 @@ static void quirk_fsl_pcie_early(struct pci_dev *dev) ...@@ -54,7 +54,7 @@ static void quirk_fsl_pcie_early(struct pci_dev *dev)
/* if we aren't in host mode don't bother */ /* if we aren't in host mode don't bother */
pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type); pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type);
if ((hdr_type & 0x7f) != PCI_HEADER_TYPE_BRIDGE) if ((hdr_type & PCI_HEADER_TYPE_MASK) != PCI_HEADER_TYPE_BRIDGE)
return; return;
dev->class = PCI_CLASS_BRIDGE_PCI_NORMAL; dev->class = PCI_CLASS_BRIDGE_PCI_NORMAL;
...@@ -581,7 +581,7 @@ static int fsl_add_bridge(struct platform_device *pdev, int is_primary) ...@@ -581,7 +581,7 @@ static int fsl_add_bridge(struct platform_device *pdev, int is_primary)
hose->ops = &fsl_indirect_pcie_ops; hose->ops = &fsl_indirect_pcie_ops;
/* For PCIE read HEADER_TYPE to identify controller mode */ /* For PCIE read HEADER_TYPE to identify controller mode */
early_read_config_byte(hose, 0, 0, PCI_HEADER_TYPE, &hdr_type); early_read_config_byte(hose, 0, 0, PCI_HEADER_TYPE, &hdr_type);
if ((hdr_type & 0x7f) != PCI_HEADER_TYPE_BRIDGE) if ((hdr_type & PCI_HEADER_TYPE_MASK) != PCI_HEADER_TYPE_BRIDGE)
goto no_bridge; goto no_bridge;
} else { } else {
......
...@@ -259,10 +259,9 @@ static u32 __init search_agp_bridge(u32 *order, int *valid_agp) ...@@ -259,10 +259,9 @@ static u32 __init search_agp_bridge(u32 *order, int *valid_agp)
order); order);
} }
/* No multi-function device? */
type = read_pci_config_byte(bus, slot, func, type = read_pci_config_byte(bus, slot, func,
PCI_HEADER_TYPE); PCI_HEADER_TYPE);
if (!(type & 0x80)) if (!(type & PCI_HEADER_TYPE_MFD))
break; break;
} }
} }
......
...@@ -779,13 +779,13 @@ static int __init check_dev_quirk(int num, int slot, int func) ...@@ -779,13 +779,13 @@ static int __init check_dev_quirk(int num, int slot, int func)
type = read_pci_config_byte(num, slot, func, type = read_pci_config_byte(num, slot, func,
PCI_HEADER_TYPE); PCI_HEADER_TYPE);
if ((type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) { if ((type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS); sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS);
if (sec > num) if (sec > num)
early_pci_scan_bus(sec); early_pci_scan_bus(sec);
} }
if (!(type & 0x80)) if (!(type & PCI_HEADER_TYPE_MFD))
return -1; return -1;
return 0; return 0;
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
* BIOS32 and PCI BIOS handling. * BIOS32 and PCI BIOS handling.
*/ */
#include <linux/bits.h>
#include <linux/bitfield.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -29,8 +31,19 @@ ...@@ -29,8 +31,19 @@
#define PCIBIOS_HW_TYPE1_SPEC 0x10 #define PCIBIOS_HW_TYPE1_SPEC 0x10
#define PCIBIOS_HW_TYPE2_SPEC 0x20 #define PCIBIOS_HW_TYPE2_SPEC 0x20
/*
* Returned in EAX:
* - AH: return code
*/
#define PCIBIOS_RETURN_CODE GENMASK(15, 8)
int pcibios_enabled; int pcibios_enabled;
static u8 pcibios_get_return_code(u32 eax)
{
return FIELD_GET(PCIBIOS_RETURN_CODE, eax);
}
/* According to the BIOS specification at: /* According to the BIOS specification at:
* http://members.datafast.net.au/dft0802/specs/bios21.pdf, we could * http://members.datafast.net.au/dft0802/specs/bios21.pdf, we could
* restrict the x zone to some pages and make it ro. But this may be * restrict the x zone to some pages and make it ro. But this may be
...@@ -154,7 +167,7 @@ static int __init check_pcibios(void) ...@@ -154,7 +167,7 @@ static int __init check_pcibios(void)
: "memory"); : "memory");
local_irq_restore(flags); local_irq_restore(flags);
status = (eax >> 8) & 0xff; status = pcibios_get_return_code(eax);
hw_mech = eax & 0xff; hw_mech = eax & 0xff;
major_ver = (ebx >> 8) & 0xff; major_ver = (ebx >> 8) & 0xff;
minor_ver = ebx & 0xff; minor_ver = ebx & 0xff;
...@@ -227,7 +240,7 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, ...@@ -227,7 +240,7 @@ static int pci_bios_read(unsigned int seg, unsigned int bus,
raw_spin_unlock_irqrestore(&pci_config_lock, flags); raw_spin_unlock_irqrestore(&pci_config_lock, flags);
return (int)((result & 0xff00) >> 8); return pcibios_get_return_code(result);
} }
static int pci_bios_write(unsigned int seg, unsigned int bus, static int pci_bios_write(unsigned int seg, unsigned int bus,
...@@ -269,7 +282,7 @@ static int pci_bios_write(unsigned int seg, unsigned int bus, ...@@ -269,7 +282,7 @@ static int pci_bios_write(unsigned int seg, unsigned int bus,
raw_spin_unlock_irqrestore(&pci_config_lock, flags); raw_spin_unlock_irqrestore(&pci_config_lock, flags);
return (int)((result & 0xff00) >> 8); return pcibios_get_return_code(result);
} }
...@@ -385,9 +398,10 @@ struct irq_routing_table * pcibios_get_irq_routing_table(void) ...@@ -385,9 +398,10 @@ struct irq_routing_table * pcibios_get_irq_routing_table(void)
"m" (opt) "m" (opt)
: "memory"); : "memory");
DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map); DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map);
if (ret & 0xff00) ret = pcibios_get_return_code(ret);
printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff); if (ret) {
else if (opt.size) { printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", ret);
} else if (opt.size) {
rt = kmalloc(sizeof(struct irq_routing_table) + opt.size, GFP_KERNEL); rt = kmalloc(sizeof(struct irq_routing_table) + opt.size, GFP_KERNEL);
if (rt) { if (rt) {
memset(rt, 0, sizeof(struct irq_routing_table)); memset(rt, 0, sizeof(struct irq_routing_table));
...@@ -415,7 +429,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) ...@@ -415,7 +429,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq)
"b" ((dev->bus->number << 8) | dev->devfn), "b" ((dev->bus->number << 8) | dev->devfn),
"c" ((irq << 8) | (pin + 10)), "c" ((irq << 8) | (pin + 10)),
"S" (&pci_indirect)); "S" (&pci_indirect));
return !(ret & 0xff00); return pcibios_get_return_code(ret) == PCIBIOS_SUCCESSFUL;
} }
EXPORT_SYMBOL(pcibios_set_irq_routing); EXPORT_SYMBOL(pcibios_set_irq_routing);
......
...@@ -85,7 +85,7 @@ int pci_host_common_probe(struct platform_device *pdev) ...@@ -85,7 +85,7 @@ int pci_host_common_probe(struct platform_device *pdev)
} }
EXPORT_SYMBOL_GPL(pci_host_common_probe); EXPORT_SYMBOL_GPL(pci_host_common_probe);
int pci_host_common_remove(struct platform_device *pdev) void pci_host_common_remove(struct platform_device *pdev)
{ {
struct pci_host_bridge *bridge = platform_get_drvdata(pdev); struct pci_host_bridge *bridge = platform_get_drvdata(pdev);
...@@ -93,8 +93,6 @@ int pci_host_common_remove(struct platform_device *pdev) ...@@ -93,8 +93,6 @@ int pci_host_common_remove(struct platform_device *pdev)
pci_stop_root_bus(bridge->bus); pci_stop_root_bus(bridge->bus);
pci_remove_root_bus(bridge->bus); pci_remove_root_bus(bridge->bus);
pci_unlock_rescan_remove(); pci_unlock_rescan_remove();
return 0;
} }
EXPORT_SYMBOL_GPL(pci_host_common_remove); EXPORT_SYMBOL_GPL(pci_host_common_remove);
......
...@@ -82,7 +82,7 @@ static struct platform_driver gen_pci_driver = { ...@@ -82,7 +82,7 @@ static struct platform_driver gen_pci_driver = {
.of_match_table = gen_pci_of_match, .of_match_table = gen_pci_of_match,
}, },
.probe = pci_host_common_probe, .probe = pci_host_common_probe,
.remove = pci_host_common_remove, .remove_new = pci_host_common_remove,
}; };
module_platform_driver(gen_pci_driver); module_platform_driver(gen_pci_driver);
......
...@@ -272,7 +272,7 @@ void pci_bus_put(struct pci_bus *bus); ...@@ -272,7 +272,7 @@ void pci_bus_put(struct pci_bus *bus);
/* PCIe speed to Mb/s reduced by encoding overhead */ /* PCIe speed to Mb/s reduced by encoding overhead */
#define PCIE_SPEED2MBS_ENC(speed) \ #define PCIE_SPEED2MBS_ENC(speed) \
((speed) == PCIE_SPEED_64_0GT ? 64000*128/130 : \ ((speed) == PCIE_SPEED_64_0GT ? 64000*1/1 : \
(speed) == PCIE_SPEED_32_0GT ? 32000*128/130 : \ (speed) == PCIE_SPEED_32_0GT ? 32000*128/130 : \
(speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \ (speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \
(speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \ (speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \
......
...@@ -702,10 +702,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev) ...@@ -702,10 +702,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev)
{ {
u32 class = pdev->class; u32 class = pdev->class;
/* Use "USB Device (not host controller)" class */ if (class != PCI_CLASS_SERIAL_USB_DEVICE) {
pdev->class = PCI_CLASS_SERIAL_USB_DEVICE; /* Use "USB Device (not host controller)" class */
pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n", pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
class, pdev->class); pci_info(pdev,
"PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
class, pdev->class);
}
} }
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB, DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB,
quirk_amd_dwc_class); quirk_amd_dwc_class);
......
...@@ -4875,7 +4875,7 @@ void lpfc_reset_barrier(struct lpfc_hba *phba) ...@@ -4875,7 +4875,7 @@ void lpfc_reset_barrier(struct lpfc_hba *phba)
lockdep_assert_held(&phba->hbalock); lockdep_assert_held(&phba->hbalock);
pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype); pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype);
if (hdrtype != 0x80 || if (hdrtype != PCI_HEADER_TYPE_MFD ||
(FC_JEDEC_ID(phba->vpd.rev.biuRev) != HELIOS_JEDEC_ID && (FC_JEDEC_ID(phba->vpd.rev.biuRev) != HELIOS_JEDEC_ID &&
FC_JEDEC_ID(phba->vpd.rev.biuRev) != THOR_JEDEC_ID)) FC_JEDEC_ID(phba->vpd.rev.biuRev) != THOR_JEDEC_ID))
return; return;
......
...@@ -93,6 +93,6 @@ extern const struct pci_ecam_ops loongson_pci_ecam_ops; /* Loongson PCIe */ ...@@ -93,6 +93,6 @@ extern const struct pci_ecam_ops loongson_pci_ecam_ops; /* Loongson PCIe */
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON) #if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
/* for DT-based PCI controllers that support ECAM */ /* for DT-based PCI controllers that support ECAM */
int pci_host_common_probe(struct platform_device *pdev); int pci_host_common_probe(struct platform_device *pdev);
int pci_host_common_remove(struct platform_device *pdev); void pci_host_common_remove(struct platform_device *pdev);
#endif #endif
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment