kboot: Use adt_segment_ranges struct instead of open-coding

Signed-off-by: Hector Martin <marcan@marcan.st>
This commit is contained in:
Hector Martin 2023-09-08 00:02:55 +09:00
parent f4d6d2069a
commit dd2d4e5441
2 changed files with 18 additions and 10 deletions

View file

@ -106,4 +106,13 @@ bool adt_is_compatible(const void *adt, int nodeoffset, const char *compat);
for (const struct adt_property *prop = ADT_PROP(adt, _poff); _prop_count--; \ for (const struct adt_property *prop = ADT_PROP(adt, _poff); _prop_count--; \
prop = ADT_PROP(adt, _poff = adt_next_property_offset(adt, _poff))) prop = ADT_PROP(adt, _poff = adt_next_property_offset(adt, _poff)))
/* Common ADT properties */
struct adt_segment_ranges {
u64 phys;
u64 iova;
u64 remap;
u32 size;
u32 unk;
} PACKED;
#endif #endif

View file

@ -1596,33 +1596,32 @@ static int dt_reserve_asc_firmware(const char *adt_path, const char *fdt_path)
bail("FDT: couldn't set '%s.phandle' property: %d\n", fdt_path, ret); bail("FDT: couldn't set '%s.phandle' property: %d\n", fdt_path, ret);
} }
const uint64_t *segments; const struct adt_segment_ranges *seg;
u32 segments_len; u32 segments_len;
segments = adt_getprop(adt, node, "segment-ranges", &segments_len); seg = adt_getprop(adt, node, "segment-ranges", &segments_len);
unsigned int num_maps = segments_len / 32; unsigned int num_maps = segments_len / sizeof(*seg);
for (unsigned i = 0; i < num_maps; i++) { for (unsigned i = 0; i < num_maps; i++) {
u64 paddr = segments[0]; u64 iova = seg->iova;
u64 iova = segments[2];
u32 size = segments[3];
segments += 4;
char node_name[64]; char node_name[64];
snprintf(node_name, sizeof(node_name), "asc-firmware@%lx", paddr); snprintf(node_name, sizeof(node_name), "asc-firmware@%lx", seg->phys);
int mem_node = dt_get_or_add_reserved_mem(node_name, "apple,asc-mem", paddr, size); int mem_node = dt_get_or_add_reserved_mem(node_name, "apple,asc-mem", seg->phys, seg->size);
if (mem_node < 0) if (mem_node < 0)
return ret; return ret;
uint32_t mem_phandle = fdt_get_phandle(dt, mem_node); uint32_t mem_phandle = fdt_get_phandle(dt, mem_node);
ret = dt_device_set_reserved_mem(mem_node, node_name, dev_phandle, iova, size); ret = dt_device_set_reserved_mem(mem_node, node_name, dev_phandle, iova, seg->size);
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = dt_device_add_mem_region(fdt_path, mem_phandle, NULL); ret = dt_device_add_mem_region(fdt_path, mem_phandle, NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;
seg++;
} }
return 0; return 0;