@@ -1801,53 +1801,51 @@ struct isp_segment_ranges {
18011801
18021802static int dt_set_isp_fwdata (void )
18031803{
1804- const char * path = "isp" ;
1804+ const char * fdt_path = "isp" ;
1805+ int ret = 0 ;
1806+
1807+ u64 phys , iova , size ;
1808+
1809+ int fdt_node = fdt_path_offset (dt , fdt_path );
1810+ if (fdt_node < 0 ) {
1811+ printf ("FDT: '%s' not found\n" , fdt_path );
1812+ return 0 ;
1813+ }
1814+
1815+ if (isp_get_heap (& phys , & iova , & size )) {
1816+ const char * status = fdt_getprop (dt , fdt_node , "status" , NULL );
1817+
1818+ if (!status || strcmp (status , "disabled" )) {
1819+ printf ("FDT: ISP enabled but not initialized, disabling\n" );
1820+ if (fdt_setprop_string (dt , fdt_node , "status" , "disabled" ) < 0 )
1821+ bail ("FDT: failed to set status property of ISP\n" );
1822+ }
1823+
1824+ return 0 ;
1825+ }
18051826
18061827 int adt_node = adt_path_offset (adt , "/arm-io/isp" );
18071828 if (adt_node < 0 )
18081829 adt_node = adt_path_offset (adt , "/arm-io/isp0" );
18091830 if (adt_node < 0 )
18101831 return 0 ;
18111832
1812- u32 segments_len ;
1813- struct isp_segment_ranges * segments ;
1814- segments =
1815- (struct isp_segment_ranges * )adt_getprop (adt , adt_node , "segment-ranges" , & segments_len );
1816- if (!segments || !segments_len )
1817- bail ("ADT: invalid ISP segment-ranges\n" );
1818-
1819- int count = segments_len / sizeof (* segments );
1820- for (int i = 0 ; i < count ; i ++ )
1821- segments [i ].remap = segments [i ].iova ; // match sio segment-ranges
1822-
1823- u64 ctrr_size ;
1824- switch (os_firmware .version ) {
1825- case V12_1 : // haven't checked, probably right
1826- case V12_2 : // "
1827- case V12_3 :
1828- case V12_3_1 :
1829- case V12_4 :
1830- case V12_5 :
1831- ctrr_size = 0x1800000 ;
1832- break ;
1833- case V13_5 :
1834- ctrr_size = 0x1000000 ;
1835- break ;
1836- default :
1837- bail ("FDT: couldn't get ISP CTRR size (%d)\n" , os_firmware .version );
1833+ uint32_t dev_phandle = fdt_get_phandle (dt , fdt_node );
1834+ if (!dev_phandle ) {
1835+ ret = fdt_generate_phandle (dt , & dev_phandle );
1836+ if (!ret )
1837+ ret = fdt_setprop_u32 (dt , fdt_node , "phandle" , dev_phandle );
1838+ if (ret != 0 )
1839+ bail ("FDT: couldn't set '%s.phandle' property: %d\n" , fdt_path , ret );
18381840 }
18391841
1840- u64 heap_base = segments [count - 1 ].iova + segments [count - 1 ].size ;
1841- u64 heap_size = ctrr_size - heap_base ;
1842-
1843- int fdt_node = fdt_path_offset (dt , path );
1844- if (fdt_node < 0 )
1845- bail ("FDT: '%s' node not found\n" , path );
1842+ int mem_node = dt_get_or_add_reserved_mem ("isp-heap" , "apple,asc-mem" , phys , size );
1843+ if (mem_node < 0 )
1844+ return ret ;
18461845
1847- if (fdt_appendprop_u64 (dt , fdt_node , "apple,isp-heap-base" , heap_base ))
1848- bail ("FDT: couldn't set apple,isp-heap-base\n" );
1849- if (fdt_appendprop_u64 (dt , fdt_node , "apple,isp-heap-size" , heap_size ))
1850- bail ("FDT: couldn't set apple,isp-heap-size\n" );
1846+ ret = dt_device_set_reserved_mem (mem_node , "isp-heap" , dev_phandle , iova , size );
1847+ if (ret < 0 )
1848+ return ret ;
18511849
18521850 return 0 ;
18531851}
@@ -2113,6 +2111,9 @@ int kboot_prepare_dt(void *fdt)
21132111 dt = NULL ;
21142112 }
21152113
2114+ /* Need to init ISP early to carve out heap */
2115+ isp_init ();
2116+
21162117 dt_bufsize = fdt_totalsize (fdt );
21172118 assert (dt_bufsize );
21182119
@@ -2195,7 +2196,6 @@ int kboot_boot(void *kernel)
21952196 usb_init ();
21962197 pcie_init ();
21972198 dapf_init_all ();
2198- isp_init ();
21992199
22002200 printf ("Setting SMP mode to WFE...\n" );
22012201 smp_set_wfe_mode (true);
0 commit comments