@@ -986,6 +986,46 @@ static int dt_device_set_reserved_mem(int node, dart_dev_t *dart, const char *na
986986 return 0 ;
987987}
988988
989+ static int dt_get_or_add_reserved_mem (const char * node_name , u64 paddr , size_t size )
990+ {
991+ int ret ;
992+ int resv_node = fdt_path_offset (dt , "/reserved-memory" );
993+ if (resv_node < 0 )
994+ bail ("DT: '/reserved-memory' not found\n" );
995+
996+ int node = fdt_subnode_offset (dt , resv_node , node_name );
997+ if (node >= 0 )
998+ return node ;
999+
1000+ node = fdt_add_subnode (dt , resv_node , node_name );
1001+ if (node < 0 )
1002+ bail ("DT: failed to add node '%s' to '/reserved-memory'\n" , node_name );
1003+
1004+ uint32_t phandle ;
1005+ ret = fdt_generate_phandle (dt , & phandle );
1006+ if (ret )
1007+ bail ("DT: failed to generate phandle: %d\n" , ret );
1008+
1009+ ret = fdt_setprop_u32 (dt , node , "phandle" , phandle );
1010+ if (ret != 0 )
1011+ bail ("DT: couldn't set '%s.phandle' property: %d\n" , node_name , ret );
1012+
1013+ u64 reg [2 ] = {cpu_to_fdt64 (paddr ), cpu_to_fdt64 (size )};
1014+ ret = fdt_setprop (dt , node , "reg" , reg , sizeof (reg ));
1015+ if (ret != 0 )
1016+ bail ("DT: couldn't set '%s.reg' property: %d\n" , node_name , ret );
1017+
1018+ ret = fdt_setprop_string (dt , node , "compatible" , "apple,resv-mem" );
1019+ if (ret != 0 )
1020+ bail ("DT: couldn't set '%s.compatible' property: %d\n" , node_name , ret );
1021+
1022+ ret = fdt_setprop_empty (dt , node , "no-map" );
1023+ if (ret != 0 )
1024+ bail ("DT: couldn't set '%s.no-map' property: %d\n" , node_name , ret );
1025+
1026+ return node ;
1027+ }
1028+
9891029static int dt_set_dcp_firmware (const char * alias )
9901030{
9911031 const char * path = fdt_get_alias (dt , alias );
@@ -1112,41 +1152,16 @@ static int dt_carveout_reserved_regions(const char *dcp_alias, const char *disp_
11121152 piodma_phandle = fdt_get_phandle (dt , piodma_node );
11131153 }
11141154
1115- uint32_t max_phandle ;
1116- ret = fdt_find_max_phandle (dt , & max_phandle );
1117- if (ret )
1118- bail_cleanup ("DT: failed to get max phandle: %d\n" , ret );
1119-
11201155 for (unsigned i = 0 ; i < num_maps ; i ++ ) {
11211156 const char * name = maps [i ].mem_fdt ;
11221157 char node_name [64 ];
11231158
1124- int resv_node = fdt_path_offset (dt , "/reserved-memory" );
1125- if (resv_node < 0 )
1126- bail_cleanup ("DT: '/reserved-memory' not found\n" );
1127-
11281159 snprintf (node_name , sizeof (node_name ), "%s@%lx" , name , region [i ].paddr );
1129- int mem_node = fdt_add_subnode ( dt , resv_node , node_name );
1160+ int mem_node = dt_get_or_add_reserved_mem ( node_name , region [ i ]. paddr , region [ i ]. size );
11301161 if (mem_node < 0 )
1131- bail_cleanup ("DT: failed to add '%s' /reserved-memory subnode: %d\n" , node_name , ret );
1132-
1133- uint32_t mem_phandle = ++ max_phandle ;
1134- ret = fdt_setprop_u32 (dt , mem_node , "phandle" , mem_phandle );
1135- if (ret != 0 )
1136- bail_cleanup ("DT: couldn't set '%s.phandle' property: %d\n" , node_name , ret );
1137-
1138- u64 reg [2 ] = {cpu_to_fdt64 (region [i ].paddr ), cpu_to_fdt64 (region [i ].size )};
1139- ret = fdt_setprop (dt , mem_node , "reg" , reg , sizeof (reg ));
1140- if (ret != 0 )
1141- bail_cleanup ("DT: couldn't set '%s.reg' property: %d\n" , node_name , ret );
1142-
1143- ret = fdt_setprop_string (dt , mem_node , "compatible" , "apple,dcp" );
1144- if (ret != 0 )
1145- bail_cleanup ("DT: couldn't set '%s.compatible' property: %d\n" , node_name , ret );
1162+ goto err ;
11461163
1147- ret = fdt_setprop_empty (dt , mem_node , "no-map" );
1148- if (ret != 0 )
1149- bail_cleanup ("DT: couldn't set '%s.no-map' property: %d\n" , node_name , ret );
1164+ uint32_t mem_phandle = fdt_get_phandle (dt , mem_node );
11501165
11511166 if (maps [i ].map_dcp && dart_dcp ) {
11521167 ret = dt_device_set_reserved_mem (mem_node , dart_dcp , node_name , dcp_phandle ,
0 commit comments