Re: [PATCH v2 07/13] mailbox: pcc: Always map the shared memory communication address

Adam Young
2025-03-12T22:29:16Z

On 3/5/25 11:38, Sudeep Holla wrote:
> Currently the shared memory communication address was mapped by the
> mailbox client drivers leading to all sorts of inconsistencies.
>
> It also has resulted in the inconsistent attributes used while mapping
> the shared memory regions.
>
> In order to remove/eliminate any issues, let us ensures the shared
> memory address is always mapped and unmapped when the PCC channels are
> requested and release.
>
> We need to map them as the ACPI PCCT associates these shared memory
> with each channel subspace and may need use the status or the flags in
> the headers of those shared memory communication address regions to
> manage the transport/channel.
>
> Since there are no users of pcc_chan_ioremap() and also it is mapped
> by default, we can stop exporting it and merge the functionality into
> pcc_mbox_request_channel().
>
> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
> ---
> drivers/mailbox/pcc.c | 29 +++++++++--------------------
> include/acpi/pcc.h | 5 -----
> 2 files changed, 9 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c
> index 41bd14851216e8c4f03052c81aaf938a5e5c5343..b3d133170aac7f8acfd1999564c69b7fe4f6d582 100644
> --- a/drivers/mailbox/pcc.c
> +++ b/drivers/mailbox/pcc.c
> @@ -372,6 +372,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p)
> struct pcc_mbox_chan *
> pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)
> {
> + struct pcc_mbox_chan *pcc_mchan;
> struct pcc_chan_info *pchan;
> struct mbox_chan *chan;
> int rc;
> @@ -390,7 +391,14 @@ pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)
> if (rc)
> return ERR_PTR(rc);
>
> - return &pchan->chan;
> + pcc_mchan = &pchan->chan;
> + pcc_mchan->shmem = acpi_os_ioremap(pcc_mchan->shmem_base_addr,
> + pcc_mchan->shmem_size);
> + if (pcc_mchan->shmem)
> + return pcc_mchan;
> +
> + mbox_free_channel(chan);
> + return ERR_PTR(-ENXIO);
> }
> EXPORT_SYMBOL_GPL(pcc_mbox_request_channel);
>
> @@ -419,25 +427,6 @@ void pcc_mbox_free_channel(struct pcc_mbox_chan *pchan)
> }
> EXPORT_SYMBOL_GPL(pcc_mbox_free_channel);
>
> -int pcc_mbox_ioremap(struct mbox_chan *chan)
> -{
> - struct pcc_chan_info *pchan_info;
> - struct pcc_mbox_chan *pcc_mbox_chan;
> -
> - if (!chan || !chan->cl)
> - return -1;
> - pchan_info = chan->con_priv;
> - pcc_mbox_chan = &pchan_info->chan;
> -
> - pcc_mbox_chan->shmem = acpi_os_ioremap(pcc_mbox_chan->shmem_base_addr,
> - pcc_mbox_chan->shmem_size);
> - if (!pcc_mbox_chan->shmem)
> - return -ENXIO;
> -
> - return 0;
> -}
> -EXPORT_SYMBOL_GPL(pcc_mbox_ioremap);
> -
> /**
> * pcc_send_data - Called from Mailbox Controller code. Used
> * here only to ring the channel doorbell. The PCC client
> diff --git a/include/acpi/pcc.h b/include/acpi/pcc.h
> index d1e506f041c5a80857d4a025fa3c1803746ba4b9..840bfc95bae3329605da5f66cf37b7d2ca183f48 100644
> --- a/include/acpi/pcc.h
> +++ b/include/acpi/pcc.h
> @@ -37,7 +37,6 @@ struct pcc_mbox_chan {
> extern struct pcc_mbox_chan *
> pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id);
> extern void pcc_mbox_free_channel(struct pcc_mbox_chan *chan);
> -extern int pcc_mbox_ioremap(struct mbox_chan *chan);
> #else
> static inline struct pcc_mbox_chan *
> pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)
> @@ -45,10 +44,6 @@ pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)
> return ERR_PTR(-ENODEV);
> }
> static inline void pcc_mbox_free_channel(struct pcc_mbox_chan *chan) { }
> -static inline int pcc_mbox_ioremap(struct mbox_chan *chan)
> -{
> - return 0;
> -};
> #endif
>
> #endif /* _PCC_H */
>
tested-by: Adam Young <admiyo@os.amperecomputing.com>