From cf0117f6fa269a0ee4c2fdee150bd4cd234edacf Mon Sep 17 00:00:00 2001
From: Greg V <greg@unrelenting.technology>
Date: Fri, 11 Feb 2022 17:14:39 +0300
Subject: [PATCH] LinuxKPI: return an address string in pci_name
amdgpu's virtual display feature uses pci_name to match a module parameter string,
and the documentation shows an example of '0000:26:00.0' for the name.
In our case the name was just 'drmn', which is silly and not actually unique
across devices. Let's generate the expected string.
---
sys/compat/linuxkpi/common/include/linux/pci.h | 4 ++--
sys/compat/linuxkpi/common/src/linux_pci.c | 3 +++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h
index 5dfdfa2e86c..94db1d84a37 100644
--- a/sys/compat/linuxkpi/common/include/linux/pci.h
+++ b/sys/compat/linuxkpi/common/include/linux/pci.h
@@ -277,6 +277,7 @@ struct pci_dev {
size_t romlen;
TAILQ_HEAD(, pci_mmio_region) mmio;
+ char *path_name;
};
/* We need some meta-struct to keep track of these for devres. */
@@ -378,8 +379,7 @@ pci_resource_flags(struct pci_dev *pdev, int bar)
static inline const char *
pci_name(struct pci_dev *d)
{
-
- return device_get_desc(d->dev.bsddev);
+ return d->path_name;
}
static inline void *
diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index c388da87ac1..dc90f281459 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -277,6 +277,8 @@ lkpifill_pci_dev(device_t dev, struct pci_dev *pdev)
pdev->subsystem_device = pci_get_subdevice(dev);
pdev->class = pci_get_class(dev);
pdev->revision = pci_get_revid(dev);
+ pdev->path_name = kasprintf(GFP_KERNEL, "%04d:%02d:%02d.%d",
+ pci_get_domain(dev), pci_get_bus(dev), pci_get_slot(dev), pci_get_function(dev));
pdev->bus = malloc(sizeof(*pdev->bus), M_DEVBUF, M_WAITOK | M_ZERO);
pdev->bus->self = pdev;
pdev->bus->number = pci_get_bus(dev);
@@ -302,6 +304,7 @@ lkpinew_pci_dev_release(struct device *dev)
if (pdev->root != NULL)
pci_dev_put(pdev->root);
free(pdev->bus, M_DEVBUF);
+ kfree(pdev->path_name);
free(pdev, M_DEVBUF);
}
--
2.30.0