VERSION = 2022
PATCHLEVEL = 04
SUBLEVEL =
-EXTRAVERSION = -rc2
+EXTRAVERSION = -rc3
NAME =
# *DOCUMENTATION*
{
return SZ_256K;
}
+
+int board_late_init(void)
+{
+ unsigned long base;
+ unsigned long top;
+ u32 status = 0;
+
+ /* Reserve 4M each for scriptaddr and pxefile_addr_r at the top of RAM
+ * at least 1M below the stack.
+ */
+ top = gd->start_addr_sp - CONFIG_STACK_SIZE - SZ_8M - SZ_1M;
+ top = ALIGN_DOWN(top, SZ_8M);
+
+ status |= env_set_hex("scriptaddr", top + SZ_4M);
+ status |= env_set_hex("pxefile_addr_r", top);
+
+ /* somewhat based on the Linux Kernel boot requirements:
+ * align by 2M and maximal FDT size 2M
+ */
+ base = ALIGN(gd->ram_base, SZ_2M);
+
+ status |= env_set_hex("fdt_addr_r", base);
+ status |= env_set_hex("kernel_addr_r", base + SZ_2M);
+ status |= env_set_hex("ramdisk_addr_r", base + SZ_128M);
+ status |= env_set_hex("loadaddr", base + SZ_2G);
+ status |= env_set_hex("kernel_comp_addr_r", base + SZ_2G - SZ_128M);
+ status |= env_set_hex("kernel_comp_size", SZ_128M);
+
+ if (status)
+ log_warning("late_init: Failed to set run time variables\n");
+
+ return 0;
+}
# SPDX-License-Identifier: GPL-2.0+
#
-ifeq ($(CONFIG_$(SPL_)SKIP_LOWLEVEL_INIT),)
-obj-y := mux.o
-endif
-
-obj-y += board.o
+obj-y := board.o mux.o
return &dpll_ddr;
}
+void set_uart_mux_conf(void)
+{
+ switch (CONFIG_CONS_INDEX) {
+ case 1: {
+ enable_uart0_pin_mux();
+ break;
+ }
+ case 2: {
+ enable_uart1_pin_mux();
+ break;
+ }
+ case 3: {
+ enable_uart2_pin_mux();
+ break;
+ }
+ case 4: {
+ enable_uart3_pin_mux();
+ break;
+ }
+ case 5: {
+ enable_uart4_pin_mux();
+ break;
+ }
+ case 6: {
+ enable_uart5_pin_mux();
+ break;
+ }
+ }
+}
+
void set_mux_conf_regs(void)
{
/* done first by the ROM and afterwards by the pin controller driver */
#ifdef CONFIG_DEBUG_UART
void board_debug_uart_init(void)
{
+ setup_early_clocks();
+
/* done by pin controller driver if not debugging */
enable_uart_pin_mux(CONFIG_DEBUG_UART_BASE);
}
*/
#include <common.h>
#include <env.h>
+#include <fdt_support.h>
#include <init.h>
#include <log.h>
#include <stdlib.h>
env_set("serial#", serial);
}
+#define SBL_BOARD "board_id="
+#define SBL_LCDTYPE "lcdtype="
+static ulong board_id = 0;
+static ulong lcdtype = 0;
+
+static void parse_cmdline(const struct tag_cmdline *cmdline)
+{
+ char *buf;
+
+ /* Export this to sbl_cmdline (secondary boot loader command line) */
+ env_set("sbl_cmdline", cmdline->cmdline);
+
+ buf = strstr(cmdline->cmdline, SBL_BOARD);
+ if (!buf)
+ return;
+ buf += strlen(SBL_BOARD);
+
+ board_id = simple_strtoul(buf, NULL, 10);
+
+ buf = strstr(cmdline->cmdline, SBL_LCDTYPE);
+ if (!buf)
+ return;
+ buf += strlen(SBL_LCDTYPE);
+
+ lcdtype = simple_strtoul(buf, NULL, 10);
+}
+
/*
* The downstream/vendor kernel (provided by Samsung) uses ATAGS for booting.
* It also requires an extremely long cmdline provided by the primary bootloader
if (t->hdr.tag == ATAG_SERIAL)
parse_serial(&t->u.serialnr);
+ if (t->hdr.tag == ATAG_CMDLINE)
+ parse_cmdline(&t->u.cmdline);
+
fw_atags_size += t->hdr.size * sizeof(u32);
}
memcpy(*in_params, fw_atags_copy, fw_atags_size);
*(u8 **)in_params += fw_atags_size;
}
+
+/* These numbers are unique per product but not across all products */
+#define SAMSUNG_CODINA_LCD_LMS380KF01 4
+#define SAMSUNG_CODINA_LCD_S6D27A1 13
+#define SAMSUNG_SKOMER_LCD_HVA40WV1 10
+#define SAMSUNG_SKOMER_LCD_NT35512 12
+
+static void codina_patch_display(void *fdt)
+{
+ int node;
+ int ret;
+
+ node = fdt_path_offset(fdt, "/spi-gpio-0/panel");
+ if (node < 0) {
+ printf("cannot find Codina panel node\n");
+ return;
+ }
+ if (lcdtype == SAMSUNG_CODINA_LCD_LMS380KF01) {
+ ret = fdt_setprop_string(fdt, node, "compatible", "samsung,lms380kf01");
+ if (ret < 0)
+ printf("could not set LCD compatible\n");
+ else
+ printf("updated LCD compatible to LMS380KF01\n");
+ } else if (lcdtype == SAMSUNG_CODINA_LCD_S6D27A1) {
+ ret = fdt_setprop_string(fdt, node, "compatible", "samsung,s6d27a1");
+ if (ret < 0)
+ printf("could not set LCD compatible\n");
+ else
+ printf("updated LCD compatible to S6D27A1\n");
+ } else {
+ printf("unknown LCD type\n");
+ }
+}
+
+static void skomer_kyle_patch_display(void *fdt)
+{
+ int node;
+ int ret;
+
+ node = fdt_path_offset(fdt, "/soc/mcde/dsi/panel");
+ if (node < 0) {
+ printf("cannot find Skomer/Kyle panel node\n");
+ return;
+ }
+ if (lcdtype == SAMSUNG_SKOMER_LCD_HVA40WV1) {
+ ret = fdt_setprop_string(fdt, node, "compatible", "hydis,hva40wv1");
+ if (ret < 0)
+ printf("could not set LCD compatible\n");
+ else
+ printf("updated LCD compatible to Hydis HVA40WV1\n");
+ } else if (lcdtype == SAMSUNG_SKOMER_LCD_NT35512) {
+ /*
+ * FIXME: This panel is actually a BOE product, but we don't know
+ * the exact product name, so the compatible for the NT35512
+ * is used for the time being. The vendor drivers also call it NT35512.
+ */
+ ret = fdt_setprop_string(fdt, node, "compatible", "novatek,nt35512");
+ if (ret < 0)
+ printf("could not set LCD compatible\n");
+ else
+ printf("updated LCD compatible to Novatek NT35512\n");
+ } else {
+ printf("unknown LCD type\n");
+ }
+}
+
+int ft_board_setup(void *fdt, struct bd_info *bd)
+{
+ const char *str;
+ int node;
+ int ret;
+
+ printf("stemmy patch: DTB at 0x%08lx\n", (ulong)fdt);
+
+ /* Inspect FDT to see what we've got here */
+ ret = fdt_check_header(fdt);
+ if (ret < 0) {
+ printf("invalid DTB\n");
+ return ret;
+ }
+ node = fdt_path_offset(fdt, "/");
+ if (node < 0) {
+ printf("cannot find root node\n");
+ return node;
+ }
+ str = fdt_stringlist_get(fdt, node, "compatible", 0, NULL);
+ if (!str) {
+ printf("could not find board compatible\n");
+ return -1;
+ }
+
+ if (!strcmp(str, "samsung,janice")) {
+ switch(board_id) {
+ case 7:
+ printf("Janice GT-I9070 Board Rev 0.0\n");
+ break;
+ case 8:
+ printf("Janice GT-I9070 Board Rev 0.1\n");
+ break;
+ case 9:
+ printf("Janice GT-I9070 Board Rev 0.2\n");
+ break;
+ case 10:
+ printf("Janice GT-I9070 Board Rev 0.3\n");
+ break;
+ case 11:
+ printf("Janice GT-I9070 Board Rev 0.4\n");
+ break;
+ case 12:
+ printf("Janice GT-I9070 Board Rev 0.5\n");
+ break;
+ case 13:
+ printf("Janice GT-I9070 Board Rev 0.6\n");
+ break;
+ default:
+ break;
+ }
+ } else if (!strcmp(str, "samsung,gavini")) {
+ switch(board_id) {
+ case 7:
+ printf("Gavini GT-I8530 Board Rev 0.0\n");
+ break;
+ case 8:
+ printf("Gavini GT-I8530 Board Rev 0.0A\n");
+ break;
+ case 9:
+ printf("Gavini GT-I8530 Board Rev 0.0B\n");
+ break;
+ case 10:
+ printf("Gavini GT-I8530 Board Rev 0.0A_EMUL\n");
+ break;
+ case 11:
+ printf("Gavini GT-I8530 Board Rev 0.0C\n");
+ break;
+ case 12:
+ printf("Gavini GT-I8530 Board Rev 0.0D\n");
+ break;
+ case 13:
+ printf("Gavini GT-I8530 Board Rev 0.1\n");
+ break;
+ case 14:
+ printf("Gavini GT-I8530 Board Rev 0.3\n");
+ break;
+ default:
+ break;
+ }
+ } else if (!strcmp(str, "samsung,codina")) {
+ switch(board_id) {
+ case 7:
+ printf("Codina GT-I8160 Board Rev 0.0\n");
+ break;
+ case 8:
+ printf("Codina GT-I8160 Board Rev 0.1\n");
+ break;
+ case 9:
+ printf("Codina GT-I8160 Board Rev 0.2\n");
+ break;
+ case 10:
+ printf("Codina GT-I8160 Board Rev 0.3\n");
+ break;
+ case 11:
+ printf("Codina GT-I8160 Board Rev 0.4\n");
+ break;
+ case 12:
+ printf("Codina GT-I8160 Board Rev 0.5\n");
+ break;
+ default:
+ break;
+ }
+ codina_patch_display(fdt);
+ } else if (!strcmp(str, "samsung,codina-tmo")) {
+ switch(board_id) {
+ case 0x101:
+ printf("Codina SGH-T599 Board pre-Rev 0.0\n");
+ break;
+ case 0x102:
+ printf("Codina SGH-T599 Board Rev 0.0\n");
+ break;
+ case 0x103:
+ printf("Codina SGH-T599 Board Rev 0.1\n");
+ break;
+ case 0x104:
+ printf("Codina SGH-T599 Board Rev 0.2\n");
+ break;
+ case 0x105:
+ printf("Codina SGH-T599 Board Rev 0.4\n");
+ break;
+ case 0x106:
+ printf("Codina SGH-T599 Board Rev 0.6\n");
+ break;
+ case 0x107:
+ printf("Codina SGH-T599 Board Rev 0.7\n");
+ break;
+ default:
+ break;
+ }
+ codina_patch_display(fdt);
+ } else if (!strcmp(str, "samsung,golden")) {
+ switch(board_id) {
+ case 0x102:
+ printf("Golden GT-I8190 Board SW bringup\n");
+ break;
+ case 0x103:
+ printf("Golden GT-I8190 Board Rev 0.2\n");
+ break;
+ case 0x104:
+ printf("Golden GT-I8190 Board Rev 0.3\n");
+ break;
+ case 0x105:
+ printf("Golden GT-I8190 Board Rev 0.4\n");
+ break;
+ case 0x106:
+ printf("Golden GT-I8190 Board Rev 0.5\n");
+ break;
+ case 0x107:
+ printf("Golden GT-I8190 Board Rev 0.6\n");
+ break;
+ default:
+ break;
+ }
+ } else if (!strcmp(str, "samsung,skomer")) {
+ switch(board_id) {
+ case 0x101:
+ printf("Skomer GT-S7710 Board Rev 0.0\n");
+ break;
+ case 0x102:
+ printf("Skomer GT-S7710 Board Rev 0.1\n");
+ break;
+ case 0x103:
+ printf("Skomer GT-S7710 Board Rev 0.2\n");
+ break;
+ case 0x104:
+ printf("Skomer GT-S7710 Board Rev 0.3\n");
+ break;
+ case 0x105:
+ printf("Skomer GT-S7710 Board Rev 0.4\n");
+ break;
+ case 0x106:
+ printf("Skomer GT-S7710 Board Rev 0.5\n");
+ break;
+ case 0x107:
+ printf("Skomer GT-S7710 Board Rev 0.6\n");
+ break;
+ case 0x108:
+ printf("Skomer GT-S7710 Board Rev 0.7\n");
+ break;
+ case 0x109:
+ printf("Skomer GT-S7710 Board Rev 0.8\n");
+ break;
+ default:
+ break;
+ }
+ skomer_kyle_patch_display(fdt);
+ } else if (!strcmp(str, "samsung,kyle")) {
+ switch(board_id) {
+ case 0x101:
+ printf("Kyle SGH-I407 Board Rev 0.0\n");
+ break;
+ case 0x102:
+ printf("Kyle SGH-I407 Board Rev 0.1\n");
+ break;
+ case 0x103:
+ printf("Kyle SGH-I407 Board Rev 0.2\n");
+ break;
+ case 0x104:
+ printf("Kyle SGH-I407 Board Rev 0.3\n");
+ break;
+ case 0x105:
+ printf("Kyle SGH-I407 Board Rev 0.4\n");
+ break;
+ case 0x106:
+ printf("Kyle SGH-I407 Board Rev 0.5\n");
+ break;
+ case 0x107:
+ printf("Kyle SGH-I407 Board Rev 0.6\n");
+ break;
+ default:
+ break;
+ }
+ skomer_kyle_patch_display(fdt);
+ }
+
+ return 0;
+}
CONFIG_DEFAULT_DEVICE_TREE="t8103-j274"
CONFIG_DEBUG_UART_BASE=0x235200000
CONFIG_DEBUG_UART_CLOCK=24000000
-CONFIG_SYS_LOAD_ADDR=0x880000000
+CONFIG_SYS_LOAD_ADDR=0x0
CONFIG_USE_PREBOOT=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_BOARD_LATE_INIT=y
# CONFIG_NET is not set
CONFIG_APPLE_SPI_KEYB=y
# CONFIG_MMC is not set
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MCDE_SIMPLE=y
# CONFIG_EFI_LOADER is not set
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_LIBFDT=y
-.TH MKIMAGE 1 "2010-05-16"
+.TH MKIMAGE 1 "2022-02-07"
.SH NAME
mkimage \- Generate image for U-Boot
.SH SYNOPSIS
.B mkimage
-.RB "\-l [" "uimage file name" "]"
+.RB [ \-T " \fItype\fP] " \-l " [\fIuimage file name\fP]"
.B mkimage
.RB [\fIoptions\fP] " \-f [" "image tree source file" "]" " [" "uimage file name" "]"
.BI "\-l [" "uimage file name" "]"
mkimage lists the information contained in the header of an existing U-Boot image.
+.TP
+.BI "\-T [" "image type" "]"
+Parse image file as type.
+Pass \-h as the image to see the list of supported image type.
+Without this option image type is autodetected.
+
.P
.B Create old legacy image:
#if CONFIG_IS_ENABLED(DM_GPIO)
/* Take phy out of reset */
- ret = dm_gpio_set_value(&priv->reset_gpio, false);
- if (ret) {
- if (CONFIG_IS_ENABLED(CLK))
- clk_disable_bulk(&priv->bulk);
- return ret;
+ if (dm_gpio_is_valid(&priv->reset_gpio)) {
+ ret = dm_gpio_set_value(&priv->reset_gpio, false);
+ if (ret) {
+ if (CONFIG_IS_ENABLED(CLK))
+ clk_disable_bulk(&priv->bulk);
+ return ret;
+ }
}
#endif
return 0;
"stdout=serial,vidconsole\0" \
"stderr=serial,vidconsole\0"
-#define ENV_MEM_LAYOUT_SETTINGS \
- "fdt_addr_r=0x960100000\0" \
- "kernel_addr_r=0x960200000\0"
-
#if CONFIG_IS_ENABLED(CMD_NVME)
#define BOOT_TARGET_NVME(func) func(NVME, nvme, 0)
#else
#define CONFIG_EXTRA_ENV_SETTINGS \
ENV_DEVICE_SETTINGS \
- ENV_MEM_LAYOUT_SETTINGS \
BOOTENV
#endif
static void usage(void);
/* parameters initialized by core will be used by the image type code */
-static struct image_tool_params params = {
- .type = IH_TYPE_KERNEL,
-};
+static struct image_tool_params params;
/*
* dumpimage_extract_subimage -
}
}
- if (argc < 2)
+ if (argc < 2 || (params.iflag && params.lflag))
usage();
if (optind >= argc) {
/* set tparams as per input type_id */
tparams = imagetool_get_type(params.type);
- if (tparams == NULL) {
+ if (!params.lflag && tparams == NULL) {
fprintf(stderr, "%s: unsupported type: %s\n",
params.cmdname, genimg_get_type_name(params.type));
exit(EXIT_FAILURE);
* check the passed arguments parameters meets the requirements
* as per image type to be generated/listed
*/
- if (tparams->check_params) {
+ if (tparams && tparams->check_params) {
if (tparams->check_params(¶ms)) {
fprintf(stderr, "%s: Parameter check failed\n",
params.cmdname);
exit(EXIT_FAILURE);
}
- if ((uint32_t)sbuf.st_size < tparams->header_size) {
+ if (tparams && (uint32_t)sbuf.st_size < tparams->header_size) {
fprintf(stderr, "%s: Bad size: \"%s\" is not valid image\n",
params.cmdname, params.imagefile);
exit(EXIT_FAILURE);
static void usage(void)
{
- fprintf(stderr, "Usage: %s -l image\n"
- " -l ==> list image header information\n",
+ fprintf(stderr, "Usage: %s [-T type] -l image\n"
+ " -l ==> list image header information\n"
+ " -T ==> parse image file as 'type'\n",
params.cmdname);
fprintf(stderr,
" %s [-T type] [-p position] [-o outfile] image\n"
return NULL;
}
+static int imagetool_verify_print_header_by_type(
+ void *ptr,
+ struct stat *sbuf,
+ struct image_type_params *tparams,
+ struct image_tool_params *params);
+
int imagetool_verify_print_header(
void *ptr,
struct stat *sbuf,
struct image_type_params **start = __start_image_type;
struct image_type_params **end = __stop_image_type;
+ if (tparams)
+ return imagetool_verify_print_header_by_type(ptr, sbuf, tparams, params);
+
for (curr = start; curr != end; curr++) {
if ((*curr)->verify_header) {
retval = (*curr)->verify_header((unsigned char *)ptr,
return retval;
}
-int imagetool_verify_print_header_by_type(
+static int imagetool_verify_print_header_by_type(
void *ptr,
struct stat *sbuf,
struct image_type_params *tparams,
/*
* imagetool_verify_print_header() - verifies the image header
*
- * Scan registered image types and verify the image_header for each
- * supported image type. If verification is successful, this prints
- * the respective header.
- *
- * Return: 0 on success, negative if input image format does not match with
- * any of supported image types
- */
-int imagetool_verify_print_header(
- void *ptr,
- struct stat *sbuf,
- struct image_type_params *tparams,
- struct image_tool_params *params);
-
-/*
- * imagetool_verify_print_header_by_type() - verifies the image header
- *
* Verify the image_header for the image type given by tparams.
+ * If tparams is NULL then scan registered image types and verify the
+ * image_header for each supported image type.
* If verification is successful, this prints the respective header.
* @ptr: pointer the the image header
* @sbuf: stat information about the file pointed to by ptr
- * @tparams: image type parameters
+ * @tparams: image type parameters or NULL
* @params: mkimage parameters
*
* Return: 0 on success, negative if input image format does not match with
* the given image type
*/
-int imagetool_verify_print_header_by_type(
+int imagetool_verify_print_header(
void *ptr,
struct stat *sbuf,
struct image_type_params *tparams,
static void usage(const char *msg)
{
fprintf(stderr, "Error: %s\n", msg);
- fprintf(stderr, "Usage: %s -l image\n"
- " -l ==> list image header information\n",
+ fprintf(stderr, "Usage: %s [-T type] -l image\n"
+ " -l ==> list image header information\n"
+ " -T ==> parse image file as 'type'\n",
params.cmdname);
fprintf(stderr,
" %s [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image\n"
params.datafile = datafile;
else if (!params.datafile)
usage("Missing data file for auto-FIT (use -d)");
- } else if (type != IH_TYPE_INVALID) {
+ } else if (params.lflag || type != IH_TYPE_INVALID) {
if (type == IH_TYPE_SCRIPT && !params.datafile)
usage("Missing data file for script (use -d)");
params.type = type;
/* set tparams as per input type_id */
tparams = imagetool_get_type(params.type);
- if (tparams == NULL) {
+ if (tparams == NULL && !params.lflag) {
fprintf (stderr, "%s: unsupported type %s\n",
params.cmdname, genimg_get_type_name(params.type));
exit (EXIT_FAILURE);
* check the passed arguments parameters meets the requirements
* as per image type to be generated/listed
*/
- if (tparams->check_params)
+ if (tparams && tparams->check_params)
if (tparams->check_params (¶ms))
usage("Bad parameters for image type");
if (!params.eflag) {
params.ep = params.addr;
/* If XIP, entry point must be after the U-Boot header */
- if (params.xflag)
+ if (params.xflag && tparams)
params.ep += tparams->header_size;
}
params.cmdname, params.imagefile);
exit (EXIT_FAILURE);
#endif
- } else if (sbuf.st_size < (off_t)tparams->header_size) {
+ } else if (tparams && sbuf.st_size < (off_t)tparams->header_size) {
fprintf (stderr,
"%s: Bad size: \"%s\" is not valid image: size %llu < %u\n",
params.cmdname, params.imagefile,
exit (EXIT_FAILURE);
}
- if (params.fflag) {
- /*
- * Verifies the header format based on the expected header for image
- * type in tparams
- */
- retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
- tparams, ¶ms);
- } else {
- /**
- * When listing the image, we are not given the image type. Simply check all
- * image types to find one that matches our header
- */
- retval = imagetool_verify_print_header(ptr, &sbuf,
- tparams, ¶ms);
- }
+ /*
+ * Verifies the header format based on the expected header for image
+ * type in tparams. If tparams is NULL simply check all image types
+ * to find one that matches our header.
+ */
+ retval = imagetool_verify_print_header(ptr, &sbuf, tparams, ¶ms);
(void) munmap((void *)ptr, sbuf.st_size);
(void) close (ifd);