aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2022-04-02 19:52:53 +0000
committerWarner Losh <imp@FreeBSD.org>2022-04-06 17:44:54 +0000
commit6615aa8e1b3de544772f6bd40d791cfe468fa15c (patch)
treee35898dcc6e84db4c47515685eeffe73dfdbdbb2
parent568f805c83954a044bcd29dbc7b037b617fab4b9 (diff)
downloadsrc-6615aa8e1b3de544772f6bd40d791cfe468fa15c.tar.gz
src-6615aa8e1b3de544772f6bd40d791cfe468fa15c.zip
linuxkpi: Restore the KBI for struct pci_driver
The size of the 13.0 version of struct pci_driver was 92 or 184 bytes on 32- or 64-bit systems respectively. We recently added bsd_probe_return at the end of this struct, breaking the KBI on the stable/13 branch. Fix this by removing the isdrm member. We don't need it because we can do a strcmp in the few places that need it as they aren't performance critical. Move the newly added bsd_probe_return to that slot. It's the same size in all our supported KBIs as bool and fits into that slot due to padding rules. Direct commit to stable/13 because this is not relevant to main. Approved by: re@ (gjb) Sponsored by: Netflix Reviewed by: bz Differential Revision: https://reviews.freebsd.org/D34754 (cherry picked from commit aa61c28b4242ce3f86f1ae7807ae95887cbe9d11)
-rw-r--r--sys/compat/linuxkpi/common/include/linux/pci.h3
-rw-r--r--sys/compat/linuxkpi/common/src/linux_pci.c14
2 files changed, 10 insertions, 7 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h
index eb5f46a4879c..7afe426d6b52 100644
--- a/sys/compat/linuxkpi/common/include/linux/pci.h
+++ b/sys/compat/linuxkpi/common/include/linux/pci.h
@@ -229,13 +229,12 @@ struct pci_driver {
devclass_t bsdclass;
struct device_driver driver;
const struct pci_error_handlers *err_handler;
- bool isdrm;
+ int bsd_probe_return;
int (*bsd_iov_init)(device_t dev, uint16_t num_vfs,
const nvlist_t *pf_config);
void (*bsd_iov_uninit)(device_t dev);
int (*bsd_iov_add_vf)(device_t dev, uint16_t vfnum,
const nvlist_t *vf_config);
- int bsd_probe_return;
};
struct pci_bus {
diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index 0734acac60ac..0e952c17d7f7 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -119,6 +119,12 @@ struct linux_dma_priv {
#define DMA_PRIV_LOCK(priv) mtx_lock(&(priv)->lock)
#define DMA_PRIV_UNLOCK(priv) mtx_unlock(&(priv)->lock)
+static bool
+linux_is_drm(struct pci_driver *pdrv)
+{
+ return (pdrv->name != NULL && strcmp(pdrv->name, "drmn") == 0);
+}
+
static int
linux_pdev_dma_uninit(struct pci_dev *pdev)
{
@@ -405,7 +411,7 @@ linux_pci_attach_device(device_t dev, struct pci_driver *pdrv,
linux_set_current(curthread);
parent = device_get_parent(dev);
- isdrm = pdrv != NULL && pdrv->isdrm;
+ isdrm = pdrv != NULL && linux_is_drm(pdrv);
if (isdrm) {
struct pci_devinfo *dinfo;
@@ -674,7 +680,6 @@ linux_pci_register_driver(struct pci_driver *pdrv)
dc = devclass_find("pci");
if (dc == NULL)
return (-ENXIO);
- pdrv->isdrm = false;
return (_linux_pci_register_driver(pdrv, dc));
}
@@ -688,7 +693,7 @@ linux_pci_reserve_bar(struct pci_dev *pdev, struct resource_list *rl,
KASSERT(type == SYS_RES_IOPORT || type == SYS_RES_MEMORY,
("trying to reserve non-BAR type %d", type));
- dev = pdev->pdrv != NULL && pdev->pdrv->isdrm ?
+ dev = pdev->pdrv != NULL && linux_is_drm(pdev->pdrv) ?
device_get_parent(pdev->dev.bsddev) : pdev->dev.bsddev;
res = pci_reserve_map(device_get_parent(dev), dev, type, &rid, 0, ~0,
1, 1, 0);
@@ -706,7 +711,7 @@ pci_resource_start(struct pci_dev *pdev, int bar)
if ((rle = linux_pci_get_bar(pdev, bar, true)) == NULL)
return (0);
- dev = pdev->pdrv != NULL && pdev->pdrv->isdrm ?
+ dev = pdev->pdrv != NULL && linux_is_drm(pdev->pdrv) ?
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",
@@ -734,7 +739,6 @@ linux_pci_register_drm_driver(struct pci_driver *pdrv)
dc = devclass_create("vgapci");
if (dc == NULL)
return (-ENXIO);
- pdrv->isdrm = true;
pdrv->name = "drmn";
return (_linux_pci_register_driver(pdrv, dc));
}