All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andre Przywara <andre.przywara@arm.com>
To: Srivathsa L Rao <srivathsa.rao@oss.qualcomm.com>,
	Lorenzo Pieralisi <lpieralisi@kernel.org>,
	Hanjun Guo <guohanjun@huawei.com>,
	Sudeep Holla <sudeep.holla@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	Len Brown <lenb@kernel.org>, James Morse <james.morse@arm.com>,
	Ben Horgan <ben.horgan@arm.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	Fenghua Yu <fenghuay@nvidia.com>
Cc: Jonathan Cameron <jic23@kernel.org>,
	Ganapatrao Kulkarni <ganapatrao.kulkarni@oss.qualcomm.com>,
	Trilok Soni <tsoni@quicinc.com>,
	Srinivas Ramana <sramana@qti.qualcomm.com>,
	Niyas Sait <niyas.sait@arm.com>, Lee Trager <lee@trager.us>,
	linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 08/10] arm_mpam: add MPAM-Fb MSC firmware access support
Date: Thu, 30 Jul 2026 11:55:49 +0200	[thread overview]
Message-ID: <89c8a581-05e1-440e-bee3-d36c2e034fcc@arm.com> (raw)
In-Reply-To: <c74c2a72-a343-45b8-b77b-61e0efafe345@oss.qualcomm.com>

Hey Srivathsa,

On 7/29/26 18:13, Srivathsa L Rao wrote:
> Hi Andre,
> 
> On 7/29/2026 7:11 PM, Andre Przywara wrote:
>> The Arm MPAM Firmware-backed (Fb) Profile document[1] describes an
>> alternative way of accessing the "Memory System Components" (MSC) in an
>> MPAM enabled system.
>>
>> Normally the MSCs are MMIO mapped, but in some implementations this
>> might not be possible (MSC located outside of the local socket, MSC
>> mapped secure-only) or desirable (direct MMIO access too slow or needs
>> to be mediated through a control processor). MPAM-fb standardises a
>> protocol to abstract MSC accesses, building on the SCMI protocol.
>>
>> Add functions that do an MSC read or write access by redirecting the
>> request through a firmware interface. For now this done via an ACPI
>> PCC shared memory and mailbox combination.
>>
>> Since the protocol used is only a small subset of the full SCMI spec,
>> and the SCMI protocol has no full ACPI support anyway, open-code the
>> (simple) SCMI message generation, for just the fields we need.
>>
>> [1] https://developer.arm.com/documentation/den0144/latest
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>> ---
>>   drivers/resctrl/Makefile        |   2 +-
>>   drivers/resctrl/mpam_devices.c  |  52 ++++++--
>>   drivers/resctrl/mpam_fb.c       | 214 ++++++++++++++++++++++++++++++++
>>   drivers/resctrl/mpam_internal.h |  22 ++++
>>   include/linux/arm_mpam.h        |   2 +-
>>   5 files changed, 279 insertions(+), 13 deletions(-)
>>   create mode 100644 drivers/resctrl/mpam_fb.c
>>
>> diff --git a/drivers/resctrl/Makefile b/drivers/resctrl/Makefile
>> index 4f6d0e81f9b8..097c036724e9 100644
>> --- a/drivers/resctrl/Makefile
>> +++ b/drivers/resctrl/Makefile
>> @@ -1,5 +1,5 @@
>>   obj-$(CONFIG_ARM64_MPAM_DRIVER)            += mpam.o
>> -mpam-y                        += mpam_devices.o
>> +mpam-y                        += mpam_devices.o mpam_fb.o
>>   mpam-$(CONFIG_ARM64_MPAM_RESCTRL_FS)        += mpam_resctrl.o
>>   ccflags-$(CONFIG_ARM64_MPAM_DRIVER_DEBUG)    += -DDEBUG
>> diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/ 
>> mpam_devices.c
>> index f6910ab3bbc2..abe1e628928f 100644
>> --- a/drivers/resctrl/mpam_devices.c
>> +++ b/drivers/resctrl/mpam_devices.c

[ ... ]

