Skip to content

Commit 4ae2357

Browse files
committed
kboot: Handle ISP heap carveout
Signed-off-by: Hector Martin <[email protected]>
1 parent c03f94c commit 4ae2357

1 file changed

Lines changed: 38 additions & 38 deletions

File tree

src/kboot.c

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,53 +1857,51 @@ struct isp_segment_ranges {
18571857

18581858
static 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

Comments
 (0)