Add single core R5F IPC for AM62 SoC family
Subsystems (2)
v5 cover Add single core R5F IPC for AM62 SoC family
AM62 SoC family don't have a multicore R5F cluster, instead they have a single core R5F.
This enables IPC support with single core R5F for AM62 family of SoCs.
Devarsh Thakkar (2):
dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC
family
.../bindings/remoteproc/ti,k3-r5f-rproc.yaml | 65 ++++++++++++++----- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++---- 2 files changed, 91 insertions(+), 31 deletions(-)
Signature · 1 line
2.17.1
PATCH v5 1/2 dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
AM62 family of devices don't have a R5F cluster, instead they have single core DM R5F.
Add new compatible string ti,am62-r5fss to support this scenario.
When this new compatible is used don't allow cluster-mode property usage in device-tree as this implies that there is no R5F cluster available and only single R5F core is present.
---
V2: Avoid acronyms, use "Device Manager" instead of "DM"
V3:
- Use separate if block for each compatible for ti,cluster-mode property
- Rearrange compatibles as per alphabatical order
V4: Place each enum in separate line in allOf
V5: No change (fixing typo in email address)
--- .../bindings/remoteproc/ti,k3-r5f-rproc.yaml | 65 ++++++++++++++----- 1 file changed, 47 insertions(+), 18 deletions(-)
Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.yaml +47 -18
@@ -21,6 +21,9 @@ description: | called "Single-CPU" mode, where only Core0 is used, but with ability to use Core1's TCMs as well. + AM62 SoC family support a single R5F core only which runs Device Manager + firmware and can also be used as a remote processor with IPC communication. + Each Dual-Core R5F sub-system is represented as a single DTS node representing the cluster, with a pair of child DT nodes representing the individual R5F cores. Each node has a number of required or optional
@@ -28,16 +31,20 @@ description: | the device management of the remote processor and to communicate with the remote processor. + Since AM62 SoC family only support a single core, there is no cluster-mode + property setting required for it. + properties: $nodename: pattern: "^r5fss(@.*)?" compatible: enum: + - ti,am62-r5fss + - ti,am64-r5fss - ti,am654-r5fss - - ti,j721e-r5fss - ti,j7200-r5fss - - ti,am64-r5fss + - ti,j721e-r5fss - ti,j721s2-r5fss power-domains:
@@ -80,7 +87,9 @@ patternProperties: node representing a TI instantiation of the Arm Cortex R5F core. There are some specific integration differences for the IP like the usage of a Region Address Translator (RAT) for translating the larger SoC bus - addresses into a 32-bit address space for the processor. + addresses into a 32-bit address space for the processor. For AM62x, + the R5F Sub-System device node should only define one R5F child node + as it has only one core available. Each R5F core has an associated 64 KB of Tightly-Coupled Memory (TCM) internal memories split between two banks - TCMA and TCMB (further
@@ -100,10 +109,11 @@ patternProperties: properties: compatible: enum: + - ti,am62-r5f + - ti,am64-r5f - ti,am654-r5f - - ti,j721e-r5f - ti,j7200-r5f - - ti,am64-r5f + - ti,j721e-r5f - ti,j721s2-r5f reg:
@@ -208,19 +218,38 @@ patternProperties: unevaluatedProperties: false -if: - properties: - compatible: - enum: - - ti,am64-r5fss -then: - properties: - ti,cluster-mode: - enum: [0, 2] -else: - properties: - ti,cluster-mode: - enum: [0, 1] +allOf: + - if: + properties: + compatible: + enum: + - ti,am64-r5fss + then: + properties: + ti,cluster-mode: + enum: [0, 2] + + - if: + properties: + compatible: + enum: + - ti,am654-r5fss + - ti,j7200-r5fss + - ti,j721e-r5fss + - ti,j721s2-r5fss + then: + properties: + ti,cluster-mode: + enum: [0, 1] + + - if: + properties: + compatible: + enum: + - ti,am62-r5fss + then: + properties: + ti,cluster-mode: false required: - compatible
Signature · 1 line
2.17.1
Re: [PATCH v5 1/2] dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
Quoted 9 lines · Devarsh Thakkar
AM62 family of devices don't have a R5F cluster, instead they have single core DM R5F.
Add new compatible string ti,am62-r5fss to support this scenario.When this new compatible is used don't allow cluster-mode property usage in device-tree as this implies that there is no R5F cluster available and only single R5F core is present.
Quoted 8 lines
Signed-off-by Devarsh Thakkar <[email protected]>---
V2: Avoid acronyms, use "Device Manager" instead of "DM"
V3:
- Use separate if block for each compatible for ti,cluster-mode property
- Rearrange compatibles as per alphabatical order
V4: Place each enum in separate line in allOf
V5: No change (fixing typo in email address)
Best regards,
Krzysztof
PATCH v5 2/2 remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC family
In reply to Devarsh ThakkarAM62 and AM62A SoCs use single core R5F which is a new scenario different than the one being used with CLUSTER_MODE_SINGLECPU which is for utilizing a single core from a set of cores available in R5F cluster present in the SoC.
To support this single core scenario map it with
newly defined CLUSTER_MODE_NONE and use it when
compatible is set to ti,am62-r5fss.
---
V2: Fix indentation and ordering issues as per review comments
V3: Change CLUSTER_MODE_NONE value to -1
V4: No change
V5: No change (fixing typo in email address)
--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 13 deletions(-)
drivers/remoteproc/ti_k3_r5_remoteproc.c +44 -13
@@ -74,9 +74,11 @@ struct k3_r5_mem {* Split mode : AM65x, J721E, J7200 and AM64x SoCs * LockStep mode : AM65x, J721E and J7200 SoCs * Single-CPU mode : AM64x SoCs only +* None : AM62x, AM62A SoCs */ enum cluster_mode { -CLUSTER_MODE_SPLIT =0 , +CLUSTER_MODE_NONE =-1 , +CLUSTER_MODE_SPLIT ,CLUSTER_MODE_LOCKSTEP ,CLUSTER_MODE_SINGLECPU , };
@@ -86,11 +88,13 @@ enum cluster_mode {* @tcm_is_double: flag to denote the larger unified TCMs in certain modes * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC * @single_cpu_mode: flag to denote if SoC/IP supports Single-CPU mode +* @is_single_core: flag to denote if SoC/IP has only single core R5 */ struct k3_r5_soc_data {bool tcm_is_double;bool tcm_ecc_autoinit;bool single_cpu_mode; +bool is_single_core; };/**
@@ -838,7 +842,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE ) { core = core0; }else { core = kproc->core;
@@ -853,7 +858,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec, cfg, ctrl, stat);/* check if only Single-CPU mode is supported on applicable SoCs */ -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->single_cpu_mode || cluster->soc_data->is_single_core) { single_cpu = !!(stat &PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY );if (single_cpu && cluster->mode ==CLUSTER_MODE_SPLIT ) {
@@ -1074,6 +1079,7 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc)if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE || !cluster->soc_data->tcm_is_double)return ;
@@ -1147,7 +1153,9 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) atcm_enable = cfg &PROC_BOOT_CFG_FLAG_R5_ATCM_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 ; -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->is_single_core) { + mode =CLUSTER_MODE_NONE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ; }else {
@@ -1271,7 +1279,8 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)/* create only one rproc in lockstep mode or single-cpu mode */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE )break ; }
@@ -1704,21 +1713,32 @@ static int k3_r5_probe(struct platform_device *pdev)* default to most common efuse configurations - Split-mode on AM64x * and LockStep-mode on all others */ - cluster->mode = data->single_cpu_mode ? +if (!data->is_single_core) + cluster->mode = data->single_cpu_mode ?CLUSTER_MODE_SPLIT :CLUSTER_MODE_LOCKSTEP ; +else + cluster->mode =CLUSTER_MODE_NONE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores); - ret =of_property_read_u32 (np,"ti,cluster-mode" , &cluster->mode); -if (ret <0 && ret != -EINVAL ) { -dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , - ret); -return ret; +if (!data->is_single_core) { + ret =of_property_read_s32 (np,"ti,cluster-mode" , &cluster->mode); +if (ret <0 && ret != -EINVAL ) { +dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , ret); +return ret; + } } num_cores =of_get_available_child_count (np); -if (num_cores !=2 ) { -dev_err (dev,"MCU cluster requires both R5F cores to be enabled, num_cores = %d\n" , +if (num_cores !=2 && !data->is_single_core) { +dev_err (dev,"MCU cluster requires both R5F cores to be enabled but num_cores is set to = %d\n" , + num_cores); +return -ENODEV ; + } + +if (num_cores !=1 && data->is_single_core) { +dev_err (dev,"SoC supports only single core R5 but num_cores is set to %d\n" , num_cores);return -ENODEV ; }
@@ -1760,18 +1780,28 @@ static const struct k3_r5_soc_data am65_j721e_soc_data = { .tcm_is_double = false, .tcm_ecc_autoinit = false, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data j7200_j721s2_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data am64_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = true, + .is_single_core = false, +}; + +static const struct k3_r5_soc_data am62_soc_data = { + .tcm_is_double = false, + .tcm_ecc_autoinit = true, + .single_cpu_mode = false, + .is_single_core = true, };static const struct of_device_id k3_r5_of_match[] = {
@@ -1779,6 +1809,7 @@ static const struct of_device_id k3_r5_of_match[] = { { .compatible = "ti,j721e-r5fss", .data = &am65_j721e_soc_data, }, { .compatible = "ti,j7200-r5fss", .data = &j7200_j721s2_soc_data, }, { .compatible = "ti,am64-r5fss", .data = &am64_soc_data, }, + { .compatible = "ti,am62-r5fss", .data = &am62_soc_data, }, { .compatible = "ti,j721s2-r5fss", .data = &j7200_j721s2_soc_data, }, { /* sentinel */ }, };
Signature · 1 line
2.17.1
Mathieu Poirier
maintainerRe: [PATCH v5 2/2] remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC family
Quoted 24 lines · Devarsh Thakkar
AM62 and AM62A SoCs use single core R5F which is a new scenario different than the one being used with
CLUSTER_MODE_SINGLECPUwhich is for utilizing a single core from a set of cores available in R5F cluster present in the SoC.To support this single core scenario map it with
newly definedCLUSTER_MODE_NONEand use it when
compatible is set to ti,am62-r5fss.Signed-off-by Devarsh Thakkar <[email protected]>---
V2: Fix indentation and ordering issues as per review comments
V3: ChangeCLUSTER_MODE_NONEvalue to -1
V4: No change
V5: No change (fixing typo in email address)--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0
drivers/remoteproc/ti_k3_r5_remoteproc.c struct k3_r5_mem { · line 80
Quoted 8 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1@@ -74,9 +74,11 @@ struct k3_r5_mem {* Split mode : AM65x, J721E, J7200 and AM64x SoCs * LockStep mode : AM65x, J721E and J7200 SoCs * Single-CPU mode : AM64x SoCs only +* None : AM62x, AM62A SoCs */ enum cluster_mode { -CLUSTER_MODE_SPLIT =0 , +CLUSTER_MODE_NONE =-1 ,
s/CLUSTER_MODE_NONE/CLUSTER_MODE_ONECORE
And add it after CLUSTER_MODE_SINGLECPU
Quoted 29 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +5
-1+CLUSTER_MODE_SPLIT ,CLUSTER_MODE_LOCKSTEP , CLUSTER_MODE_SINGLECPU, };@@ -86,11 +88,13 @@ enum cluster_mode {* @tcm_is_double: flag to denote the larger unified TCMs in certain modes * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC * @single_cpu_mode: flag to denote if SoC/IP supports Single-CPU mode +* @is_single_core: flag to denote if SoC/IP has only single core R5 */ struct k3_r5_soc_data {bool tcm_is_double;bool tcm_ecc_autoinit;bool single_cpu_mode; +bool is_single_core; };/** @@ -838,7 +842,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE ) { core = core0; }else { core = kproc->core;
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 861
Quoted 5 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-1@@ -853,7 +858,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec, cfg, ctrl, stat);/* check if only Single-CPU mode is supported on applicable SoCs */ -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->single_cpu_mode || cluster->soc_data->is_single_core) {
Everywhere other than k3_r5_probe(), cluster->mode should be used. Otherwise it is wildly confusing and error prone. Please resend this set with an extra preamble patch that fixes this.
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0single_cpu = !!(stat &PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY );if (single_cpu && cluster->mode ==CLUSTER_MODE_SPLIT ) {@@ -1074,6 +1079,7 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc)if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE || !cluster->soc_data->tcm_is_double)return ;
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) · line 1160
Quoted 9 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1147,7 +1153,9 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) atcm_enable = cfg &PROC_BOOT_CFG_FLAG_R5_ATCM_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 ; -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->is_single_core) { + mode =CLUSTER_MODE_NONE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ;
Same comment as above.
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1}else {@@ -1271,7 +1279,8 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)/* create only one rproc in lockstep mode or single-cpu mode */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE )break ; }
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_probe(struct platform_device *pdev) · line 1715
Quoted 3 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0@@ -1704,21 +1713,32 @@ static int k3_r5_probe(struct platform_device *pdev)* default to most common efuse configurations - Split-mode on AM64x * and LockStep-mode on all others */
The above comment needs to be adjusted.
Thanks,
Mathieu
Quoted 77 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +30
-8- cluster->mode = data->single_cpu_mode ? +if (!data->is_single_core) + cluster->mode = data->single_cpu_mode ?CLUSTER_MODE_SPLIT :CLUSTER_MODE_LOCKSTEP ; +else + cluster->mode =CLUSTER_MODE_NONE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores); - ret =of_property_read_u32 (np,"ti,cluster-mode" , &cluster->mode); -if (ret <0 && ret != -EINVAL ) { -dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , - ret); -return ret; +if (!data->is_single_core) { + ret =of_property_read_s32 (np,"ti,cluster-mode" , &cluster->mode); +if (ret <0 && ret != -EINVAL ) { +dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , ret); +return ret; + } } num_cores =of_get_available_child_count (np); -if (num_cores !=2 ) { -dev_err (dev,"MCU cluster requires both R5F cores to be enabled, num_cores = %d\n" , +if (num_cores !=2 && !data->is_single_core) { +dev_err (dev,"MCU cluster requires both R5F cores to be enabled but num_cores is set to = %d\n" , + num_cores); +return -ENODEV ; + } + +if (num_cores !=1 && data->is_single_core) { +dev_err (dev,"SoC supports only single core R5 but num_cores is set to %d\n" , num_cores);return -ENODEV ; }@@ -1760,18 +1780,28 @@ static const struct k3_r5_soc_data am65_j721e_soc_data = { .tcm_is_double = false, .tcm_ecc_autoinit = false, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data j7200_j721s2_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data am64_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = true, + .is_single_core = false, +}; + +static const struct k3_r5_soc_data am62_soc_data = { + .tcm_is_double = false, + .tcm_ecc_autoinit = true, + .single_cpu_mode = false, + .is_single_core = true, };static const struct of_device_id k3_r5_of_match[] = {@@ -1779,6 +1809,7 @@ static const struct of_device_id k3_r5_of_match[] = { { .compatible = "ti,j721e-r5fss", .data = &am65_j721e_soc_data, }, { .compatible = "ti,j7200-r5fss", .data = &j7200_j721s2_soc_data, }, { .compatible = "ti,am64-r5fss", .data = &am64_soc_data, }, + { .compatible = "ti,am62-r5fss", .data = &am62_soc_data, }, { .compatible = "ti,j721s2-r5fss", .data = &j7200_j721s2_soc_data, }, { /* sentinel */ }, };Signature · 1 line
2.17.1
Re: [PATCH v5 2/2] remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC family
Hi Mathieu,
Thanks for the review.
Quoted 36 lines · Mathieu Poirier
Quoted 24 lines · Devarsh Thakkar
AM62 and AM62A SoCs use single core R5F which is a new scenario different than the one being used with
CLUSTER_MODE_SINGLECPUwhich is for utilizing a single core from a set of cores available in R5F cluster present in the SoC.To support this single core scenario map it with
newly definedCLUSTER_MODE_NONEand use it when
compatible is set to ti,am62-r5fss.Signed-off-by Devarsh Thakkar <[email protected]>---
V2: Fix indentation and ordering issues as per review comments
V3: ChangeCLUSTER_MODE_NONEvalue to -1
V4: No change
V5: No change (fixing typo in email address)--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0drivers/remoteproc/ti_k3_r5_remoteproc.c struct k3_r5_mem { · line 80
Quoted 8 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1@@ -74,9 +74,11 @@ struct k3_r5_mem {* Split mode : AM65x, J721E, J7200 and AM64x SoCs * LockStep mode : AM65x, J721E and J7200 SoCs * Single-CPU mode : AM64x SoCs only +* None : AM62x, AM62A SoCs */ enum cluster_mode { -CLUSTER_MODE_SPLIT =0 , +CLUSTER_MODE_NONE =-1 ,s/CLUSTER_MODE_NONE/CLUSTER_MODE_ONECORE
Quoted 1 line
And add it after
CLUSTER_MODE_SINGLECPU
Ok, i will then add it in dt-bindings too.
Quoted 32 lines
Quoted 32 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +5
-1+CLUSTER_MODE_SPLIT ,CLUSTER_MODE_LOCKSTEP , CLUSTER_MODE_SINGLECPU, };@@ -86,11 +88,13 @@ enum cluster_mode {* @tcm_is_double: flag to denote the larger unified TCMs in certain modes * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC * @single_cpu_mode: flag to denote if SoC/IP supports Single-CPU mode +* @is_single_core: flag to denote if SoC/IP has only single core R5 */ struct k3_r5_soc_data {bool tcm_is_double;bool tcm_ecc_autoinit;bool single_cpu_mode; +bool is_single_core; };/** @@ -838,7 +842,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE ) { core = core0; }else { core = kproc->core;@@ -853,7 +858,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec, cfg, ctrl, stat);
Quoted 7 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 861
Quoted 3 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-1/* check if only Single-CPU mode is supported on applicable SoCs */ -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->single_cpu_mode || cluster->soc_data->is_single_core) {Everywhere other than
k3_r5_probe(),cluster->modeshould be used. Otherwise it is wildly confusing and error prone. Please resend this set with an extra preamble patch that fixes this.
I agree wherever possible we should do that but some places in the code we are overriding and fine-tuning the cluster-mode value based on firmware configs For e.g. here we are overriding the user selected cluster mode from split mode to single cpu mode if firmware says so and SoC supports single cpu mode.
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0single_cpu = !!(stat &PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY );if (single_cpu && cluster->mode ==CLUSTER_MODE_SPLIT ) {@@ -1074,6 +1079,7 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc)if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE || !cluster->soc_data->tcm_is_double)return ;
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) · line 1160
Quoted 10 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1147,7 +1153,9 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) atcm_enable = cfg &PROC_BOOT_CFG_FLAG_R5_ATCM_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 ; -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->is_single_core) { + mode =CLUSTER_MODE_NONE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ;Same comment as above.
Here also we are overriding user selected cluster mode based on firmware returned config value and soc data.
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1}else {@@ -1271,7 +1279,8 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)/* create only one rproc in lockstep mode or single-cpu mode */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE )break ; }
Quoted 6 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_probe(struct platform_device *pdev) · line 1715
Quoted 4 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0@@ -1704,21 +1713,32 @@ static int k3_r5_probe(struct platform_device *pdev)* default to most common efuse configurations - Split-mode on AM64x * and LockStep-mode on all others */ The above comment needs to be adjusted.
Will do.
Regards,
Devarsh
Quoted 81 lines
Thanks,
MathieuQuoted 77 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +30
-8- cluster->mode = data->single_cpu_mode ? +if (!data->is_single_core) + cluster->mode = data->single_cpu_mode ?CLUSTER_MODE_SPLIT :CLUSTER_MODE_LOCKSTEP ; +else + cluster->mode =CLUSTER_MODE_NONE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores); - ret =of_property_read_u32 (np,"ti,cluster-mode" , &cluster->mode); -if (ret <0 && ret != -EINVAL ) { -dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , - ret); -return ret; +if (!data->is_single_core) { + ret =of_property_read_s32 (np,"ti,cluster-mode" , &cluster->mode); +if (ret <0 && ret != -EINVAL ) { +dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , ret); +return ret; + } } num_cores =of_get_available_child_count (np); -if (num_cores !=2 ) { -dev_err (dev,"MCU cluster requires both R5F cores to be enabled, num_cores = %d\n" , +if (num_cores !=2 && !data->is_single_core) { +dev_err (dev,"MCU cluster requires both R5F cores to be enabled but num_cores is set to = %d\n" , + num_cores); +return -ENODEV ; + } + +if (num_cores !=1 && data->is_single_core) { +dev_err (dev,"SoC supports only single core R5 but num_cores is set to %d\n" , num_cores);return -ENODEV ; }@@ -1760,18 +1780,28 @@ static const struct k3_r5_soc_data am65_j721e_soc_data = { .tcm_is_double = false, .tcm_ecc_autoinit = false, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data j7200_j721s2_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data am64_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = true, + .is_single_core = false, +}; + +static const struct k3_r5_soc_data am62_soc_data = { + .tcm_is_double = false, + .tcm_ecc_autoinit = true, + .single_cpu_mode = false, + .is_single_core = true, };static const struct of_device_id k3_r5_of_match[] = {@@ -1779,6 +1809,7 @@ static const struct of_device_id k3_r5_of_match[] = { { .compatible = "ti,j721e-r5fss", .data = &am65_j721e_soc_data, }, { .compatible = "ti,j7200-r5fss", .data = &j7200_j721s2_soc_data, }, { .compatible = "ti,am64-r5fss", .data = &am64_soc_data, }, + { .compatible = "ti,am62-r5fss", .data = &am62_soc_data, }, { .compatible = "ti,j721s2-r5fss", .data = &j7200_j721s2_soc_data, }, { /* sentinel */ }, };Signature · 1 line
2.17.1
Mathieu Poirier
maintainerRe: [PATCH v5 2/2] remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC family
Quoted 82 lines · Devarsh Thakkar
Hi Mathieu,
Thanks for the review.
Quoted 36 lines · Mathieu Poirier
Quoted 24 lines · Devarsh Thakkar
AM62 and AM62A SoCs use single core R5F which is a new scenario different than the one being used with
CLUSTER_MODE_SINGLECPUwhich is for utilizing a single core from a set of cores available in R5F cluster present in the SoC.To support this single core scenario map it with
newly definedCLUSTER_MODE_NONEand use it when
compatible is set to ti,am62-r5fss.Signed-off-by Devarsh Thakkar <[email protected]>---
V2: Fix indentation and ordering issues as per review comments
V3: ChangeCLUSTER_MODE_NONEvalue to -1
V4: No change
V5: No change (fixing typo in email address)--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0drivers/remoteproc/ti_k3_r5_remoteproc.c struct k3_r5_mem { · line 80
Quoted 8 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1@@ -74,9 +74,11 @@ struct k3_r5_mem {* Split mode : AM65x, J721E, J7200 and AM64x SoCs * LockStep mode : AM65x, J721E and J7200 SoCs * Single-CPU mode : AM64x SoCs only +* None : AM62x, AM62A SoCs */ enum cluster_mode { -CLUSTER_MODE_SPLIT =0 , +CLUSTER_MODE_NONE =-1 ,s/CLUSTER_MODE_NONE/CLUSTER_MODE_ONECORE
Quoted 1 line
And add it after
CLUSTER_MODE_SINGLECPUOk, i will then add it in dt-bindings too.
Quoted 32 lines
Quoted 32 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +5
-1+CLUSTER_MODE_SPLIT ,CLUSTER_MODE_LOCKSTEP , CLUSTER_MODE_SINGLECPU, };@@ -86,11 +88,13 @@ enum cluster_mode {* @tcm_is_double: flag to denote the larger unified TCMs in certain modes * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC * @single_cpu_mode: flag to denote if SoC/IP supports Single-CPU mode +* @is_single_core: flag to denote if SoC/IP has only single core R5 */ struct k3_r5_soc_data {bool tcm_is_double;bool tcm_ecc_autoinit;bool single_cpu_mode; +bool is_single_core; };/** @@ -838,7 +842,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE ) { core = core0; }else { core = kproc->core;@@ -853,7 +858,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec, cfg, ctrl, stat);Quoted 7 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 861
Quoted 3 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-1/* check if only Single-CPU mode is supported on applicable SoCs */ -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->single_cpu_mode || cluster->soc_data->is_single_core) {Everywhere other than
k3_r5_probe(),cluster->modeshould be used. Otherwise it is wildly confusing and error prone. Please resend this set with an extra preamble patch that fixes this.
Quoted 4 lines
I agree wherever possible we should do that but some places in the code we are overriding and fine-tuning the cluster-mode value based on firmware configs For e.g. here we are overriding the user selected cluster mode from split mode to single cpu mode if firmware says so and SoC supports single cpu mode.
Overriding cluster->mode happens after this and as such, there is no reason why it can't be used in the if() clause. Moreover, reading your V6, this part is completely omitted. Omission? Bug? Feature?
Quoted 24 lines
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0single_cpu = !!(stat &PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY );if (single_cpu && cluster->mode ==CLUSTER_MODE_SPLIT ) {@@ -1074,6 +1079,7 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc)if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE || !cluster->soc_data->tcm_is_double)return ;Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) · line 1160
Quoted 10 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1147,7 +1153,9 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) atcm_enable = cfg &PROC_BOOT_CFG_FLAG_R5_ATCM_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 ; -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->is_single_core) { + mode =CLUSTER_MODE_NONE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ;Same comment as above.
Quoted 2 lines
Here also we are overriding user selected cluster mode based on firmware returned config value and soc data.
Same comment as above.
Quoted 103 lines
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1}else {@@ -1271,7 +1279,8 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)/* create only one rproc in lockstep mode or single-cpu mode */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE )break ; }Quoted 6 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_probe(struct platform_device *pdev) · line 1715
Quoted 4 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0@@ -1704,21 +1713,32 @@ static int k3_r5_probe(struct platform_device *pdev)* default to most common efuse configurations - Split-mode on AM64x * and LockStep-mode on all others */ The above comment needs to be adjusted.
Will do.
Regards,
DevarshQuoted 81 lines
Thanks,
MathieuQuoted 77 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +30
-8- cluster->mode = data->single_cpu_mode ? +if (!data->is_single_core) + cluster->mode = data->single_cpu_mode ?CLUSTER_MODE_SPLIT :CLUSTER_MODE_LOCKSTEP ; +else + cluster->mode =CLUSTER_MODE_NONE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores); - ret =of_property_read_u32 (np,"ti,cluster-mode" , &cluster->mode); -if (ret <0 && ret != -EINVAL ) { -dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , - ret); -return ret; +if (!data->is_single_core) { + ret =of_property_read_s32 (np,"ti,cluster-mode" , &cluster->mode); +if (ret <0 && ret != -EINVAL ) { +dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , ret); +return ret; + } } num_cores =of_get_available_child_count (np); -if (num_cores !=2 ) { -dev_err (dev,"MCU cluster requires both R5F cores to be enabled, num_cores = %d\n" , +if (num_cores !=2 && !data->is_single_core) { +dev_err (dev,"MCU cluster requires both R5F cores to be enabled but num_cores is set to = %d\n" , + num_cores); +return -ENODEV ; + } + +if (num_cores !=1 && data->is_single_core) { +dev_err (dev,"SoC supports only single core R5 but num_cores is set to %d\n" , num_cores);return -ENODEV ; }@@ -1760,18 +1780,28 @@ static const struct k3_r5_soc_data am65_j721e_soc_data = { .tcm_is_double = false, .tcm_ecc_autoinit = false, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data j7200_j721s2_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data am64_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = true, + .is_single_core = false, +}; + +static const struct k3_r5_soc_data am62_soc_data = { + .tcm_is_double = false, + .tcm_ecc_autoinit = true, + .single_cpu_mode = false, + .is_single_core = true, };static const struct of_device_id k3_r5_of_match[] = {@@ -1779,6 +1809,7 @@ static const struct of_device_id k3_r5_of_match[] = { { .compatible = "ti,j721e-r5fss", .data = &am65_j721e_soc_data, }, { .compatible = "ti,j7200-r5fss", .data = &j7200_j721s2_soc_data, }, { .compatible = "ti,am64-r5fss", .data = &am64_soc_data, }, + { .compatible = "ti,am62-r5fss", .data = &am62_soc_data, }, { .compatible = "ti,j721s2-r5fss", .data = &j7200_j721s2_soc_data, }, { /* sentinel */ }, };Signature · 1 line
2.17.1
Re: [PATCH v5 2/2] remoteproc: k3-r5: Use separate compatible string for TI AM62 SoC family
Hi Mathieu,
Quoted 83 lines · Mathieu Poirier
Quoted 82 lines · Devarsh Thakkar
Hi Mathieu,
Thanks for the review.
Quoted 36 lines · Mathieu Poirier
Quoted 24 lines · Devarsh Thakkar
AM62 and AM62A SoCs use single core R5F which is a new scenario different than the one being used with
CLUSTER_MODE_SINGLECPUwhich is for utilizing a single core from a set of cores available in R5F cluster present in the SoC.To support this single core scenario map it with
newly definedCLUSTER_MODE_NONEand use it when
compatible is set to ti,am62-r5fss.Signed-off-by Devarsh Thakkar <[email protected]>---
V2: Fix indentation and ordering issues as per review comments
V3: ChangeCLUSTER_MODE_NONEvalue to -1
V4: No change
V5: No change (fixing typo in email address)--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 57 ++++++++++++++++++------ 1 file changed, 44 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0drivers/remoteproc/ti_k3_r5_remoteproc.c struct k3_r5_mem { · line 80
Quoted 8 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1@@ -74,9 +74,11 @@ struct k3_r5_mem {* Split mode : AM65x, J721E, J7200 and AM64x SoCs * LockStep mode : AM65x, J721E and J7200 SoCs * Single-CPU mode : AM64x SoCs only +* None : AM62x, AM62A SoCs */ enum cluster_mode { -CLUSTER_MODE_SPLIT =0 , +CLUSTER_MODE_NONE =-1 ,s/CLUSTER_MODE_NONE/CLUSTER_MODE_ONECORE
Quoted 1 line
And add it after
CLUSTER_MODE_SINGLECPUOk, i will then add it in dt-bindings too.
Quoted 39 lines
Quoted 30 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +5
-1+CLUSTER_MODE_SPLIT ,CLUSTER_MODE_LOCKSTEP , CLUSTER_MODE_SINGLECPU, };@@ -86,11 +88,13 @@ enum cluster_mode {* @tcm_is_double: flag to denote the larger unified TCMs in certain modes * @tcm_ecc_autoinit: flag to denote the auto-initialization of TCMs for ECC * @single_cpu_mode: flag to denote if SoC/IP supports Single-CPU mode +* @is_single_core: flag to denote if SoC/IP has only single core R5 */ struct k3_r5_soc_data {bool tcm_is_double;bool tcm_ecc_autoinit;bool single_cpu_mode; +bool is_single_core; };/** @@ -838,7 +842,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) core0 = list_first_entry(&cluster->cores, struct k3_r5_core, elem);if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE ) { core = core0; }else { core = kproc->core;drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 861
Quoted 5 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-1@@ -853,7 +858,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec, cfg, ctrl, stat);/* check if only Single-CPU mode is supported on applicable SoCs */ -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->single_cpu_mode || cluster->soc_data->is_single_core) {Everywhere other than
k3_r5_probe(),cluster->modeshould be used. Otherwise it is wildly confusing and error prone. Please resend this set with an extra preamble patch that fixes this.
Quoted 9 lines
Quoted 4 lines
I agree wherever possible we should do that but some places in the code we are overriding and fine-tuning the cluster-mode value based on firmware configs For e.g. here we are overriding the user selected cluster mode from split mode to single cpu mode if firmware says so and SoC supports single cpu mode.
Overriding
cluster->modehappens after this and as such, there is no reason why it can't be used in theif()clause. Moreover, reading your V6, this part is completely omitted. Omission? Bug? Feature?
I omitted this change after re-checking, since it was not required, I was using it to jump to config but it works fine even without this change since anyway the control reaches there as lockstep cluster mode is not set in this scenario.
Best Regards
Devarsh
Quoted 132 lines
Quoted 24 lines
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0single_cpu = !!(stat &PROC_BOOT_STATUS_FLAG_R5_SINGLECORE_ONLY );if (single_cpu && cluster->mode ==CLUSTER_MODE_SPLIT ) {@@ -1074,6 +1079,7 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc)if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE || !cluster->soc_data->tcm_is_double)return ;Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) · line 1160
Quoted 10 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1147,7 +1153,9 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) atcm_enable = cfg &PROC_BOOT_CFG_FLAG_R5_ATCM_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 ; -if (cluster->soc_data->single_cpu_mode) { +if (cluster->soc_data->is_single_core) { + mode =CLUSTER_MODE_NONE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ;Same comment as above.
Quoted 2 lines
Here also we are overriding user selected cluster mode based on firmware returned config value and soc data.
Same comment as above.
Quoted 103 lines
Quoted 12 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1}else {@@ -1271,7 +1279,8 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)/* create only one rproc in lockstep mode or single-cpu mode */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_NONE )break ; }Quoted 6 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_probe(struct platform_device *pdev) · line 1715
Quoted 4 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0@@ -1704,21 +1713,32 @@ static int k3_r5_probe(struct platform_device *pdev)* default to most common efuse configurations - Split-mode on AM64x * and LockStep-mode on all others */ The above comment needs to be adjusted.
Will do.
Regards,
DevarshQuoted 81 lines
Thanks,
MathieuQuoted 77 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +30
-8- cluster->mode = data->single_cpu_mode ? +if (!data->is_single_core) + cluster->mode = data->single_cpu_mode ?CLUSTER_MODE_SPLIT :CLUSTER_MODE_LOCKSTEP ; +else + cluster->mode =CLUSTER_MODE_NONE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores); - ret =of_property_read_u32 (np,"ti,cluster-mode" , &cluster->mode); -if (ret <0 && ret != -EINVAL ) { -dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , - ret); -return ret; +if (!data->is_single_core) { + ret =of_property_read_s32 (np,"ti,cluster-mode" , &cluster->mode); +if (ret <0 && ret != -EINVAL ) { +dev_err (dev,"invalid format for ti,cluster-mode, ret = %d\n" , ret); +return ret; + } } num_cores =of_get_available_child_count (np); -if (num_cores !=2 ) { -dev_err (dev,"MCU cluster requires both R5F cores to be enabled, num_cores = %d\n" , +if (num_cores !=2 && !data->is_single_core) { +dev_err (dev,"MCU cluster requires both R5F cores to be enabled but num_cores is set to = %d\n" , + num_cores); +return -ENODEV ; + } + +if (num_cores !=1 && data->is_single_core) { +dev_err (dev,"SoC supports only single core R5 but num_cores is set to %d\n" , num_cores);return -ENODEV ; }@@ -1760,18 +1780,28 @@ static const struct k3_r5_soc_data am65_j721e_soc_data = { .tcm_is_double = false, .tcm_ecc_autoinit = false, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data j7200_j721s2_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = false, + .is_single_core = false, };static const struct k3_r5_soc_data am64_soc_data = { .tcm_is_double = true, .tcm_ecc_autoinit = true, .single_cpu_mode = true, + .is_single_core = false, +}; + +static const struct k3_r5_soc_data am62_soc_data = { + .tcm_is_double = false, + .tcm_ecc_autoinit = true, + .single_cpu_mode = false, + .is_single_core = true, };static const struct of_device_id k3_r5_of_match[] = {@@ -1779,6 +1809,7 @@ static const struct of_device_id k3_r5_of_match[] = { { .compatible = "ti,j721e-r5fss", .data = &am65_j721e_soc_data, }, { .compatible = "ti,j7200-r5fss", .data = &j7200_j721s2_soc_data, }, { .compatible = "ti,am64-r5fss", .data = &am64_soc_data, }, + { .compatible = "ti,am62-r5fss", .data = &am62_soc_data, }, { .compatible = "ti,j721s2-r5fss", .data = &j7200_j721s2_soc_data, }, { /* sentinel */ }, };Signature · 1 line
2.17.1