Re: [PATCH v12 08/13] arm_mpam: propagate MSC access errors for interrupt control

From: Ben Horgan

Date: Fri Oct 02 2026 - 11:40:11 EST


Hi Andre,

On 01/10/2026 16:34, Andre Przywara wrote:
> Allow the functions dealing with interrupt registration and enablement
> to check for and return errors, and propagate MSC read and write errors
> from the lower level up.
> This does not cover the IRQ handler yet, as this needs some more
> attention.
>
> Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
> Reviewed-by: Srivathsa L Rao <srivathsa.rao@xxxxxxxxxxxxxxxx>
> Reviewed-by: Jonathan Cameron <jonathan.cameron@xxxxxxxxxxxxxxxx>

Reviewed-by: Ben Horgan <ben.horgan@xxxxxxx>

Thanks,

Ben

> ---
> drivers/resctrl/mpam_devices.c | 23 +++++++++++------------
> 1 file changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/resctrl/mpam_devices.c b/drivers/resctrl/mpam_devices.c
> index b876f4d2e9a77..60f6a39176ea1 100644
> --- a/drivers/resctrl/mpam_devices.c
> +++ b/drivers/resctrl/mpam_devices.c
> @@ -1118,7 +1118,9 @@ static int mpam_msc_hw_probe(struct mpam_msc *msc)
> }
>
> /* Clear any stale errors */
> - mpam_msc_clear_esr(msc);
> + ret = mpam_msc_clear_esr(msc);
> + if (ret)
> + return ret;
>
> spin_lock(&partid_max_lock);
> mpam_partid_max = min(mpam_partid_max, msc->partid_max);
> @@ -2681,9 +2683,7 @@ static int mpam_enable_msc_ecr(void *_msc)
> {
> struct mpam_msc *msc = _msc;
>
> - __mpam_write_reg(msc, MPAMF_ECR, MPAMF_ECR_INTEN);
> -
> - return 0;
> + return __mpam_write_reg(msc, MPAMF_ECR, MPAMF_ECR_INTEN);
> }
>
> /* This can run in mpam_disable(), and the interrupt handler on the same CPU */
> @@ -2691,9 +2691,7 @@ static int mpam_disable_msc_ecr(void *_msc)
> {
> struct mpam_msc *msc = _msc;
>
> - __mpam_write_reg(msc, MPAMF_ECR, 0);
> -
> - return 0;
> + return __mpam_write_reg(msc, MPAMF_ECR, 0);
> }
>
> static irqreturn_t __mpam_irq_handler(int irq, struct mpam_msc *msc)
> @@ -2790,11 +2788,12 @@ static int mpam_register_irqs(void)
> return err;
> }
>
> - mutex_lock(&msc->error_irq_lock);
> + guard(mutex)(&msc->error_irq_lock);
> msc->error_irq_req = true;
> - mpam_touch_msc(msc, mpam_enable_msc_ecr, msc);
> + err = mpam_touch_msc(msc, mpam_enable_msc_ecr, msc);
> + if (err)
> + return err;
> msc->error_irq_hw_enabled = true;
> - mutex_unlock(&msc->error_irq_lock);
> }
>
> return 0;
> @@ -2815,8 +2814,8 @@ static void mpam_unregister_irqs(void)
>
> mutex_lock(&msc->error_irq_lock);
> if (msc->error_irq_hw_enabled) {
> - mpam_touch_msc(msc, mpam_disable_msc_ecr, msc);
> - msc->error_irq_hw_enabled = false;
> + if (!mpam_touch_msc(msc, mpam_disable_msc_ecr, msc))
> + msc->error_irq_hw_enabled = false;
> }
>
> if (msc->error_irq_req) {