* [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