Skip to content

Commit deb2807

Browse files
marcaneiln
authored andcommitted
kboot: Handle ISP heap carveout
Signed-off-by: Hector Martin <[email protected]> Signed-off-by: Eileen Yoon <[email protected]>
1 parent 3de2d26 commit deb2807

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
@@ -1801,53 +1801,51 @@ struct isp_segment_ranges {
18011801

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

Comments
 (0)