--- zzzz-none-000/linux-4.4.271/drivers/of/fdt.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/drivers/of/fdt.c 2023-04-19 10:22:29.000000000 +0000 @@ -799,14 +799,13 @@ #endif /* CONFIG_BLK_DEV_INITRD */ #ifdef CONFIG_SERIAL_EARLYCON -extern struct of_device_id __earlycon_of_table[]; static int __init early_init_dt_scan_chosen_serial(void) { int offset; const char *p; int l; - const struct of_device_id *match = __earlycon_of_table; + const struct earlycon_id *match; const void *fdt = initial_boot_params; offset = fdt_path_offset(fdt, "/chosen"); @@ -829,19 +828,20 @@ if (offset < 0) return -ENODEV; - while (match->compatible[0]) { + for (match = __earlycon_table; match < __earlycon_table_end; match++) { u64 addr; - if (fdt_node_check_compatible(fdt, offset, match->compatible)) { - match++; + if (!match->compatible[0]) + continue; + + if (fdt_node_check_compatible(fdt, offset, match->compatible)) continue; - } addr = fdt_translate_address(fdt, offset); if (addr == OF_BAD_ADDR) return -ENXIO; - of_setup_earlycon(addr, match->data); + of_setup_earlycon(addr, match->setup); return 0; } return -ENODEV; @@ -946,6 +946,7 @@ { int l; const char *p; + char *q = data; pr_debug("search \"chosen\", depth: %d, uname: %s\n", depth, uname); @@ -959,6 +960,16 @@ p = of_get_flat_dt_prop(node, "bootargs", &l); if (p != NULL && l > 0) strlcpy(data, p, min((int)l, COMMAND_LINE_SIZE)); + p = of_get_flat_dt_prop(node, "bootargs-append", &l); + if (p != NULL && l > 0) + strlcat(data, p, min_t(int, strlen(data) + (int)l, COMMAND_LINE_SIZE)); + p = of_get_flat_dt_prop(node, "bootargs-prepend", &l); + if (p != NULL && l > 0 && l < COMMAND_LINE_SIZE) { + /* XXX: This may truncate the command line. */ + memmove(&q[l - 1], q, COMMAND_LINE_SIZE - l + 1); + memcpy(q, p, l - 1); + q[COMMAND_LINE_SIZE - 1] = 0; + } /* * CONFIG_CMDLINE is meant to be a default in case nothing else