forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 297b60346df8beafee954a0fd7c2d64f33f3b9bc
kernel/drivers/remoteproc/st_remoteproc.c
....@@ -1,13 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ST's Remote Processor Control Driver
34 *
45 * Copyright (C) 2015 STMicroelectronics - All Rights Reserved
56 *
67 * Author: Ludovic Barre <ludovic.barre@st.com>
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
118 */
129
1310 #include <linux/clk.h>
....@@ -19,6 +16,7 @@
1916 #include <linux/mfd/syscon.h>
2017 #include <linux/module.h>
2118 #include <linux/of.h>
19
+#include <linux/of_address.h>
2220 #include <linux/of_device.h>
2321 #include <linux/of_reserved_mem.h>
2422 #include <linux/platform_device.h>
....@@ -91,6 +89,80 @@
9189 dev_err(dev, "failed to send message via mbox: %d\n", ret);
9290 }
9391
92
+static int st_rproc_mem_alloc(struct rproc *rproc,
93
+ struct rproc_mem_entry *mem)
94
+{
95
+ struct device *dev = rproc->dev.parent;
96
+ void *va;
97
+
98
+ va = ioremap_wc(mem->dma, mem->len);
99
+ if (!va) {
100
+ dev_err(dev, "Unable to map memory region: %pa+%zx\n",
101
+ &mem->dma, mem->len);
102
+ return -ENOMEM;
103
+ }
104
+
105
+ /* Update memory entry va */
106
+ mem->va = va;
107
+
108
+ return 0;
109
+}
110
+
111
+static int st_rproc_mem_release(struct rproc *rproc,
112
+ struct rproc_mem_entry *mem)
113
+{
114
+ iounmap(mem->va);
115
+
116
+ return 0;
117
+}
118
+
119
+static int st_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
120
+{
121
+ struct device *dev = rproc->dev.parent;
122
+ struct device_node *np = dev->of_node;
123
+ struct rproc_mem_entry *mem;
124
+ struct reserved_mem *rmem;
125
+ struct of_phandle_iterator it;
126
+ int index = 0;
127
+
128
+ of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
129
+ while (of_phandle_iterator_next(&it) == 0) {
130
+ rmem = of_reserved_mem_lookup(it.node);
131
+ if (!rmem) {
132
+ of_node_put(it.node);
133
+ dev_err(dev, "unable to acquire memory-region\n");
134
+ return -EINVAL;
135
+ }
136
+
137
+ /* No need to map vdev buffer */
138
+ if (strcmp(it.node->name, "vdev0buffer")) {
139
+ /* Register memory region */
140
+ mem = rproc_mem_entry_init(dev, NULL,
141
+ (dma_addr_t)rmem->base,
142
+ rmem->size, rmem->base,
143
+ st_rproc_mem_alloc,
144
+ st_rproc_mem_release,
145
+ it.node->name);
146
+ } else {
147
+ /* Register reserved memory for vdev buffer allocation */
148
+ mem = rproc_of_resm_mem_entry_init(dev, index,
149
+ rmem->size,
150
+ rmem->base,
151
+ it.node->name);
152
+ }
153
+
154
+ if (!mem) {
155
+ of_node_put(it.node);
156
+ return -ENOMEM;
157
+ }
158
+
159
+ rproc_add_carveout(rproc, mem);
160
+ index++;
161
+ }
162
+
163
+ return rproc_elf_load_rsc_table(rproc, fw);
164
+}
165
+
94166 static int st_rproc_start(struct rproc *rproc)
95167 {
96168 struct st_rproc *ddata = rproc->priv;
....@@ -121,7 +193,7 @@
121193 }
122194 }
123195
124
- dev_info(&rproc->dev, "Started from 0x%x\n", rproc->bootaddr);
196
+ dev_info(&rproc->dev, "Started from 0x%llx\n", rproc->bootaddr);
125197
126198 return 0;
127199
....@@ -158,9 +230,14 @@
158230 }
159231
160232 static const struct rproc_ops st_rproc_ops = {
161
- .kick = st_rproc_kick,
162
- .start = st_rproc_start,
163
- .stop = st_rproc_stop,
233
+ .kick = st_rproc_kick,
234
+ .start = st_rproc_start,
235
+ .stop = st_rproc_stop,
236
+ .parse_fw = st_rproc_parse_fw,
237
+ .load = rproc_elf_load_segments,
238
+ .find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table,
239
+ .sanity_check = rproc_elf_sanity_check,
240
+ .get_boot_addr = rproc_elf_get_boot_addr,
164241 };
165242
166243 /*
....@@ -252,12 +329,6 @@
252329 if (err) {
253330 dev_err(dev, "Boot offset not found\n");
254331 return -EINVAL;
255
- }
256
-
257
- err = of_reserved_mem_device_init(dev);
258
- if (err) {
259
- dev_err(dev, "Failed to obtain shared memory\n");
260
- return err;
261332 }
262333
263334 err = clk_prepare(ddata->clk);
....@@ -386,8 +457,6 @@
386457 rproc_del(rproc);
387458
388459 clk_disable_unprepare(ddata->clk);
389
-
390
- of_reserved_mem_device_release(&pdev->dev);
391460
392461 for (i = 0; i < ST_RPROC_MAX_VRING * MBOX_MAX; i++)
393462 mbox_free_channel(ddata->mbox_chan[i]);