summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSudeep Holla <sudeep.holla@arm.com>2025-10-16 22:08:19 +0300
committerJassi Brar <jassisinghbrar@gmail.com>2026-01-18 23:19:21 +0300
commit9f3bbbb72ad03378c45523b8045ac82d1ba28ae6 (patch)
tree0d93936e95b948cd79f908307aa45ffecbbe4dde
parent9c753f7c953c0c564db677773e767b8cecaee960 (diff)
downloadlinux-9f3bbbb72ad03378c45523b8045ac82d1ba28ae6.tar.xz
mailbox: pcc: Initialize SHMEM before binding the channel with the client
The PCC channel's shared memory region must be set up before the mailbox controller binds the channel with the client, as the binding process may trigger client operations like startup() that may rely on SHMEM being initialized. Reorder the setup sequence to ensure the shared memory is ready before binding. Initialize and map the PCC shared memory (SHMEM) prior to calling mbox_bind_client() so that clients never observe an uninitialized or NULL SHMEM during bind-time callbacks or early use in startup(). This makes the PCC mailbox channel bring-up order consistent and eliminates a race between SHMEM setup and client binding. This will be needed in channel startup to clear/acknowledge any pending interrupts before enabling them. Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> Acked-by: lihuisong@huawei.com Tested-by: Adam Young <admiyo@os.amperecomputing.com> Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
-rw-r--r--drivers/mailbox/pcc.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c
index 025c4cdd8d26..d8739eca5ac0 100644
--- a/drivers/mailbox/pcc.c
+++ b/drivers/mailbox/pcc.c
@@ -377,18 +377,20 @@ pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id)
return ERR_PTR(-EBUSY);
}
- rc = mbox_bind_client(chan, cl);
- if (rc)
- return ERR_PTR(rc);
-
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;
+ if (!pcc_mchan->shmem)
+ return ERR_PTR(-ENXIO);
- mbox_free_channel(chan);
- return ERR_PTR(-ENXIO);
+ rc = mbox_bind_client(chan, cl);
+ if (rc) {
+ iounmap(pcc_mchan->shmem);
+ pcc_mchan->shmem = NULL;
+ return ERR_PTR(rc);
+ }
+
+ return pcc_mchan;
}
EXPORT_SYMBOL_GPL(pcc_mbox_request_channel);