@@ -1847,6 +1847,67 @@ static int dt_set_sio_fwdata(void)
18471847 return 0 ;
18481848}
18491849
1850+ struct isp_segment_ranges {
1851+ u64 phys ;
1852+ u64 iova ;
1853+ u64 remap ;
1854+ u32 size ;
1855+ u32 unk ;
1856+ } PACKED ;
1857+
1858+ static int dt_set_isp_fwdata (void )
1859+ {
1860+ const char * path = "isp" ;
1861+
1862+ int adt_node = adt_path_offset (adt , "/arm-io/isp" );
1863+ if (adt_node < 0 )
1864+ adt_node = adt_path_offset (adt , "/arm-io/isp0" );
1865+ if (adt_node < 0 )
1866+ return 0 ;
1867+
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 );
1894+ }
1895+
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 );
1902+
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" );
1907+
1908+ return 0 ;
1909+ }
1910+
18501911static int dt_disable_missing_devs (const char * adt_prefix , const char * dt_prefix , int max_devs )
18511912{
18521913 int ret = -1 ;
@@ -2159,6 +2220,10 @@ int kboot_prepare_dt(void *fdt)
21592220 return -1 ;
21602221 if (dt_set_sio_fwdata ())
21612222 return -1 ;
2223+ if (dt_set_isp_fwdata ())
2224+ return -1 ;
2225+ if (dt_reserve_asc_firmware ("/arm-io/isp" , "isp" ))
2226+ return -1 ;
21622227#ifndef RELEASE
21632228 if (dt_transfer_virtios ())
21642229 return 1 ;
0 commit comments