Skip to content

Commit

Permalink
drm/i915/pmu: Support multiple GPUs
Browse files Browse the repository at this point in the history
With discrete graphics system can have both integrated and discrete GPU
handled by i915.

Currently we use a fixed name ("i915") when registering as the uncore PMU
provider which stops working in this case.

To fix this we add the PCI device name string to non-integrated devices
handled by us. Integrated devices keep the legacy name preserving
backward compatibility.

v2:
 * Detect IGP and keep legacy name. (Michal)
 * Use PCI device name as suffix. (Michal, Chris)

v3:
 * Constify the name. (Chris)
 * Use pci_domain_nr. (Chris)

v4:
 * Fix kfree_const usage. (Chris)

v5:
 * kfree_const does not work for modules. (Chris)
 * Changed is_igp helper to take i915.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20191016093802.12483-1-tvrtko.ursulin@linux.intel.com
  • Loading branch information
Tvrtko Ursulin committed Oct 17, 2019
1 parent eb8de23 commit 0548867
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
29 changes: 27 additions & 2 deletions drivers/gpu/drm/i915/i915_pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,17 @@ static void i915_pmu_unregister_cpuhp_state(struct i915_pmu *pmu)
cpuhp_remove_multi_state(cpuhp_slot);
}

static bool is_igp(struct drm_i915_private *i915)
{
struct pci_dev *pdev = i915->drm.pdev;

/* IGP is 0000:00:02.0 */
return pci_domain_nr(pdev->bus) == 0 &&
pdev->bus->number == 0 &&
PCI_SLOT(pdev->devfn) == 2 &&
PCI_FUNC(pdev->devfn) == 0;
}

void i915_pmu_register(struct drm_i915_private *i915)
{
struct i915_pmu *pmu = &i915->pmu;
Expand Down Expand Up @@ -1110,10 +1121,19 @@ void i915_pmu_register(struct drm_i915_private *i915)
hrtimer_init(&pmu->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
pmu->timer.function = i915_sample;

ret = perf_pmu_register(&pmu->base, "i915", -1);
if (ret)
if (!is_igp(i915))
pmu->name = kasprintf(GFP_KERNEL,
"i915-%s",
dev_name(i915->drm.dev));
else
pmu->name = "i915";
if (!pmu->name)
goto err;

ret = perf_pmu_register(&pmu->base, pmu->name, -1);
if (ret)
goto err_name;

ret = i915_pmu_register_cpuhp_state(pmu);
if (ret)
goto err_unreg;
Expand All @@ -1122,6 +1142,9 @@ void i915_pmu_register(struct drm_i915_private *i915)

err_unreg:
perf_pmu_unregister(&pmu->base);
err_name:
if (!is_igp(i915))
kfree(pmu->name);
err:
pmu->base.event_init = NULL;
free_event_attributes(pmu);
Expand All @@ -1143,5 +1166,7 @@ void i915_pmu_unregister(struct drm_i915_private *i915)

perf_pmu_unregister(&pmu->base);
pmu->base.event_init = NULL;
if (!is_igp(i915))
kfree(pmu->name);
free_event_attributes(pmu);
}
4 changes: 4 additions & 0 deletions drivers/gpu/drm/i915/i915_pmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ struct i915_pmu {
* @base: PMU base.
*/
struct pmu base;
/**
* @name: Name as registered with perf core.
*/
const char *name;
/**
* @lock: Lock protecting enable mask and ref count handling.
*/
Expand Down

0 comments on commit 0548867

Please sign in to comment.