summaryrefslogtreecommitdiffstats
path: root/src/soc/amd/picasso/pcie_gpp.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2020-07-08 15:47:19 -0700
committerAaron Durbin <adurbin@chromium.org>2020-07-10 15:59:03 +0000
commitcff479e930c20d56312c8f041d1e4f3318293b03 (patch)
treeecf98d3fc52e7ca1a8997a42cc8abee8c9651b55 /src/soc/amd/picasso/pcie_gpp.c
parent5bb926e3c9bc00edef45b8a119469fc70e92990d (diff)
downloadcoreboot-cff479e930c20d56312c8f041d1e4f3318293b03.tar.gz
coreboot-cff479e930c20d56312c8f041d1e4f3318293b03.tar.bz2
coreboot-cff479e930c20d56312c8f041d1e4f3318293b03.zip
soc/amd/picasso: Add driver for handling PCIE GPP bridges
This change adds a driver pcie_gpp.c which provides device_operations for external and internal PCIe GPP bridges. These device operations include standard PCI bridge operations as well as operations for generating ACPI node for the device and returning appropriate ACPI name for it. Signed-off-by: Furquan Shaikh <furquan@google.com> Change-Id: I9f8809c2735bdc09435deda91a570c89e71e8062 Reviewed-on: https://review.coreboot.org/c/coreboot/+/43312 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/soc/amd/picasso/pcie_gpp.c')
-rw-r--r--src/soc/amd/picasso/pcie_gpp.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/soc/amd/picasso/pcie_gpp.c b/src/soc/amd/picasso/pcie_gpp.c
new file mode 100644
index 000000000000..73de80365dce
--- /dev/null
+++ b/src/soc/amd/picasso/pcie_gpp.c
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <acpi/acpigen.h>
+#include <device/device.h>
+#include <device/pci.h>
+#include <device/pci_ids.h>
+#include <soc/pci_devs.h>
+#include <stdio.h>
+
+static const char *pcie_gpp_acpi_name(const struct device *dev)
+{
+ if (dev->path.type != DEVICE_PATH_PCI)
+ return NULL;
+
+ switch (dev->path.pci.devfn) {
+ case PCIE_GPP_0_DEVFN:
+ return "PBR0";
+ case PCIE_GPP_1_DEVFN:
+ return "PBR1";
+ case PCIE_GPP_2_DEVFN:
+ return "PBR2";
+ case PCIE_GPP_3_DEVFN:
+ return "PBR3";
+ case PCIE_GPP_4_DEVFN:
+ return "PBR4";
+ case PCIE_GPP_5_DEVFN:
+ return "PBR5";
+ case PCIE_GPP_6_DEVFN:
+ return "PBR6";
+ case PCIE_GPP_A_DEVFN:
+ return "PBRA";
+ case PCIE_GPP_B_DEVFN:
+ return "PBRB";
+ }
+
+ return NULL;
+}
+
+static struct device_operations pcie_gpp_ops = {
+ .read_resources = pci_bus_read_resources,
+ .set_resources = pci_dev_set_resources,
+ .enable_resources = pci_bus_enable_resources,
+ .scan_bus = pci_scan_bridge,
+ .reset_bus = pci_bus_reset,
+ .acpi_name = pcie_gpp_acpi_name,
+ .acpi_fill_ssdt = acpi_device_write_pci_dev,
+};
+
+static const unsigned short pci_device_ids[] = {
+ PCI_DEVICE_ID_AMD_FAM17H_PCIE_GPP,
+ PCI_DEVICE_ID_AMD_FAM17H_PCIE_GPP_BUSA,
+ PCI_DEVICE_ID_AMD_FAM17H_PCIE_GPP_BUSB,
+ 0
+};
+
+static const struct pci_driver pcie_gpp_driver __pci_driver = {
+ .ops = &pcie_gpp_ops,
+ .vendor = PCI_VENDOR_ID_AMD,
+ .devices = pci_device_ids,
+};