>> +static int mpam_fb_send_request(struct mpam_pcc_chan *pcc_chan, u32 
>> msc_id,
>> +                u16 reg, u32 *result, int mpam_fb_command)
>> +{
>> +    unsigned int token = atomic_inc_return(&mpam_fb_token);
>> +    struct acpi_pcct_ext_pcc_shared_memory __iomem *pcc_shmem;
>> +    struct pcc_mbox_chan *chan;
>> +    void __iomem *payload_ofs;
>> +    u32 status;
>> +    int ret;
>> +
>> +    if (!pcc_chan)
>> +        return -ENODEV;
>> +
>> +    chan = pcc_chan->pcc_chan;
>> +
>> +    /* prune token to fit into the 10 bits inside the command 
>> register */
>> +    token = FIELD_GET(MPAM_MSC_TOKEN_MASK,
>> +              FIELD_PREP(MPAM_MSC_TOKEN_MASK, token));
>> +
>> +    guard(mutex)(&pcc_chan->pcc_chan_lock);
>> +
>> +    switch (mpam_fb_command) {
>> +    case MPAM_MSC_WRITE_CMD:
>> +        mpam_fb_build_write_message(msc_id, reg, *result,
>> +                        token, chan->shmem);
>> +        break;
>> +    case MPAM_MSC_READ_CMD:
>> +        mpam_fb_build_read_message(msc_id, reg, token, chan->shmem);
>> +        break;
>> +    case MPAM_PROTOCOL_VERSION_CMD:
>> +        mpam_fb_build_version_message(token, chan->shmem);
>> +        break;
>> +    default:
>> +        dev_err(pcc_chan->pcc_cl.dev, "unsupported MPAM-Fb command 
>> %d\n",
>> +            mpam_fb_command);
>> +        ret = -EINVAL;
>> +        goto out_err;
>> +    }
>> +
>> +    ret = mbox_send_message(chan->mchan, NULL);
>> +    if (ret < 0)
>> +        goto out_err;
>> +
>> +    pcc_shmem = chan->shmem;
>> +    payload_ofs = chan->shmem + sizeof(*pcc_shmem);
>> +    status = readl(&pcc_shmem->command);
>> +    if (FIELD_GET(MPAM_MSC_TOKEN_MASK, status) != token) {
>> +        ret = -ETIMEDOUT;
>> +
>> +        goto out_err;
>> +    }
>> +
>> +    ret = readl(payload_ofs + 0x0);
>> +    if (ret < 0) {
>> +        switch (ret) {
>> +        case MPAM_FB_ERR_NOT_SUPPORTED:
>> +            ret = -EOPNOTSUPP;
>> +            break;
>> +        case MPAM_FB_ERR_INVALID_PARAMETERS:
>> +            ret = -EINVAL;
>> +            break;
>> +        case MPAM_FB_ERR_NOT_FOUND:
>> +            ret = -ENOENT;
>> +            break;
>> +        case MPAM_FB_ERR_OUT_OF_RANGE:
>> +            ret = -ERANGE;
>> +            break;
> 
> While testing v4 on a QEMU setup with a fake PCC-backed MSC, I added a
> small error injection mechanism to verify the firmware response status
> code translations in mpam_fb_send_request(). I injected each defined
> MPAM_FB_ERR_* code and observed the following.

Ah, very nice, thanks for doing this!

>> +        default:
>> +            ret = -EINVAL;
>> +        }
>> +
>> +        goto out_err;
>> +    }
> 
> MPAM_FB_ERR_BUSY (-6) falls through to this default and gets -EINVAL.
> Would -EAGAIN be more appropriate here?  Callers could then maybe add a 

Oh, sure, I somehow missed that, even though it's one of the more 
obvious mappings and probably even the most useful one.

Thanks for catching that, added.

Cheers,
Andre

> short retry loop inside mpam_fb_send_request() itself, or in the probe 
> path, convert -EAGAIN to -EPROBE_DEFER so the driver core retries probe 
> automatically.
> 
> The other unhandled codes also collapse to -EINVAL, like EPROTO, EBUSY, 
> I guess that can come later.
> 
>> +
>> +    if (mpam_fb_command != MPAM_MSC_WRITE_CMD)
>> +        *result = readl(payload_ofs + 0x4);
>> +
>> +    return 0;
>> +
>> +out_err:
>> +    mpam_fb_disable_mpam(ret);
>> +
>> +    return ret;
>> +}
>> +
>> +int mpam_fb_send_read_request(struct mpam_msc *msc, u16 reg, u32 
>> *result)
>> +{
>> +    return mpam_fb_send_request(msc->pcc_chan, msc->mpam_fb_msc_id,
>> +                    reg, result, MPAM_MSC_READ_CMD);
>> +}
>> +
>> +int mpam_fb_send_write_request(struct mpam_msc *msc, u16 reg, u32 value)
>> +{
>> +    return mpam_fb_send_request(msc->pcc_chan, msc->mpam_fb_msc_id,
>> +                    reg, &value, MPAM_MSC_WRITE_CMD);
>> +}
>> +
>> +int mpam_fb_get_protocol_version(struct mpam_msc *msc)
>> +{
>> +    u32 version;
>> +    int ret;
>> +
>> +    ret = mpam_fb_send_request(msc->pcc_chan, 0,
>> +                   0, &version, MPAM_PROTOCOL_VERSION_CMD);
>> +    if (ret)
>> +        return ret;
>> +
>> +    return version;
>> +}
>> diff --git a/drivers/resctrl/mpam_internal.h b/drivers/resctrl/ 
>> mpam_internal.h
>> index 2b81b6b0bf4e..a2193e7df57c 100644
>> --- a/drivers/resctrl/mpam_internal.h
>> +++ b/drivers/resctrl/mpam_internal.h
>> @@ -11,6 +11,7 @@
>>   #include <linux/io.h>
>>   #include <linux/jump_label.h>
>>   #include <linux/llist.h>
>> +#include <linux/mailbox_client.h>
>>   #include <linux/mutex.h>
>>   #include <linux/resctrl.h>
>>   #include <linux/spinlock.h>
>> @@ -57,6 +58,15 @@ struct mpam_garbage {
>>       struct platform_device    *pdev;
>>   };
>> +struct mpam_pcc_chan {
>> +    struct list_head    pcc_chans;
>> +    struct mbox_client    pcc_cl;
>> +    struct pcc_mbox_chan    *pcc_chan;
>> +    struct mutex        pcc_chan_lock; /* only one message at a time */
>> +    struct kref        refcount;
>> +    int            subspace_id;
>> +};
>> +
>>   struct mpam_msc {
>>       /* member of mpam_all_msc */
>>       struct list_head    all_msc_list;
>> @@ -66,6 +76,8 @@ struct mpam_msc {
>>       /* Not modified after mpam_is_enabled() becomes true */
>>       enum mpam_msc_iface    iface;
>> +    struct mpam_pcc_chan    *pcc_chan;
>> +    int            mpam_fb_msc_id;    /* in its own name space */
>>       u32            nrdy_usec;
>>       cpumask_t        accessibility;
>>       bool            has_extd_esr;
>> @@ -484,6 +496,9 @@ extern u8 mpam_pmg_max;
>>   void mpam_enable(struct work_struct *work);
>>   void mpam_disable(struct work_struct *work);
>> +/* helper function to call from outside mpam_devices.c */
>> +void mpam_fb_disable_mpam(int err);
>> +
>>   /* Reset all the RIS in a class under cpus_read_lock() */
>>   void mpam_reset_class_locked(struct mpam_class *class);
>> @@ -511,6 +526,13 @@ static inline void 
>> mpam_resctrl_offline_cpu(unsigned int cpu) { }
>>   static inline void mpam_resctrl_teardown_class(struct mpam_class 
>> *class) { }
>>   #endif /* CONFIG_RESCTRL_FS */
>> +/* MPAM-Fb Firmware-backed protocol wrappers */
>> +int mpam_fb_send_read_request(struct mpam_msc *msc, u16 reg, u32 
>> *result);
>> +int mpam_fb_send_write_request(struct mpam_msc *msc, u16 reg, u32 
>> value);
>> +int mpam_fb_get_protocol_version(struct mpam_msc *msc);
>> +
>> +#define MPAM_FB_PROT_HEADER_LEN        sizeof(u32)
>> +
>>   /*
>>    * MPAM MSCs have the following register layout. See:
>>    * Arm Memory System Resource Partitioning and Monitoring (MPAM) System
>> diff --git a/include/linux/arm_mpam.h b/include/linux/arm_mpam.h
>> index f92a36187a52..002f56e15362 100644
>> --- a/include/linux/arm_mpam.h
>> +++ b/include/linux/arm_mpam.h
>> @@ -12,7 +12,7 @@ struct mpam_msc;
>>   enum mpam_msc_iface {
>>       MPAM_IFACE_MMIO,    /* a real MPAM MSC */
>> -    MPAM_IFACE_PCC,        /* a fake MPAM MSC */
>> +    MPAM_IFACE_PCC,        /* using the MPAM-Fb firmware redirection */
>>   };
>>   enum mpam_class_types {
> 
> Best Regards,
> Srivathsa


  reply	other threads:[~2026-07-30  9:55 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-29 13:41 [PATCH v5 00/10] arm_mpam: Add MPAM-Fb firmware support Andre Przywara
2026-07-29 13:41 ` [PATCH v5 01/10] arm_mpam: let low level MSC accessors return an error Andre Przywara
2026-07-30 11:20   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 02/10] arm_mpam: propagate MSC access errors for hw_probe functions Andre Przywara
2026-07-30 11:21   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 03/10] arm_mpam: propagate MSC access errors for MBWU counters Andre Przywara
2026-07-30  1:33   ` Lee Trager
2026-07-30  8:20     ` Ben Horgan
2026-07-30 11:23   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 04/10] arm_mpam: propagate MSC access errors for msmon helpers Andre Przywara
2026-07-30 11:25   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 05/10] arm_mpam: propagate MSC access errors for __ris_msmon_read() Andre Przywara
2026-07-30  9:52   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 06/10] arm_mpam: propagate MSC access errors for state saving function Andre Przywara
2026-07-30 11:28   ` Ben Horgan
2026-07-29 13:41 ` [PATCH v5 07/10] arm_mpam: prepare mon_sel locking for MPAM-Fb Andre Przywara
2026-07-29 13:41 ` [PATCH v5 08/10] arm_mpam: add MPAM-Fb MSC firmware access support Andre Przywara
2026-07-29 14:51   ` Ben Horgan
2026-07-29 15:17     ` Andre Przywara
2026-07-29 16:10   ` Ben Horgan
2026-07-30 12:54     ` Andre Przywara
2026-07-29 16:13   ` Srivathsa L Rao
2026-07-30  9:55     ` Andre Przywara [this message]
2026-07-30 10:59   ` Ben Horgan
2026-07-30 12:28     ` Andre Przywara
2026-07-29 13:41 ` [PATCH v5 09/10] arm_mpam: change error IRQ to use a threaded IRQ handler Andre Przywara
2026-07-29 15:23   ` Ben Horgan
2026-07-30 12:07     ` Andre Przywara
2026-07-29 13:41 ` [PATCH v5 10/10] arm_mpam: detect and enable MPAM-Fb PCC support Andre Przywara
2026-07-30  1:34   ` Lee Trager
2026-07-30 12:47     ` Andre Przywara
2026-07-30  9:58   ` Srivathsa L Rao
2026-07-30 10:05     ` Andre Przywara
2026-07-30 11:06 ` [PATCH v5 00/10] arm_mpam: Add MPAM-Fb firmware support Ritwick Sharma

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=89c8a581-05e1-440e-bee3-d36c2e034fcc@arm.com \
    --to=andre.przywara@arm.com \
    --cc=ben.horgan@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=fenghuay@nvidia.com \
    --cc=ganapatrao.kulkarni@oss.qualcomm.com \
    --cc=guohanjun@huawei.com \
    --cc=james.morse@arm.com \
    --cc=jic23@kernel.org \
    --cc=lee@trager.us \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lpieralisi@kernel.org \
    --cc=niyas.sait@arm.com \
    --cc=rafael@kernel.org \
    --cc=reinette.chatre@intel.com \
    --cc=sramana@qti.qualcomm.com \
    --cc=srivathsa.rao@oss.qualcomm.com \
    --cc=sudeep.holla@kernel.org \
    --cc=tsoni@quicinc.com \
    --cc=will@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.