@@ -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
147147struct 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 {
176176static 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)
227221static 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+ */
270262static 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
455444static 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 */
831820static 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
872848static 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