mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-15 22:26:15 +07:00
perf/x86/intel/uncore: Factor out uncore_pci_find_dev_pmu()
When an uncore PCI sub driver gets a remove notification, the corresponding PMU has to be retrieved and unregistered. The codes, which find the corresponding PMU by comparing the pci_device_id table, can be shared. Factor out uncore_pci_find_dev_pmu(), which will be used later. There is no functional change. Signed-off-by: Kan Liang <kan.liang@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/1600094060-82746-3-git-send-email-kan.liang@linux.intel.com
This commit is contained in:
parent
fe6507338d
commit
8ed2ccaa3f
@ -1008,6 +1008,37 @@ static int uncore_pci_get_dev_die_info(struct pci_dev *pdev,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the PMU of a PCI device.
|
||||||
|
* @pdev: The PCI device.
|
||||||
|
* @ids: The ID table of the available PCI devices with a PMU.
|
||||||
|
*/
|
||||||
|
static struct intel_uncore_pmu *
|
||||||
|
uncore_pci_find_dev_pmu(struct pci_dev *pdev, const struct pci_device_id *ids)
|
||||||
|
{
|
||||||
|
struct intel_uncore_pmu *pmu = NULL;
|
||||||
|
struct intel_uncore_type *type;
|
||||||
|
kernel_ulong_t data;
|
||||||
|
unsigned int devfn;
|
||||||
|
|
||||||
|
while (ids && ids->vendor) {
|
||||||
|
if ((ids->vendor == pdev->vendor) &&
|
||||||
|
(ids->device == pdev->device)) {
|
||||||
|
data = ids->driver_data;
|
||||||
|
devfn = PCI_DEVFN(UNCORE_PCI_DEV_DEV(data),
|
||||||
|
UNCORE_PCI_DEV_FUNC(data));
|
||||||
|
if (devfn == pdev->devfn) {
|
||||||
|
type = uncore_pci_uncores[UNCORE_PCI_DEV_TYPE(data)];
|
||||||
|
pmu = &type->pmus[UNCORE_PCI_DEV_IDX(data)];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ids++;
|
||||||
|
}
|
||||||
|
return pmu;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* add a pci uncore device
|
* add a pci uncore device
|
||||||
*/
|
*/
|
||||||
@ -1039,21 +1070,8 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id
|
|||||||
*/
|
*/
|
||||||
if (id->driver_data & ~0xffff) {
|
if (id->driver_data & ~0xffff) {
|
||||||
struct pci_driver *pci_drv = pdev->driver;
|
struct pci_driver *pci_drv = pdev->driver;
|
||||||
const struct pci_device_id *ids = pci_drv->id_table;
|
|
||||||
unsigned int devfn;
|
|
||||||
|
|
||||||
while (ids && ids->vendor) {
|
pmu = uncore_pci_find_dev_pmu(pdev, pci_drv->id_table);
|
||||||
if ((ids->vendor == pdev->vendor) &&
|
|
||||||
(ids->device == pdev->device)) {
|
|
||||||
devfn = PCI_DEVFN(UNCORE_PCI_DEV_DEV(ids->driver_data),
|
|
||||||
UNCORE_PCI_DEV_FUNC(ids->driver_data));
|
|
||||||
if (devfn == pdev->devfn) {
|
|
||||||
pmu = &type->pmus[UNCORE_PCI_DEV_IDX(ids->driver_data)];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ids++;
|
|
||||||
}
|
|
||||||
if (pmu == NULL)
|
if (pmu == NULL)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user