Add the pci_get_base_class() helper and use it
Subsystems (6)
cover Add the pci_get_base_class() helper and use it
From: Sui Jingfeng <[email protected]>
There is no function that can be used to get all PCI(e) devices in a system by matching against its the PCI base class code only, while keep the sub-class code and the programming interface ignored. Therefore, add the pci_get_base_class() function to suit the need.
For example, if an application want to process all PCI(e) display devices in a system, it can achieve such goal by writing the code as following:
pdev = NULL;
do {
pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev);
if (!pdev)
break;
do_something_for_pci_display_device(pdev);
} while (1);Sui Jingfeng (5):
PCI: Add the pci_get_base_class() helper
ALSA: hda/intel: Use pci_get_base_class() to reduce duplicated code drm/nouveau: Use pci_get_base_class() to reduce duplicated code drm/amdgpu: Use pci_get_base_class() to reduce duplicated code drm/radeon: Use pci_get_base_class() to reduce duplicated code
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 11 +++------ drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 20 ++++----------- drivers/gpu/drm/nouveau/nouveau_acpi.c | 11 +++------ drivers/gpu/drm/radeon/radeon_bios.c | 20 ++++----------- drivers/pci/search.c | 31 ++++++++++++++++++++++++ include/linux/pci.h | 5 ++++ sound/pci/hda/hda_intel.c | 16 ++++-------- 7 files changed, 59 insertions(+), 55 deletions(-)
Signature · 1 line
2.34.1
PATCH 1/5 PCI: Add the pci_get_base_class() helper
From: Sui Jingfeng <[email protected]>
There is no function that can be used to get all PCI(e) devices in a system by matching against its the PCI base class code only, while keep the sub-class code and the programming interface ignored. Therefore, add the pci_get_base_class() function to suit the need.
For example, if an application want to process all PCI(e) display devices in a system, it can achieve such goal by writing the code as following:
pdev = NULL;
do {
pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev);
if (!pdev)
break;
do_something_for_pci_display_device(pdev);
} while (1);--- drivers/pci/search.c | 31 +++++++++++++++++++++++++++++++ include/linux/pci.h | 5 +++++ 2 files changed, 36 insertions(+)
drivers/pci/search.c +31 -0
@@ -363,6 +363,37 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) }EXPORT_SYMBOL (pci_get_class); +/** +* pci_get_base_class - searching for a PCI device by matching against the base class code only +* @class: search for a PCI device with this base class code +* @from: Previous PCI device found in search, or %NULL for new search. +* +* Iterates through the list of known PCI devices. If a PCI device is found +* with a matching base class code, the reference count to the device is +* incremented. See pci_match_one_device() to figure out how does this works. +* A new search is initiated by passing %NULL as the @from argument. +* Otherwise if @from is not %NULL, searches continue from next device on the +* global list. The reference count for @from is always decremented if it is +* not %NULL. +* +* Returns: +* A pointer to a matched PCI device, %NULL Otherwise. +*/ +struct pci_dev *pci_get_base_class (unsigned int class,struct pci_dev *from) +{ +struct pci_device_id id = { + .vendor =PCI_ANY_ID , + .device =PCI_ANY_ID , + .subvendor =PCI_ANY_ID , + .subdevice =PCI_ANY_ID , + .class_mask =0xFF0000 , + .class = class <<16 , + }; + +return pci_get_dev_by_id (&id, from); +} +EXPORT_SYMBOL (pci_get_base_class); +/** * pci_dev_present - Returns 1 if device matching the device list is present, 0 if not. * @ids: A pointer to a null terminated list of struct pci_device_id structures
include/linux/pci.h +5 -0
@@ -1180,6 +1180,8 @@ struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);struct pci_dev *pci_get_domain_bus_and_slot (int domain,unsigned int bus,unsigned int devfn);struct pci_dev *pci_get_class (unsigned int class,struct pci_dev *from); +struct pci_dev *pci_get_base_class (unsigned int class,struct pci_dev *from); +int pci_dev_present (const struct pci_device_id *ids); int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
@@ -1896,6 +1898,9 @@ static inline struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) {return NULL ; } +static inline struct pci_dev *pci_get_base_class (unsigned int class, +struct pci_dev *from) +{return NULL ; }static inline int pci_dev_present (const struct pci_device_id *ids) {return 0 ; }
Signature · 1 line
2.34.1
PATCH 2/5 ALSA: hda/intel: Use pci_get_base_class() to reduce duplicated code
In reply to Sui JingfengFrom: Sui Jingfeng <[email protected]>
Should be no functional change
--- sound/pci/hda/hda_intel.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
sound/pci/hda/hda_intel.c +5 -11
@@ -1429,17 +1429,11 @@ static bool atpx_present(void)acpi_handle dhandle, atpx_handle;acpi_status status; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { - dhandle =ACPI_HANDLE (&pdev->dev); -if (dhandle) { - status =acpi_get_handle (dhandle,"ATPX" , &atpx_handle); -if (ACPI_SUCCESS (status)) { -pci_dev_put (pdev); -return true; - } - } - } -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_OTHER <<8 , pdev)) !=NULL ) { +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_OTHER <<8 )) +continue ; + dhandle =ACPI_HANDLE (&pdev->dev);if (dhandle) { status =acpi_get_handle (dhandle,"ATPX" , &atpx_handle);
Signature · 1 line
2.34.1
Re: [PATCH 2/5] ALSA: hda/intel: Use pci_get_base_class() to reduce duplicated code
Quoted 33 lines · Sui Jingfeng
From: Sui Jingfeng <[email protected]>
Should be no functional change
Cc Jaroslav Kysela <[email protected]>Cc Takashi Iwai <[email protected]>Cc Fred Oh <[email protected]>Cc Pierre-Louis Bossart <[email protected]>Cc Kai Vehmanen <[email protected]>Cc Bjorn Helgaas <[email protected]>Signed-off-by Sui Jingfeng <[email protected]>--- sound/pci/hda/hda_intel.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)sound/pci/hda/hda_intel.c +0
-9@@ -1429,17 +1429,11 @@ static bool atpx_present(void)acpi_handle dhandle, atpx_handle;acpi_status status; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { - dhandle =ACPI_HANDLE (&pdev->dev); -if (dhandle) { - status =acpi_get_handle (dhandle,"ATPX" , &atpx_handle); -if (ACPI_SUCCESS (status)) { -pci_dev_put (pdev); -return true; - } - }
sound/pci/hda/hda_intel.c static bool atpx_present(void) · line 1439
Quoted 10 lines
sound/pci/hda/hda_intel.c +5
-2- } -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_OTHER <<8 , pdev)) !=NULL ) { +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_OTHER <<8 )) +continue ; + dhandle =ACPI_HANDLE (&pdev->dev);if (dhandle) { status =acpi_get_handle (dhandle,"ATPX" , &atpx_handle);
thanks,
Takashi
PATCH 3/5 drm/nouveau: Use pci_get_base_class() to reduce duplicated code
In reply to Sui JingfengFrom: Sui Jingfeng <[email protected]>
Should be no functional change.
--- drivers/gpu/drm/nouveau/nouveau_acpi.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/gpu/drm/nouveau/nouveau_acpi.c +4 -7
@@ -284,14 +284,11 @@ static bool nouveau_dsm_detect(void)printk ("MXM: GUID detected in BIOS\n" );/* now do DSM detection */ -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { - vga_count++; - -nouveau_dsm_pci_probe (pdev, &dhandle, &has_mux, &has_optimus, - &has_optimus_flags, &has_power_resources); - } +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_3D <<8 )) +continue ; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_3D <<8 , pdev)) !=NULL ) { vga_count++; nouveau_dsm_pci_probe(pdev, &dhandle, &has_mux, &has_optimus,
Signature · 1 line
2.34.1
PATCH 4/5 drm/amdgpu: Use pci_get_base_class() to reduce duplicated code
In reply to Sui JingfengFrom: Sui Jingfeng <[email protected]>
Should be no functional change.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 11 ++++------- drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 20 +++++--------------- 2 files changed, 9 insertions(+), 22 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +4 -7
@@ -1389,14 +1389,11 @@ void amdgpu_acpi_detect(void)struct pci_dev *pdev =NULL ;int ret; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { -if (!atif->handle) -amdgpu_atif_pci_probe_handle (pdev); -if (!atcs->handle) -amdgpu_atcs_pci_probe_handle (pdev); - } +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_OTHER <<8 )) +continue ; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_OTHER <<8 , pdev)) !=NULL ) {if (!atif->handle)amdgpu_atif_pci_probe_handle (pdev);if (!atcs->handle)
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c +5 -15
@@ -287,7 +287,11 @@ static bool amdgpu_atrm_get_bios(struct amdgpu_device *adev)if (adev->flags &AMD_IS_APU )return false; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_OTHER <<8 )) +continue ; + dhandle =ACPI_HANDLE (&pdev->dev);if (!dhandle)continue ;
@@ -299,20 +303,6 @@ static bool amdgpu_atrm_get_bios(struct amdgpu_device *adev) } } -if (!found) { -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_OTHER <<8 , pdev)) !=NULL ) { - dhandle =ACPI_HANDLE (&pdev->dev); -if (!dhandle) -continue ; - - status =acpi_get_handle (dhandle,"ATRM" , &atrm_handle); -if (ACPI_SUCCESS (status)) { - found = true; -break ; - } - } - } -if (!found)return false;pci_dev_put (pdev);
Signature · 1 line
2.34.1
PATCH 5/5 drm/radeon: Use pci_get_base_class() to reduce duplicated code
In reply to Sui JingfengFrom: Sui Jingfeng <[email protected]>
Should be no functional change.
--- drivers/gpu/drm/radeon/radeon_bios.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)
drivers/gpu/drm/radeon/radeon_bios.c +5 -15
@@ -199,7 +199,11 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)if (rdev->flags &RADEON_IS_IGP )return false; -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_VGA <<8 , pdev)) !=NULL ) { +while ((pdev =pci_get_base_class (PCI_BASE_CLASS_DISPLAY , pdev))) { +if ((pdev->class !=PCI_CLASS_DISPLAY_VGA <<8 ) && + (pdev->class !=PCI_CLASS_DISPLAY_OTHER <<8 )) +continue ; + dhandle =ACPI_HANDLE (&pdev->dev);if (!dhandle)continue ;
@@ -211,20 +215,6 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev) } } -if (!found) { -while ((pdev =pci_get_class (PCI_CLASS_DISPLAY_OTHER <<8 , pdev)) !=NULL ) { - dhandle =ACPI_HANDLE (&pdev->dev); -if (!dhandle) -continue ; - - status =acpi_get_handle (dhandle,"ATRM" , &atrm_handle); -if (ACPI_SUCCESS (status)) { - found = true; -break ; - } - } - } -if (!found)return false;pci_dev_put (pdev);
Signature · 1 line
2.34.1
[Public]
Quoted 30 lines
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Sui Jingfeng
Sent: Friday, August 25, 2023 2:27 AM
To: Bjorn Helgaas <[email protected]>
Cc: [email protected]; Sui Jingfeng <[email protected]>; [email protected]; [email protected]; dri- [email protected]; [email protected]; linux- [email protected]
Subject: [PATCH 0/5] Add thepci_get_base_class()helper and use itFrom: Sui Jingfeng <[email protected]>
There is no function that can be used to get all PCI(e) devices in a system by matching against its the PCI base class code only, while keep the sub-class code and the programming interface ignored. Therefore, add the
pci_get_base_class()function to suit the need.For example, if an application want to process all PCI(e) display devices in a system, it can achieve such goal by writing the code as following:
pdev = NULL; do { pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev); if (!pdev) break; do_something_for_pci_display_device(pdev); } while (1);
Quoted 7 lines
Sui Jingfeng (5):
PCI: Add thepci_get_base_class()helper
ALSA: hda/intel: Usepci_get_base_class()to reduce duplicated code drm/nouveau: Usepci_get_base_class()to reduce duplicated code drm/amdgpu: Usepci_get_base_class()to reduce duplicated code drm/radeon: Usepci_get_base_class()to reduce duplicated code
Series is:
Quoted 11 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 11 +++------ drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 20 ++++----------- drivers/gpu/drm/nouveau/nouveau_acpi.c | 11 +++------ drivers/gpu/drm/radeon/radeon_bios.c | 20 ++++----------- drivers/pci/search.c | 31 ++++++++++++++++++++++++ include/linux/pci.h | 5 ++++ sound/pci/hda/hda_intel.c | 16 ++++-------- 7 files changed, 59 insertions(+), 55 deletions(-)--
2.34.1
Hi,
Quoted 39 lines · Alexander
[Public]
Quoted 30 lines
-----Original Message-----
From: amd-gfx <[email protected]> On Behalf Of Sui Jingfeng
Sent: Friday, August 25, 2023 2:27 AM
To: Bjorn Helgaas <[email protected]>
Cc: [email protected]; Sui Jingfeng <[email protected]>; [email protected]; [email protected]; dri- [email protected]; [email protected]; linux- [email protected]
Subject: [PATCH 0/5] Add thepci_get_base_class()helper and use itFrom: Sui Jingfeng <[email protected]>
There is no function that can be used to get all PCI(e) devices in a system by matching against its the PCI base class code only, while keep the sub-class code and the programming interface ignored. Therefore, add the
pci_get_base_class()function to suit the need.For example, if an application want to process all PCI(e) display devices in a system, it can achieve such goal by writing the code as following:
pdev = NULL; do { pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev); if (!pdev) break; do_something_for_pci_display_device(pdev); } while (1);Quoted 7 lines
Sui Jingfeng (5):
PCI: Add thepci_get_base_class()helper
ALSA: hda/intel: Usepci_get_base_class()to reduce duplicated code drm/nouveau: Usepci_get_base_class()to reduce duplicated code drm/amdgpu: Usepci_get_base_class()to reduce duplicated code drm/radeon: Usepci_get_base_class()to reduce duplicated code
Quoted 2 lines
Series is:
Reviewed-by Alex Deucher <[email protected]>
Thanks a lot.
What to do next then?
By the way, Bjorn, what's your opinion?
I'm ask because I don't know what to do next with this series.
As they belong to different system of Linux kernel, the rest of patch (0002 ~ 0005) depend on the first one.
I think, merge the 0001-patch firstly, then wait it arrive at drm-misc, alsa branch. Or, to do something else?
Bjorn Helgaas
AppliedQuoted 26 lines · Sui Jingfeng
From: Sui Jingfeng <[email protected]>
There is no function that can be used to get all PCI(e) devices in a system by matching against its the PCI base class code only, while keep the sub-class code and the programming interface ignored. Therefore, add the
pci_get_base_class()function to suit the need.For example, if an application want to process all PCI(e) display devices in a system, it can achieve such goal by writing the code as following:
pdev = NULL; do { pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev); if (!pdev) break; do_something_for_pci_display_device(pdev); } while (1);Sui Jingfeng (5):
PCI: Add thepci_get_base_class()helper
ALSA: hda/intel: Usepci_get_base_class()to reduce duplicated code drm/nouveau: Usepci_get_base_class()to reduce duplicated code drm/amdgpu: Usepci_get_base_class()to reduce duplicated code drm/radeon: Usepci_get_base_class()to reduce duplicated code
Quoted 8 lines
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 11 +++------ drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | 20 ++++----------- drivers/gpu/drm/nouveau/nouveau_acpi.c | 11 +++------ drivers/gpu/drm/radeon/radeon_bios.c | 20 ++++----------- drivers/pci/search.c | 31 ++++++++++++++++++++++++ include/linux/pci.h | 5 ++++ sound/pci/hda/hda_intel.c | 16 ++++-------- 7 files changed, 59 insertions(+), 55 deletions(-)
Applied to pci/enumeration for v6.7, thanks.