diff options
Diffstat (limited to 'drivers/core')
-rw-r--r-- | drivers/core/Kconfig | 8 | ||||
-rw-r--r-- | drivers/core/Makefile | 16 | ||||
-rw-r--r-- | drivers/core/acpi.c | 16 | ||||
-rw-r--r-- | drivers/core/of_access.c | 36 | ||||
-rw-r--r-- | drivers/core/of_addr.c | 26 | ||||
-rw-r--r-- | drivers/core/of_extra.c | 6 | ||||
-rw-r--r-- | drivers/core/ofnode.c | 105 |
7 files changed, 135 insertions, 78 deletions
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig index c39abe3bc94..6b4330fe4ea 100644 --- a/drivers/core/Kconfig +++ b/drivers/core/Kconfig @@ -152,6 +152,14 @@ config SPL_DM_SEQ_ALIAS numbered devices (e.g. serial0 = &serial0). This feature can be disabled if it is not required, to save code space in SPL. +config TPL_DM_SEQ_ALIAS + bool "Support numbered aliases in device tree in TPL" + depends on TPL_DM + help + Most boards will have a '/aliases' node containing the path to + numbered devices (e.g. serial0 = &serial0). This feature can be + disabled if it is not required, to save code space in SPL. + config VPL_DM_SEQ_ALIAS bool "Support numbered aliases in device tree in VPL" depends on VPL_DM diff --git a/drivers/core/Makefile b/drivers/core/Makefile index acbd2bf2cef..9ea57911f89 100644 --- a/drivers/core/Makefile +++ b/drivers/core/Makefile @@ -3,19 +3,19 @@ # Copyright (c) 2013 Google, Inc obj-y += device.o fdtaddr.o lists.o root.o uclass.o util.o tag.o -obj-$(CONFIG_$(SPL_TPL_)ACPIGEN) += acpi.o -obj-$(CONFIG_$(SPL_TPL_)DEVRES) += devres.o -obj-$(CONFIG_$(SPL_TPL_)DM_DEVICE_REMOVE) += device-remove.o -obj-$(CONFIG_$(SPL_)SIMPLE_BUS) += simple-bus.o +obj-$(CONFIG_$(PHASE_)ACPIGEN) += acpi.o +obj-$(CONFIG_$(PHASE_)DEVRES) += devres.o +obj-$(CONFIG_$(PHASE_)DM_DEVICE_REMOVE) += device-remove.o +obj-$(CONFIG_$(XPL_)SIMPLE_BUS) += simple-bus.o obj-$(CONFIG_SIMPLE_PM_BUS) += simple-pm-bus.o obj-$(CONFIG_DM) += dump.o -obj-$(CONFIG_$(SPL_TPL_)REGMAP) += regmap.o -obj-$(CONFIG_$(SPL_TPL_)SYSCON) += syscon-uclass.o -obj-$(CONFIG_$(SPL_)OF_LIVE) += of_access.o of_addr.o +obj-$(CONFIG_$(PHASE_)REGMAP) += regmap.o +obj-$(CONFIG_$(PHASE_)SYSCON) += syscon-uclass.o +obj-$(CONFIG_$(XPL_)OF_LIVE) += of_access.o of_addr.o ifndef CONFIG_DM_DEV_READ_INLINE obj-$(CONFIG_OF_CONTROL) += read.o endif -obj-$(CONFIG_$(SPL_)OF_PLATDATA) += read.o +obj-$(CONFIG_$(XPL_)OF_PLATDATA) += read.o obj-$(CONFIG_OF_CONTROL) += of_extra.o ofnode.o read_extra.o ccflags-$(CONFIG_DM_DEBUG) += -DDEBUG diff --git a/drivers/core/acpi.c b/drivers/core/acpi.c index 9f784228921..4763963914b 100644 --- a/drivers/core/acpi.c +++ b/drivers/core/acpi.c @@ -48,6 +48,7 @@ enum method_t { METHOD_FILL_SSDT, METHOD_INJECT_DSDT, METHOD_SETUP_NHLT, + METHOD_FILL_MADT, }; /* Prototype for all methods */ @@ -282,6 +283,8 @@ acpi_method acpi_get_method(struct udevice *dev, enum method_t method) switch (method) { case METHOD_WRITE_TABLES: return aops->write_tables; + case METHOD_FILL_MADT: + return aops->fill_madt; case METHOD_FILL_SSDT: return aops->fill_ssdt; case METHOD_INJECT_DSDT: @@ -328,6 +331,19 @@ int acpi_recurse_method(struct acpi_ctx *ctx, struct udevice *parent, return 0; } +int acpi_fill_madt_subtbl(struct acpi_ctx *ctx) +{ + int ret; + + log_debug("Writing MADT table\n"); + ret = acpi_recurse_method(ctx, dm_root(), METHOD_FILL_MADT, TYPE_NONE); + log_debug("Writing MADT finished, err=%d\n", ret); + if (ret) + return log_msg_ret("build", ret); + + return ret; +} + int acpi_fill_ssdt(struct acpi_ctx *ctx) { void *start = ctx->current; diff --git a/drivers/core/of_access.c b/drivers/core/of_access.c index d05be273e7b..77acd766262 100644 --- a/drivers/core/of_access.c +++ b/drivers/core/of_access.c @@ -490,17 +490,17 @@ int of_read_u8(const struct device_node *np, const char *propname, u8 *outp) { const u8 *val; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (!np) return -EINVAL; val = of_find_property_value_of_size(np, propname, sizeof(*outp)); if (IS_ERR(val)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return PTR_ERR(val); } *outp = *val; - dm_warn("%#x (%d)\n", *outp, *outp); + log_debug("%#x (%d)\n", *outp, *outp); return 0; } @@ -509,17 +509,17 @@ int of_read_u16(const struct device_node *np, const char *propname, u16 *outp) { const __be16 *val; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (!np) return -EINVAL; val = of_find_property_value_of_size(np, propname, sizeof(*outp)); if (IS_ERR(val)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return PTR_ERR(val); } *outp = be16_to_cpup(val); - dm_warn("%#x (%d)\n", *outp, *outp); + log_debug("%#x (%d)\n", *outp, *outp); return 0; } @@ -534,14 +534,14 @@ int of_read_u32_array(const struct device_node *np, const char *propname, { const __be32 *val; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); val = of_find_property_value_of_size(np, propname, sz * sizeof(*out_values)); if (IS_ERR(val)) return PTR_ERR(val); - dm_warn("size %zd\n", sz); + log_debug("size %zd\n", sz); while (sz--) *out_values++ = be32_to_cpup(val++); @@ -553,19 +553,19 @@ int of_read_u32_index(const struct device_node *np, const char *propname, { const __be32 *val; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (!np) return -EINVAL; val = of_find_property_value_of_size(np, propname, sizeof(*outp) * (index + 1)); if (IS_ERR(val)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return PTR_ERR(val); } *outp = be32_to_cpup(val + index); - dm_warn("%#x (%d)\n", *outp, *outp); + log_debug("%#x (%d)\n", *outp, *outp); return 0; } @@ -575,20 +575,20 @@ int of_read_u64_index(const struct device_node *np, const char *propname, { const __be64 *val; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (!np) return -EINVAL; val = of_find_property_value_of_size(np, propname, sizeof(*outp) * (index + 1)); if (IS_ERR(val)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return PTR_ERR(val); } *outp = be64_to_cpup(val + index); - dm_warn("%#llx (%lld)\n", (unsigned long long)*outp, - (unsigned long long)*outp); + log_debug("%#llx (%lld)\n", (unsigned long long)*outp, + (unsigned long long)*outp); return 0; } @@ -621,7 +621,7 @@ int of_property_match_string(const struct device_node *np, const char *propname, l = strnlen(p, end - p) + 1; if (p + l > end) return -EILSEQ; - dm_warn("comparing %s with %s\n", string, p); + log_debug("comparing %s with %s\n", string, p); if (strcmp(string, p) == 0) return i; /* Found it; return index */ } @@ -826,8 +826,8 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np, strncpy(ap->stem, stem, stem_len); ap->stem[stem_len] = 0; list_add_tail(&ap->link, &aliases_lookup); - dm_warn("adding DT alias:%s: stem=%s id=%i node=%s\n", - ap->alias, ap->stem, ap->id, of_node_full_name(np)); + log_debug("adding DT alias:%s: stem=%s id=%i node=%s\n", + ap->alias, ap->stem, ap->id, of_node_full_name(np)); } int of_alias_scan(void) diff --git a/drivers/core/of_addr.c b/drivers/core/of_addr.c index 6c7b4c97d67..250dd175b55 100644 --- a/drivers/core/of_addr.c +++ b/drivers/core/of_addr.c @@ -27,7 +27,7 @@ static struct of_bus *of_match_bus(struct device_node *np); #ifdef DEBUG static void of_dump_addr(const char *s, const __be32 *addr, int na) { - dm_warn("%s", s); + pr_debug("%s", s); while (na--) pr_cont(" %08x", be32_to_cpu(*(addr++))); pr_cont("\n"); @@ -66,9 +66,9 @@ static u64 of_bus_default_map(__be32 *addr, const __be32 *range, s = of_read_number(range + na + pna, ns); da = of_read_number(addr, na); - dm_warn("default map, cp=%llx, s=%llx, da=%llx\n", - (unsigned long long)cp, (unsigned long long)s, - (unsigned long long)da); + log_debug("default map, cp=%llx, s=%llx, da=%llx\n", + (unsigned long long)cp, (unsigned long long)s, + (unsigned long long)da); if (da < cp || da >= (cp + s)) return OF_BAD_ADDR; @@ -200,11 +200,11 @@ static int of_translate_one(const struct device_node *parent, if (ranges == NULL || rlen == 0) { offset = of_read_number(addr, na); memset(addr, 0, pna * 4); - dm_warn("empty ranges; 1:1 translation\n"); + log_debug("empty ranges; 1:1 translation\n"); goto finish; } - dm_warn("walking ranges...\n"); + log_debug("walking ranges...\n"); /* Now walk through the ranges */ rlen /= 4; @@ -222,7 +222,7 @@ static int of_translate_one(const struct device_node *parent, finish: of_dump_addr("parent translation for:", addr, pna); - dm_warn("with offset: %llx\n", (unsigned long long)offset); + log_debug("with offset: %llx\n", (unsigned long long)offset); /* Translate it into parent bus space */ return pbus->translate(addr, offset, pna); @@ -247,7 +247,7 @@ static u64 __of_translate_address(const struct device_node *dev, int na, ns, pna, pns; u64 result = OF_BAD_ADDR; - dm_warn("** translation for device %s **\n", of_node_full_name(dev)); + log_debug("** translation for device %s **\n", of_node_full_name(dev)); /* Increase refcount at current level */ (void)of_node_get(dev); @@ -266,8 +266,8 @@ static u64 __of_translate_address(const struct device_node *dev, } memcpy(addr, in_addr, na * 4); - dm_warn("bus is %s (na=%d, ns=%d) on %s\n", bus->name, na, ns, - of_node_full_name(parent)); + log_debug("bus is %s (na=%d, ns=%d) on %s\n", bus->name, na, ns, + of_node_full_name(parent)); of_dump_addr("translating address:", addr, na); /* Translate */ @@ -279,7 +279,7 @@ static u64 __of_translate_address(const struct device_node *dev, /* If root, we have finished */ if (parent == NULL) { - dm_warn("reached root node\n"); + log_debug("reached root node\n"); result = of_read_number(addr, na); break; } @@ -293,8 +293,8 @@ static u64 __of_translate_address(const struct device_node *dev, break; } - dm_warn("parent bus is %s (na=%d, ns=%d) on %s\n", pbus->name, - pna, pns, of_node_full_name(parent)); + log_debug("parent bus is %s (na=%d, ns=%d) on %s\n", pbus->name, + pna, pns, of_node_full_name(parent)); /* Apply bus translation */ if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop)) diff --git a/drivers/core/of_extra.c b/drivers/core/of_extra.c index bfc1e3441b1..f49187dfc1e 100644 --- a/drivers/core/of_extra.c +++ b/drivers/core/of_extra.c @@ -58,7 +58,7 @@ int ofnode_decode_region(ofnode node, const char *prop_name, fdt_addr_t *basep, const fdt_addr_t *cell; int len; - dm_warn("%s: %s: %s\n", __func__, ofnode_get_name(node), prop_name); + log_debug("%s: %s: %s\n", __func__, ofnode_get_name(node), prop_name); cell = ofnode_get_property(node, prop_name, &len); if (!cell || (len < sizeof(fdt_addr_t) * 2)) { dm_warn("cell=%p, len=%d\n", cell, len); @@ -67,8 +67,8 @@ int ofnode_decode_region(ofnode node, const char *prop_name, fdt_addr_t *basep, *basep = fdt_addr_to_cpu(*cell); *sizep = fdt_size_to_cpu(cell[1]); - dm_warn("%s: base=%08lx, size=%lx\n", __func__, (ulong)*basep, - (ulong)*sizep); + log_debug("%s: base=%08lx, size=%lx\n", __func__, (ulong)*basep, + (ulong)*sizep); return 0; } diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 7e3b3719d18..950895e72a9 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -315,7 +315,7 @@ int ofnode_read_u8(ofnode node, const char *propname, u8 *outp) int len; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) return of_read_u8(ofnode_to_np(node), propname, outp); @@ -323,11 +323,11 @@ int ofnode_read_u8(ofnode node, const char *propname, u8 *outp) cell = fdt_getprop(gd->fdt_blob, ofnode_to_offset(node), propname, &len); if (!cell || len < sizeof(*cell)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return -EINVAL; } *outp = *cell; - dm_warn("%#x (%u)\n", *outp, *outp); + log_debug("%#x (%u)\n", *outp, *outp); return 0; } @@ -346,7 +346,7 @@ int ofnode_read_u16(ofnode node, const char *propname, u16 *outp) int len; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) return of_read_u16(ofnode_to_np(node), propname, outp); @@ -354,11 +354,11 @@ int ofnode_read_u16(ofnode node, const char *propname, u16 *outp) cell = fdt_getprop(gd->fdt_blob, ofnode_to_offset(node), propname, &len); if (!cell || len < sizeof(*cell)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return -EINVAL; } *outp = be16_to_cpup(cell); - dm_warn("%#x (%u)\n", *outp, *outp); + log_debug("%#x (%u)\n", *outp, *outp); return 0; } @@ -391,7 +391,7 @@ int ofnode_read_u32_index(ofnode node, const char *propname, int index, int len; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) return of_read_u32_index(ofnode_to_np(node), propname, index, @@ -400,17 +400,17 @@ int ofnode_read_u32_index(ofnode node, const char *propname, int index, cell = fdt_getprop(ofnode_to_fdt(node), ofnode_to_offset(node), propname, &len); if (!cell) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return -EINVAL; } if (len < (sizeof(int) * (index + 1))) { - dm_warn("(not large enough)\n"); + log_debug("(not large enough)\n"); return -EOVERFLOW; } *outp = fdt32_to_cpu(cell[index]); - dm_warn("%#x (%u)\n", *outp, *outp); + log_debug("%#x (%u)\n", *outp, *outp); return 0; } @@ -430,17 +430,17 @@ int ofnode_read_u64_index(ofnode node, const char *propname, int index, cell = fdt_getprop(ofnode_to_fdt(node), ofnode_to_offset(node), propname, &len); if (!cell) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return -EINVAL; } if (len < (sizeof(u64) * (index + 1))) { - dm_warn("(not large enough)\n"); + log_debug("(not large enough)\n"); return -EOVERFLOW; } *outp = fdt64_to_cpu(cell[index]); - dm_warn("%#llx (%llu)\n", *outp, *outp); + log_debug("%#llx (%llu)\n", *outp, *outp); return 0; } @@ -468,7 +468,7 @@ int ofnode_read_u64(ofnode node, const char *propname, u64 *outp) int len; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) return of_read_u64(ofnode_to_np(node), propname, outp); @@ -476,12 +476,12 @@ int ofnode_read_u64(ofnode node, const char *propname, u64 *outp) cell = fdt_getprop(ofnode_to_fdt(node), ofnode_to_offset(node), propname, &len); if (!cell || len < sizeof(*cell)) { - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return -EINVAL; } *outp = fdt64_to_cpu(cell[0]); - dm_warn("%#llx (%llu)\n", (unsigned long long)*outp, - (unsigned long long)*outp); + log_debug("%#llx (%llu)\n", (unsigned long long)*outp, + (unsigned long long)*outp); return 0; } @@ -499,11 +499,11 @@ bool ofnode_read_bool(ofnode node, const char *propname) bool prop; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); prop = ofnode_has_property(node, propname); - dm_warn("%s\n", prop ? "true" : "false"); + log_debug("%s\n", prop ? "true" : "false"); return prop ? true : false; } @@ -514,7 +514,7 @@ const void *ofnode_read_prop(ofnode node, const char *propname, int *sizep) int len; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) { struct property *prop = of_find_property( @@ -529,7 +529,7 @@ const void *ofnode_read_prop(ofnode node, const char *propname, int *sizep) propname, &len); } if (!val) { - dm_warn("<not found>\n"); + log_debug("<not found>\n"); if (sizep) *sizep = -FDT_ERR_NOTFOUND; return NULL; @@ -553,7 +553,7 @@ const char *ofnode_read_string(ofnode node, const char *propname) dm_warn("<invalid>\n"); return NULL; } - dm_warn("%s\n", str); + log_debug("%s\n", str); return str; } @@ -573,7 +573,7 @@ ofnode ofnode_find_subnode(ofnode node, const char *subnode_name) ofnode subnode; assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, subnode_name); + log_debug("%s: %s: ", __func__, subnode_name); if (ofnode_is_np(node)) { struct device_node *np = ofnode_to_np(node); @@ -588,8 +588,8 @@ ofnode ofnode_find_subnode(ofnode node, const char *subnode_name) ofnode_to_offset(node), subnode_name); subnode = noffset_to_ofnode(node, ooffset); } - dm_warn("%s\n", ofnode_valid(subnode) ? - ofnode_get_name(subnode) : "<none>"); + log_debug("%s\n", ofnode_valid(subnode) ? + ofnode_get_name(subnode) : "<none>"); return subnode; } @@ -598,7 +598,7 @@ int ofnode_read_u32_array(ofnode node, const char *propname, u32 *out_values, size_t sz) { assert(ofnode_valid(node)); - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); if (ofnode_is_np(node)) { return of_read_u32_array(ofnode_to_np(node), propname, @@ -611,7 +611,7 @@ int ofnode_read_u32_array(ofnode node, const char *propname, out_values, sz); /* get the error right, but space is more important in SPL */ - if (!IS_ENABLED(CONFIG_SPL_BUILD)) { + if (!IS_ENABLED(CONFIG_XPL_BUILD)) { if (ret == -FDT_ERR_NOTFOUND) return -EINVAL; else if (ret == -FDT_ERR_BADLAYOUT) @@ -1032,7 +1032,7 @@ ofnode ofnode_get_aliases_node(const char *name) if (!prop) return ofnode_null(); - dm_warn("%s: node_path: %s\n", __func__, prop); + log_debug("%s: node_path: %s\n", __func__, prop); return ofnode_path(prop); } @@ -1301,7 +1301,7 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type, int len; int ret = -ENOENT; - dm_warn("%s: %s: ", __func__, propname); + log_debug("%s: %s: ", __func__, propname); /* * If we follow the pci bus bindings strictly, we should check @@ -1318,10 +1318,10 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type, int i; for (i = 0; i < num; i++) { - dm_warn("pci address #%d: %08lx %08lx %08lx\n", i, - (ulong)fdt32_to_cpu(cell[0]), - (ulong)fdt32_to_cpu(cell[1]), - (ulong)fdt32_to_cpu(cell[2])); + log_debug("pci address #%d: %08lx %08lx %08lx\n", i, + (ulong)fdt32_to_cpu(cell[0]), + (ulong)fdt32_to_cpu(cell[1]), + (ulong)fdt32_to_cpu(cell[2])); if ((fdt32_to_cpu(*cell) & type) == type) { const unaligned_fdt64_t *ptr; @@ -1348,7 +1348,7 @@ int ofnode_read_pci_addr(ofnode node, enum fdt_pci_space type, ret = -EINVAL; fail: - dm_warn("(not found)\n"); + log_debug("(not found)\n"); return ret; } @@ -1468,7 +1468,7 @@ int ofnode_read_simple_size_cells(ofnode node) bool ofnode_pre_reloc(ofnode node) { -#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_TPL_BUILD) +#if defined(CONFIG_XPL_BUILD) || defined(CONFIG_TPL_BUILD) /* for SPL and TPL the remaining nodes after the fdtgrep 1st pass * had property bootph-all or bootph-pre-sram/bootph-pre-ram. * They are removed in final dtb (fdtgrep 2nd pass) @@ -1632,7 +1632,7 @@ int ofnode_write_string(ofnode node, const char *propname, const char *value) { assert(ofnode_valid(node)); - dm_warn("%s: %s = %s", __func__, propname, value); + log_debug("%s: %s = %s", __func__, propname, value); return ofnode_write_prop(node, propname, value, strlen(value) + 1, false); @@ -1735,6 +1735,39 @@ const char *ofnode_conf_read_str(const char *prop_name) return ofnode_read_string(node, prop_name); } +bool ofnode_options_read_bool(const char *prop_name) +{ + ofnode uboot; + + uboot = ofnode_path("/options/u-boot"); + if (!ofnode_valid(uboot)) + return false; + + return ofnode_read_bool(uboot, prop_name); +} + +int ofnode_options_read_int(const char *prop_name, int default_val) +{ + ofnode uboot; + + uboot = ofnode_path("/options/u-boot"); + if (!ofnode_valid(uboot)) + return default_val; + + return ofnode_read_u32_default(uboot, prop_name, default_val); +} + +const char *ofnode_options_read_str(const char *prop_name) +{ + ofnode uboot; + + uboot = ofnode_path("/options/u-boot"); + if (!ofnode_valid(uboot)) + return NULL; + + return ofnode_read_string(uboot, prop_name); +} + int ofnode_read_bootscript_address(u64 *bootscr_address, u64 *bootscr_offset) { int ret; |