Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jan 2021 07:27:45 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 0074d2118ac2 - stable/12 - linuxkpi: handle ARI
Message-ID:  <202101150727.10F7Rj6t066811@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=0074d2118ac24f23b43bc1923cc588dfebd73548

commit 0074d2118ac24f23b43bc1923cc588dfebd73548
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-01-04 21:41:12 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-01-15 06:57:01 +0000

    linuxkpi: handle ARI
    
    (cherry picked from commit de27805fee0bbe3b714615b1df4cf0b8ebbc39b9)
---
 sys/compat/linuxkpi/common/src/linux_pci.c | 21 +++++++++++++++------
 sys/conf/kmod.mk                           |  1 +
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index d3b64e07b980..e73b324c47fb 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$");
 #include <linux/pci.h>
 #include <linux/compat.h>
 
+#include "pcib_if.h"
+
 static device_probe_t linux_pci_probe;
 static device_attach_t linux_pci_attach;
 static device_detach_t linux_pci_detach;
@@ -234,12 +236,16 @@ linux_pci_attach_device(device_t dev, struct pci_driver *pdrv,
 	struct pci_bus *pbus;
 	struct pci_devinfo *dinfo;
 	device_t parent;
+	uintptr_t rid;
 	int error;
+	bool isdrm;
 
 	linux_set_current(curthread);
 
-	if (pdrv != NULL && pdrv->isdrm) {
-		parent = device_get_parent(dev);
+	parent = device_get_parent(dev);
+	isdrm = pdrv != NULL && pdrv->isdrm;
+
+	if (isdrm) {
 		dinfo = device_get_ivars(parent);
 		device_set_ivars(dev, dinfo);
 	} else {
@@ -249,7 +255,11 @@ linux_pci_attach_device(device_t dev, struct pci_driver *pdrv,
 	pdev->dev.parent = &linux_root_device;
 	pdev->dev.bsddev = dev;
 	INIT_LIST_HEAD(&pdev->dev.irqents);
-	pdev->devfn = PCI_DEVFN(pci_get_slot(dev), pci_get_function(dev));
+	if (isdrm)
+		PCI_GET_ID(device_get_parent(parent), parent, PCI_ID_RID, &rid);
+	else
+		PCI_GET_ID(parent, dev, PCI_ID_RID, &rid);
+	pdev->devfn = rid;
 	pdev->device = dinfo->cfg.device;
 	pdev->vendor = dinfo->cfg.vendor;
 	pdev->subsystem_vendor = dinfo->cfg.subvendor;
@@ -474,9 +484,8 @@ pci_resource_start(struct pci_dev *pdev, int bar)
 
 	if ((rle = linux_pci_get_bar(pdev, bar)) == NULL)
 		return (0);
-	dev = pci_find_dbsf(pdev->bus->domain, pdev->bus->number,
-	    PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
-	MPASS(dev != NULL);
+	dev = pdev->pdrv != NULL && pdev->pdrv->isdrm ?
+	    device_get_parent(pdev->dev.bsddev) : pdev->dev.bsddev;
 	if (BUS_TRANSLATE_RESOURCE(dev, rle->type, rle->start, &newstart)) {
 		device_printf(pdev->dev.bsddev, "translate of %#jx failed\n",
 		    (uintmax_t)rle->start);
diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk
index fce55e529e29..610484ba7e36 100644
--- a/sys/conf/kmod.mk
+++ b/sys/conf/kmod.mk
@@ -113,6 +113,7 @@ LINUXKPI_GENSRCS+= \
 	device_if.h \
 	pci_if.h \
 	pci_iov_if.h \
+	pcib_if.h \
 	vnode_if.h \
 	usb_if.h \
 	opt_usb.h \



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101150727.10F7Rj6t066811>