From 2f588b887075860a3a6955fbef09b54e05d4380f Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sat, 14 Nov 2020 17:25:41 +1100 Subject: [PATCH] [core] honour the kernels probe requests --- dkms.conf | 2 +- src/amd/common.c | 10 +++++++--- src/amd/common.h | 1 + src/amd/navi10.c | 1 + src/amd/polaris10.c | 1 + src/amd/vega10.c | 1 + src/amd/vega20.c | 1 + src/hook.c | 3 +++ src/vendor-reset-dev.h | 2 ++ 9 files changed, 18 insertions(+), 4 deletions(-) diff --git a/dkms.conf b/dkms.conf index c820601..11da121 100644 --- a/dkms.conf +++ b/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME="vendor-reset" -PACKAGE_VERSION="0.0.11" +PACKAGE_VERSION="0.0.12" BUILT_MODULE_NAME[0]="${PACKAGE_NAME}" MAKE[0]="make KDIR=${kernel_source_dir}" CLEAN="make KDIR=${kernel_source_dir} clean" diff --git a/src/amd/common.c b/src/amd/common.c index 1146e5a..7a62722 100644 --- a/src/amd/common.c +++ b/src/amd/common.c @@ -28,15 +28,19 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "common.h" #include "compat.h" +int amd_common_probe(struct vendor_reset_cfg *cfg, struct pci_dev *dev) +{ + /* disable bus reset for the card, seems to be an issue with all of them */ + dev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET; + return 0; +} + int amd_common_pre_reset(struct vendor_reset_dev *dev) { struct amd_vendor_private *priv; struct pci_dev *pdev = dev->pdev; int ret, i; - /* disable bus reset for the card, seems to be an issue with all of em */ - pdev->dev_flags |= PCI_DEV_FLAGS_NO_BUS_RESET; - /* do not try to reset the card under amdgpu, it will cause problems */ if (pdev->driver && !strcmp(pdev->driver->name, "amdgpu")) return -ENOTTY; diff --git a/src/amd/common.h b/src/amd/common.h index dd35c22..e7c0047 100644 --- a/src/amd/common.h +++ b/src/amd/common.h @@ -123,6 +123,7 @@ static inline struct amd_vendor_private *amd_private(struct vendor_reset_dev *vd return vdev->vendor_private; } +int amd_common_probe(struct vendor_reset_cfg *cfg, struct pci_dev *dev); int amd_common_pre_reset(struct vendor_reset_dev *); int amd_common_post_reset(struct vendor_reset_dev *); diff --git a/src/amd/navi10.c b/src/amd/navi10.c index 73ce5f9..5ffb2b3 100644 --- a/src/amd/navi10.c +++ b/src/amd/navi10.c @@ -260,6 +260,7 @@ free_adev: const struct vendor_reset_ops amd_navi10_ops = { .version = {1, 0}, + .probe = amd_common_probe, .pre_reset = amd_common_pre_reset, .reset = amd_navi10_reset, .post_reset = amd_common_post_reset, diff --git a/src/amd/polaris10.c b/src/amd/polaris10.c index 60bcca1..3d8f88b 100644 --- a/src/amd/polaris10.c +++ b/src/amd/polaris10.c @@ -76,6 +76,7 @@ static int amd_polaris10_reset(struct vendor_reset_dev *vdev) const struct vendor_reset_ops amd_polaris10_ops = { .version = {1, 0}, + .probe = amd_common_probe, .pre_reset = amd_common_pre_reset, .reset = amd_polaris10_reset, .post_reset = amd_common_post_reset, diff --git a/src/amd/vega10.c b/src/amd/vega10.c index 3e0bb92..21b733e 100644 --- a/src/amd/vega10.c +++ b/src/amd/vega10.c @@ -280,6 +280,7 @@ free_adev: const struct vendor_reset_ops amd_vega10_ops = { .version = {1, 0}, + .probe = amd_common_probe, .pre_reset = amd_common_pre_reset, .reset = amd_vega10_reset, .post_reset = amd_common_post_reset, diff --git a/src/amd/vega20.c b/src/amd/vega20.c index 3660a5b..4ad4c00 100644 --- a/src/amd/vega20.c +++ b/src/amd/vega20.c @@ -191,6 +191,7 @@ free_adev: const struct vendor_reset_ops amd_vega20_ops = { .version = {1, 0}, + .probe = amd_common_probe, .pre_reset = amd_common_pre_reset, .reset = amd_vega20_reset, .post_reset = amd_common_post_reset, diff --git a/src/hook.c b/src/hook.c index 0d67af8..4d780b2 100644 --- a/src/hook.c +++ b/src/hook.c @@ -38,6 +38,9 @@ static int hooked_pci_dev_specific_reset(struct pci_dev *dev, int probe) if (!cfg) goto do_orig; + if (probe) + return cfg->ops->probe(cfg, dev); + ret = vendor_reset_dev_locked(cfg, dev); if (!ret || ret != -ENOTTY) return ret; diff --git a/src/vendor-reset-dev.h b/src/vendor-reset-dev.h index eb2b573..f05df21 100644 --- a/src/vendor-reset-dev.h +++ b/src/vendor-reset-dev.h @@ -45,6 +45,8 @@ struct vendor_reset_ops { /* version of the reset operations for logging */ const struct vendor_reset_ver version; + /* called when the kernel is probing for a working reset function */ + int (*probe)(struct vendor_reset_cfg *, struct pci_dev *); /* any pre-reset ops to do, i.e., common code between devices */ int (*pre_reset)(struct vendor_reset_dev *); /* the reset method for the device at the specified address */