@@ -138,10 +138,10 @@ static struct adi_sharc_resource_table _rsc_table_template = {
138
138
},
139
139
};
140
140
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 ,
145
145
};
146
146
147
147
struct adi_rproc_data {
@@ -162,7 +162,7 @@ struct adi_rproc_data {
162
162
void __iomem * L1_shared_base ;
163
163
void __iomem * L2_shared_base ;
164
164
struct workqueue_struct * core_workqueue ;
165
- enum adi_rproc_rproc_state rproc_state ;
165
+ enum adi_rproc_rpmsg_state rpmsg_state ;
166
166
u64 l1_da_range [2 ];
167
167
u64 l2_da_range [2 ];
168
168
u32 verify ;
@@ -176,21 +176,15 @@ struct adi_rproc_data {
176
176
static int adi_core_set_svect (struct adi_rproc_data * rproc_data ,
177
177
unsigned long svect )
178
178
{
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 );
194
188
return - EINVAL ;
195
189
}
196
190
@@ -203,19 +197,19 @@ static int adi_core_start(struct adi_rproc_data *rproc_data)
203
197
{
204
198
int ret = 0 ;
205
199
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" );
209
210
return - ENOENT ;
210
211
}
211
212
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
-
219
213
return adi_rcu_start_core (rproc_data -> rcu , rproc_data -> core_id );
220
214
}
221
215
@@ -227,11 +221,10 @@ static int adi_core_reset(struct adi_rproc_data *rproc_data)
227
221
static int adi_core_stop (struct adi_rproc_data * rproc_data )
228
222
{
229
223
/* 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
+ }
235
228
return adi_rcu_stop_core (rproc_data -> rcu ,
236
229
rproc_data -> core_id , rproc_data -> core_irq );
237
230
}
@@ -258,15 +251,14 @@ static void load_callback(void *p)
258
251
complete (cmp );
259
252
}
260
253
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
+ */
270
262
static int adi_verify_ldr_hdr (struct adi_rproc_data * rproc_data ,
271
263
struct ldr_hdr * block_hdr )
272
264
{
@@ -317,7 +309,6 @@ static int adi_verify_ldr_hdr(struct adi_rproc_data *rproc_data,
317
309
curr_hdr_xor_checksum );
318
310
return - EINVAL ;
319
311
}
320
-
321
312
}
322
313
323
314
/* 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)
442
433
if (rproc_data -> verify )
443
434
dev_info (rproc_data -> dev ,
444
435
"Verified and loaded ldr\n" );
445
-
446
436
return 0 ;
447
437
}
448
438
449
439
}
450
440
451
441
return 0 ;
452
-
453
442
}
454
443
455
444
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,
488
477
const struct firmware * fw )
489
478
{
490
479
rproc_data -> fw_size = fw -> size ;
491
- if (! rproc_data -> mem_virt ) {
480
+ if (rproc_data -> mem_virt == NULL ) {
492
481
rproc_data -> mem_virt = dma_alloc_coherent (rproc_data -> dev ,
493
482
fw -> size * MEMORY_COUNT ,
494
483
& rproc_data -> mem_handle ,
@@ -830,43 +819,30 @@ static irqreturn_t sharc_virtio_irq_threaded_handler(int irq, void *p)
830
819
/* kick a virtqueue */
831
820
static void adi_rproc_kick (struct rproc * rproc , int vqid )
832
821
{
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 ;
836
823
int wait_time ;
837
824
838
- rproc_data = (struct adi_rproc_data * )rproc -> priv ;
839
825
/* 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 );
854
841
}
855
-
856
- msleep (20 );
857
842
}
858
843
859
- if (rproc_data -> rproc_state == ADI_REMOTEPROC_SYNCED ) {
844
+ if (rproc_data -> rpmsg_state == ADI_RP_RPMSG_SYNCED )
860
845
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 );
870
846
}
871
847
872
848
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)
1014
990
/* Get ADI resource table address */
1015
991
node = of_parse_phandle (np , "adi,rsc-table" , 0 );
1016
992
if (node ) {
1017
- u32 irq_flags = 0 ;
1018
-
1019
993
dev_info (& pdev -> dev , "Resource table set, enable rpmsg\n" );
1020
994
rmem = of_reserved_mem_lookup (node );
1021
995
of_node_put (node );
@@ -1042,8 +1016,7 @@ static int adi_remoteproc_probe(struct platform_device *pdev)
1042
1016
goto free_adi_rcu ;
1043
1017
}
1044
1018
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 ;
1047
1020
} else {
1048
1021
rproc_data -> adi_rsc_table = NULL ;
1049
1022
}
@@ -1106,7 +1079,7 @@ static int adi_remoteproc_probe(struct platform_device *pdev)
1106
1079
rproc_data -> mem_virt = NULL ;
1107
1080
rproc_data -> fw_size = 0 ;
1108
1081
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 ;
1110
1083
1111
1084
ret = rproc_add (rproc );
1112
1085
if (ret ) {
0 commit comments