Add single core R5F IPC for AM62 SoC family
Subsystems (2)
v6 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 (3):
remoteproc: k3-r5: Simplify single core config set
dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
remoteproc: k3-r5: Use separate compatible string for TI AM62x SoC
family
.../bindings/remoteproc/ti,k3-r5f-rproc.yaml | 76 +++++++++++++----- drivers/remoteproc/ti_k3_r5_remoteproc.c | 77 ++++++++++++++----- 2 files changed, 111 insertions(+), 42 deletions(-)
Signature · 1 line
2.34.1
PATCH v6 1/3 remoteproc: k3-r5: Simplify single core config set
The config PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE
is set only when cluster mode is set toCLUSTER_MODE_SINGLECPU and cluster mode
is already configured before setting this config.
So directly check for cluster mode instead of checking soc_data->single_cpu_mode first and then checking cluster mode.
---
V6: No change
--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/remoteproc/ti_k3_r5_remoteproc.c +8 -9
@@ -875,15 +875,14 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec =0x0 ;if (core == core0) { clr_cfg =PROC_BOOT_CFG_FLAG_R5_TEINIT ; -if (cluster->soc_data->single_cpu_mode) { -/* -* Single-CPU configuration bit can only be configured -* on Core0 and system firmware will NACK any requests -* with the bit configured, so program it only on -* permitted cores -*/ -if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) - set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ; +/* +* Single-CPU configuration bit can only be configured +* on Core0 and system firmware will NACK any requests +* with the bit configured, so program it only on +* permitted cores +*/ +if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ; }else {/* * LockStep configuration bit is Read-only on Split-mode
Signature · 1 line
2.34.1
Mathieu Poirier
maintainerRe: [PATCH v6 1/3] remoteproc: k3-r5: Simplify single core config set
Quoted 31 lines · Devarsh Thakkar
The config
PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE
is set only when cluster mode is set toCLUSTER_MODE_SINGLECPUand cluster mode
is already configured before setting this config.So directly check for cluster mode instead of checking
soc_data->single_cpu_modefirst and then checking cluster mode.Signed-off-by Devarsh Thakkar <[email protected]>---
V6: No change--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-7@@ -875,15 +875,14 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) boot_vec =0x0 ;if (core == core0) { clr_cfg =PROC_BOOT_CFG_FLAG_R5_TEINIT ; -if (cluster->soc_data->single_cpu_mode) { -/* -* Single-CPU configuration bit can only be configured -* on Core0 and system firmware will NACK any requests -* with the bit configured, so program it only on -* permitted cores -*/
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 885
Quoted 10 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +8
-2-if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) - set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ; +/* +* Single-CPU configuration bit can only be configured +* on Core0 and system firmware will NACK any requests +* with the bit configured, so program it only on +* permitted cores +*/ +if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) { + set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ;
This is exactly the kind of buggy situation I want to avoid by asking to use soc_data->single_cpu_mode only in probe().
Quoted 6 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +0
-0}else {/* * LockStep configuration bit is Read-only on Split-mode Signature · 1 line
2.34.1
PATCH v6 2/3 dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
In reply to Devarsh ThakkarAM62 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 cluster-mode property can only be set to value 3 i.e. CLUSTER_MODE_SINGLECORE which is also the default value in case cluster-mode is not defined in device-tree.
While at it, also sort the compatible lists in alphabetical order.
---
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)
V6: Use cluster-mode=3 for am62x
--- .../bindings/remoteproc/ti,k3-r5f-rproc.yaml | 76 ++++++++++++++----- 1 file changed, 55 insertions(+), 21 deletions(-)
Documentation/devicetree/bindings/remoteproc/ti,k3-r5f-rproc.yaml +55 -21
@@ -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
@@ -34,10 +37,11 @@ properties: 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:
@@ -64,10 +68,17 @@ properties: $ref: /schemas/types.yaml#/definitions/uint32 description: | Configuration Mode for the Dual R5F cores within the R5F cluster. - Should be either a value of 1 (LockStep mode) or 0 (Split mode) on + For most SoCs (AM65x, J721E, J7200, J721s2), + It should be either a value of 1 (LockStep mode) or 0 (Split mode) on most SoCs (AM65x, J721E, J7200, J721s2), default is LockStep mode if - omitted; and should be either a value of 0 (Split mode) or 2 - (Single-CPU mode) on AM64x SoCs, default is Split mode if omitted. + omitted. + For AM64x SoCs, + It should be either a value of 0 (Split mode) or 2 (Single-CPU mode) and + default is Split mode if omitted. + For AM62x SoCs, + It should be set as 3 (Single-Core mode) which is also the default if + omitted. + # R5F Processor Child Nodes: # ==========================
@@ -80,7 +91,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 +113,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 +222,39 @@ 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: + enum: [3] required: - compatible
Signature · 1 line
2.34.1
Re: [PATCH v6 2/3] dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
Quoted 4 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.
This is a friendly reminder during the review process.
It looks like you received a tag and forgot to add it.
If you do not know the process, here is a short explanation:
Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions. However, there's no need to repost patches *only* to add the tags. The upstream maintainer will do that for acks received on the version they apply.
https://elixir.bootlin.com/linux/v5.17/source/Documentation/process/submitting-patches.rst#L540
If a tag was not added on purpose, please state why and what changed.
Best regards,
Krzysztof
Re: [PATCH v6 2/3] dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
Hi Krzysztof,
Quoted 16 lines · Krzysztof Kozlowski
Quoted 4 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.This is a friendly reminder during the review process.
It looks like you received a tag and forgot to add it.
If you do not know the process, here is a short explanation:
Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions. However, there's no need to repost patches *only* to add the tags. The upstream maintainer will do that for acks received on the version they apply.
Quoted 3 lines
https://elixir.bootlin.com/linux/v5.17/source/Documentation/process/submitting-patches.rst#L540
If a tag was not added on purpose, please state why and what changed.
I apologize if it was not clear but yes I didn't put the tag as patch was updated to use cluster-mode=3 for am62x as per review comments on
https://lore.kernel.org/all/20230110183505.GA2741090@p14s/
I'll append a note below commit message on Reviewed-By removal when I post the next series.
Regards
Devarsh
Quoted 5 lines
Best regards,
Krzysztof
Re: [PATCH v6 2/3] dt-bindings: remoteproc: ti: Add new compatible for AM62 SoC family
Hi Devarsh,
Quoted 19 lines · Devarsh Thakkar
Hi Krzysztof,
Quoted 16 lines · Krzysztof Kozlowski
Quoted 4 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.This is a friendly reminder during the review process.
It looks like you received a tag and forgot to add it.
If you do not know the process, here is a short explanation:
Please add Acked-by/Reviewed-by/Tested-by tags when posting new versions. However, there's no need to repost patches *only* to add the tags. The upstream maintainer will do that for acks received on the version they apply.
Quoted 6 lines
Quoted 3 lines
https://elixir.bootlin.com/linux/v5.17/source/Documentation/process/submitting-patches.rst#L540
If a tag was not added on purpose, please state why and what changed.
I apologize if it was not clear but yes I didn't put the tag as patch was updated to use cluster-mode=3 for am62x as per review comments on
https://lore.kernel.org/all/20230110183505.GA2741090@p14s/
It would be helpful in future if you document why tag was dropped as part of change log (below tearline) to indicate its intentional.
Quoted 11 lines
I'll append a note below commit message on Reviewed-By removal when I post the next series.
Regards
DevarshQuoted 5 lines
Best regards,
Krzysztof
PATCH v6 3/3 remoteproc: k3-r5: Use separate compatible string for TI AM62x 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_SINGLECORE and use it when compatible is set to ti,am62-r5fss.
Also set PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE config for CLUSTER_MODE_SINGLECORE too as it is required by R5 core when it is being as general purpose core instead of device manager.
---
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)
V6:
- Use CLUSTER_MODE_SINGLECORE for AM62x
- Set PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE for single core.
--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 62 +++++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-)
drivers/remoteproc/ti_k3_r5_remoteproc.c +49 -13
@@ -71,14 +71,16 @@ struct k3_r5_mem {/* * All cluster mode values are not applicable on all SoCs. The following * are the modes supported on various SoCs: -* Split mode : AM65x, J721E, J7200 and AM64x SoCs -* LockStep mode : AM65x, J721E and J7200 SoCs -* Single-CPU mode : AM64x SoCs only +* Split mode : AM65x, J721E, J7200 and AM64x SoCs +* LockStep mode : AM65x, J721E and J7200 SoCs +* Single-CPU mode : AM64x SoCs only +* Single-Core mode : AM62x, AM62A SoCs */ enum cluster_mode {CLUSTER_MODE_SPLIT =0 ,CLUSTER_MODE_LOCKSTEP ,CLUSTER_MODE_SINGLECPU , +CLUSTER_MODE_SINGLECORE };/**
@@ -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_SINGLECORE ) { core = core0; }else { core = kproc->core;
@@ -881,7 +886,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc)* with the bit configured, so program it only on * permitted cores */ -if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) { +if (cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE ) { set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ; }else {/*
@@ -1073,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_SINGLECORE || !cluster->soc_data->tcm_is_double)return ;
@@ -1146,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_SINGLECORE ; + }else if (cluster->soc_data->single_cpu_mode) { mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ; }else {
@@ -1268,9 +1277,12 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev) goto err_add; } -/* create only one rproc in lockstep mode or single-cpu mode */ +/* create only one rproc in lockstep, single-cpu or +* single core mode +*/ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE )break ; }
@@ -1699,12 +1711,19 @@ static int k3_r5_probe(struct platform_device *pdev)return -ENOMEM ; cluster->dev = dev; +/* -* default to most common efuse configurations - Split-mode on AM64x -* and LockStep-mode on all others +* default to most common efuse configurations - +* Split-mode on AM64x +* Single core on AM62x +* 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_SINGLECORE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores);
@@ -1716,8 +1735,14 @@ static int k3_r5_probe(struct platform_device *pdev) } 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 ; }
@@ -1759,18 +1784,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[] = {
@@ -1778,6 +1813,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.34.1
Mathieu Poirier
maintainerRe: [PATCH v6 3/3] remoteproc: k3-r5: Use separate compatible string for TI AM62x SoC family
Quoted 79 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 defined
CLUSTER_MODE_SINGLECOREand use it when compatible is set to ti,am62-r5fss.Also set
PROC_BOOT_CFG_FLAG_R5_SINGLE_COREconfig forCLUSTER_MODE_SINGLECOREtoo as it is required by R5 core when it is being as general purpose core instead of device manager.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)
V6:
- UseCLUSTER_MODE_SINGLECOREfor AM62x
- SetPROC_BOOT_CFG_FLAG_R5_SINGLE_COREfor single core.--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 62 +++++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +9
-4@@ -71,14 +71,16 @@ struct k3_r5_mem {/* * All cluster mode values are not applicable on all SoCs. The following * are the modes supported on various SoCs: -* Split mode : AM65x, J721E, J7200 and AM64x SoCs -* LockStep mode : AM65x, J721E and J7200 SoCs -* Single-CPU mode : AM64x SoCs only +* Split mode : AM65x, J721E, J7200 and AM64x SoCs +* LockStep mode : AM65x, J721E and J7200 SoCs +* Single-CPU mode : AM64x SoCs only +* Single-Core mode : AM62x, AM62A SoCs */ enum cluster_mode {CLUSTER_MODE_SPLIT =0 ,CLUSTER_MODE_LOCKSTEP ,CLUSTER_MODE_SINGLECPU , +CLUSTER_MODE_SINGLECORE };/** @@ -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_SINGLECORE ) { 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 891
Quoted 7 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1@@ -881,7 +886,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc)* with the bit configured, so program it only on * permitted cores */ -if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) { +if (cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE ) { set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ;
Why was this not part of the 5 previous version?
Quoted 11 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0}else {/* @@ -1073,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_SINGLECORE || !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 1158
Quoted 7 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1146,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_SINGLECORE ; + }else if (cluster->soc_data->single_cpu_mode) {
I have already commented on that.
Quoted 98 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +34
-7mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ; }else {@@ -1268,9 +1277,12 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev) goto err_add; } -/* create only one rproc in lockstep mode or single-cpu mode */ +/* create only one rproc in lockstep, single-cpu or +* single core mode +*/ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE )break ; }@@ -1699,12 +1711,19 @@ static int k3_r5_probe(struct platform_device *pdev)return -ENOMEM ; cluster->dev = dev; +/* -* default to most common efuse configurations - Split-mode on AM64x -* and LockStep-mode on all others +* default to most common efuse configurations - +* Split-mode on AM64x +* Single core on AM62x +* 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_SINGLECORE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores);@@ -1716,8 +1735,14 @@ static int k3_r5_probe(struct platform_device *pdev) } 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 ; }@@ -1759,18 +1784,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[] = {@@ -1778,6 +1813,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.34.1
Re: [PATCH v6 3/3] remoteproc: k3-r5: Use separate compatible string for TI AM62x SoC family
Hi Mathieu,
Quoted 81 lines · Mathieu Poirier
Quoted 80 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 defined
CLUSTER_MODE_SINGLECOREand use it when compatible is set to ti,am62-r5fss.Also set
PROC_BOOT_CFG_FLAG_R5_SINGLE_COREconfig forCLUSTER_MODE_SINGLECOREtoo as it is required by R5 core when it is being as general purpose core instead of device manager.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)
V6:
- UseCLUSTER_MODE_SINGLECOREfor AM62x
- SetPROC_BOOT_CFG_FLAG_R5_SINGLE_COREfor single core.--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 62 +++++++++++++++++++----- 1 file changed, 49 insertions(+), 13 deletions(-)drivers/remoteproc/ti_k3_r5_remoteproc.c +9
-4@@ -71,14 +71,16 @@ struct k3_r5_mem {/* * All cluster mode values are not applicable on all SoCs. The following * are the modes supported on various SoCs: -* Split mode : AM65x, J721E, J7200 and AM64x SoCs -* LockStep mode : AM65x, J721E and J7200 SoCs -* Single-CPU mode : AM64x SoCs only +* Split mode : AM65x, J721E, J7200 and AM64x SoCs +* LockStep mode : AM65x, J721E and J7200 SoCs +* Single-CPU mode : AM64x SoCs only +* Single-Core mode : AM62x, AM62A SoCs */ enum cluster_mode {CLUSTER_MODE_SPLIT =0 ,CLUSTER_MODE_LOCKSTEP ,CLUSTER_MODE_SINGLECPU , +CLUSTER_MODE_SINGLECORE };/** @@ -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_SINGLECORE ) { core = core0; }else { core = kproc->core;@@ -881,7 +886,8 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc)* with the bit configured, so program it only on
Quoted 8 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) · line 891
Quoted 6 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +2
-1* permitted cores */ -if (cluster->mode ==CLUSTER_MODE_SINGLECPU ) { +if (cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE ) { set_cfg =PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ;Why was this not part of the 5 previous version?
I came to know about this recently only. The AM62x R5 IPC is functional even without this change but set_config was failing in another single core MCU R5 chip which was using this compatible. The recommendation I got from firmware team was to set this flag for all single core R5 scenarios.
Regards,
Devarsh
Quoted 120 lines
Quoted 12 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +1
-0}else {/* @@ -1073,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_SINGLECORE || !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 1158
Quoted 7 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +3
-1@@ -1146,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_SINGLECORE ; + }else if (cluster->soc_data->single_cpu_mode) {I have already commented on that.
Quoted 98 lines
drivers/remoteproc/ti_k3_r5_remoteproc.c +34
-7mode = cfg &PROC_BOOT_CFG_FLAG_R5_SINGLE_CORE ?CLUSTER_MODE_SINGLECPU :CLUSTER_MODE_SPLIT ; }else {@@ -1268,9 +1277,12 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev) goto err_add; } -/* create only one rproc in lockstep mode or single-cpu mode */ +/* create only one rproc in lockstep, single-cpu or +* single core mode +*/ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP || - cluster->mode ==CLUSTER_MODE_SINGLECPU ) + cluster->mode ==CLUSTER_MODE_SINGLECPU || + cluster->mode ==CLUSTER_MODE_SINGLECORE )break ; }@@ -1699,12 +1711,19 @@ static int k3_r5_probe(struct platform_device *pdev)return -ENOMEM ; cluster->dev = dev; +/* -* default to most common efuse configurations - Split-mode on AM64x -* and LockStep-mode on all others +* default to most common efuse configurations - +* Split-mode on AM64x +* Single core on AM62x +* 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_SINGLECORE ; + cluster->soc_data = data;INIT_LIST_HEAD (&cluster->cores);@@ -1716,8 +1735,14 @@ static int k3_r5_probe(struct platform_device *pdev) } 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 ; }@@ -1759,18 +1784,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[] = {@@ -1778,6 +1813,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.34.1