From nobody Wed Dec 17 15:43:43 2025 Received: from lelvem-ot02.ext.ti.com (lelvem-ot02.ext.ti.com [198.47.23.235]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E88FC2376ED; Mon, 17 Mar 2025 12:06:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.47.23.235 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742213218; cv=none; b=H2OoA5VW08N6u5/lRXOUg+zhO6PYpSPe2gQBhqnrO3bNQSSCO7H1Yw2v4+ly4QFsrpxqORNfIGgJUUmkc3rWB4qyLkm/dHTAWc2HZ2SV2noUkWqBi1PNKxmRb98F55XrbAWJNX05YmFcLdtcUOZBW2T0Z0Ars4RJ1oEWrbPL3Og= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742213218; c=relaxed/simple; bh=EFon17fl/5f8yHsJej4/n8l9GJ9B6kMnolTP8FnwSN0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bz4wwqeOThkYPwjqd6/aEtyGLjtASmO5402YBPHjwvV5Pw4N4n0vCmwiv+xfP9DJTjQkYKNcTkL+HDDQaVbiN1OxeeTux06Nmzi+WafLRTYEQrzwQZee2prcrycUsh4Ba+t+/1R2J8sybKsWabi2adFhfjMpkcQCa0fhtXgFLl4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=hfdQgdQe; arc=none smtp.client-ip=198.47.23.235 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="hfdQgdQe" Received: from lelv0266.itg.ti.com ([10.180.67.225]) by lelvem-ot02.ext.ti.com (8.15.2/8.15.2) with ESMTPS id 52HC6djM2802821 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 17 Mar 2025 07:06:39 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1742213199; bh=75ALpHD6hyMFusAZx5Lv3Z1J6hg9kA9b1BiofihXObM=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=hfdQgdQerThMAtvuufWfVuQftfx1PaY8+LicnsEilBTzDzhGQkDUu94Kmcg5FhXi8 ZGxBVH6es7Jt6uturHy4Dn5nK2mOtSGb3jVubz/mdaYn8l9sUhmzH3xvRyA4Xi8YX6 hLK3YkrFOYNxofJtwvzF/qP4rV3lSsSvcU3y9LBU= Received: from DLEE111.ent.ti.com (dlee111.ent.ti.com [157.170.170.22]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTP id 52HC6dqp004905; Mon, 17 Mar 2025 07:06:39 -0500 Received: from DLEE109.ent.ti.com (157.170.170.41) by DLEE111.ent.ti.com (157.170.170.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Mon, 17 Mar 2025 07:06:39 -0500 Received: from lelvsmtp5.itg.ti.com (10.180.75.250) by DLEE109.ent.ti.com (157.170.170.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Mon, 17 Mar 2025 07:06:39 -0500 Received: from uda0510294.dhcp.ti.com (uda0510294.dhcp.ti.com [172.24.227.151]) by lelvsmtp5.itg.ti.com (8.15.2/8.15.2) with ESMTP id 52HC6MJx060901; Mon, 17 Mar 2025 07:06:35 -0500 From: Beleswar Padhi To: , CC: , , , , , , , , , , Subject: [PATCH v9 02/26] remoteproc: k3-r5: Refactor Data Structures to Align with DSP and M4 Date: Mon, 17 Mar 2025 17:35:58 +0530 Message-ID: <20250317120622.1746415-3-b-padhi@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250317120622.1746415-1-b-padhi@ti.com> References: <20250317120622.1746415-1-b-padhi@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea Content-Type: text/plain; charset="utf-8" Currently, struct members such as mem, num_mems, reset, tsp, ti_sci and ti_sci_id are part of the k3_r5_core structure. To align the rproc->priv data structure of the R5 remote processor with that of the DSP and M4, move the above members from k3_r5_core to k3_r5_rproc. Additionally, introduce a void *priv pointer in k3_r5_rproc that can be typecasted to point to the k3_r5_core structure. This abstraction is done to ensure common functionalities across R5, DSP and M4 drivers can be refactored at a later stage. Signed-off-by: Beleswar Padhi --- drivers/remoteproc/ti_k3_r5_remoteproc.c | 381 ++++++++++++----------- 1 file changed, 198 insertions(+), 183 deletions(-) diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/= ti_k3_r5_remoteproc.c index b2738b9a1b2d..525f26996b56 100644 --- a/drivers/remoteproc/ti_k3_r5_remoteproc.c +++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c @@ -114,19 +114,16 @@ struct k3_r5_cluster { const struct k3_r5_soc_data *soc_data; }; =20 +struct k3_r5_rproc; + /** * struct k3_r5_core - K3 R5 core structure * @elem: linked list item * @dev: cached device pointer - * @rproc: rproc handle representing this core - * @mem: internal memory regions data + * @kproc: K3 rproc handle representing this core + * @cluster: cached pointer to parent cluster structure * @sram: on-chip SRAM memory regions data - * @num_mems: number of internal memory regions * @num_sram: number of on-chip SRAM memory regions - * @reset: reset control handle - * @tsp: TI-SCI processor control handle - * @ti_sci: TI-SCI handle - * @ti_sci_id: TI-SCI device identifier * @atcm_enable: flag to control ATCM enablement * @btcm_enable: flag to control BTCM enablement * @loczrama: flag to dictate which TCM is at device address 0x0 @@ -135,15 +132,10 @@ struct k3_r5_cluster { struct k3_r5_core { struct list_head elem; struct device *dev; - struct rproc *rproc; - struct k3_r5_mem *mem; + struct k3_r5_rproc *kproc; + struct k3_r5_cluster *cluster; struct k3_r5_mem *sram; - int num_mems; int num_sram; - struct reset_control *reset; - struct ti_sci_proc *tsp; - const struct ti_sci_handle *ti_sci; - u32 ti_sci_id; u32 atcm_enable; u32 btcm_enable; u32 loczrama; @@ -153,23 +145,33 @@ struct k3_r5_core { /** * struct k3_r5_rproc - K3 remote processor state * @dev: cached device pointer - * @cluster: cached pointer to parent cluster structure - * @mbox: mailbox channel handle - * @client: mailbox client to request the mailbox channel * @rproc: rproc handle - * @core: cached pointer to r5 core structure being used + * @mem: internal memory regions data + * @num_mems: number of internal memory regions * @rmem: reserved memory regions data * @num_rmems: number of reserved memory regions + * @reset: reset control handle + * @tsp: TI-SCI processor control handle + * @ti_sci: TI-SCI handle + * @ti_sci_id: TI-SCI device identifier + * @mbox: mailbox channel handle + * @client: mailbox client to request the mailbox channel + * @priv: Remote processor private data */ struct k3_r5_rproc { struct device *dev; - struct k3_r5_cluster *cluster; - struct mbox_chan *mbox; - struct mbox_client client; struct rproc *rproc; - struct k3_r5_core *core; + struct k3_r5_mem *mem; + int num_mems; struct k3_r5_mem *rmem; int num_rmems; + struct reset_control *reset; + struct ti_sci_proc *tsp; + const struct ti_sci_handle *ti_sci; + u32 ti_sci_id; + struct mbox_chan *mbox; + struct mbox_client client; + void *priv; }; =20 /** @@ -244,48 +246,48 @@ static void k3_r5_rproc_kick(struct rproc *rproc, int= vqid) ret); } =20 -static int k3_r5_split_reset(struct k3_r5_core *core) +static int k3_r5_split_reset(struct k3_r5_rproc *kproc) { int ret; =20 - ret =3D reset_control_assert(core->reset); + ret =3D reset_control_assert(kproc->reset); if (ret) { - dev_err(core->dev, "local-reset assert failed, ret =3D %d\n", + dev_err(kproc->dev, "local-reset assert failed, ret =3D %d\n", ret); return ret; } =20 - ret =3D core->ti_sci->ops.dev_ops.put_device(core->ti_sci, - core->ti_sci_id); + ret =3D kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, + kproc->ti_sci_id); if (ret) { - dev_err(core->dev, "module-reset assert failed, ret =3D %d\n", + dev_err(kproc->dev, "module-reset assert failed, ret =3D %d\n", ret); - if (reset_control_deassert(core->reset)) - dev_warn(core->dev, "local-reset deassert back failed\n"); + if (reset_control_deassert(kproc->reset)) + dev_warn(kproc->dev, "local-reset deassert back failed\n"); } =20 return ret; } =20 -static int k3_r5_split_release(struct k3_r5_core *core) +static int k3_r5_split_release(struct k3_r5_rproc *kproc) { int ret; =20 - ret =3D core->ti_sci->ops.dev_ops.get_device(core->ti_sci, - core->ti_sci_id); + ret =3D kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci, + kproc->ti_sci_id); if (ret) { - dev_err(core->dev, "module-reset deassert failed, ret =3D %d\n", + dev_err(kproc->dev, "module-reset deassert failed, ret =3D %d\n", ret); return ret; } =20 - ret =3D reset_control_deassert(core->reset); + ret =3D reset_control_deassert(kproc->reset); if (ret) { - dev_err(core->dev, "local-reset deassert failed, ret =3D %d\n", + dev_err(kproc->dev, "local-reset deassert failed, ret =3D %d\n", ret); - if (core->ti_sci->ops.dev_ops.put_device(core->ti_sci, - core->ti_sci_id)) - dev_warn(core->dev, "module-reset assert back failed\n"); + if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, + kproc->ti_sci_id)) + dev_warn(kproc->dev, "module-reset assert back failed\n"); } =20 return ret; @@ -294,11 +296,12 @@ static int k3_r5_split_release(struct k3_r5_core *cor= e) static int k3_r5_lockstep_reset(struct k3_r5_cluster *cluster) { struct k3_r5_core *core; + struct k3_r5_rproc *kproc; int ret; =20 /* assert local reset on all applicable cores */ list_for_each_entry(core, &cluster->cores, elem) { - ret =3D reset_control_assert(core->reset); + ret =3D reset_control_assert(core->kproc->reset); if (ret) { dev_err(core->dev, "local-reset assert failed, ret =3D %d\n", ret); @@ -309,8 +312,9 @@ static int k3_r5_lockstep_reset(struct k3_r5_cluster *c= luster) =20 /* disable PSC modules on all applicable cores */ list_for_each_entry(core, &cluster->cores, elem) { - ret =3D core->ti_sci->ops.dev_ops.put_device(core->ti_sci, - core->ti_sci_id); + kproc =3D core->kproc; + ret =3D kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, + kproc->ti_sci_id); if (ret) { dev_err(core->dev, "module-reset assert failed, ret =3D %d\n", ret); @@ -322,14 +326,15 @@ static int k3_r5_lockstep_reset(struct k3_r5_cluster = *cluster) =20 unroll_module_reset: list_for_each_entry_continue_reverse(core, &cluster->cores, elem) { - if (core->ti_sci->ops.dev_ops.put_device(core->ti_sci, - core->ti_sci_id)) + kproc =3D core->kproc; + if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, + kproc->ti_sci_id)) dev_warn(core->dev, "module-reset assert back failed\n"); } core =3D list_last_entry(&cluster->cores, struct k3_r5_core, elem); unroll_local_reset: list_for_each_entry_from_reverse(core, &cluster->cores, elem) { - if (reset_control_deassert(core->reset)) + if (reset_control_deassert(core->kproc->reset)) dev_warn(core->dev, "local-reset deassert back failed\n"); } =20 @@ -339,12 +344,14 @@ static int k3_r5_lockstep_reset(struct k3_r5_cluster = *cluster) static int k3_r5_lockstep_release(struct k3_r5_cluster *cluster) { struct k3_r5_core *core; + struct k3_r5_rproc *kproc; int ret; =20 /* enable PSC modules on all applicable cores */ list_for_each_entry_reverse(core, &cluster->cores, elem) { - ret =3D core->ti_sci->ops.dev_ops.get_device(core->ti_sci, - core->ti_sci_id); + kproc =3D core->kproc; + ret =3D kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci, + kproc->ti_sci_id); if (ret) { dev_err(core->dev, "module-reset deassert failed, ret =3D %d\n", ret); @@ -355,7 +362,7 @@ static int k3_r5_lockstep_release(struct k3_r5_cluster = *cluster) =20 /* deassert local reset on all applicable cores */ list_for_each_entry_reverse(core, &cluster->cores, elem) { - ret =3D reset_control_deassert(core->reset); + ret =3D reset_control_deassert(core->kproc->reset); if (ret) { dev_err(core->dev, "module-reset deassert failed, ret =3D %d\n", ret); @@ -367,29 +374,30 @@ static int k3_r5_lockstep_release(struct k3_r5_cluste= r *cluster) =20 unroll_local_reset: list_for_each_entry_continue(core, &cluster->cores, elem) { - if (reset_control_assert(core->reset)) + if (reset_control_assert(core->kproc->reset)) dev_warn(core->dev, "local-reset assert back failed\n"); } core =3D list_first_entry(&cluster->cores, struct k3_r5_core, elem); unroll_module_reset: list_for_each_entry_from(core, &cluster->cores, elem) { - if (core->ti_sci->ops.dev_ops.put_device(core->ti_sci, - core->ti_sci_id)) + kproc =3D core->kproc; + if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci, + kproc->ti_sci_id)) dev_warn(core->dev, "module-reset assert back failed\n"); } =20 return ret; } =20 -static inline int k3_r5_core_halt(struct k3_r5_core *core) +static inline int k3_r5_core_halt(struct k3_r5_rproc *kproc) { - return ti_sci_proc_set_control(core->tsp, + return ti_sci_proc_set_control(kproc->tsp, PROC_BOOT_CTRL_FLAG_R5_CORE_HALT, 0); } =20 -static inline int k3_r5_core_run(struct k3_r5_core *core) +static inline int k3_r5_core_run(struct k3_r5_rproc *kproc) { - return ti_sci_proc_set_control(core->tsp, + return ti_sci_proc_set_control(kproc->tsp, 0, PROC_BOOT_CTRL_FLAG_R5_CORE_HALT); } =20 @@ -447,15 +455,15 @@ static int k3_r5_rproc_request_mbox(struct rproc *rpr= oc) static int k3_r5_rproc_prepare(struct rproc *rproc) { struct k3_r5_rproc *kproc =3D rproc->priv; - struct k3_r5_cluster *cluster =3D kproc->cluster; - struct k3_r5_core *core =3D kproc->core; + struct k3_r5_core *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *dev =3D kproc->dev; u32 ctrl =3D 0, cfg =3D 0, stat =3D 0; u64 boot_vec =3D 0; bool mem_init_dis; int ret; =20 - ret =3D ti_sci_proc_get_status(core->tsp, &boot_vec, &cfg, &ctrl, &stat); + ret =3D ti_sci_proc_get_status(kproc->tsp, &boot_vec, &cfg, &ctrl, &stat); if (ret < 0) return ret; mem_init_dis =3D !!(cfg & PROC_BOOT_CFG_FLAG_R5_MEM_INIT_DIS); @@ -463,7 +471,7 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) /* Re-use LockStep-mode reset logic for Single-CPU mode */ ret =3D (cluster->mode =3D=3D CLUSTER_MODE_LOCKSTEP || cluster->mode =3D=3D CLUSTER_MODE_SINGLECPU) ? - k3_r5_lockstep_release(cluster) : k3_r5_split_release(core); + k3_r5_lockstep_release(cluster) : k3_r5_split_release(kproc); if (ret) { dev_err(dev, "unable to enable cores for TCM loading, ret =3D %d\n", ret); @@ -487,10 +495,10 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) * can be effective on all TCM addresses. */ dev_dbg(dev, "zeroing out ATCM memory\n"); - memset_io(core->mem[0].cpu_addr, 0x00, core->mem[0].size); + memset_io(kproc->mem[0].cpu_addr, 0x00, kproc->mem[0].size); =20 dev_dbg(dev, "zeroing out BTCM memory\n"); - memset_io(core->mem[1].cpu_addr, 0x00, core->mem[1].size); + memset_io(kproc->mem[1].cpu_addr, 0x00, kproc->mem[1].size); =20 return 0; } @@ -514,15 +522,15 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) static int k3_r5_rproc_unprepare(struct rproc *rproc) { struct k3_r5_rproc *kproc =3D rproc->priv; - struct k3_r5_cluster *cluster =3D kproc->cluster; - struct k3_r5_core *core =3D kproc->core; + struct k3_r5_core *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *dev =3D kproc->dev; int ret; =20 /* Re-use LockStep-mode reset logic for Single-CPU mode */ ret =3D (cluster->mode =3D=3D CLUSTER_MODE_LOCKSTEP || cluster->mode =3D=3D CLUSTER_MODE_SINGLECPU) ? - k3_r5_lockstep_reset(cluster) : k3_r5_split_reset(core); + k3_r5_lockstep_reset(cluster) : k3_r5_split_reset(kproc); if (ret) dev_err(dev, "unable to disable cores, ret =3D %d\n", ret); =20 @@ -549,9 +557,9 @@ static int k3_r5_rproc_unprepare(struct rproc *rproc) static int k3_r5_rproc_start(struct rproc *rproc) { struct k3_r5_rproc *kproc =3D rproc->priv; - struct k3_r5_cluster *cluster =3D kproc->cluster; + struct k3_r5_core *core0, *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *dev =3D kproc->dev; - struct k3_r5_core *core0, *core; u32 boot_addr; int ret; =20 @@ -560,15 +568,14 @@ static int k3_r5_rproc_start(struct rproc *rproc) dev_dbg(dev, "booting R5F core using boot addr =3D 0x%x\n", boot_addr); =20 /* boot vector need not be programmed for Core1 in LockStep mode */ - core =3D kproc->core; - ret =3D ti_sci_proc_set_config(core->tsp, boot_addr, 0, 0); + ret =3D ti_sci_proc_set_config(kproc->tsp, boot_addr, 0, 0); if (ret) return ret; =20 /* unhalt/run all applicable cores */ if (cluster->mode =3D=3D CLUSTER_MODE_LOCKSTEP) { list_for_each_entry_reverse(core, &cluster->cores, elem) { - ret =3D k3_r5_core_run(core); + ret =3D k3_r5_core_run(core->kproc); if (ret) goto unroll_core_run; } @@ -576,13 +583,13 @@ static int k3_r5_rproc_start(struct rproc *rproc) /* do not allow core 1 to start before core 0 */ core0 =3D list_first_entry(&cluster->cores, struct k3_r5_core, elem); - if (core !=3D core0 && core0->rproc->state =3D=3D RPROC_OFFLINE) { + if (core !=3D core0 && core0->kproc->rproc->state =3D=3D RPROC_OFFLINE) { dev_err(dev, "%s: can not start core 1 before core 0\n", __func__); return -EPERM; } =20 - ret =3D k3_r5_core_run(core); + ret =3D k3_r5_core_run(core->kproc); if (ret) return ret; =20 @@ -594,7 +601,7 @@ static int k3_r5_rproc_start(struct rproc *rproc) =20 unroll_core_run: list_for_each_entry_continue(core, &cluster->cores, elem) { - if (k3_r5_core_halt(core)) + if (k3_r5_core_halt(core->kproc)) dev_warn(core->dev, "core halt back failed\n"); } return ret; @@ -627,15 +634,15 @@ static int k3_r5_rproc_start(struct rproc *rproc) static int k3_r5_rproc_stop(struct rproc *rproc) { struct k3_r5_rproc *kproc =3D rproc->priv; - struct k3_r5_cluster *cluster =3D kproc->cluster; + struct k3_r5_core *core1, *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *dev =3D kproc->dev; - struct k3_r5_core *core1, *core =3D kproc->core; int ret; =20 /* halt all applicable cores */ if (cluster->mode =3D=3D CLUSTER_MODE_LOCKSTEP) { list_for_each_entry(core, &cluster->cores, elem) { - ret =3D k3_r5_core_halt(core); + ret =3D k3_r5_core_halt(core->kproc); if (ret) { core =3D list_prev_entry(core, elem); goto unroll_core_halt; @@ -645,14 +652,14 @@ static int k3_r5_rproc_stop(struct rproc *rproc) /* do not allow core 0 to stop before core 1 */ core1 =3D list_last_entry(&cluster->cores, struct k3_r5_core, elem); - if (core !=3D core1 && core1->rproc->state !=3D RPROC_OFFLINE) { + if (core !=3D core1 && core1->kproc->rproc->state !=3D RPROC_OFFLINE) { dev_err(dev, "%s: can not stop core 0 before core 1\n", __func__); ret =3D -EPERM; goto out; } =20 - ret =3D k3_r5_core_halt(core); + ret =3D k3_r5_core_halt(core->kproc); if (ret) goto out; } @@ -661,7 +668,7 @@ static int k3_r5_rproc_stop(struct rproc *rproc) =20 unroll_core_halt: list_for_each_entry_from_reverse(core, &cluster->cores, elem) { - if (k3_r5_core_run(core)) + if (k3_r5_core_run(core->kproc)) dev_warn(core->dev, "core run back failed\n"); } out: @@ -731,7 +738,7 @@ static struct resource_table *k3_r5_get_loaded_rsc_tabl= e(struct rproc *rproc, static void *k3_r5_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len,= bool *is_iomem) { struct k3_r5_rproc *kproc =3D rproc->priv; - struct k3_r5_core *core =3D kproc->core; + struct k3_r5_core *core =3D kproc->priv; void __iomem *va =3D NULL; phys_addr_t bus_addr; u32 dev_addr, offset; @@ -742,22 +749,22 @@ static void *k3_r5_rproc_da_to_va(struct rproc *rproc= , u64 da, size_t len, bool return NULL; =20 /* handle both R5 and SoC views of ATCM and BTCM */ - for (i =3D 0; i < core->num_mems; i++) { - bus_addr =3D core->mem[i].bus_addr; - dev_addr =3D core->mem[i].dev_addr; - size =3D core->mem[i].size; + for (i =3D 0; i < kproc->num_mems; i++) { + bus_addr =3D kproc->mem[i].bus_addr; + dev_addr =3D kproc->mem[i].dev_addr; + size =3D kproc->mem[i].size; =20 /* handle R5-view addresses of TCMs */ if (da >=3D dev_addr && ((da + len) <=3D (dev_addr + size))) { offset =3D da - dev_addr; - va =3D core->mem[i].cpu_addr + offset; + va =3D kproc->mem[i].cpu_addr + offset; return (__force void *)va; } =20 /* handle SoC-view addresses of TCMs */ if (da >=3D bus_addr && ((da + len) <=3D (bus_addr + size))) { offset =3D da - bus_addr; - va =3D core->mem[i].cpu_addr + offset; + va =3D kproc->mem[i].cpu_addr + offset; return (__force void *)va; } } @@ -835,9 +842,9 @@ static const struct rproc_ops k3_r5_rproc_ops =3D { */ static int k3_r5_rproc_configure(struct k3_r5_rproc *kproc) { - struct k3_r5_cluster *cluster =3D kproc->cluster; + struct k3_r5_core *temp, *core0, *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *dev =3D kproc->dev; - struct k3_r5_core *core0, *core, *temp; u32 ctrl =3D 0, cfg =3D 0, stat =3D 0; u32 set_cfg =3D 0, clr_cfg =3D 0; u64 boot_vec =3D 0; @@ -851,10 +858,10 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *= kproc) cluster->mode =3D=3D CLUSTER_MODE_SINGLECORE) { core =3D core0; } else { - core =3D kproc->core; + core =3D kproc->priv; } =20 - ret =3D ti_sci_proc_get_status(core->tsp, &boot_vec, &cfg, &ctrl, + ret =3D ti_sci_proc_get_status(core->kproc->tsp, &boot_vec, &cfg, &ctrl, &stat); if (ret < 0) return ret; @@ -924,7 +931,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kp= roc) * and TEINIT config is only allowed with Core0. */ list_for_each_entry(temp, &cluster->cores, elem) { - ret =3D k3_r5_core_halt(temp); + ret =3D k3_r5_core_halt(temp->kproc); if (ret) goto out; =20 @@ -932,7 +939,7 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *kp= roc) clr_cfg &=3D ~PROC_BOOT_CFG_FLAG_R5_LOCKSTEP; clr_cfg &=3D ~PROC_BOOT_CFG_FLAG_R5_TEINIT; } - ret =3D ti_sci_proc_set_config(temp->tsp, boot_vec, + ret =3D ti_sci_proc_set_config(temp->kproc->tsp, boot_vec, set_cfg, clr_cfg); if (ret) goto out; @@ -940,14 +947,14 @@ static int k3_r5_rproc_configure(struct k3_r5_rproc *= kproc) =20 set_cfg =3D PROC_BOOT_CFG_FLAG_R5_LOCKSTEP; clr_cfg =3D 0; - ret =3D ti_sci_proc_set_config(core->tsp, boot_vec, + ret =3D ti_sci_proc_set_config(core->kproc->tsp, boot_vec, set_cfg, clr_cfg); } else { - ret =3D k3_r5_core_halt(core); + ret =3D k3_r5_core_halt(core->kproc); if (ret) goto out; =20 - ret =3D ti_sci_proc_set_config(core->tsp, boot_vec, + ret =3D ti_sci_proc_set_config(core->kproc->tsp, boot_vec, set_cfg, clr_cfg); } =20 @@ -1057,10 +1064,9 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rpro= c *kproc) */ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rproc *kproc) { - struct k3_r5_cluster *cluster =3D kproc->cluster; - struct k3_r5_core *core =3D kproc->core; + struct k3_r5_core *core0, *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *cdev =3D core->dev; - struct k3_r5_core *core0; =20 if (cluster->mode =3D=3D CLUSTER_MODE_LOCKSTEP || cluster->mode =3D=3D CLUSTER_MODE_SINGLECPU || @@ -1070,14 +1076,14 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rpr= oc *kproc) =20 core0 =3D list_first_entry(&cluster->cores, struct k3_r5_core, elem); if (core =3D=3D core0) { - WARN_ON(core->mem[0].size !=3D SZ_64K); - WARN_ON(core->mem[1].size !=3D SZ_64K); + WARN_ON(kproc->mem[0].size !=3D SZ_64K); + WARN_ON(kproc->mem[1].size !=3D SZ_64K); =20 - core->mem[0].size /=3D 2; - core->mem[1].size /=3D 2; + kproc->mem[0].size /=3D 2; + kproc->mem[1].size /=3D 2; =20 dev_dbg(cdev, "adjusted TCM sizes, ATCM =3D 0x%zx BTCM =3D 0x%zx\n", - core->mem[0].size, core->mem[1].size); + kproc->mem[0].size, kproc->mem[1].size); } } =20 @@ -1096,22 +1102,21 @@ static void k3_r5_adjust_tcm_sizes(struct k3_r5_rpr= oc *kproc) */ static int k3_r5_rproc_configure_mode(struct k3_r5_rproc *kproc) { - struct k3_r5_cluster *cluster =3D kproc->cluster; - struct k3_r5_core *core =3D kproc->core; + struct k3_r5_core *core0, *core =3D kproc->priv; + struct k3_r5_cluster *cluster =3D core->cluster; struct device *cdev =3D core->dev; bool r_state =3D false, c_state =3D false, lockstep_en =3D false, single_= cpu =3D false; u32 ctrl =3D 0, cfg =3D 0, stat =3D 0, halted =3D 0; u64 boot_vec =3D 0; u32 atcm_enable, btcm_enable, loczrama; - struct k3_r5_core *core0; enum cluster_mode mode =3D cluster->mode; int reset_ctrl_status; int ret; =20 core0 =3D list_first_entry(&cluster->cores, struct k3_r5_core, elem); =20 - ret =3D core->ti_sci->ops.dev_ops.is_on(core->ti_sci, core->ti_sci_id, - &r_state, &c_state); + ret =3D kproc->ti_sci->ops.dev_ops.is_on(kproc->ti_sci, kproc->ti_sci_id, + &r_state, &c_state); if (ret) { dev_err(cdev, "failed to get initial state, mode cannot be determined, r= et =3D %d\n", ret); @@ -1122,7 +1127,7 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rp= roc *kproc) r_state, c_state); } =20 - reset_ctrl_status =3D reset_control_status(core->reset); + reset_ctrl_status =3D reset_control_status(kproc->reset); if (reset_ctrl_status < 0) { dev_err(cdev, "failed to get initial local reset status, ret =3D %d\n", reset_ctrl_status); @@ -1135,7 +1140,7 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_rp= roc *kproc) */ core->released_from_reset =3D c_state; =20 - ret =3D ti_sci_proc_get_status(core->tsp, &boot_vec, &cfg, &ctrl, + ret =3D ti_sci_proc_get_status(kproc->tsp, &boot_vec, &cfg, &ctrl, &stat); if (ret < 0) { dev_err(cdev, "failed to get initial processor status, ret =3D %d\n", @@ -1192,25 +1197,26 @@ static int k3_r5_rproc_configure_mode(struct k3_r5_= rproc *kproc) core->atcm_enable =3D atcm_enable; core->btcm_enable =3D btcm_enable; core->loczrama =3D loczrama; - core->mem[0].dev_addr =3D loczrama ? 0 : K3_R5_TCM_DEV_ADDR; - core->mem[1].dev_addr =3D loczrama ? K3_R5_TCM_DEV_ADDR : 0; + kproc->mem[0].dev_addr =3D loczrama ? 0 : K3_R5_TCM_DEV_ADDR; + kproc->mem[1].dev_addr =3D loczrama ? K3_R5_TCM_DEV_ADDR : 0; } =20 return ret; } =20 static int k3_r5_core_of_get_internal_memories(struct platform_device *pde= v, - struct k3_r5_core *core) + struct k3_r5_rproc *kproc) { static const char * const mem_names[] =3D {"atcm", "btcm"}; struct device *dev =3D &pdev->dev; + struct k3_r5_core *core =3D kproc->priv; struct resource *res; int num_mems; int i; =20 num_mems =3D ARRAY_SIZE(mem_names); - core->mem =3D devm_kcalloc(dev, num_mems, sizeof(*core->mem), GFP_KERNEL); - if (!core->mem) + kproc->mem =3D devm_kcalloc(dev, num_mems, sizeof(*kproc->mem), GFP_KERNE= L); + if (!kproc->mem) return -ENOMEM; =20 for (i =3D 0; i < num_mems; i++) { @@ -1236,13 +1242,13 @@ static int k3_r5_core_of_get_internal_memories(stru= ct platform_device *pdev, * unaligned data accesses when using memcpy() or memset() * functions (normally seen with device type memory). */ - core->mem[i].cpu_addr =3D devm_ioremap_wc(dev, res->start, - resource_size(res)); - if (!core->mem[i].cpu_addr) { + kproc->mem[i].cpu_addr =3D devm_ioremap_wc(dev, res->start, + resource_size(res)); + if (!kproc->mem[i].cpu_addr) { dev_err(dev, "failed to map %s memory\n", mem_names[i]); return -ENOMEM; } - core->mem[i].bus_addr =3D res->start; + kproc->mem[i].bus_addr =3D res->start; =20 /* * TODO: @@ -1253,20 +1259,20 @@ static int k3_r5_core_of_get_internal_memories(stru= ct platform_device *pdev, * SoCs) based on loczrama setting */ if (!strcmp(mem_names[i], "atcm")) { - core->mem[i].dev_addr =3D core->loczrama ? + kproc->mem[i].dev_addr =3D core->loczrama ? 0 : K3_R5_TCM_DEV_ADDR; } else { - core->mem[i].dev_addr =3D core->loczrama ? + kproc->mem[i].dev_addr =3D core->loczrama ? K3_R5_TCM_DEV_ADDR : 0; } - core->mem[i].size =3D resource_size(res); + kproc->mem[i].size =3D resource_size(res); =20 dev_dbg(dev, "memory %5s: bus addr %pa size 0x%zx va %pK da 0x%x\n", - mem_names[i], &core->mem[i].bus_addr, - core->mem[i].size, core->mem[i].cpu_addr, - core->mem[i].dev_addr); + mem_names[i], &kproc->mem[i].bus_addr, + kproc->mem[i].size, kproc->mem[i].cpu_addr, + kproc->mem[i].dev_addr); } - core->num_mems =3D num_mems; + kproc->num_mems =3D num_mems; =20 return 0; } @@ -1284,6 +1290,7 @@ static int k3_r5_cluster_rproc_init(struct platform_d= evice *pdev) struct device *dev =3D &pdev->dev; struct k3_r5_rproc *kproc; struct k3_r5_core *core, *core1; + struct device_node *np; struct device *cdev; const char *fw_name; struct rproc *rproc; @@ -1292,6 +1299,7 @@ static int k3_r5_cluster_rproc_init(struct platform_d= evice *pdev) core1 =3D list_last_entry(&cluster->cores, struct k3_r5_core, elem); list_for_each_entry(core, &cluster->cores, elem) { cdev =3D core->dev; + np =3D dev_of_node(cdev); ret =3D rproc_of_parse_firmware(cdev, 0, &fw_name); if (ret) { dev_err(dev, "failed to parse firmware-name property, ret =3D %d\n", @@ -1312,11 +1320,63 @@ static int k3_r5_cluster_rproc_init(struct platform= _device *pdev) rproc->recovery_disabled =3D true; =20 kproc =3D rproc->priv; - kproc->cluster =3D cluster; - kproc->core =3D core; + kproc->priv =3D core; kproc->dev =3D cdev; kproc->rproc =3D rproc; - core->rproc =3D rproc; + core->kproc =3D kproc; + + kproc->ti_sci =3D devm_ti_sci_get_by_phandle(cdev, "ti,sci"); + if (IS_ERR(kproc->ti_sci)) { + ret =3D dev_err_probe(cdev, PTR_ERR(kproc->ti_sci), + "failed to get ti-sci handle\n"); + kproc->ti_sci =3D NULL; + goto out; + } + + ret =3D of_property_read_u32(np, "ti,sci-dev-id", &kproc->ti_sci_id); + if (ret) { + dev_err(cdev, "missing 'ti,sci-dev-id' property\n"); + goto out; + } + + kproc->reset =3D devm_reset_control_get_exclusive(cdev, NULL); + if (IS_ERR_OR_NULL(kproc->reset)) { + ret =3D PTR_ERR_OR_ZERO(kproc->reset); + if (!ret) + ret =3D -ENODEV; + dev_err_probe(cdev, ret, "failed to get reset handle\n"); + goto out; + } + + kproc->tsp =3D ti_sci_proc_of_get_tsp(cdev, kproc->ti_sci); + if (IS_ERR(kproc->tsp)) { + ret =3D dev_err_probe(cdev, PTR_ERR(kproc->tsp), + "failed to construct ti-sci proc control\n"); + goto out; + } + + ret =3D k3_r5_core_of_get_internal_memories(to_platform_device(cdev), kp= roc); + if (ret) { + dev_err(cdev, "failed to get internal memories, ret =3D %d\n", + ret); + goto out; + } + + ret =3D ti_sci_proc_request(kproc->tsp); + if (ret < 0) { + dev_err(cdev, "ti_sci_proc_request failed, ret =3D %d\n", ret); + goto out; + } + + ret =3D devm_add_action_or_reset(cdev, k3_r5_release_tsp, kproc->tsp); + if (ret) + goto out; + } + + list_for_each_entry(core, &cluster->cores, elem) { + cdev =3D core->dev; + kproc =3D core->kproc; + rproc =3D kproc->rproc; =20 ret =3D k3_r5_rproc_request_mbox(rproc); if (ret) @@ -1330,7 +1390,7 @@ static int k3_r5_cluster_rproc_init(struct platform_d= evice *pdev) =20 ret =3D k3_r5_rproc_configure(kproc); if (ret) { - dev_err(dev, "initial configure failed, ret =3D %d\n", + dev_err(cdev, "initial configure failed, ret =3D %d\n", ret); goto out; } @@ -1340,14 +1400,14 @@ static int k3_r5_cluster_rproc_init(struct platform= _device *pdev) =20 ret =3D k3_r5_reserved_mem_init(kproc); if (ret) { - dev_err(dev, "reserved memory init failed, ret =3D %d\n", + dev_err(cdev, "reserved memory init failed, ret =3D %d\n", ret); goto out; } =20 - ret =3D devm_rproc_add(dev, rproc); + ret =3D devm_rproc_add(cdev, rproc); if (ret) { - dev_err_probe(dev, ret, "rproc_add failed\n"); + dev_err_probe(cdev, ret, "rproc_add failed\n"); goto out; } =20 @@ -1373,7 +1433,7 @@ static int k3_r5_cluster_rproc_init(struct platform_d= evice *pdev) core->released_from_reset, msecs_to_jiffies(2000)); if (ret <=3D 0) { - dev_err(dev, + dev_err(cdev, "Timed out waiting for %s core to power up!\n", rproc->name); goto out; @@ -1396,8 +1456,8 @@ static int k3_r5_cluster_rproc_init(struct platform_d= evice *pdev) /* undo core0 upon any failures on core1 in split-mode */ if (cluster->mode =3D=3D CLUSTER_MODE_SPLIT && core =3D=3D core1) { core =3D list_prev_entry(core, elem); - rproc =3D core->rproc; - kproc =3D rproc->priv; + kproc =3D core->kproc; + rproc =3D kproc->rproc; goto err_split; } return ret; @@ -1422,8 +1482,8 @@ static void k3_r5_cluster_rproc_exit(void *data) list_last_entry(&cluster->cores, struct k3_r5_core, elem); =20 list_for_each_entry_from_reverse(core, &cluster->cores, elem) { - rproc =3D core->rproc; - kproc =3D rproc->priv; + kproc =3D core->kproc; + rproc =3D kproc->rproc; =20 if (rproc->state =3D=3D RPROC_ATTACHED) { ret =3D rproc_detach(rproc); @@ -1539,58 +1599,12 @@ static int k3_r5_core_of_init(struct platform_devic= e *pdev) goto err; } =20 - core->ti_sci =3D devm_ti_sci_get_by_phandle(dev, "ti,sci"); - if (IS_ERR(core->ti_sci)) { - ret =3D dev_err_probe(dev, PTR_ERR(core->ti_sci), "failed to get ti-sci = handle\n"); - core->ti_sci =3D NULL; - goto err; - } - - ret =3D of_property_read_u32(np, "ti,sci-dev-id", &core->ti_sci_id); - if (ret) { - dev_err(dev, "missing 'ti,sci-dev-id' property\n"); - goto err; - } - - core->reset =3D devm_reset_control_get_exclusive(dev, NULL); - if (IS_ERR_OR_NULL(core->reset)) { - ret =3D PTR_ERR_OR_ZERO(core->reset); - if (!ret) - ret =3D -ENODEV; - dev_err_probe(dev, ret, "failed to get reset handle\n"); - goto err; - } - - core->tsp =3D ti_sci_proc_of_get_tsp(dev, core->ti_sci); - if (IS_ERR(core->tsp)) { - ret =3D dev_err_probe(dev, PTR_ERR(core->tsp), - "failed to construct ti-sci proc control\n"); - goto err; - } - - ret =3D k3_r5_core_of_get_internal_memories(pdev, core); - if (ret) { - dev_err(dev, "failed to get internal memories, ret =3D %d\n", - ret); - goto err; - } - ret =3D k3_r5_core_of_get_sram_memories(pdev, core); if (ret) { dev_err(dev, "failed to get sram memories, ret =3D %d\n", ret); goto err; } =20 - ret =3D ti_sci_proc_request(core->tsp); - if (ret < 0) { - dev_err(dev, "ti_sci_proc_request failed, ret =3D %d\n", ret); - goto err; - } - - ret =3D devm_add_action_or_reset(dev, k3_r5_release_tsp, core->tsp); - if (ret) - goto err; - platform_set_drvdata(pdev, core); devres_close_group(dev, k3_r5_core_of_init); =20 @@ -1652,6 +1666,7 @@ static int k3_r5_cluster_of_init(struct platform_devi= ce *pdev) } =20 core =3D platform_get_drvdata(cpdev); + core->cluster =3D cluster; put_device(&cpdev->dev); list_add_tail(&core->elem, &cluster->cores); } --=20 2.34.1