Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1368884 > unrolled thread
| Started by | Tai Nguyen <ttnguyen@apm.com> |
|---|---|
| First post | 2016-04-01 01:40 +0200 |
| Last post | 2016-04-01 14:20 +0200 |
| Articles | 7 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH 0/4] perf: Add APM X-Gene SoC Performance Monitoring Unit driver Tai Nguyen <ttnguyen@apm.com> - 2016-04-01 01:40 +0200
[PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding Tai Nguyen <ttnguyen@apm.com> - 2016-04-01 01:40 +0200
Re: [PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding Mark Rutland <mark.rutland@arm.com> - 2016-04-01 14:40 +0200
Re: [PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding Mark Rutland <mark.rutland@arm.com> - 2016-04-01 14:40 +0200
[PATCH 1/4] MAINTAINERS: Add entry for APM X-Gene SoC PMU driver Tai Nguyen <ttnguyen@apm.com> - 2016-04-01 01:50 +0200
[PATCH 4/4] arm64: dts: apm: Add APM X-Gene SoC PMU DTS entries Tai Nguyen <ttnguyen@apm.com> - 2016-04-01 01:50 +0200
Re: [PATCH 3/4] perf: xgene: Add APM X-Gene SoC Performance Monitoring Unit driver Mark Rutland <mark.rutland@arm.com> - 2016-04-01 14:20 +0200
| From | Tai Nguyen <ttnguyen@apm.com> |
|---|---|
| Date | 2016-04-01 01:40 +0200 |
| Subject | [PATCH 0/4] perf: Add APM X-Gene SoC Performance Monitoring Unit driver |
| Message-ID | <riUlX-3W5-7@gated-at.bofh.it> |
perf: Add APM X-Gene SoC Performance Monitoring Unit driver In addition to the X-Gene ARM CPU performance monitoring unit (PMU), there are PMU for the SoC system devices such as L3 cache(s), I/O bridge(s), memory controller bridges and memory. These PMU devices are loosely architected to follow the same model as the PMU for ARM cores. Signed-off-by: Tai Nguyen <ttnguyen@apm.com> Tai Nguyen (4): MAINTAINERS: Add entry for APM X-Gene SoC PMU driver Documentation: Add documentation for APM X-Gene SoC PMU DTS binding perf: xgene: Add APM X-Gene SoC Performance Monitoring Unit driver arm64: dts: apm: Add APM X-Gene SoC PMU DTS entries .../devicetree/bindings/perf/apm-xgene-pmu.txt | 116 ++ MAINTAINERS | 7 + arch/arm64/boot/dts/apm/apm-storm.dtsi | 60 + drivers/perf/Kconfig | 7 + drivers/perf/Makefile | 1 + drivers/perf/xgene_pmu.c | 1447 ++++++++++++++++++++ 6 files changed, 1638 insertions(+) create mode 100644 Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt create mode 100644 drivers/perf/xgene_pmu.c -- 1.9.1
[toc] | [next] | [standalone]
| From | Tai Nguyen <ttnguyen@apm.com> |
|---|---|
| Date | 2016-04-01 01:40 +0200 |
| Subject | [PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding |
| Message-ID | <riUlY-3W5-11@gated-at.bofh.it> |
| In reply to | #1368884 |
Documentation: Add documentation for APM X-Gene SoC PMU DTS binding
Signed-off-by: Tai Nguyen <ttnguyen@apm.com>
---
.../devicetree/bindings/perf/apm-xgene-pmu.txt | 116 +++++++++++++++++++++
1 file changed, 116 insertions(+)
create mode 100644 Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt
diff --git a/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt b/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt
new file mode 100644
index 0000000..40dfd4e
--- /dev/null
+++ b/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt
@@ -0,0 +1,116 @@
+* APM X-Gene SoC PMU bindings
+
+This is APM X-Gene SoC PMU (Performance Monitoring Unit) module.
+The following PMU devices are supported:
+
+ L3C - L3 cache controller
+ IOB - IO bridge
+ MCB - Memory controller bridge
+ MC - Memory controller
+
+The following section describes the SoC PMU DT node binding.
+
+Required properties:
+- compatible : Shall be "apm,xgene-pmu" for revision 1 or
+ "apm,xgene-pmu-v2" for revision 2.
+- regmap-csw : Regmap of the CPU switch fabric (CSW) resource.
+- regmap-mcba : Regmap of the MCB-A (memory bridge) resource.
+- regmap-mcbb : Regmap of the MCB-B (memory bridge) resource.
+- reg : First resource shall be the CPU bus PMU resource.
+- interrupts : Interrupt-specifier for PMU IRQ.
+
+Required properties for L3C subnode:
+- compatible : Shall be "apm,xgene-pmu-l3c".
+- reg : First resource shall be the L3C PMU resource.
+- index : Instance number of the L3C PMU.
+
+Required properties for IOB subnode:
+- compatible : Shall be "apm,xgene-pmu-iob".
+- reg : First resource shall be the IOB PMU resource.
+- index : Instance number of the IOB PMU.
+
+Required properties for MCB subnode:
+- compatible : Shall be "apm,xgene-pmu-mcb".
+- reg : First resource shall be the MCB PMU resource.
+- index : Instance number of the MCB PMU.
+
+Required properties for MC subnode:
+- compatible : Shall be "apm,xgene-pmu-mc".
+- reg : First resource shall be the MC PMU resource.
+- index : Instance number of the MC PMU.
+
+Example:
+ csw: csw@7e200000 {
+ compatible = "apm,xgene-csw", "syscon";
+ reg = <0x0 0x7e200000 0x0 0x1000>;
+ };
+
+ mcba: mcba@7e700000 {
+ compatible = "apm,xgene-mcb", "syscon";
+ reg = <0x0 0x7e700000 0x0 0x1000>;
+ };
+
+ mcbb: mcbb@7e720000 {
+ compatible = "apm,xgene-mcb", "syscon";
+ reg = <0x0 0x7e720000 0x0 0x1000>;
+ };
+
+ pmu: pmu@78810000 {
+ compatible = "apm,xgene-pmu-v2";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+ regmap-csw = <&csw>;
+ regmap-mcba = <&mcba>;
+ regmap-mcbb = <&mcbb>;
+ reg = <0x0 0x78810000 0x0 0x1000>;
+ interrupts = <0x0 0x22 0x4>;
+
+ pmul3c@7e610000 {
+ compatible = "apm,xgene-pmu-l3c";
+ reg = <0x0 0x7e610000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmuiob@7e940000 {
+ compatible = "apm,xgene-pmu-iob";
+ reg = <0x0 0x7e940000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmcb@7e710000 {
+ compatible = "apm,xgene-pmu-mcb";
+ reg = <0x0 0x7e710000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmcb@7e730000 {
+ compatible = "apm,xgene-pmu-mcb";
+ reg = <0x0 0x7e730000 0x0 0x1000>;
+ index = <1>;
+ };
+
+ pmucmc@7e810000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e810000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmc@7e850000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e850000 0x0 0x1000>;
+ index = <1>;
+ };
+
+ pmucmc@7e890000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e890000 0x0 0x1000>;
+ index = <2>;
+ };
+
+ pmucmc@7e8d0000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e8d0000 0x0 0x1000>;
+ index = <3>;
+ };
+ };
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Mark Rutland <mark.rutland@arm.com> |
|---|---|
| Date | 2016-04-01 14:40 +0200 |
| Subject | Re: [PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding |
| Message-ID | <rj6wN-4fI-3@gated-at.bofh.it> |
| In reply to | #1368886 |
On Fri, Apr 01, 2016 at 01:30:01PM +0100, Mark Rutland wrote: > Hi, > > As per Documentation/devicetree/bindings/submitting-patches.txt, please > put binding patches earlier in a series than the code using them. Whoops, this patch was in the right place; I'm just reading my mail wrong. Please ignore this. Thanks, Mark.
[toc] | [prev] | [next] | [standalone]
| From | Mark Rutland <mark.rutland@arm.com> |
|---|---|
| Date | 2016-04-01 14:40 +0200 |
| Subject | Re: [PATCH 2/4] Documentation: Add documentation for APM X-Gene SoC PMU DTS binding |
| Message-ID | <rj6wN-4fI-5@gated-at.bofh.it> |
| In reply to | #1368886 |
Hi, As per Documentation/devicetree/bindings/submitting-patches.txt, please put binding patches earlier in a series than the code using them. On Thu, Mar 31, 2016 at 04:37:50PM -0700, Tai Nguyen wrote: > Documentation: Add documentation for APM X-Gene SoC PMU DTS binding > > Signed-off-by: Tai Nguyen <ttnguyen@apm.com> > --- > .../devicetree/bindings/perf/apm-xgene-pmu.txt | 116 +++++++++++++++++++++ > 1 file changed, 116 insertions(+) > create mode 100644 Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt > > diff --git a/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt b/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt > new file mode 100644 > index 0000000..40dfd4e > --- /dev/null > +++ b/Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt > @@ -0,0 +1,116 @@ > +* APM X-Gene SoC PMU bindings > + > +This is APM X-Gene SoC PMU (Performance Monitoring Unit) module. > +The following PMU devices are supported: > + > + L3C - L3 cache controller > + IOB - IO bridge > + MCB - Memory controller bridge > + MC - Memory controller These sound like separate units. How do these relate? Is there an SOC-wide PMU that aggregates counters, or are these actually independent? > + > +The following section describes the SoC PMU DT node binding. > + > +Required properties: > +- compatible : Shall be "apm,xgene-pmu" for revision 1 or > + "apm,xgene-pmu-v2" for revision 2. That name is very general. Is there not a more specific name for the SOC PMU? > +Required properties for L3C subnode: > +- compatible : Shall be "apm,xgene-pmu-l3c". > +- reg : First resource shall be the L3C PMU resource. > +- index : Instance number of the L3C PMU. > + > +Required properties for IOB subnode: > +- compatible : Shall be "apm,xgene-pmu-iob". > +- reg : First resource shall be the IOB PMU resource. > +- index : Instance number of the IOB PMU. > + > +Required properties for MCB subnode: > +- compatible : Shall be "apm,xgene-pmu-mcb". > +- reg : First resource shall be the MCB PMU resource. > +- index : Instance number of the MCB PMU. > + > +Required properties for MC subnode: > +- compatible : Shall be "apm,xgene-pmu-mc". > +- reg : First resource shall be the MC PMU resource. > +- index : Instance number of the MC PMU. What's the index property useful for? Thanks, Mark.
[toc] | [prev] | [next] | [standalone]
| From | Tai Nguyen <ttnguyen@apm.com> |
|---|---|
| Date | 2016-04-01 01:50 +0200 |
| Subject | [PATCH 1/4] MAINTAINERS: Add entry for APM X-Gene SoC PMU driver |
| Message-ID | <riUvD-3Zj-1@gated-at.bofh.it> |
| In reply to | #1368884 |
MAINTAINERS: Add entry for APM X-Gene SoC PMU driver Signed-off-by: Tai Nguyen <ttnguyen@apm.com> --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 66662b8..d3fe3c6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -8505,6 +8505,13 @@ L: linux-scsi@vger.kernel.org S: Supported F: drivers/scsi/pm8001/ +PMU-XGENE +APPLIED MICRO (APM) X-GENE SOC PMU +M: Tai Nguyen <ttnguyen@apm.com> +S: Supported +F: drivers/perf/xgene_pmu.c +F: Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt + POSIX CLOCKS and TIMERS M: Thomas Gleixner <tglx@linutronix.de> L: linux-kernel@vger.kernel.org -- 1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Tai Nguyen <ttnguyen@apm.com> |
|---|---|
| Date | 2016-04-01 01:50 +0200 |
| Subject | [PATCH 4/4] arm64: dts: apm: Add APM X-Gene SoC PMU DTS entries |
| Message-ID | <riUvD-3Zj-7@gated-at.bofh.it> |
| In reply to | #1368884 |
arm64: dts: apm: Add APM X-Gene SoC PMU DTS entries
Signed-off-by: Tai Nguyen <ttnguyen@apm.com>
---
arch/arm64/boot/dts/apm/apm-storm.dtsi | 60 ++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/arch/arm64/boot/dts/apm/apm-storm.dtsi b/arch/arm64/boot/dts/apm/apm-storm.dtsi
index 6c5ed11..dc3d20b7 100644
--- a/arch/arm64/boot/dts/apm/apm-storm.dtsi
+++ b/arch/arm64/boot/dts/apm/apm-storm.dtsi
@@ -517,6 +517,66 @@
};
};
+ pmu: pmu@78810000 {
+ compatible = "apm,xgene-pmu-v2";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+ regmap-csw = <&csw>;
+ regmap-mcba = <&mcba>;
+ regmap-mcbb = <&mcbb>;
+ reg = <0x0 0x78810000 0x0 0x1000>;
+ interrupts = <0x0 0x22 0x4>;
+
+ pmul3c@7e610000 {
+ compatible = "apm,xgene-pmu-l3c";
+ reg = <0x0 0x7e610000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmuiob@7e940000 {
+ compatible = "apm,xgene-pmu-iob";
+ reg = <0x0 0x7e940000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmcb@7e710000 {
+ compatible = "apm,xgene-pmu-mcb";
+ reg = <0x0 0x7e710000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmcb@7e730000 {
+ compatible = "apm,xgene-pmu-mcb";
+ reg = <0x0 0x7e730000 0x0 0x1000>;
+ index = <1>;
+ };
+
+ pmucmc@7e810000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e810000 0x0 0x1000>;
+ index = <0>;
+ };
+
+ pmucmc@7e850000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e850000 0x0 0x1000>;
+ index = <1>;
+ };
+
+ pmucmc@7e890000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e890000 0x0 0x1000>;
+ index = <2>;
+ };
+
+ pmucmc@7e8d0000 {
+ compatible = "apm,xgene-pmu-mc";
+ reg = <0x0 0x7e8d0000 0x0 0x1000>;
+ index = <3>;
+ };
+ };
+
pcie0: pcie@1f2b0000 {
status = "disabled";
device_type = "pci";
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Mark Rutland <mark.rutland@arm.com> |
|---|---|
| Date | 2016-04-01 14:20 +0200 |
| Subject | Re: [PATCH 3/4] perf: xgene: Add APM X-Gene SoC Performance Monitoring Unit driver |
| Message-ID | <rj6ds-46Z-9@gated-at.bofh.it> |
| In reply to | #1368884 |
Hi,
I haven't reviewed this in great detail, but I spotted a few issues.
> +static int get_next_avail_cntr(struct xgene_pmu_dev *pmu_dev)
> +{
> + int shift, cntr, retval;
> + unsigned long flags;
> +
> + raw_spin_lock_irqsave(&pmu_dev->lock, flags);
> +
> + for (cntr = 0; cntr < pmu_dev->max_counters; cntr++) {
> + shift = cntr;
> + if (!(pmu_dev->cntr_assign_mask & (1ULL << shift))) {
> + pmu_dev->cntr_assign_mask |= (1ULL << shift);
> + retval = cntr;
> + goto out;
> + }
> + }
> + retval = -ENOSPC;
Please use a bitmask. Then you can do something like:
cntr = find_first_zero_bit(pmu_dev->cntr_assign_mask,
pmu_dev->max_counters);
if (cntr == pmu_dev->max_counters)
return -ENOSPC;
set_bit(cntr, pmu_dev->cntr_assign_mask);
return cntr;
Are the spinlocks necessary?
I thought add and del couldn't be called in parallel for the same
context, and those are the only users of this mask.
> +
> +out:
> + raw_spin_unlock_irqrestore(&pmu_dev->lock, flags);
> +
> + return retval;
> +}
> +
> +static int clear_avail_cntr(struct xgene_pmu_dev *pmu_dev, u8 cntr)
> +{
> + unsigned long flags;
> + int shift;
> +
> + if (cntr > pmu_dev->max_counters)
> + return -EINVAL;
This implies we have an event we tried to del, which didn't have a
counter. Surely we should never have added the event in that case, and
this should never happen?
> +
> + shift = cntr;
> +
> + raw_spin_lock_irqsave(&pmu_dev->lock, flags);
> + pmu_dev->cntr_assign_mask &= ~(1ULL << shift);
clear_bit(cntr, pmu_dev->cntr_assign_mask);
> + raw_spin_unlock_irqrestore(&pmu_dev->lock, flags);
> +
> + return 0;
> +}
[...]
> +static int xgene_perf_event_init(struct perf_event *event)
> +{
> + struct xgene_pmu_dev *pmu_dev = to_pmu_dev(event->pmu);
> + struct hw_perf_event *hwc = &event->hw;
> + u64 config, config1;
> +
> + /* test the event attr type check for PMU enumeration */
> + if (event->attr.type != event->pmu->type)
> + return -ENOENT;
> +
> + /*
> + * SOC PMU counters are shared across all cores.
> + * Therefore, it does not support per-process mode.
> + * Also, it does not support event sampling mode.
> + */
> + if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK)
> + return -EINVAL;
> +
> + /* SOC counters do not have usr/os/guest/host bits */
> + if (event->attr.exclude_user || event->attr.exclude_kernel ||
> + event->attr.exclude_host || event->attr.exclude_guest)
> + return -EINVAL;
> +
> + if (event->cpu < 0)
> + return -EINVAL;
We should really have this made common for system PMUs (e.g. librify
it). Every driver does something subtly different, and isn't kept in
sync with new core feature addition.
Even if you're happy to accept a request made with any event->cpu,
you'll need to forcefully override that and ensure that all events are
in the same percpu context.
See what we do in drivers/bus/arm-ccn.c.
> +
> + if (event->pmu != &pmu_dev->pmu)
> + return -ENOENT;
If this does need to be checked, we should so so when checking the type
above.
However, the PMU should have a unique type anyway, so the type being the
same should imply this is true anyway.
> +
> + if (pmu_dev) {
> + config = event->attr.config;
> + config1 = event->attr.config1;
> + } else {
> + return -EINVAL;
> + }
> +
How can the else case ever occur? All other PMUs have been filtered away
by this point.
> + if (pmu_dev->max_counters == 0)
> + return -EINVAL;
Why bother registering the PMU device at all in this case?
> +
> + hwc->config = config;
> + if (config1)
> + hwc->extra_reg.config = config1;
> + else
> + /* Enable all Agents */
> + hwc->extra_reg.config = 0xFFFFFFFFFFFFFFFFULL;
I'm not sure I follow what's going on here.
It would be good to document precisely what this means.
[...]
> +static int xgene_init_events_attrs(struct xgene_pmu_dev *pmu_dev,
> + struct xgene_pmu_dev_event_desc *event_desc)
> +{
> + struct attribute_group *attr_group;
> + struct attribute **attrs;
> + int i = 0, j;
> +
> + while (event_desc[i].attr.attr.name)
> + i++;
> +
> + attr_group = devm_kzalloc(pmu_dev->parent->dev,
> + sizeof(struct attribute *) * (i + 1)
> + + sizeof(*attr_group), GFP_KERNEL);
> + if (!attr_group)
> + return -ENOMEM;
> +
> + attrs = (struct attribute **)(attr_group + 1);
> + for (j = 0; j < i; j++)
> + attrs[j] = &event_desc[j].attr.attr;
> +
> + attr_group->name = "events";
> + attr_group->attrs = attrs;
> + pmu_dev->events_group = attr_group;
> +
> + return 0;
> +}
I don't think this needs to be dynamic. See what we do in
drivers/bus/arm-cci.c with CCI_EXT_ATTR_ENTRY for a simple way of
initialising the attribute pointer array at compile time.
With that, you don't need any dynamic allocation or initialisation here.
> +static void xgene_perf_pmu_init(struct xgene_pmu_dev *pmu_dev)
> +{
> + pmu_dev->pmu.event_init = xgene_perf_event_init;
> + pmu_dev->pmu.add = xgene_perf_add;
> + pmu_dev->pmu.del = xgene_perf_del;
> + pmu_dev->pmu.start = xgene_perf_start;
> + pmu_dev->pmu.stop = xgene_perf_stop;
> + pmu_dev->pmu.read = xgene_perf_read;
> +}
You'll also need to set the task_ctx_nr to perf_invalid_context, as this
is a system PMU rather than something that can profile tasks or
individual CPUs.
> +static irqreturn_t _xgene_pmu_isr(int irq, struct xgene_pmu_dev *pmu_dev)
> +{
> + struct perf_event *event = NULL;
> + struct perf_sample_data data;
> + struct xgene_pmu *xgene_pmu;
> + struct hw_perf_event *hwc;
> + struct pt_regs *regs;
This is _not_ a CPU PMU. There are no relevant pt_rregs.
> + int idx;
> + u32 val;
> +
> + /* Get interrupt counter source */
> + val = readl(pmu_dev->inf->csr + PMU_PMOVSR);
> + idx = ffs(val) - 1;
> + if (!(val & PMU_OVERFLOW_MASK))
> + goto out;
> + event = pmu_dev->pmu_counter_event[idx];
> +
> + /*
> + * Handle the counter(s) overflow(s)
> + */
> + regs = get_irq_regs();
As above, this is irrelevant.
> +
> + /* Ignore if we don't have an event. */
> + if (!event)
> + goto out;
> +
> + hwc = &event->hw;
> +
> + xgene_perf_event_update(event, hwc, idx);
> + perf_sample_data_init(&data, 0, hwc->last_period);
> + if (!xgene_perf_event_set_period(event, hwc, idx))
> + goto out;
> +
> + if (perf_event_overflow(event, &data, regs))
> + xgene_perf_disable_event(event);
perf_event_overflow skips non-sampling events (i.e. all events this PMU
is capable of), and always returns 0, so the regs aren't even used at
all...
This can/should go.
[...]
> +static int xgene_pmu_probe_active_mcb_mcu(struct xgene_pmu *xgene_pmu,
> + struct platform_device *pdev)
> +{
> + if (efi_enabled(EFI_BOOT))
> + return acpi_pmu_probe_active_mcb_mcu(xgene_pmu, pdev);
> + else
> + return fdt_pmu_probe_active_mcb_mcu(xgene_pmu, pdev);
> +}
EFI has _nothing_ to do with ACPI here.
EFI != ACPI; ECI && !ACPI is possible.
Check whether you have an of_node or an acpi companion device.
> +static int xgene_pmu_probe_pmu_dev(struct xgene_pmu *xgene_pmu,
> + struct platform_device *pdev)
> +{
> + if (efi_enabled(EFI_BOOT))
> + return acpi_pmu_probe_pmu_dev(xgene_pmu, pdev);
> + else
> + return fdt_pmu_probe_pmu_dev(xgene_pmu, pdev);
> +}
Likewise.
Thanks,
Mark.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web