mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-01 03:44:27 -04:00
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
This commit is contained in:
@@ -54,7 +54,7 @@ static void quirk_fsl_pcie_early(struct pci_dev *dev)
|
||||
|
||||
/* if we aren't in host mode don't bother */
|
||||
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;
|
||||
|
||||
dev->class = PCI_CLASS_BRIDGE_PCI_NORMAL;
|
||||
@@ -581,7 +581,7 @@ static int fsl_add_bridge(struct platform_device *pdev, int is_primary)
|
||||
hose->ops = &fsl_indirect_pcie_ops;
|
||||
/* For PCIE read HEADER_TYPE to identify controller mode */
|
||||
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;
|
||||
|
||||
} else {
|
||||
|
||||
@@ -259,10 +259,9 @@ static u32 __init search_agp_bridge(u32 *order, int *valid_agp)
|
||||
order);
|
||||
}
|
||||
|
||||
/* No multi-function device? */
|
||||
type = read_pci_config_byte(bus, slot, func,
|
||||
PCI_HEADER_TYPE);
|
||||
if (!(type & 0x80))
|
||||
if (!(type & PCI_HEADER_TYPE_MFD))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -779,13 +779,13 @@ static int __init check_dev_quirk(int num, int slot, int func)
|
||||
type = read_pci_config_byte(num, slot, func,
|
||||
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);
|
||||
if (sec > num)
|
||||
early_pci_scan_bus(sec);
|
||||
}
|
||||
|
||||
if (!(type & 0x80))
|
||||
if (!(type & PCI_HEADER_TYPE_MFD))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
* BIOS32 and PCI BIOS handling.
|
||||
*/
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -29,8 +31,19 @@
|
||||
#define PCIBIOS_HW_TYPE1_SPEC 0x10
|
||||
#define PCIBIOS_HW_TYPE2_SPEC 0x20
|
||||
|
||||
/*
|
||||
* Returned in EAX:
|
||||
* - AH: return code
|
||||
*/
|
||||
#define PCIBIOS_RETURN_CODE GENMASK(15, 8)
|
||||
|
||||
int pcibios_enabled;
|
||||
|
||||
static u8 pcibios_get_return_code(u32 eax)
|
||||
{
|
||||
return FIELD_GET(PCIBIOS_RETURN_CODE, eax);
|
||||
}
|
||||
|
||||
/* According to the BIOS specification at:
|
||||
* 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
|
||||
@@ -154,7 +167,7 @@ static int __init check_pcibios(void)
|
||||
: "memory");
|
||||
local_irq_restore(flags);
|
||||
|
||||
status = (eax >> 8) & 0xff;
|
||||
status = pcibios_get_return_code(eax);
|
||||
hw_mech = eax & 0xff;
|
||||
major_ver = (ebx >> 8) & 0xff;
|
||||
minor_ver = ebx & 0xff;
|
||||
@@ -227,7 +240,7 @@ static int pci_bios_read(unsigned int seg, unsigned int bus,
|
||||
|
||||
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,
|
||||
@@ -269,7 +282,7 @@ static int pci_bios_write(unsigned int seg, unsigned int bus,
|
||||
|
||||
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)
|
||||
"m" (opt)
|
||||
: "memory");
|
||||
DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map);
|
||||
if (ret & 0xff00)
|
||||
printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff);
|
||||
else if (opt.size) {
|
||||
ret = pcibios_get_return_code(ret);
|
||||
if (ret) {
|
||||
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);
|
||||
if (rt) {
|
||||
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)
|
||||
"b" ((dev->bus->number << 8) | dev->devfn),
|
||||
"c" ((irq << 8) | (pin + 10)),
|
||||
"S" (&pci_indirect));
|
||||
return !(ret & 0xff00);
|
||||
return pcibios_get_return_code(ret) == PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_set_irq_routing);
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ int pci_host_common_probe(struct platform_device *pdev)
|
||||
}
|
||||
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);
|
||||
|
||||
@@ -93,8 +93,6 @@ int pci_host_common_remove(struct platform_device *pdev)
|
||||
pci_stop_root_bus(bridge->bus);
|
||||
pci_remove_root_bus(bridge->bus);
|
||||
pci_unlock_rescan_remove();
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_host_common_remove);
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ static struct platform_driver gen_pci_driver = {
|
||||
.of_match_table = gen_pci_of_match,
|
||||
},
|
||||
.probe = pci_host_common_probe,
|
||||
.remove = pci_host_common_remove,
|
||||
.remove_new = pci_host_common_remove,
|
||||
};
|
||||
module_platform_driver(gen_pci_driver);
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ void pci_bus_put(struct pci_bus *bus);
|
||||
|
||||
/* PCIe speed to Mb/s reduced by encoding overhead */
|
||||
#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_16_0GT ? 16000*128/130 : \
|
||||
(speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \
|
||||
|
||||
@@ -702,10 +702,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev)
|
||||
{
|
||||
u32 class = pdev->class;
|
||||
|
||||
/* Use "USB Device (not host controller)" class */
|
||||
pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
|
||||
pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
|
||||
class, pdev->class);
|
||||
if (class != PCI_CLASS_SERIAL_USB_DEVICE) {
|
||||
/* Use "USB Device (not host controller)" class */
|
||||
pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
|
||||
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,
|
||||
quirk_amd_dwc_class);
|
||||
|
||||
@@ -4875,7 +4875,7 @@ void lpfc_reset_barrier(struct lpfc_hba *phba)
|
||||
lockdep_assert_held(&phba->hbalock);
|
||||
|
||||
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) != THOR_JEDEC_ID))
|
||||
return;
|
||||
|
||||
@@ -93,6 +93,6 @@ extern const struct pci_ecam_ops loongson_pci_ecam_ops; /* Loongson PCIe */
|
||||
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
||||
/* for DT-based PCI controllers that support ECAM */
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user