@@ -1857,53 +1857,51 @@ struct isp_segment_ranges {
18571857
18581858static int dt_set_isp_fwdata (void )
18591859{
1860- const char * path = "isp" ;
1860+ const char * fdt_path = "isp" ;
1861+ int ret = 0 ;
1862+
1863+ u64 phys , iova , size ;
1864+
1865+ int fdt_node = fdt_path_offset (dt , fdt_path );
1866+ if (fdt_node < 0 ) {
1867+ printf ("FDT: '%s' not found\n" , fdt_path );
1868+ return 0 ;
1869+ }
1870+
1871+ if (isp_get_heap (& phys , & iova , & size )) {
1872+ const char * status = fdt_getprop (dt , fdt_node , "status" , NULL );
1873+
1874+ if (!status || strcmp (status , "disabled" )) {
1875+ printf ("FDT: ISP enabled but not initialized, disabling\n" );
1876+ if (fdt_setprop_string (dt , fdt_node , "status" , "disabled" ) < 0 )
1877+ bail ("FDT: failed to set status property of ISP\n" );
1878+ }
1879+
1880+ return 0 ;
1881+ }
18611882
18621883 int adt_node = adt_path_offset (adt , "/arm-io/isp" );
18631884 if (adt_node < 0 )
18641885 adt_node = adt_path_offset (adt , "/arm-io/isp0" );
18651886 if (adt_node < 0 )
18661887 return 0 ;
18671888
1868- u32 segments_len ;
1869- struct isp_segment_ranges * segments ;
1870- segments =
1871- (struct isp_segment_ranges * )adt_getprop (adt , adt_node , "segment-ranges" , & segments_len );
1872- if (!segments || !segments_len )
1873- bail ("ADT: invalid ISP segment-ranges\n" );
1874-
1875- int count = segments_len / sizeof (* segments );
1876- for (int i = 0 ; i < count ; i ++ )
1877- segments [i ].remap = segments [i ].iova ; // match sio segment-ranges
1878-
1879- u64 ctrr_size ;
1880- switch (os_firmware .version ) {
1881- case V12_1 : // haven't checked, probably right
1882- case V12_2 : // "
1883- case V12_3 :
1884- case V12_3_1 :
1885- case V12_4 :
1886- case V12_5 :
1887- ctrr_size = 0x1800000 ;
1888- break ;
1889- case V13_5 :
1890- ctrr_size = 0x1000000 ;
1891- break ;
1892- default :
1893- bail ("FDT: couldn't get ISP CTRR size (%d)\n" , os_firmware .version );
1889+ uint32_t dev_phandle = fdt_get_phandle (dt , fdt_node );
1890+ if (!dev_phandle ) {
1891+ ret = fdt_generate_phandle (dt , & dev_phandle );
1892+ if (!ret )
1893+ ret = fdt_setprop_u32 (dt , fdt_node , "phandle" , dev_phandle );
1894+ if (ret != 0 )
1895+ bail ("FDT: couldn't set '%s.phandle' property: %d\n" , fdt_path , ret );
18941896 }
18951897
1896- u64 heap_base = segments [count - 1 ].iova + segments [count - 1 ].size ;
1897- u64 heap_size = ctrr_size - heap_base ;
1898-
1899- int fdt_node = fdt_path_offset (dt , path );
1900- if (fdt_node < 0 )
1901- bail ("FDT: '%s' node not found\n" , path );
1898+ int mem_node = dt_get_or_add_reserved_mem ("isp-heap" , "apple,asc-mem" , phys , size );
1899+ if (mem_node < 0 )
1900+ return ret ;
19021901
1903- if (fdt_appendprop_u64 (dt , fdt_node , "apple,isp-heap-base" , heap_base ))
1904- bail ("FDT: couldn't set apple,isp-heap-base\n" );
1905- if (fdt_appendprop_u64 (dt , fdt_node , "apple,isp-heap-size" , heap_size ))
1906- bail ("FDT: couldn't set apple,isp-heap-size\n" );
1902+ ret = dt_device_set_reserved_mem (mem_node , "isp-heap" , dev_phandle , iova , size );
1903+ if (ret < 0 )
1904+ return ret ;
19071905
19081906 return 0 ;
19091907}
@@ -2169,6 +2167,9 @@ int kboot_prepare_dt(void *fdt)
21692167 dt = NULL ;
21702168 }
21712169
2170+ /* Need to init ISP early to carve out heap */
2171+ isp_init ();
2172+
21722173 dt_bufsize = fdt_totalsize (fdt );
21732174 assert (dt_bufsize );
21742175
@@ -2254,7 +2255,6 @@ int kboot_boot(void *kernel)
22542255 usb_init ();
22552256 pcie_init ();
22562257 dapf_init_all ();
2257- isp_init ();
22582258
22592259 printf ("Setting SMP mode to WFE...\n" );
22602260 smp_set_wfe_mode (true);
0 commit comments