Skip to content

Commit 6248b01

Browse files
rpmsg: adi: reduce amount of changes
1 parent 3b2ee5c commit 6248b01

File tree

1 file changed

+56
-83
lines changed

1 file changed

+56
-83
lines changed

drivers/remoteproc/adi_remoteproc.c

Lines changed: 56 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ static struct adi_sharc_resource_table _rsc_table_template = {
138138
},
139139
};
140140

141-
enum adi_rproc_rproc_state {
142-
ADI_REMOTEPROC_SYNCED = 0,
143-
ADI_REMOTEPROC_WAITING = 1,
144-
ADI_REMOTEPROC_TIMED_OUT = 2,
141+
enum adi_rproc_rpmsg_state {
142+
ADI_RP_RPMSG_SYNCED = 0,
143+
ADI_RP_RPMSG_WAITING = 1,
144+
ADI_RP_RPMSG_TIMED_OUT = 2,
145145
};
146146

147147
struct adi_rproc_data {
@@ -162,7 +162,7 @@ struct adi_rproc_data {
162162
void __iomem *L1_shared_base;
163163
void __iomem *L2_shared_base;
164164
struct workqueue_struct *core_workqueue;
165-
enum adi_rproc_rproc_state rproc_state;
165+
enum adi_rproc_rpmsg_state rpmsg_state;
166166
u64 l1_da_range[2];
167167
u64 l2_da_range[2];
168168
u32 verify;
@@ -176,21 +176,15 @@ struct adi_rproc_data {
176176
static int adi_core_set_svect(struct adi_rproc_data *rproc_data,
177177
unsigned long svect)
178178
{
179-
uint32_t core_id = !!svect * rproc_data->core_id;
180-
181-
switch (core_id) {
182-
case 1:
183-
adi_rcu_writel(svect, rproc_data->rcu,
184-
ADI_RCU_REG_SVECT1);
185-
break;
186-
case 2:
187-
adi_rcu_writel(svect, rproc_data->rcu,
188-
ADI_RCU_REG_SVECT2);
189-
break;
190-
default:
191-
dev_err(rproc_data->dev,
192-
"%s, invalid svect:0x%lx, cord_id:%d\n",
193-
__func__, svect, core_id);
179+
int coreid = rproc_data->core_id;
180+
181+
if (svect && (coreid == 1))
182+
adi_rcu_writel(svect, rproc_data->rcu, ADI_RCU_REG_SVECT1);
183+
else if (svect && (coreid == 2))
184+
adi_rcu_writel(svect, rproc_data->rcu, ADI_RCU_REG_SVECT2);
185+
else {
186+
dev_err(rproc_data->dev, "%s, invalid svect:0x%lx, cord_id:%d\n",
187+
__func__, svect, coreid);
194188
return -EINVAL;
195189
}
196190

@@ -203,19 +197,19 @@ static int adi_core_start(struct adi_rproc_data *rproc_data)
203197
{
204198
int ret = 0;
205199

206-
if (!rproc_data->adi_rsc_table) {
207-
dev_err(rproc_data->dev,
208-
"Could not start core, no resource table\n");
200+
if (rproc_data->adi_rsc_table != NULL) {
201+
rproc_data->rpmsg_state = ADI_RP_RPMSG_WAITING;
202+
ret = devm_request_threaded_irq(rproc_data->dev,
203+
rproc_data->icc_irq, NULL,
204+
sharc_virtio_irq_threaded_handler,
205+
rproc_data->icc_irq_flags,
206+
"ICC virtio IRQ", rproc_data);
207+
}
208+
if (ret) {
209+
dev_err(rproc_data->dev, "Fail to request ICC IRQ\n");
209210
return -ENOENT;
210211
}
211212

212-
rproc_data->rproc_state = ADI_REMOTEPROC_WAITING;
213-
ret = devm_request_threaded_irq(rproc_data->dev,
214-
rproc_data->icc_irq, NULL,
215-
sharc_virtio_irq_threaded_handler,
216-
rproc_data->icc_irq_flags,
217-
"ICC virtio IRQ", rproc_data);
218-
219213
return adi_rcu_start_core(rproc_data->rcu, rproc_data->core_id);
220214
}
221215

@@ -227,11 +221,10 @@ static int adi_core_reset(struct adi_rproc_data *rproc_data)
227221
static int adi_core_stop(struct adi_rproc_data *rproc_data)
228222
{
229223
/* After time out the irq is already released */
230-
if (rproc_data->rproc_state == ADI_REMOTEPROC_TIMED_OUT)
231-
goto adi_stop_ret;
232-
233-
devm_free_irq(rproc_data->dev, rproc_data->icc_irq, rproc_data);
234-
adi_stop_ret:
224+
if (rproc_data->adi_rsc_table != NULL) {
225+
if (rproc_data->rpmsg_state != ADI_RP_RPMSG_TIMED_OUT)
226+
devm_free_irq(rproc_data->dev, rproc_data->icc_irq, rproc_data);
227+
}
235228
return adi_rcu_stop_core(rproc_data->rcu,
236229
rproc_data->core_id, rproc_data->core_irq);
237230
}
@@ -258,15 +251,14 @@ static void load_callback(void *p)
258251
complete(cmp);
259252
}
260253

261-
/*
262-
* We validate if the current and next header checksum are valid based
263-
* on the current header block. This way we validate the current block
264-
* header integrity and validity of the block size with respect to the stream.
265-
*
266-
* In case of Direct Code Execution and Single block boot streams it is possible
267-
* to verify the block header via an xor checksum of the bcode_flag field.
268-
*/
269-
254+
/*
255+
* We validate if the current and next header checksum are valid based
256+
* on the current header block. This way we validate the current block
257+
* header integrity and validity of the block size with respect to the stream.
258+
*
259+
* In case of Direct Code Execution and Single block boot streams it is possible
260+
* to verify the block header via an xor checksum of the bcode_flag field.
261+
*/
270262
static int adi_verify_ldr_hdr(struct adi_rproc_data *rproc_data,
271263
struct ldr_hdr *block_hdr)
272264
{
@@ -317,7 +309,6 @@ static int adi_verify_ldr_hdr(struct adi_rproc_data *rproc_data,
317309
curr_hdr_xor_checksum);
318310
return -EINVAL;
319311
}
320-
321312
}
322313

323314
/* Check if size offset leads to next header, unless final (should have
@@ -442,14 +433,12 @@ static int ldr_load(struct adi_rproc_data *rproc_data)
442433
if (rproc_data->verify)
443434
dev_info(rproc_data->dev,
444435
"Verified and loaded ldr\n");
445-
446436
return 0;
447437
}
448438

449439
}
450440

451441
return 0;
452-
453442
}
454443

455444
static int adi_valid_firmware(struct rproc *rproc, const struct firmware *fw)
@@ -488,7 +477,7 @@ static int adi_ldr_load(struct adi_rproc_data *rproc_data,
488477
const struct firmware *fw)
489478
{
490479
rproc_data->fw_size = fw->size;
491-
if (!rproc_data->mem_virt) {
480+
if (rproc_data->mem_virt == NULL) {
492481
rproc_data->mem_virt = dma_alloc_coherent(rproc_data->dev,
493482
fw->size * MEMORY_COUNT,
494483
&rproc_data->mem_handle,
@@ -830,43 +819,30 @@ static irqreturn_t sharc_virtio_irq_threaded_handler(int irq, void *p)
830819
/* kick a virtqueue */
831820
static void adi_rproc_kick(struct rproc *rproc, int vqid)
832821
{
833-
struct adi_rproc_data *rproc_data;
834-
struct adi_resource_table_hdr *hdr;
835-
uint32_t core_init = 0;
822+
struct adi_rproc_data *rproc_data = (struct adi_rproc_data *)rproc->priv;
836823
int wait_time;
837824

838-
rproc_data = (struct adi_rproc_data *)rproc->priv;
839825
/* On first kick check if remote core has done its initialization */
840-
if (rproc_data->rproc_state != ADI_REMOTEPROC_WAITING) {
841-
if (rproc_data->rproc_state == ADI_REMOTEPROC_SYNCED)
842-
adi_tru_trigger_device(rproc_data->tru, rproc_data->dev);
843-
844-
return;
845-
}
846-
847-
hdr = &rproc_data->adi_rsc_table->adi_table_hdr;
848-
core_init = hdr->initialized;
849-
for (wait_time = 0; wait_time < CORE_INIT_TIMEOUT_MS; wait_time += 20) {
850-
core_init = hdr->initialized;
851-
if (core_init == ADI_RSC_TABLE_INIT_MAGIC) {
852-
rproc_data->rproc_state = ADI_REMOTEPROC_SYNCED;
853-
break;
826+
if (rproc_data->rpmsg_state == ADI_RP_RPMSG_WAITING) {
827+
for (wait_time = 0; wait_time < CORE_INIT_TIMEOUT_MS; wait_time += 20) {
828+
if (rproc_data->adi_rsc_table->adi_table_hdr.initialized ==
829+
ADI_RSC_TABLE_INIT_MAGIC) {
830+
rproc_data->rpmsg_state = ADI_RP_RPMSG_SYNCED;
831+
break;
832+
}
833+
msleep(20);
834+
}
835+
if (rproc_data->rpmsg_state != ADI_RP_RPMSG_SYNCED) {
836+
rproc_data->rpmsg_state = ADI_RP_RPMSG_TIMED_OUT;
837+
devm_free_irq(rproc_data->dev, rproc_data->icc_irq, rproc_data);
838+
dev_info(rproc_data->dev,
839+
"Core%d rpmsg init timeout, probably not supported.\n",
840+
rproc_data->core_id);
854841
}
855-
856-
msleep(20);
857842
}
858843

859-
if (rproc_data->rproc_state == ADI_REMOTEPROC_SYNCED) {
844+
if (rproc_data->rpmsg_state == ADI_RP_RPMSG_SYNCED)
860845
adi_tru_trigger_device(rproc_data->tru, rproc_data->dev);
861-
return;
862-
}
863-
864-
rproc_data->rproc_state = ADI_REMOTEPROC_TIMED_OUT;
865-
devm_free_irq(rproc_data->dev, rproc_data->icc_irq,
866-
rproc_data);
867-
dev_info(rproc_data->dev,
868-
"Core%d rpmsg init timeout, probably not supported.\n",
869-
rproc_data->core_id);
870846
}
871847

872848
static int adi_rproc_sanity_check(struct rproc *rproc, const struct firmware *fw)
@@ -1014,8 +990,6 @@ static int adi_remoteproc_probe(struct platform_device *pdev)
1014990
/* Get ADI resource table address */
1015991
node = of_parse_phandle(np, "adi,rsc-table", 0);
1016992
if (node) {
1017-
u32 irq_flags = 0;
1018-
1019993
dev_info(&pdev->dev, "Resource table set, enable rpmsg\n");
1020994
rmem = of_reserved_mem_lookup(node);
1021995
of_node_put(node);
@@ -1042,8 +1016,7 @@ static int adi_remoteproc_probe(struct platform_device *pdev)
10421016
goto free_adi_rcu;
10431017
}
10441018

1045-
irq_flags = IRQF_PERCPU | IRQF_SHARED | IRQF_ONESHOT;
1046-
rproc_data->icc_irq_flags = irq_flags;
1019+
rproc_data->icc_irq_flags = IRQF_PERCPU | IRQF_SHARED | IRQF_ONESHOT;
10471020
} else {
10481021
rproc_data->adi_rsc_table = NULL;
10491022
}
@@ -1106,7 +1079,7 @@ static int adi_remoteproc_probe(struct platform_device *pdev)
11061079
rproc_data->mem_virt = NULL;
11071080
rproc_data->fw_size = 0;
11081081
rproc_data->ldr_load_addr = SHARC_IDLE_ADDR; //start core as idle
1109-
rproc_data->rproc_state = ADI_REMOTEPROC_TIMED_OUT;
1082+
rproc_data->rpmsg_state = ADI_RP_RPMSG_TIMED_OUT;
11101083

11111084
ret = rproc_add(rproc);
11121085
if (ret) {

0 commit comments

Comments
 (0)