Commit a0db3962 authored by Cristian Marussi's avatar Cristian Marussi Committed by Sudeep Holla

firmware: arm_scmi: Support only one single system power device

In order to minimize SCMI platform fw-side complexity, only one single SCMI
platform should be in charge of SCMI SystemPower protocol communications
with the OSPM. Enforce the existence of one single unique device associated
with SystemPower protocol across any possible number of SCMI platforms, and
warn if a system tries to register different SystemPower devices from
multiple platforms.

Link: https://lore.kernel.org/r/20220704101933.2981635-2-cristian.marussi@arm.comSigned-off-by: default avatarCristian Marussi <cristian.marussi@arm.com>
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent b60e0886
......@@ -60,6 +60,11 @@ static atomic_t transfer_last_id;
static DEFINE_IDR(scmi_requested_devices);
static DEFINE_MUTEX(scmi_requested_devices_mtx);
/* Track globally the creation of SCMI SystemPower related devices */
static bool scmi_syspower_registered;
/* Protect access to scmi_syspower_registered */
static DEFINE_MUTEX(scmi_syspower_mtx);
struct scmi_requested_dev {
const struct scmi_device_id *id_table;
struct list_head node;
......@@ -1870,21 +1875,39 @@ scmi_get_protocol_device(struct device_node *np, struct scmi_info *info,
if (sdev)
return sdev;
mutex_lock(&scmi_syspower_mtx);
if (prot_id == SCMI_PROTOCOL_SYSTEM && scmi_syspower_registered) {
dev_warn(info->dev,
"SCMI SystemPower protocol device must be unique !\n");
mutex_unlock(&scmi_syspower_mtx);
return NULL;
}
pr_debug("Creating SCMI device (%s) for protocol %x\n", name, prot_id);
sdev = scmi_device_create(np, info->dev, prot_id, name);
if (!sdev) {
dev_err(info->dev, "failed to create %d protocol device\n",
prot_id);
mutex_unlock(&scmi_syspower_mtx);
return NULL;
}
if (scmi_txrx_setup(info, &sdev->dev, prot_id)) {
dev_err(&sdev->dev, "failed to setup transport\n");
scmi_device_destroy(sdev);
mutex_unlock(&scmi_syspower_mtx);
return NULL;
}
if (prot_id == SCMI_PROTOCOL_SYSTEM)
scmi_syspower_registered = true;
mutex_unlock(&scmi_syspower_mtx);
return sdev;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment