From 5ad3313b4a352d0470ae6981259839e928b2e668 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Wed, 17 Feb 2021 16:43:13 -0800 Subject: [PATCH 1/2] switch: qcom: support erratas for multiple vendors Update the driver to support erratas for different vendors. Other vendors will not have the exact same errata as Diode. Thus, expand the support to other switch vendors. Change-Id: Ic9a3d93f9fef36757f5df42364f6e72030740f75 Signed-off-by: Tony Truong --- drivers/pci/switch/switch-qcom.c | 54 +++++++++++++++++++------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/drivers/pci/switch/switch-qcom.c b/drivers/pci/switch/switch-qcom.c index fce2d25fd816..22bf1e272e06 100644 --- a/drivers/pci/switch/switch-qcom.c +++ b/drivers/pci/switch/switch-qcom.c @@ -25,7 +25,7 @@ enum { DIODE_ERRATA_0, DIODE_ERRATA_1, DIODE_ERRATA_2, - SWITCH_MAX, + DIODE_ERRATA_MAX, }; struct pci_qcom_switch_errata { @@ -246,7 +246,7 @@ static int config_downstream_port_1_diode(struct device *dev, void *data) return 0; } -struct pci_qcom_switch_errata errata[] = { +struct pci_qcom_switch_errata diode_errata[] = { [DIODE_ERRATA_0] = {config_upstream_port_diode}, [DIODE_ERRATA_1] = {config_downstream_port_1_diode}, [DIODE_ERRATA_2] = {config_common_port_diode}, @@ -260,30 +260,42 @@ static struct pci_device_id switch_qcom_pci_tbl[] = { }; MODULE_DEVICE_TABLE(pci, switch_qcom_pci_tbl); +static int switch_qcom_config_errata(struct pci_dev *pdev) +{ + int errata_num = 0; + int ret; + + ret = of_property_read_u32(pdev->dev.of_node, "errata", + &errata_num); + if (ret) + return 0; + + if (pdev->vendor == DIODE_VENDOR_ID) { + dev_info(&pdev->dev, "Diode errata being requested: %d\n", + errata_num); + + if (errata_num >= DIODE_ERRATA_MAX) { + dev_err(&pdev->dev, "Invalid errata num: %d\n", + errata_num); + return -EINVAL; + } + + ret = diode_errata[errata_num].config_errata(&pdev->dev, NULL); + if (ret) + return ret; + } + + return 0; +} + static int switch_qcom_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { - int ret = 0, errata_num = 0; + int ret = 0; - ret = of_property_read_u32((&pdev->dev)->of_node, "errata", - &errata_num); - if (ret) { - pr_info("No erratas needed\n"); - return 0; - } - - pr_info("Errata being requested: %d\n", errata_num); - - if (errata_num >= SWITCH_MAX) { - pr_err("Invalid errata num:%d\n", errata_num); - return -EINVAL; - } - - ret = errata[errata_num].config_errata(&pdev->dev, NULL); - if (ret) { - pr_err("Error applying errata\n"); + ret = switch_qcom_config_errata(pdev); + if (ret) return ret; - } return 0; } From dce1b10e409cc0b73636f1f1e74aab7df2253c27 Mon Sep 17 00:00:00 2001 From: Tony Truong Date: Wed, 17 Feb 2021 17:04:10 -0800 Subject: [PATCH 2/2] switch: qcom: enable PCI device and set BME During the PCI probe for each port, enable its PCI device so that it's ready for its driver. Also, set the bus master so that any traffic from downstream can be forward to upstream. Add PCI remove to handle the clean up. Change-Id: I959ab50ebba2b4351590f83e8e1b780a670ca730 Signed-off-by: Tony Truong --- drivers/pci/switch/switch-qcom.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/pci/switch/switch-qcom.c b/drivers/pci/switch/switch-qcom.c index 22bf1e272e06..58873051d210 100644 --- a/drivers/pci/switch/switch-qcom.c +++ b/drivers/pci/switch/switch-qcom.c @@ -288,6 +288,12 @@ static int switch_qcom_config_errata(struct pci_dev *pdev) return 0; } +static void switch_qcom_pci_remove(struct pci_dev *pdev) +{ + pci_clear_master(pdev); + pci_disable_device(pdev); +} + static int switch_qcom_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -297,6 +303,14 @@ static int switch_qcom_pci_probe(struct pci_dev *pdev, if (ret) return ret; + ret = pci_enable_device(pdev); + if (ret) { + dev_err(&pdev->dev, "failed to enable PCIe device\n"); + return ret; + } + + pci_set_master(pdev); + return 0; } @@ -304,6 +318,7 @@ static struct pci_driver switch_qcom_pci_driver = { .name = "pcie-qcom-switch", .id_table = switch_qcom_pci_tbl, .probe = switch_qcom_pci_probe, + .remove = switch_qcom_pci_remove, }; static int __init switch_qcom_pci_init(void)