Skip to content

Commit f89e33c

Browse files
eilnmarcan
authored andcommitted
kboot: Reserve ISP firmware
Signed-off-by: Eileen Yoon <[email protected]>
1 parent ee536f7 commit f89e33c

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

src/kboot.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
18501911
static 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

Comments
 (0)