From: Yin Li <yin.li@oss.qualcomm.com>
To: "Rafael J. Wysocki" <rafael@kernel.org>,
Shanker Donthineni <sdonthineni@nvidia.com>,
Conor Dooley <conor+dt@kernel.org>,
Fenghua Yu <fenghuay@nvidia.com>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Rob Herring <robh@kernel.org>,
Reinette Chatre <reinette.chatre@intel.com>,
Konrad Dybcio <konradybcio@kernel.org>,
James Morse <james.morse@arm.com>,
Ben Horgan <ben.horgan@arm.com>,
Bjorn Andersson <andersson@kernel.org>,
Danilo Krummrich <dakr@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-arm-msm@vger.kernel.org,
ganapatrao.kulkarni@oss.qualcomm.com,
trilok.soni@oss.qualcomm.com, devicetree@vger.kernel.org,
driver-core@lists.linux.dev,
Srivathsa L Rao <srivathsa.rao@oss.qualcomm.com>,
Huang Yiwei <huang.yiwei@oss.qualcomm.com>,
aiqun.yu@oss.qualcomm.com, linux-kernel@vger.kernel.org
Subject: [PATCH RFC 14/15] arm_mpam: Support MSC accessibility derivation from RIS nodes
Date: Tue, 11 Aug 2026 21:30:43 +0800 [thread overview]
Message-ID: <20260811-mpam-resctrl-dt-knp-support-v1-14-ea6397bead59@oss.qualcomm.com> (raw)
In-Reply-To: <20260811-mpam-resctrl-dt-knp-support-v1-0-ea6397bead59@oss.qualcomm.com>
The DT accessibility derivation only handled MSCs whose parent node is
a cache or memory device. When the MSC is placed under a generic
container (e.g. directly under /soc), the parent gives no affinity hint
and there is no fallback.
Add a per-RIS fallback path for when the parent node is not a
recognised cache or memory device. For each available RIS child node,
affinity is resolved in two steps: first from an explicit 'cpus'
phandle-array on the RIS node, then from the 'arm,mpam-device' phandle.
The final accessibility mask is the union of all RIS masks; if any RIS
fails to resolve, the mask is cleared and the MSC fails to probe rather
than come up with a partial affinity.
Factor the DT-specific logic into mpam_dt_update_msc_accessibility() so
that update_msc_accessibility() dispatches cleanly between ACPI and DT
paths.
Co-developed-by: Huang Yiwei <huang.yiwei@oss.qualcomm.com>
Signed-off-by: Huang Yiwei <huang.yiwei@oss.qualcomm.com>
Signed-off-by: Yin Li <yin.li@oss.qualcomm.com>
---
drivers/resctrl/mpam_devices.c | 146 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 131 insertions(+), 15 deletions(-)
diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
index d8856864e89a..d0462239deeb 100644
--- a/drivers/resctrl/mpam_devices.c
+++ b/drivers/resctrl/mpam_devices.c
@@ -2156,6 +2156,136 @@ static int mpam_msc_setup_error_irq(struct mpam_msc *msc)
return 0;
}
+/*
+ * Resolve a RIS to its CPU affinity from its 'cpus' phandle-array.
+ * Returns -ENODEV when 'cpus' is absent (the caller may use another source),
+ * -EINVAL when any phandle is invalid, or 0 on full success.
+ */
+static int get_cpumask_from_ris_cpus(struct device_node *ris_np,
+ cpumask_t *affinity)
+{
+ int i, cpu_phandle_count;
+
+ cpu_phandle_count = of_count_phandle_with_args(ris_np, "cpus", NULL);
+ if (cpu_phandle_count <= 0)
+ return -ENODEV;
+
+ for (i = 0; i < cpu_phandle_count; i++) {
+ struct device_node *phandle_np __free(device_node) =
+ of_parse_phandle(ris_np, "cpus", i);
+ int cpu, matched = -1;
+
+ if (phandle_np) {
+ for_each_possible_cpu(cpu) {
+ struct device_node *cpu_node __free(device_node) =
+ of_get_cpu_node(cpu, NULL);
+
+ if (phandle_np == cpu_node) {
+ matched = cpu;
+ break;
+ }
+ }
+ }
+
+ if (matched < 0) {
+ pr_warn("MPAM: RIS %pOF cpus[%d] (%pOF) is not a possible CPU\n",
+ ris_np, i, phandle_np);
+ return -EINVAL;
+ }
+
+ cpumask_set_cpu(matched, affinity);
+ }
+
+ return 0;
+}
+
+/*
+ * Resolve a RIS to its CPU affinity from its 'arm,mpam-device' phandle.
+ * Returns -EINVAL when 'arm,mpam-device' is absent or the phandle is invalid.
+ * 0 on full success.
+ */
+static int get_cpumask_from_ris_phandle(struct device_node *ris,
+ cpumask_t *affinity)
+{
+ struct device_node *mpam_device __free(device_node) =
+ of_parse_phandle(ris, "arm,mpam-device", 0);
+
+ if (!mpam_device) {
+ pr_warn("MPAM: RIS %pOF has neither 'cpus' nor 'arm,mpam-device'\n",
+ ris);
+ return -EINVAL;
+ }
+
+ if (of_device_is_compatible(mpam_device, "cache"))
+ return get_cpumask_from_cache(mpam_device, affinity);
+
+ if (of_device_is_compatible(mpam_device, "memory")) {
+ cpumask_or(affinity, affinity, cpu_possible_mask);
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
+static int get_cpumask_from_ris(struct device_node *ris, cpumask_t *affinity)
+{
+ int err;
+
+ err = get_cpumask_from_ris_cpus(ris, affinity);
+ if (err != -ENODEV)
+ return err;
+
+ return get_cpumask_from_ris_phandle(ris, affinity);
+}
+
+/*
+ * Returns -ENODEV when the parent is just a container (not a recognised device),
+ * so the caller falls back to the per-RIS description.
+ */
+static int get_cpumask_from_parent(struct mpam_msc *msc, cpumask_t *affinity)
+{
+ struct device_node *parent __free(device_node) =
+ of_get_parent(msc->pdev->dev.of_node);
+
+ if (parent == of_root) {
+ cpumask_copy(affinity, cpu_possible_mask);
+ return 0;
+ }
+
+ if (of_device_is_compatible(parent, "cache"))
+ return get_cpumask_from_cache(parent, affinity);
+
+ if (of_device_is_compatible(parent, "memory")) {
+ cpumask_copy(affinity, cpu_possible_mask);
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+/*
+ * An MSC's CPU affinity is described either by its parent node or, when the
+ * parent is just a container, per-RIS inside the MSC. In the per-RIS case the
+ * accessibility is the union of the RIS affinities: every RIS must resolve, so
+ * a single failure clears the mask and stops and the MSC fails to probe rather
+ * than come up with a partial affinity.
+ */
+static void mpam_dt_update_msc_accessibility(struct mpam_msc *msc)
+{
+ cpumask_t *affinity = &msc->accessibility;
+
+ cpumask_clear(affinity);
+
+ if (get_cpumask_from_parent(msc, affinity) == -ENODEV) {
+ for_each_available_child_of_node_scoped(msc->pdev->dev.of_node, ris) {
+ if (get_cpumask_from_ris(ris, affinity)) {
+ cpumask_clear(affinity);
+ break;
+ }
+ }
+ }
+}
+
/*
* An MSC can control traffic from a set of CPUs, but may only be accessible
* from a (hopefully wider) set of CPUs. The common reason for this is power
@@ -2165,8 +2295,6 @@ static int mpam_msc_setup_error_irq(struct mpam_msc *msc)
*/
static void update_msc_accessibility(struct mpam_msc *msc)
{
- struct device *dev = &msc->pdev->dev;
- struct device_node *parent;
u32 affinity_id;
int err;
@@ -2182,19 +2310,7 @@ static void update_msc_accessibility(struct mpam_msc *msc)
return;
}
- /* Where an MSC can be accessed from depends on the path to of_node. */
- parent = of_get_parent(msc->pdev->dev.of_node);
- if (parent == of_root) {
- cpumask_copy(&msc->accessibility, cpu_possible_mask);
- } else {
- if (of_device_is_compatible(parent, "cache"))
- get_cpumask_from_cache(parent, &msc->accessibility);
- else if (of_device_is_compatible(parent, "memory"))
- cpumask_copy(&msc->accessibility, cpu_possible_mask);
- else
- dev_err_once(dev, "Cannot determine accessibility of MSC.\n");
- }
- of_node_put(parent);
+ mpam_dt_update_msc_accessibility(msc);
}
/*
--
2.34.1
next prev parent reply other threads:[~2026-08-11 13:37 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 13:30 [PATCH RFC 00/15] arm-mpam: Add basic device tree support for resctrl Yin Li
2026-08-11 13:30 ` [PATCH RFC 01/15] dt-bindings: arm: Add MPAM MSC binding Yin Li
2026-09-03 10:03 ` Ben Horgan
2026-08-11 13:30 ` [PATCH RFC 02/15] cacheinfo: Expose the code to generate a cache-id from a device_node Yin Li
2026-08-25 19:11 ` Drew Fustini
2026-08-31 5:43 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 03/15] arm_mpam: Add device tree support for MSC probing Yin Li
2026-08-11 13:30 ` [PATCH RFC 04/15] arm_mpam: Add support for memory controller MSC on DT platforms Yin Li
2026-08-11 13:30 ` [PATCH RFC 05/15] arm_mpam: Fix device_node refcount in DT resource parsing Yin Li
2026-09-02 13:29 ` Andre Przywara
2026-09-03 8:07 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 06/15] arm_mpam: Fix cache ID sentinel from ~0UL to U32_MAX to match u32 return type Yin Li
2026-09-02 13:49 ` Andre Przywara
2026-09-04 3:27 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 07/15] arm_mpam: Fix the RIS index range check in mpam_ris_create_locked Yin Li
2026-09-02 14:50 ` Andre Przywara
2026-09-03 8:18 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 08/15] arm_mpam: Fix ris_idx type to prevent range check bypass on truncation Yin Li
2026-09-02 16:22 ` Andre Przywara
2026-09-03 9:42 ` Yin Li
2026-09-03 13:27 ` Andre Przywara
2026-09-04 2:42 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 09/15] arm_mpam: Fix MSC MMIO window size to use resource_size() instead of end - start Yin Li
2026-09-02 13:16 ` Andre Przywara
2026-09-03 9:45 ` Yin Li
2026-09-03 10:20 ` Ben Horgan
2026-09-03 13:23 ` Ben Horgan
2026-09-04 3:12 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 10/15] arm_mpam: Fix update_msc_accessibility() return type to void Yin Li
2026-08-11 13:30 ` [PATCH RFC 11/15] arm_mpam: Fix mpam_dt_create_foundling_msc() to create MSC platform devices Yin Li
2026-08-11 13:30 ` [PATCH RFC 12/15] arm_mpam: Fix get_cpumask_from_cache() to clear mask on error Yin Li
2026-09-02 16:03 ` Andre Przywara
2026-09-03 9:59 ` Yin Li
2026-08-11 13:30 ` [PATCH RFC 13/15] dt-bindings: arm: Fix MPAM MSC binding schema and examples Yin Li
2026-08-11 13:30 ` Yin Li [this message]
2026-08-11 13:30 ` [PATCH DNM RFC 15/15] arm64: dts: qcom: kaanapali: Add MPAM MSC nodes for the L2 caches Yin Li
2026-08-25 8:27 ` [PATCH RFC 00/15] arm-mpam: Add basic device tree support for resctrl Yin Li
2026-09-03 10:11 ` Ben Horgan
2026-09-04 2:52 ` Yin Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260811-mpam-resctrl-dt-knp-support-v1-14-ea6397bead59@oss.qualcomm.com \
--to=yin.li@oss.qualcomm.com \
--cc=aiqun.yu@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=ben.horgan@arm.com \
--cc=conor+dt@kernel.org \
--cc=dakr@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=driver-core@lists.linux.dev \
--cc=fenghuay@nvidia.com \
--cc=ganapatrao.kulkarni@oss.qualcomm.com \
--cc=gregkh@linuxfoundation.org \
--cc=huang.yiwei@oss.qualcomm.com \
--cc=james.morse@arm.com \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=reinette.chatre@intel.com \
--cc=robh@kernel.org \
--cc=sdonthineni@nvidia.com \
--cc=srivathsa.rao@oss.qualcomm.com \
--cc=trilok.soni@oss.qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox