@@ -56,6 +56,17 @@ struct mem_bank_data {
56
56
char * bank_name ;
57
57
};
58
58
59
+ /**
60
+ * struct zynqmp_sram_bank - sram bank description
61
+ *
62
+ * @sram_res: sram address region information
63
+ * @da: device address of sram
64
+ */
65
+ struct zynqmp_sram_bank {
66
+ struct resource sram_res ;
67
+ u32 da ;
68
+ };
69
+
59
70
/**
60
71
* struct mbox_info
61
72
*
@@ -120,6 +131,8 @@ static const struct mem_bank_data zynqmp_tcm_banks_lockstep[] = {
120
131
* struct zynqmp_r5_core
121
132
*
122
133
* @rsc_tbl_va: resource table virtual address
134
+ * @sram: Array of sram memories assigned to this core
135
+ * @num_sram: number of sram for this core
123
136
* @dev: device of RPU instance
124
137
* @np: device node of RPU instance
125
138
* @tcm_bank_count: number TCM banks accessible to this RPU
@@ -131,6 +144,8 @@ static const struct mem_bank_data zynqmp_tcm_banks_lockstep[] = {
131
144
*/
132
145
struct zynqmp_r5_core {
133
146
void __iomem * rsc_tbl_va ;
147
+ struct zynqmp_sram_bank * sram ;
148
+ int num_sram ;
134
149
struct device * dev ;
135
150
struct device_node * np ;
136
151
int tcm_bank_count ;
@@ -494,6 +509,45 @@ static int add_mem_regions_carveout(struct rproc *rproc)
494
509
return 0 ;
495
510
}
496
511
512
+ static int add_sram_carveouts (struct rproc * rproc )
513
+ {
514
+ struct zynqmp_r5_core * r5_core = rproc -> priv ;
515
+ struct rproc_mem_entry * rproc_mem ;
516
+ struct zynqmp_sram_bank * sram ;
517
+ dma_addr_t dma_addr ;
518
+ size_t len ;
519
+ int da , i ;
520
+
521
+ for (i = 0 ; i < r5_core -> num_sram ; i ++ ) {
522
+ sram = & r5_core -> sram [i ];
523
+
524
+ dma_addr = (dma_addr_t )sram -> sram_res .start ;
525
+
526
+ len = resource_size (& sram -> sram_res );
527
+ da = sram -> da ;
528
+
529
+ rproc_mem = rproc_mem_entry_init (& rproc -> dev , NULL ,
530
+ dma_addr ,
531
+ len , da ,
532
+ zynqmp_r5_mem_region_map ,
533
+ zynqmp_r5_mem_region_unmap ,
534
+ sram -> sram_res .name );
535
+ if (!rproc_mem ) {
536
+ dev_err (& rproc -> dev , "failed to add sram %s da=0x%x, size=0x%lx" ,
537
+ sram -> sram_res .name , da , len );
538
+ return - ENOMEM ;
539
+ }
540
+
541
+ rproc_add_carveout (rproc , rproc_mem );
542
+ rproc_coredump_add_segment (rproc , da , len );
543
+
544
+ dev_dbg (& rproc -> dev , "sram carveout %s addr=%llx, da=0x%x, size=0x%lx" ,
545
+ sram -> sram_res .name , dma_addr , da , len );
546
+ }
547
+
548
+ return 0 ;
549
+ }
550
+
497
551
/*
498
552
* tcm_mem_unmap()
499
553
* @rproc: single R5 core's corresponding rproc instance
@@ -669,6 +723,12 @@ static int zynqmp_r5_rproc_prepare(struct rproc *rproc)
669
723
return ret ;
670
724
}
671
725
726
+ ret = add_sram_carveouts (rproc );
727
+ if (ret ) {
728
+ dev_err (& rproc -> dev , "failed to get sram carveout %d\n" , ret );
729
+ return ret ;
730
+ }
731
+
672
732
return 0 ;
673
733
}
674
734
@@ -881,6 +941,77 @@ static struct zynqmp_r5_core *zynqmp_r5_add_rproc_core(struct device *cdev)
881
941
return ERR_PTR (ret );
882
942
}
883
943
944
+ static int zynqmp_r5_get_sram_banks (struct zynqmp_r5_core * r5_core )
945
+ {
946
+ struct device_node * np = r5_core -> np ;
947
+ struct device * dev = r5_core -> dev ;
948
+ struct zynqmp_sram_bank * sram ;
949
+ struct device_node * sram_np ;
950
+ int num_sram , i , ret ;
951
+ u64 abs_addr , size ;
952
+
953
+ /* "sram" is optional property. Do not fail, if unavailable. */
954
+ if (!of_property_present (r5_core -> np , "sram" ))
955
+ return 0 ;
956
+
957
+ num_sram = of_property_count_elems_of_size (np , "sram" , sizeof (phandle ));
958
+ if (num_sram <= 0 ) {
959
+ dev_err (dev , "Invalid sram property, ret = %d\n" ,
960
+ num_sram );
961
+ return - EINVAL ;
962
+ }
963
+
964
+ sram = devm_kcalloc (dev , num_sram ,
965
+ sizeof (struct zynqmp_sram_bank ), GFP_KERNEL );
966
+ if (!sram )
967
+ return - ENOMEM ;
968
+
969
+ for (i = 0 ; i < num_sram ; i ++ ) {
970
+ sram_np = of_parse_phandle (np , "sram" , i );
971
+ if (!sram_np ) {
972
+ dev_err (dev , "failed to get sram %d phandle\n" , i );
973
+ return - EINVAL ;
974
+ }
975
+
976
+ if (!of_device_is_available (sram_np )) {
977
+ dev_err (dev , "sram device not available\n" );
978
+ ret = - EINVAL ;
979
+ goto fail_sram_get ;
980
+ }
981
+
982
+ ret = of_address_to_resource (sram_np , 0 , & sram [i ].sram_res );
983
+ if (ret ) {
984
+ dev_err (dev , "addr to res failed\n" );
985
+ goto fail_sram_get ;
986
+ }
987
+
988
+ /* Get SRAM device address */
989
+ ret = of_property_read_reg (sram_np , i , & abs_addr , & size );
990
+ if (ret ) {
991
+ dev_err (dev , "failed to get reg property\n" );
992
+ goto fail_sram_get ;
993
+ }
994
+
995
+ sram [i ].da = (u32 )abs_addr ;
996
+
997
+ of_node_put (sram_np );
998
+
999
+ dev_dbg (dev , "sram %d: name=%s, addr=0x%llx, da=0x%x, size=0x%llx\n" ,
1000
+ i , sram [i ].sram_res .name , sram [i ].sram_res .start ,
1001
+ sram [i ].da , resource_size (& sram [i ].sram_res ));
1002
+ }
1003
+
1004
+ r5_core -> sram = sram ;
1005
+ r5_core -> num_sram = num_sram ;
1006
+
1007
+ return 0 ;
1008
+
1009
+ fail_sram_get :
1010
+ of_node_put (sram_np );
1011
+
1012
+ return ret ;
1013
+ }
1014
+
884
1015
static int zynqmp_r5_get_tcm_node_from_dt (struct zynqmp_r5_cluster * cluster )
885
1016
{
886
1017
int i , j , tcm_bank_count , ret , tcm_pd_idx , pd_count ;
@@ -1095,6 +1226,10 @@ static int zynqmp_r5_core_init(struct zynqmp_r5_cluster *cluster,
1095
1226
return ret ;
1096
1227
}
1097
1228
}
1229
+
1230
+ ret = zynqmp_r5_get_sram_banks (r5_core );
1231
+ if (ret )
1232
+ return ret ;
1098
1233
}
1099
1234
1100
1235
return 0 ;
0 commit comments