Kernel KVM virtualization development
 help / color / mirror / Atom feed
* [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
@ 2026-09-22  6:41 Dave Airlie
  2026-09-22  6:48 ` sashiko-bot
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Dave Airlie @ 2026-09-22  6:41 UTC (permalink / raw)
  To: dri-devel, linux-pci, kvm
  Cc: Jason Gunthorpe, Dave Airlie, Alex Williamson, Bjorn Helgaas,
	Rodrigo Vivi, Alex Deucher

From: Dave Airlie <airlied@redhat.com>

This changes the vgaarb client API so that the user can pass a
private data pointer into the register that will get used in
the decode callback.

This allows a bunch of pdev conversions in the drivers, and lets
some future vfio cleanups be nicer.

I'd like to merge this via the drm next tree but also fine with
it going via pci.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Cc: Alex Williamson <alex@shazbot.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  6 +++---
 drivers/gpu/drm/i915/display/intel_vga.c   |  7 ++++---
 drivers/gpu/drm/nouveau/nouveau_vga.c      |  6 +++---
 drivers/gpu/drm/radeon/radeon_device.c     |  7 +++----
 drivers/pci/vgaarb.c                       | 13 +++++++++----
 drivers/vfio/pci/vfio_pci_core.c           |  9 +++++----
 include/linux/vgaarb.h                     |  8 +++++---
 7 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 62b5b4a23f17..1344b2b1bd16 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1435,10 +1435,10 @@ bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev)
  * Enable/disable vga decode (all asics).
  * Returns VGA resource flags.
  */
-static unsigned int amdgpu_device_vga_set_decode(struct pci_dev *pdev,
+static unsigned int amdgpu_device_vga_set_decode(void *data,
 		bool state)
 {
-	struct amdgpu_device *adev = drm_to_adev(pci_get_drvdata(pdev));
+	struct amdgpu_device *adev = (struct amdgpu_device *)data;
 
 	amdgpu_asic_set_vga_state(adev, state);
 	if (state)
@@ -4208,7 +4208,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 	 * ignore it
 	 */
 	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
-		vga_client_register(adev->pdev, amdgpu_device_vga_set_decode);
+		vga_client_register(adev->pdev, amdgpu_device_vga_set_decode, adev);
 
 	px = amdgpu_device_supports_px(adev);
 
diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c
index 4966fd7eea92..0889edb36190 100644
--- a/drivers/gpu/drm/i915/display/intel_vga.c
+++ b/drivers/gpu/drm/i915/display/intel_vga.c
@@ -283,9 +283,10 @@ void intel_vga_disable(struct intel_display *display)
 	intel_de_posting_read(display, vga_reg);
 }
 
-static unsigned int intel_vga_set_decode(struct pci_dev *pdev, bool enable_decode)
+static unsigned int intel_vga_set_decode(void *data, bool enable_decode)
 {
-	struct intel_display *display = to_intel_display(pdev);
+	struct intel_display *display = (struct intel_display *)data;
+	struct pci_dev *pdev = to_pci_dev(display->drm->dev);
 	unsigned int decodes = VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
 
 	drm_dbg_kms(display->drm, "%s VGA decode due to VGA arbitration\n",
@@ -331,7 +332,7 @@ void intel_vga_register(struct intel_display *display)
 	 * then we do not take part in VGA arbitration and the
 	 * vga_client_register() fails with -ENODEV.
 	 */
-	ret = vga_client_register(pdev, intel_vga_set_decode);
+	ret = vga_client_register(pdev, intel_vga_set_decode, display);
 	drm_WARN_ON(display->drm, ret && ret != -ENODEV);
 }
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_vga.c b/drivers/gpu/drm/nouveau/nouveau_vga.c
index 29a801124e56..6662e30466f2 100644
--- a/drivers/gpu/drm/nouveau/nouveau_vga.c
+++ b/drivers/gpu/drm/nouveau/nouveau_vga.c
@@ -9,9 +9,9 @@
 #include "nouveau_vga.h"
 
 static unsigned int
-nouveau_vga_set_decode(struct pci_dev *pdev, bool state)
+nouveau_vga_set_decode(void *data, bool state)
 {
-	struct nouveau_drm *drm = pci_get_drvdata(pdev);
+	struct nouveau_drm *drm = (struct nouveau_drm *)data;
 	struct nvif_object *device = &drm->client.device.object;
 
 	if (drm->client.device.info.family == NV_DEVICE_INFO_V0_CURIE &&
@@ -103,7 +103,7 @@ nouveau_vga_init(struct nouveau_drm *drm)
 		return;
 	pdev = to_pci_dev(dev->dev);
 
-	vga_client_register(pdev, nouveau_vga_set_decode);
+	vga_client_register(pdev, nouveau_vga_set_decode, drm);
 
 	/* don't register Thunderbolt eGPU with vga_switcheroo */
 	if (pci_is_thunderbolt_attached(pdev))
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 9523240110a6..cf8a6bd00c77 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1076,10 +1076,9 @@ void radeon_combios_fini(struct radeon_device *rdev)
  * Enable/disable vga decode (all asics).
  * Returns VGA resource flags.
  */
-static unsigned int radeon_vga_set_decode(struct pci_dev *pdev, bool state)
+static unsigned int radeon_vga_set_decode(void *data, bool state)
 {
-	struct drm_device *dev = pci_get_drvdata(pdev);
-	struct radeon_device *rdev = dev->dev_private;
+	struct radeon_device *rdev = (struct radeon_device *)data;
 	radeon_vga_set_state(rdev, state);
 	if (state)
 		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
@@ -1431,7 +1430,7 @@ int radeon_device_init(struct radeon_device *rdev,
 	/* if we have > 1 VGA cards, then disable the radeon VGA resources */
 	/* this will fail for cards that aren't VGA class devices, just
 	 * ignore it */
-	vga_client_register(rdev->pdev, radeon_vga_set_decode);
+	vga_client_register(rdev->pdev, radeon_vga_set_decode, rdev);
 
 	if (rdev->flags & RADEON_IS_PX)
 		runtime = true;
diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c
index 3de05aee7859..3e58b2c05c85 100644
--- a/drivers/pci/vgaarb.c
+++ b/drivers/pci/vgaarb.c
@@ -51,7 +51,8 @@ struct vga_device {
 	unsigned int mem_norm_cnt;	/* normal MEM count */
 	bool bridge_has_one_vga;
 	bool is_firmware_default;	/* device selected by firmware */
-	unsigned int (*set_decode)(struct pci_dev *pdev, bool decode);
+	unsigned int (*set_decode)(void *data, bool decode);
+	void *set_decode_data;
 };
 
 static LIST_HEAD(vga_list);
@@ -935,6 +936,7 @@ EXPORT_SYMBOL(vga_set_legacy_decoding);
  * vga_client_register - register or unregister a VGA arbitration client
  * @pdev: PCI device of the VGA client
  * @set_decode: VGA decode change callback
+ * @data: private data to pass to callback
  *
  * Clients have two callback mechanisms they can use.
  *
@@ -956,15 +958,18 @@ EXPORT_SYMBOL(vga_set_legacy_decoding);
  * Returns: 0 on success, -ENODEV on failure
  */
 int vga_client_register(struct pci_dev *pdev,
-		unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))
+		unsigned int (*set_decode)(void *data, bool decode),
+		void *data)
 {
 	unsigned long flags;
 	struct vga_device *vgadev;
 
 	spin_lock_irqsave(&vga_lock, flags);
 	vgadev = vgadev_find(pdev);
-	if (vgadev)
+	if (vgadev) {
 		vgadev->set_decode = set_decode;
+		vgadev->set_decode_data = data;
+	}
 	spin_unlock_irqrestore(&vga_lock, flags);
 	if (!vgadev)
 		return -ENODEV;
@@ -1464,7 +1469,7 @@ static void vga_arbiter_notify_clients(void)
 	spin_lock_irqsave(&vga_lock, flags);
 	list_for_each_entry(vgadev, &vga_list, list) {
 		if (vgadev->set_decode) {
-			new_decodes = vgadev->set_decode(vgadev->pdev,
+			new_decodes = vgadev->set_decode(vgadev->set_decode_data,
 							 new_state);
 			vga_update_device_decodes(vgadev, new_decodes);
 		}
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 6757054e9d87..b04ce3ded08c 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -162,9 +162,10 @@ static inline void vfio_pci_core_debugfs_init(struct vfio_pci_core_device *vdev)
  * has no way to get to it and routing can be disabled externally at the
  * bridge.
  */
-static unsigned int vfio_pci_set_decode(struct pci_dev *pdev, bool single_vga)
+static unsigned int vfio_pci_set_decode(void *data, bool single_vga)
 {
-	struct vfio_pci_core_device *vdev = dev_get_drvdata(&pdev->dev);
+	struct vfio_pci_core_device *vdev = data;
+	struct pci_dev *pdev = vdev->pdev;
 	struct pci_dev *tmp = NULL;
 	unsigned char max_busnr;
 	unsigned int decodes;
@@ -2159,10 +2160,10 @@ static int vfio_pci_vga_init(struct vfio_pci_core_device *vdev)
 	if (ret)
 		return ret;
 
-	ret = vga_client_register(pdev, vfio_pci_set_decode);
+	ret = vga_client_register(pdev, vfio_pci_set_decode, vdev);
 	if (ret)
 		return ret;
-	vga_set_legacy_decoding(pdev, vfio_pci_set_decode(pdev, false));
+	vga_set_legacy_decoding(pdev, vfio_pci_set_decode(vdev, false));
 	return 0;
 }
 
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h
index 97129a1bbb7d..71a364669eaf 100644
--- a/include/linux/vgaarb.h
+++ b/include/linux/vgaarb.h
@@ -33,7 +33,8 @@ struct pci_dev *vga_default_device(void);
 void vga_set_default_device(struct pci_dev *pdev);
 int vga_remove_vgacon(struct pci_dev *pdev);
 int vga_client_register(struct pci_dev *pdev,
-		unsigned int (*set_decode)(struct pci_dev *pdev, bool state));
+		unsigned int (*set_decode)(void *data, bool state),
+		void *data);
 #else /* CONFIG_VGA_ARB */
 static inline void vga_set_legacy_decoding(struct pci_dev *pdev,
 		unsigned int decodes)
@@ -59,7 +60,8 @@ static inline int vga_remove_vgacon(struct pci_dev *pdev)
 	return 0;
 }
 static inline int vga_client_register(struct pci_dev *pdev,
-		unsigned int (*set_decode)(struct pci_dev *pdev, bool state))
+		unsigned int (*set_decode)(void *data, bool state),
+		void *data)
 {
 	return 0;
 }
@@ -97,7 +99,7 @@ static inline int vga_get_uninterruptible(struct pci_dev *pdev,
 
 static inline void vga_client_unregister(struct pci_dev *pdev)
 {
-	vga_client_register(pdev, NULL);
+	vga_client_register(pdev, NULL, NULL);
 }
 
 #endif /* LINUX_VGA_H */
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
  2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
@ 2026-09-22  6:48 ` sashiko-bot
  2026-09-24  2:09 ` kernel test robot
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-09-22  6:48 UTC (permalink / raw)
  To: Dave Airlie; +Cc: kvm, dri-devel, linux-pci

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Low] drm/loongson: missed vga_client_register API conversion breaks build
--

commit 53a905b209a5cf4aa1aeb17a42069c191d47a151
Author: Dave Airlie <airlied@redhat.com>

pci/vgaarb: pass a data pointer to be used in the decode callback

This commit updates the vga_client_register() API to accept a void *data
pointer, which is then passed to the decode callback. It also updates
various DRM drivers and VFIO to pass and use this new private data pointer.

[ ... ]

> diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h
> index 97129a1bbb7df..71a364669eaf8 100644
> --- a/include/linux/vgaarb.h
> +++ b/include/linux/vgaarb.h
> @@ -33,7 +33,8 @@ struct pci_dev *vga_default_device(void);
>  void vga_set_default_device(struct pci_dev *pdev);
>  int vga_remove_vgacon(struct pci_dev *pdev);
>  int vga_client_register(struct pci_dev *pdev,
> -		unsigned int (*set_decode)(struct pci_dev *pdev, bool state));
> +		unsigned int (*set_decode)(void *data, bool state),
> +		void *data);

[Severity: Low]
Does this API change break the build for the loongson DRM driver?

It looks like the conversion of vga_client_register() missed lsdc_pci_probe()
in drivers/gpu/drm/loongson/lsdc_drv.c:

drivers/gpu/drm/loongson/lsdc_drv.c:lsdc_pci_probe() {
    ...
	vga_client_register(pdev, lsdc_vga_set_decode);
    ...
}

The callback lsdc_vga_set_decode() also still expects a struct pci_dev *
rather than void *data.

[ ... ]

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260922064111.2468741-1-airlied@gmail.com?part=1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
  2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
  2026-09-22  6:48 ` sashiko-bot
@ 2026-09-24  2:09 ` kernel test robot
  2026-09-24  3:03 ` kernel test robot
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-09-24  2:09 UTC (permalink / raw)
  To: Dave Airlie, dri-devel, linux-pci, kvm
  Cc: oe-kbuild-all, Jason Gunthorpe, Dave Airlie, Alex Williamson,
	Bjorn Helgaas, Rodrigo Vivi, Alex Deucher

Hi Dave,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on pci/next pci/for-linus drm-tip/drm-tip linus/master v7.3-rc4 next-20260922]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Dave-Airlie/pci-vgaarb-pass-a-data-pointer-to-be-used-in-the-decode-callback/20260922-164111
base:   https://gitlab.freedesktop.org/drm/misc/kernel.git drm-misc-next
patch link:    https://lore.kernel.org/r/20260922064111.2468741-1-airlied%40gmail.com
patch subject: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
config: parisc-defconfig (https://download.01.org/0day-ci/archive/20260924/202609241015.1yXHBzfy-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 16.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260924/202609241015.1yXHBzfy-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202609241015.1yXHBzfy-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> Warning: drivers/gpu/drm/radeon/radeon_device.c:1079 function parameter 'data' not described in 'radeon_vga_set_decode'
>> Warning: drivers/gpu/drm/radeon/radeon_device.c:1079 Excess function parameter 'pdev' description in 'radeon_vga_set_decode'
>> Warning: drivers/gpu/drm/radeon/radeon_device.c:1079 function parameter 'data' not described in 'radeon_vga_set_decode'
>> Warning: drivers/gpu/drm/radeon/radeon_device.c:1079 Excess function parameter 'pdev' description in 'radeon_vga_set_decode'

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
  2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
  2026-09-22  6:48 ` sashiko-bot
  2026-09-24  2:09 ` kernel test robot
@ 2026-09-24  3:03 ` kernel test robot
  2026-09-24  5:15 ` kernel test robot
  2026-09-24 19:12 ` Bjorn Helgaas
  4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-09-24  3:03 UTC (permalink / raw)
  To: Dave Airlie, dri-devel, linux-pci, kvm
  Cc: oe-kbuild-all, Jason Gunthorpe, Dave Airlie, Alex Williamson,
	Bjorn Helgaas, Rodrigo Vivi, Alex Deucher

Hi Dave,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-misc/drm-misc-next]
[also build test ERROR on pci/next pci/for-linus drm-tip/drm-tip linus/master v7.3-rc4 next-20260922]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Dave-Airlie/pci-vgaarb-pass-a-data-pointer-to-be-used-in-the-decode-callback/20260922-164111
base:   https://gitlab.freedesktop.org/drm/misc/kernel.git drm-misc-next
patch link:    https://lore.kernel.org/r/20260922064111.2468741-1-airlied%40gmail.com
patch subject: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
config: powerpc-randconfig-1000-20260924 (https://download.01.org/0day-ci/archive/20260924/202609241037.1RwqQnfb-lkp@intel.com/config)
compiler: powerpc-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260924/202609241037.1RwqQnfb-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202609241037.1RwqQnfb-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/gpu/drm/loongson/lsdc_drv.c: In function 'lsdc_pci_probe':
>> drivers/gpu/drm/loongson/lsdc_drv.c:294:28: error: passing argument 2 of 'vga_client_register' from incompatible pointer type [-Werror=incompatible-pointer-types]
     vga_client_register(pdev, lsdc_vga_set_decode);
                               ^~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/loongson/lsdc_drv.c:8:
   include/linux/vgaarb.h:36:18: note: expected 'unsigned int (*)(void *, bool)' {aka 'unsigned int (*)(void *, _Bool)'} but argument is of type 'unsigned int (*)(struct pci_dev *, bool)' {aka 'unsigned int (*)(struct pci_dev *, _Bool)'}
      unsigned int (*set_decode)(void *data, bool state),
      ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/loongson/lsdc_drv.c:294:2: error: too few arguments to function 'vga_client_register'
     vga_client_register(pdev, lsdc_vga_set_decode);
     ^~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/loongson/lsdc_drv.c:8:
   include/linux/vgaarb.h:35:5: note: declared here
    int vga_client_register(struct pci_dev *pdev,
        ^~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/vga_client_register +294 drivers/gpu/drm/loongson/lsdc_drv.c

f39db26c54281d Sui Jingfeng      2023-06-15  261  
f39db26c54281d Sui Jingfeng      2023-06-15  262  static int lsdc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
f39db26c54281d Sui Jingfeng      2023-06-15  263  {
f39db26c54281d Sui Jingfeng      2023-06-15  264  	const struct lsdc_desc *descp;
f39db26c54281d Sui Jingfeng      2023-06-15  265  	struct drm_device *ddev;
f39db26c54281d Sui Jingfeng      2023-06-15  266  	struct lsdc_device *ldev;
f39db26c54281d Sui Jingfeng      2023-06-15  267  	int ret;
f39db26c54281d Sui Jingfeng      2023-06-15  268  
f39db26c54281d Sui Jingfeng      2023-06-15  269  	descp = lsdc_device_probe(pdev, ent->driver_data);
f39db26c54281d Sui Jingfeng      2023-06-15  270  	if (IS_ERR_OR_NULL(descp))
f39db26c54281d Sui Jingfeng      2023-06-15  271  		return -ENODEV;
f39db26c54281d Sui Jingfeng      2023-06-15  272  
f39db26c54281d Sui Jingfeng      2023-06-15  273  	pci_set_master(pdev);
f39db26c54281d Sui Jingfeng      2023-06-15  274  
f39db26c54281d Sui Jingfeng      2023-06-15  275  	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
f39db26c54281d Sui Jingfeng      2023-06-15  276  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  277  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  278  
f39db26c54281d Sui Jingfeng      2023-06-15  279  	ret = pcim_enable_device(pdev);
f39db26c54281d Sui Jingfeng      2023-06-15  280  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  281  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  282  
f39db26c54281d Sui Jingfeng      2023-06-15  283  	dev_info(&pdev->dev, "Found %s, revision: %u",
f39db26c54281d Sui Jingfeng      2023-06-15  284  		 to_loongson_gfx(descp)->model, pdev->revision);
f39db26c54281d Sui Jingfeng      2023-06-15  285  
f39db26c54281d Sui Jingfeng      2023-06-15  286  	ldev = lsdc_create_device(pdev, descp, &lsdc_drm_driver);
f39db26c54281d Sui Jingfeng      2023-06-15  287  	if (IS_ERR(ldev))
f39db26c54281d Sui Jingfeng      2023-06-15  288  		return PTR_ERR(ldev);
f39db26c54281d Sui Jingfeng      2023-06-15  289  
f39db26c54281d Sui Jingfeng      2023-06-15  290  	ddev = &ldev->base;
f39db26c54281d Sui Jingfeng      2023-06-15  291  
f39db26c54281d Sui Jingfeng      2023-06-15  292  	pci_set_drvdata(pdev, ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  293  
f39db26c54281d Sui Jingfeng      2023-06-15 @294  	vga_client_register(pdev, lsdc_vga_set_decode);
f39db26c54281d Sui Jingfeng      2023-06-15  295  
0a9c56dd387605 Myeonghun Pak     2026-05-13  296  	drmm_kms_helper_poll_init(ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  297  
f39db26c54281d Sui Jingfeng      2023-06-15  298  	if (loongson_vblank) {
f39db26c54281d Sui Jingfeng      2023-06-15  299  		ret = drm_vblank_init(ddev, descp->num_of_crtc);
f39db26c54281d Sui Jingfeng      2023-06-15  300  		if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  301  			return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  302  
f39db26c54281d Sui Jingfeng      2023-06-15  303  		ret = devm_request_irq(&pdev->dev, pdev->irq,
f39db26c54281d Sui Jingfeng      2023-06-15  304  				       descp->funcs->irq_handler,
f39db26c54281d Sui Jingfeng      2023-06-15  305  				       IRQF_SHARED,
f39db26c54281d Sui Jingfeng      2023-06-15  306  				       dev_name(&pdev->dev), ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  307  		if (ret) {
f39db26c54281d Sui Jingfeng      2023-06-15  308  			drm_err(ddev, "Failed to register interrupt: %d\n", ret);
f39db26c54281d Sui Jingfeng      2023-06-15  309  			return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  310  		}
f39db26c54281d Sui Jingfeng      2023-06-15  311  
f39db26c54281d Sui Jingfeng      2023-06-15  312  		drm_info(ddev, "registered irq: %u\n", pdev->irq);
f39db26c54281d Sui Jingfeng      2023-06-15  313  	}
f39db26c54281d Sui Jingfeng      2023-06-15  314  
f39db26c54281d Sui Jingfeng      2023-06-15  315  	ret = drm_dev_register(ddev, 0);
f39db26c54281d Sui Jingfeng      2023-06-15  316  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  317  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  318  
4269f5c878fc19 Thomas Zimmermann 2024-09-24  319  	drm_client_setup(ddev, NULL);
f39db26c54281d Sui Jingfeng      2023-06-15  320  
f39db26c54281d Sui Jingfeng      2023-06-15  321  	return 0;
f39db26c54281d Sui Jingfeng      2023-06-15  322  }
f39db26c54281d Sui Jingfeng      2023-06-15  323  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
  2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
                   ` (2 preceding siblings ...)
  2026-09-24  3:03 ` kernel test robot
@ 2026-09-24  5:15 ` kernel test robot
  2026-09-24 19:12 ` Bjorn Helgaas
  4 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-09-24  5:15 UTC (permalink / raw)
  To: Dave Airlie, dri-devel, linux-pci, kvm
  Cc: oe-kbuild-all, Jason Gunthorpe, Dave Airlie, Alex Williamson,
	Bjorn Helgaas, Rodrigo Vivi, Alex Deucher

Hi Dave,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-misc/drm-misc-next]
[also build test ERROR on pci/next pci/for-linus drm-tip/drm-tip linus/master v7.3-rc4 next-20260922]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Dave-Airlie/pci-vgaarb-pass-a-data-pointer-to-be-used-in-the-decode-callback/20260922-164111
base:   https://gitlab.freedesktop.org/drm/misc/kernel.git drm-misc-next
patch link:    https://lore.kernel.org/r/20260922064111.2468741-1-airlied%40gmail.com
patch subject: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
config: csky-allmodconfig (https://download.01.org/0day-ci/archive/20260924/202609241323.5ZIGw7sZ-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 16.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260924/202609241323.5ZIGw7sZ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202609241323.5ZIGw7sZ-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/gpu/drm/loongson/lsdc_drv.c: In function 'lsdc_pci_probe':
   drivers/gpu/drm/loongson/lsdc_drv.c:294:35: error: passing argument 2 of 'vga_client_register' from incompatible pointer type [-Wincompatible-pointer-types]
     294 |         vga_client_register(pdev, lsdc_vga_set_decode);
         |                                   ^~~~~~~~~~~~~~~~~~~
         |                                   |
         |                                   unsigned int (*)(struct pci_dev *, bool) {aka unsigned int (*)(struct pci_dev *, _Bool)}
   In file included from drivers/gpu/drm/loongson/lsdc_drv.c:8:
   include/linux/vgaarb.h:36:32: note: expected 'unsigned int (*)(void *, bool)' {aka 'unsigned int (*)(void *, _Bool)'} but argument is of type 'unsigned int (*)(struct pci_dev *, bool)' {aka 'unsigned int (*)(struct pci_dev *, _Bool)'}
      36 |                 unsigned int (*set_decode)(void *data, bool state),
         |                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/loongson/lsdc_drv.c:257:21: note: 'lsdc_vga_set_decode' declared here
     257 | static unsigned int lsdc_vga_set_decode(struct pci_dev *pdev, bool state)
         |                     ^~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/loongson/lsdc_drv.c:294:9: error: too few arguments to function 'vga_client_register'; expected 3, have 2
     294 |         vga_client_register(pdev, lsdc_vga_set_decode);
         |         ^~~~~~~~~~~~~~~~~~~
   include/linux/vgaarb.h:35:5: note: declared here
      35 | int vga_client_register(struct pci_dev *pdev,
         |     ^~~~~~~~~~~~~~~~~~~


vim +/vga_client_register +294 drivers/gpu/drm/loongson/lsdc_drv.c

f39db26c54281d Sui Jingfeng      2023-06-15  261  
f39db26c54281d Sui Jingfeng      2023-06-15  262  static int lsdc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
f39db26c54281d Sui Jingfeng      2023-06-15  263  {
f39db26c54281d Sui Jingfeng      2023-06-15  264  	const struct lsdc_desc *descp;
f39db26c54281d Sui Jingfeng      2023-06-15  265  	struct drm_device *ddev;
f39db26c54281d Sui Jingfeng      2023-06-15  266  	struct lsdc_device *ldev;
f39db26c54281d Sui Jingfeng      2023-06-15  267  	int ret;
f39db26c54281d Sui Jingfeng      2023-06-15  268  
f39db26c54281d Sui Jingfeng      2023-06-15  269  	descp = lsdc_device_probe(pdev, ent->driver_data);
f39db26c54281d Sui Jingfeng      2023-06-15  270  	if (IS_ERR_OR_NULL(descp))
f39db26c54281d Sui Jingfeng      2023-06-15  271  		return -ENODEV;
f39db26c54281d Sui Jingfeng      2023-06-15  272  
f39db26c54281d Sui Jingfeng      2023-06-15  273  	pci_set_master(pdev);
f39db26c54281d Sui Jingfeng      2023-06-15  274  
f39db26c54281d Sui Jingfeng      2023-06-15  275  	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
f39db26c54281d Sui Jingfeng      2023-06-15  276  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  277  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  278  
f39db26c54281d Sui Jingfeng      2023-06-15  279  	ret = pcim_enable_device(pdev);
f39db26c54281d Sui Jingfeng      2023-06-15  280  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  281  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  282  
f39db26c54281d Sui Jingfeng      2023-06-15  283  	dev_info(&pdev->dev, "Found %s, revision: %u",
f39db26c54281d Sui Jingfeng      2023-06-15  284  		 to_loongson_gfx(descp)->model, pdev->revision);
f39db26c54281d Sui Jingfeng      2023-06-15  285  
f39db26c54281d Sui Jingfeng      2023-06-15  286  	ldev = lsdc_create_device(pdev, descp, &lsdc_drm_driver);
f39db26c54281d Sui Jingfeng      2023-06-15  287  	if (IS_ERR(ldev))
f39db26c54281d Sui Jingfeng      2023-06-15  288  		return PTR_ERR(ldev);
f39db26c54281d Sui Jingfeng      2023-06-15  289  
f39db26c54281d Sui Jingfeng      2023-06-15  290  	ddev = &ldev->base;
f39db26c54281d Sui Jingfeng      2023-06-15  291  
f39db26c54281d Sui Jingfeng      2023-06-15  292  	pci_set_drvdata(pdev, ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  293  
f39db26c54281d Sui Jingfeng      2023-06-15 @294  	vga_client_register(pdev, lsdc_vga_set_decode);
f39db26c54281d Sui Jingfeng      2023-06-15  295  
0a9c56dd387605 Myeonghun Pak     2026-05-13  296  	drmm_kms_helper_poll_init(ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  297  
f39db26c54281d Sui Jingfeng      2023-06-15  298  	if (loongson_vblank) {
f39db26c54281d Sui Jingfeng      2023-06-15  299  		ret = drm_vblank_init(ddev, descp->num_of_crtc);
f39db26c54281d Sui Jingfeng      2023-06-15  300  		if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  301  			return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  302  
f39db26c54281d Sui Jingfeng      2023-06-15  303  		ret = devm_request_irq(&pdev->dev, pdev->irq,
f39db26c54281d Sui Jingfeng      2023-06-15  304  				       descp->funcs->irq_handler,
f39db26c54281d Sui Jingfeng      2023-06-15  305  				       IRQF_SHARED,
f39db26c54281d Sui Jingfeng      2023-06-15  306  				       dev_name(&pdev->dev), ddev);
f39db26c54281d Sui Jingfeng      2023-06-15  307  		if (ret) {
f39db26c54281d Sui Jingfeng      2023-06-15  308  			drm_err(ddev, "Failed to register interrupt: %d\n", ret);
f39db26c54281d Sui Jingfeng      2023-06-15  309  			return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  310  		}
f39db26c54281d Sui Jingfeng      2023-06-15  311  
f39db26c54281d Sui Jingfeng      2023-06-15  312  		drm_info(ddev, "registered irq: %u\n", pdev->irq);
f39db26c54281d Sui Jingfeng      2023-06-15  313  	}
f39db26c54281d Sui Jingfeng      2023-06-15  314  
f39db26c54281d Sui Jingfeng      2023-06-15  315  	ret = drm_dev_register(ddev, 0);
f39db26c54281d Sui Jingfeng      2023-06-15  316  	if (ret)
f39db26c54281d Sui Jingfeng      2023-06-15  317  		return ret;
f39db26c54281d Sui Jingfeng      2023-06-15  318  
4269f5c878fc19 Thomas Zimmermann 2024-09-24  319  	drm_client_setup(ddev, NULL);
f39db26c54281d Sui Jingfeng      2023-06-15  320  
f39db26c54281d Sui Jingfeng      2023-06-15  321  	return 0;
f39db26c54281d Sui Jingfeng      2023-06-15  322  }
f39db26c54281d Sui Jingfeng      2023-06-15  323  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback
  2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
                   ` (3 preceding siblings ...)
  2026-09-24  5:15 ` kernel test robot
@ 2026-09-24 19:12 ` Bjorn Helgaas
  4 siblings, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2026-09-24 19:12 UTC (permalink / raw)
  To: Dave Airlie
  Cc: dri-devel, linux-pci, kvm, Jason Gunthorpe, Dave Airlie,
	Alex Williamson, Bjorn Helgaas, Rodrigo Vivi, Alex Deucher

On Tue, Sep 22, 2026 at 04:41:11PM +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied@redhat.com>
> 
> This changes the vgaarb client API so that the user can pass a
> private data pointer into the register that will get used in
> the decode callback.
> 
> This allows a bunch of pdev conversions in the drivers, and lets
> some future vfio cleanups be nicer.
> 
> I'd like to merge this via the drm next tree but also fine with
> it going via pci.
> 
> Signed-off-by: Dave Airlie <airlied@redhat.com>
> Cc: Alex Williamson <alex@shazbot.org>
> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Cc: Alex Deucher <alexander.deucher@amd.com>

This seems fine to me, except for the
drivers/gpu/drm/loongson/lsdc_drv.c build error
(https://lore.kernel.org/all/202609241037.1RwqQnfb-lkp@intel.com) the
new kernel-doc issue
(https://lore.kernel.org/all/202609241015.1yXHBzfy-lkp@intel.com).

You could also update the subject line to match the
drivers/pci/vgaarb.c history:

  PCI/VGA: Pass a data pointer ...

With all that, I'm fine with this being merged via the drm tree:

Acked-by: Bjorn Helgaas <bhelgaas@google.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |  6 +++---
>  drivers/gpu/drm/i915/display/intel_vga.c   |  7 ++++---
>  drivers/gpu/drm/nouveau/nouveau_vga.c      |  6 +++---
>  drivers/gpu/drm/radeon/radeon_device.c     |  7 +++----
>  drivers/pci/vgaarb.c                       | 13 +++++++++----
>  drivers/vfio/pci/vfio_pci_core.c           |  9 +++++----
>  include/linux/vgaarb.h                     |  8 +++++---
>  7 files changed, 32 insertions(+), 24 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 62b5b4a23f17..1344b2b1bd16 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1435,10 +1435,10 @@ bool amdgpu_device_should_use_aspm(struct amdgpu_device *adev)
>   * Enable/disable vga decode (all asics).
>   * Returns VGA resource flags.
>   */
> -static unsigned int amdgpu_device_vga_set_decode(struct pci_dev *pdev,
> +static unsigned int amdgpu_device_vga_set_decode(void *data,
>  		bool state)
>  {
> -	struct amdgpu_device *adev = drm_to_adev(pci_get_drvdata(pdev));
> +	struct amdgpu_device *adev = (struct amdgpu_device *)data;
>  
>  	amdgpu_asic_set_vga_state(adev, state);
>  	if (state)
> @@ -4208,7 +4208,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
>  	 * ignore it
>  	 */
>  	if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
> -		vga_client_register(adev->pdev, amdgpu_device_vga_set_decode);
> +		vga_client_register(adev->pdev, amdgpu_device_vga_set_decode, adev);
>  
>  	px = amdgpu_device_supports_px(adev);
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c
> index 4966fd7eea92..0889edb36190 100644
> --- a/drivers/gpu/drm/i915/display/intel_vga.c
> +++ b/drivers/gpu/drm/i915/display/intel_vga.c
> @@ -283,9 +283,10 @@ void intel_vga_disable(struct intel_display *display)
>  	intel_de_posting_read(display, vga_reg);
>  }
>  
> -static unsigned int intel_vga_set_decode(struct pci_dev *pdev, bool enable_decode)
> +static unsigned int intel_vga_set_decode(void *data, bool enable_decode)
>  {
> -	struct intel_display *display = to_intel_display(pdev);
> +	struct intel_display *display = (struct intel_display *)data;
> +	struct pci_dev *pdev = to_pci_dev(display->drm->dev);
>  	unsigned int decodes = VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
>  
>  	drm_dbg_kms(display->drm, "%s VGA decode due to VGA arbitration\n",
> @@ -331,7 +332,7 @@ void intel_vga_register(struct intel_display *display)
>  	 * then we do not take part in VGA arbitration and the
>  	 * vga_client_register() fails with -ENODEV.
>  	 */
> -	ret = vga_client_register(pdev, intel_vga_set_decode);
> +	ret = vga_client_register(pdev, intel_vga_set_decode, display);
>  	drm_WARN_ON(display->drm, ret && ret != -ENODEV);
>  }
>  
> diff --git a/drivers/gpu/drm/nouveau/nouveau_vga.c b/drivers/gpu/drm/nouveau/nouveau_vga.c
> index 29a801124e56..6662e30466f2 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_vga.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_vga.c
> @@ -9,9 +9,9 @@
>  #include "nouveau_vga.h"
>  
>  static unsigned int
> -nouveau_vga_set_decode(struct pci_dev *pdev, bool state)
> +nouveau_vga_set_decode(void *data, bool state)
>  {
> -	struct nouveau_drm *drm = pci_get_drvdata(pdev);
> +	struct nouveau_drm *drm = (struct nouveau_drm *)data;
>  	struct nvif_object *device = &drm->client.device.object;
>  
>  	if (drm->client.device.info.family == NV_DEVICE_INFO_V0_CURIE &&
> @@ -103,7 +103,7 @@ nouveau_vga_init(struct nouveau_drm *drm)
>  		return;
>  	pdev = to_pci_dev(dev->dev);
>  
> -	vga_client_register(pdev, nouveau_vga_set_decode);
> +	vga_client_register(pdev, nouveau_vga_set_decode, drm);
>  
>  	/* don't register Thunderbolt eGPU with vga_switcheroo */
>  	if (pci_is_thunderbolt_attached(pdev))
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index 9523240110a6..cf8a6bd00c77 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -1076,10 +1076,9 @@ void radeon_combios_fini(struct radeon_device *rdev)
>   * Enable/disable vga decode (all asics).
>   * Returns VGA resource flags.
>   */
> -static unsigned int radeon_vga_set_decode(struct pci_dev *pdev, bool state)
> +static unsigned int radeon_vga_set_decode(void *data, bool state)
>  {
> -	struct drm_device *dev = pci_get_drvdata(pdev);
> -	struct radeon_device *rdev = dev->dev_private;
> +	struct radeon_device *rdev = (struct radeon_device *)data;
>  	radeon_vga_set_state(rdev, state);
>  	if (state)
>  		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
> @@ -1431,7 +1430,7 @@ int radeon_device_init(struct radeon_device *rdev,
>  	/* if we have > 1 VGA cards, then disable the radeon VGA resources */
>  	/* this will fail for cards that aren't VGA class devices, just
>  	 * ignore it */
> -	vga_client_register(rdev->pdev, radeon_vga_set_decode);
> +	vga_client_register(rdev->pdev, radeon_vga_set_decode, rdev);
>  
>  	if (rdev->flags & RADEON_IS_PX)
>  		runtime = true;
> diff --git a/drivers/pci/vgaarb.c b/drivers/pci/vgaarb.c
> index 3de05aee7859..3e58b2c05c85 100644
> --- a/drivers/pci/vgaarb.c
> +++ b/drivers/pci/vgaarb.c
> @@ -51,7 +51,8 @@ struct vga_device {
>  	unsigned int mem_norm_cnt;	/* normal MEM count */
>  	bool bridge_has_one_vga;
>  	bool is_firmware_default;	/* device selected by firmware */
> -	unsigned int (*set_decode)(struct pci_dev *pdev, bool decode);
> +	unsigned int (*set_decode)(void *data, bool decode);
> +	void *set_decode_data;
>  };
>  
>  static LIST_HEAD(vga_list);
> @@ -935,6 +936,7 @@ EXPORT_SYMBOL(vga_set_legacy_decoding);
>   * vga_client_register - register or unregister a VGA arbitration client
>   * @pdev: PCI device of the VGA client
>   * @set_decode: VGA decode change callback
> + * @data: private data to pass to callback
>   *
>   * Clients have two callback mechanisms they can use.
>   *
> @@ -956,15 +958,18 @@ EXPORT_SYMBOL(vga_set_legacy_decoding);
>   * Returns: 0 on success, -ENODEV on failure
>   */
>  int vga_client_register(struct pci_dev *pdev,
> -		unsigned int (*set_decode)(struct pci_dev *pdev, bool decode))
> +		unsigned int (*set_decode)(void *data, bool decode),
> +		void *data)
>  {
>  	unsigned long flags;
>  	struct vga_device *vgadev;
>  
>  	spin_lock_irqsave(&vga_lock, flags);
>  	vgadev = vgadev_find(pdev);
> -	if (vgadev)
> +	if (vgadev) {
>  		vgadev->set_decode = set_decode;
> +		vgadev->set_decode_data = data;
> +	}
>  	spin_unlock_irqrestore(&vga_lock, flags);
>  	if (!vgadev)
>  		return -ENODEV;
> @@ -1464,7 +1469,7 @@ static void vga_arbiter_notify_clients(void)
>  	spin_lock_irqsave(&vga_lock, flags);
>  	list_for_each_entry(vgadev, &vga_list, list) {
>  		if (vgadev->set_decode) {
> -			new_decodes = vgadev->set_decode(vgadev->pdev,
> +			new_decodes = vgadev->set_decode(vgadev->set_decode_data,
>  							 new_state);
>  			vga_update_device_decodes(vgadev, new_decodes);
>  		}
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index 6757054e9d87..b04ce3ded08c 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -162,9 +162,10 @@ static inline void vfio_pci_core_debugfs_init(struct vfio_pci_core_device *vdev)
>   * has no way to get to it and routing can be disabled externally at the
>   * bridge.
>   */
> -static unsigned int vfio_pci_set_decode(struct pci_dev *pdev, bool single_vga)
> +static unsigned int vfio_pci_set_decode(void *data, bool single_vga)
>  {
> -	struct vfio_pci_core_device *vdev = dev_get_drvdata(&pdev->dev);
> +	struct vfio_pci_core_device *vdev = data;
> +	struct pci_dev *pdev = vdev->pdev;
>  	struct pci_dev *tmp = NULL;
>  	unsigned char max_busnr;
>  	unsigned int decodes;
> @@ -2159,10 +2160,10 @@ static int vfio_pci_vga_init(struct vfio_pci_core_device *vdev)
>  	if (ret)
>  		return ret;
>  
> -	ret = vga_client_register(pdev, vfio_pci_set_decode);
> +	ret = vga_client_register(pdev, vfio_pci_set_decode, vdev);
>  	if (ret)
>  		return ret;
> -	vga_set_legacy_decoding(pdev, vfio_pci_set_decode(pdev, false));
> +	vga_set_legacy_decoding(pdev, vfio_pci_set_decode(vdev, false));
>  	return 0;
>  }
>  
> diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h
> index 97129a1bbb7d..71a364669eaf 100644
> --- a/include/linux/vgaarb.h
> +++ b/include/linux/vgaarb.h
> @@ -33,7 +33,8 @@ struct pci_dev *vga_default_device(void);
>  void vga_set_default_device(struct pci_dev *pdev);
>  int vga_remove_vgacon(struct pci_dev *pdev);
>  int vga_client_register(struct pci_dev *pdev,
> -		unsigned int (*set_decode)(struct pci_dev *pdev, bool state));
> +		unsigned int (*set_decode)(void *data, bool state),
> +		void *data);
>  #else /* CONFIG_VGA_ARB */
>  static inline void vga_set_legacy_decoding(struct pci_dev *pdev,
>  		unsigned int decodes)
> @@ -59,7 +60,8 @@ static inline int vga_remove_vgacon(struct pci_dev *pdev)
>  	return 0;
>  }
>  static inline int vga_client_register(struct pci_dev *pdev,
> -		unsigned int (*set_decode)(struct pci_dev *pdev, bool state))
> +		unsigned int (*set_decode)(void *data, bool state),
> +		void *data)
>  {
>  	return 0;
>  }
> @@ -97,7 +99,7 @@ static inline int vga_get_uninterruptible(struct pci_dev *pdev,
>  
>  static inline void vga_client_unregister(struct pci_dev *pdev)
>  {
> -	vga_client_register(pdev, NULL);
> +	vga_client_register(pdev, NULL, NULL);
>  }
>  
>  #endif /* LINUX_VGA_H */
> -- 
> 2.54.0
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-09-24 19:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-22  6:41 [PATCH] pci/vgaarb: pass a data pointer to be used in the decode callback Dave Airlie
2026-09-22  6:48 ` sashiko-bot
2026-09-24  2:09 ` kernel test robot
2026-09-24  3:03 ` kernel test robot
2026-09-24  5:15 ` kernel test robot
2026-09-24 19:12 ` Bjorn Helgaas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox