Re: [PATCH v6 10/10] arm_mpam: detect and enable MPAM-Fb PCC support
Jonathan Cameron <[email protected]> Thu, 30 Jul 2026 12:17:20 -0700
| Newsgroups | org.kernel.vger.linux-acpi,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Organization | Qualcomm |
| Message-ID | <[email protected]> |
On Thu, 30 Jul 2026 17:25:39 +0200 Andre Przywara <[email protected]> wrote: > The Arm MPAM-Fb specification [1] describes a protocol to access MSC > registers through a firmware interface. This requires a shared memory > region to hold the message, and a mailbox to trigger the access. > For ACPI this is wrapped as a PCC channel, described using existing > ACPI abstractions. > > Add code to parse those PCC table descriptions associated with an MSC, > and store the parsed information in the MSC struct. > There can be multiple PCC channels, and each channel can serve multiple > MSCs, so we need to keep track of the channel usage, using a list and > a refcount. > > This will be used by the MPAM-Fb access wrapper code. > > [1] https://developer.arm.com/documentation/den0144/latest > > Signed-off-by: Andre Przywara <[email protected]> > Tested-by: Ritwick Sharma <[email protected]> One trivial thing inline. With that resolved Reviewed-by: Jonathan Cameron <[email protected]> > --- > drivers/resctrl/mpam_devices.c | 111 +++++++++++++++++++++++++++++++- > drivers/resctrl/mpam_fb.c | 41 ++++++++++++ > drivers/resctrl/mpam_internal.h | 2 + > 3 files changed, 152 insertions(+), 2 deletions(-) > > diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c > index 606ae4af2be9..8490034c7db9 100644 > --- a/drivers/resctrl/mpam_devices.c > +++ b/drivers/resctrl/mpam_devices.c .. > @@ -2232,7 +2317,7 @@ static void mpam_msc_drv_remove(struct platform_device *pdev) > static struct mpam_msc *do_mpam_msc_drv_probe(struct platform_device *pdev) > { > int err; > - u32 tmp; > + u32 pcc_subspace_id; > struct mpam_msc *msc; > struct resource *msc_res; > struct device *dev = &pdev->dev; > @@ -2280,7 +2365,7 @@ static struct mpam_msc *do_mpam_msc_drv_probe(struct platform_device *pdev) > if (err) > return ERR_PTR(err); > > - if (device_property_read_u32(&pdev->dev, "pcc-channel", &tmp)) > + if (device_property_read_u32(dev, "pcc-channel", &pcc_subspace_id)) > msc->iface = MPAM_IFACE_MMIO; > else > msc->iface = MPAM_IFACE_PCC; > @@ -2296,6 +2381,28 @@ static struct mpam_msc *do_mpam_msc_drv_probe(struct platform_device *pdev) > } > msc->mapped_hwpage_sz = msc_res->end - msc_res->start; > msc->mapped_hwpage = io; > + } else if (msc->iface == MPAM_IFACE_PCC) { > + int ret; Trivial but why not use already defined err? > + > + msc->pcc_chan = mpam_pcc_chan_get(dev, pcc_subspace_id); > + if (IS_ERR(msc->pcc_chan)) { > + pr_err("Failed to request MSC PCC channel\n"); > + return ERR_CAST(msc->pcc_chan); > + } > + > + ret = mpam_fb_check_shared_buffer_size(msc); > + if (ret) { > + mpam_pcc_chan_put(msc->pcc_chan); > + > + return ERR_PTR(ret); > + } > + > + ret = mpam_fb_check_protocol_version(msc); > + if (ret) { > + mpam_pcc_chan_put(msc->pcc_chan); > + > + return ERR_PTR(ret); > + } > } else { > return ERR_PTR(-EINVAL); > }