mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 22:02:28 +00:00
remoteproc: k3-r5: Simplify cluster mode setting usage
Check the validity of mode against SoC supported modes right at the probe to minimize the usage of same check further in the code. Set default value of cluster-mode only if cluster-mode device tree property is empty. In case devicetree provided cluster-mode property is invalid For e.g. using CLUSTER_MODE_SINGLECPU on any SoC other than am64x then return error. If firmware has set the PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY flag then what it means is that only CLUSTER_MODE_SINGLECPU is possible to use [1] and hence there is no need to check for soc_data->single_cpu_mode first and then checking cluster mode. PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE flag can be set directly for CLUSTER_MODE_SINGLECPU without checking for soc_data->single_cpu_mode since that check has already been done during probe. For IPC-only mode, directly override cluster mode as per config flag set by bootloader without checking for soc specific data. This because config flag would already have been validated by firmware when bootloader was setting it. Link: [1] https://software-dl.ti.com/tisci/esd/latest/2_tisci_msgs/security/PROC_BOOT.html?highlight=singlecore_only#arm-r5 Signed-off-by: Devarsh Thakkar <devarsht@ti.com> Link: https://lore.kernel.org/r/20230327152832.923480-2-devarsht@ti.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
This commit is contained in:
parent
e19967994d
commit
7f40291927
@ -852,38 +852,33 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc)
|
|||||||
dev_dbg(dev, "boot_vector = 0x%llx, cfg = 0x%x ctrl = 0x%x stat = 0x%x\n",
|
dev_dbg(dev, "boot_vector = 0x%llx, cfg = 0x%x ctrl = 0x%x stat = 0x%x\n",
|
||||||
boot_vec, cfg, ctrl, stat);
|
boot_vec, cfg, ctrl, stat);
|
||||||
|
|
||||||
/* check if only Single-CPU mode is supported on applicable SoCs */
|
single_cpu = !!(stat & PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY);
|
||||||
if (cluster->soc_data->single_cpu_mode) {
|
lockstep_en = !!(stat & PROC_BOOT_STATUS_FLAG_R5_LOCKSTEP_PERMITTED);
|
||||||
single_cpu =
|
|
||||||
!!(stat & PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY);
|
/* Override to single CPU mode if set in status flag */
|
||||||
if (single_cpu && cluster->mode == CLUSTER_MODE_SPLIT) {
|
if (single_cpu && cluster->mode == CLUSTER_MODE_SPLIT) {
|
||||||
dev_err(cluster->dev, "split-mode not permitted, force configuring for single-cpu mode\n");
|
dev_err(cluster->dev, "split-mode not permitted, force configuring for single-cpu mode\n");
|
||||||
cluster->mode = CLUSTER_MODE_SINGLECPU;
|
cluster->mode = CLUSTER_MODE_SINGLECPU;
|
||||||
}
|
|
||||||
goto config;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check conventional LockStep vs Split mode configuration */
|
/* Override to split mode if lockstep enable bit is not set in status flag */
|
||||||
lockstep_en = !!(stat & PROC_BOOT_STATUS_FLAG_R5_LOCKSTEP_PERMITTED);
|
|
||||||
if (!lockstep_en && cluster->mode == CLUSTER_MODE_LOCKSTEP) {
|
if (!lockstep_en && cluster->mode == CLUSTER_MODE_LOCKSTEP) {
|
||||||
dev_err(cluster->dev, "lockstep mode not permitted, force configuring for split-mode\n");
|
dev_err(cluster->dev, "lockstep mode not permitted, force configuring for split-mode\n");
|
||||||
cluster->mode = CLUSTER_MODE_SPLIT;
|
cluster->mode = CLUSTER_MODE_SPLIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
config:
|
|
||||||
/* always enable ARM mode and set boot vector to 0 */
|
/* always enable ARM mode and set boot vector to 0 */
|
||||||
boot_vec = 0x0;
|
boot_vec = 0x0;
|
||||||
if (core == core0) {
|
if (core == core0) {
|
||||||
clr_cfg = PROC_BOOT_CFG_FLAG_R5_TEINIT;
|
clr_cfg = PROC_BOOT_CFG_FLAG_R5_TEINIT;
|
||||||
if (cluster->soc_data->single_cpu_mode) {
|
/*
|
||||||
/*
|
* Single-CPU configuration bit can only be configured
|
||||||
* Single-CPU configuration bit can only be configured
|
* on Core0 and system firmware will NACK any requests
|
||||||
* on Core0 and system firmware will NACK any requests
|
* with the bit configured, so program it only on
|
||||||
* with the bit configured, so program it only on
|
* permitted cores
|
||||||
* permitted cores
|
*/
|
||||||
*/
|
if (cluster->mode == CLUSTER_MODE_SINGLECPU) {
|
||||||
if (cluster->mode == CLUSTER_MODE_SINGLECPU)
|
set_cfg = PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE;
|
||||||
set_cfg = PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE;
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* LockStep configuration bit is Read-only on Split-mode
|
* LockStep configuration bit is Read-only on Split-mode
|
||||||
@ -1108,12 +1103,12 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc)
|
|||||||
struct k3_r5_cluster *cluster = kproc->cluster;
|
struct k3_r5_cluster *cluster = kproc->cluster;
|
||||||
struct k3_r5_core *core = kproc->core;
|
struct k3_r5_core *core = kproc->core;
|
||||||
struct device *cdev = core->dev;
|
struct device *cdev = core->dev;
|
||||||
bool r_state = false, c_state = false;
|
bool r_state = false, c_state = false, lockstep_en = false, single_cpu = false;
|
||||||
u32 ctrl = 0, cfg = 0, stat = 0, halted = 0;
|
u32 ctrl = 0, cfg = 0, stat = 0, halted = 0;
|
||||||
u64 boot_vec = 0;
|
u64 boot_vec = 0;
|
||||||
u32 atcm_enable, btcm_enable, loczrama;
|
u32 atcm_enable, btcm_enable, loczrama;
|
||||||
struct k3_r5_core *core0;
|
struct k3_r5_core *core0;
|
||||||
enum cluster_mode mode;
|
enum cluster_mode mode = cluster->mode;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);
|
core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);
|
||||||
@ -1147,13 +1142,14 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc)
|
|||||||
atcm_enable = cfg & PROC_BOOT_CFG_FLAG_R5_ATCM_EN ? 1 : 0;
|
atcm_enable = cfg & PROC_BOOT_CFG_FLAG_R5_ATCM_EN ? 1 : 0;
|
||||||
btcm_enable = cfg & PROC_BOOT_CFG_FLAG_R5_BTCM_EN ? 1 : 0;
|
btcm_enable = cfg & PROC_BOOT_CFG_FLAG_R5_BTCM_EN ? 1 : 0;
|
||||||
loczrama = cfg & PROC_BOOT_CFG_FLAG_R5_TCM_RSTBASE ? 1 : 0;
|
loczrama = cfg & PROC_BOOT_CFG_FLAG_R5_TCM_RSTBASE ? 1 : 0;
|
||||||
if (cluster->soc_data->single_cpu_mode) {
|
single_cpu = cfg & PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ? 1 : 0;
|
||||||
mode = cfg & PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?
|
lockstep_en = cfg & PROC_BOOT_CFG_FLAG_R5_LOCKSTEP ? 1 : 0;
|
||||||
CLUSTER_MODE_SINGLECPU : CLUSTER_MODE_SPLIT;
|
|
||||||
} else {
|
if (single_cpu)
|
||||||
mode = cfg & PROC_BOOT_CFG_FLAG_R5_LOCKSTEP ?
|
mode = CLUSTER_MODE_SINGLECPU;
|
||||||
CLUSTER_MODE_LOCKSTEP : CLUSTER_MODE_SPLIT;
|
if (lockstep_en)
|
||||||
}
|
mode = CLUSTER_MODE_LOCKSTEP;
|
||||||
|
|
||||||
halted = ctrl & PROC_BOOT_CTRL_FLAG_R5_CORE_HALT;
|
halted = ctrl & PROC_BOOT_CTRL_FLAG_R5_CORE_HALT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1700,12 +1696,6 @@ static int k3_r5_probe(struct platform_device *pdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cluster->dev = dev;
|
cluster->dev = dev;
|
||||||
/*
|
|
||||||
* default to most common efuse configurations - Split-mode on AM64x
|
|
||||||
* and LockStep-mode on all others
|
|
||||||
*/
|
|
||||||
cluster->mode = data->single_cpu_mode ?
|
|
||||||
CLUSTER_MODE_SPLIT : CLUSTER_MODE_LOCKSTEP;
|
|
||||||
cluster->soc_data = data;
|
cluster->soc_data = data;
|
||||||
INIT_LIST_HEAD(&cluster->cores);
|
INIT_LIST_HEAD(&cluster->cores);
|
||||||
|
|
||||||
@ -1716,6 +1706,20 @@ static int k3_r5_probe(struct platform_device *pdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret == -EINVAL) {
|
||||||
|
/*
|
||||||
|
* default to most common efuse configurations - Split-mode on AM64x
|
||||||
|
* and LockStep-mode on all others
|
||||||
|
*/
|
||||||
|
cluster->mode = data->single_cpu_mode ?
|
||||||
|
CLUSTER_MODE_SPLIT : CLUSTER_MODE_LOCKSTEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cluster->mode == CLUSTER_MODE_SINGLECPU && !data->single_cpu_mode) {
|
||||||
|
dev_err(dev, "Cluster mode = %d is not supported on this SoC\n", cluster->mode);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
num_cores = of_get_available_child_count(np);
|
num_cores = of_get_available_child_count(np);
|
||||||
if (num_cores != 2) {
|
if (num_cores != 2) {
|
||||||
dev_err(dev, "MCU cluster requires both R5F cores to be enabled, num_cores = %d\n",
|
dev_err(dev, "MCU cluster requires both R5F cores to be enabled, num_cores = %d\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user