[U-Boot] [RFC] odroid: Add support for the ODROID-X board variant
Minkyu Kang
mk7.kang at samsung.com
Fri Oct 23 12:53:28 CEST 2015
Dear Siarhei Siamashka,
On 20/10/15 08:39, Siarhei Siamashka wrote:
> ODROID-X uses a slightly older revision of the same base board
> as the ODROID-X2. But the CPU module in ODROID-X uses an older
> 1.4GHz revision of Exynos4412 SoC and less RAM (1GiB instead
> of 2GiB).
>
> The current U-Boot code deadlocks on ODROID-X when probing the RAM
> size via get_ram_size() function. Reducing CONFIG_NR_DRAM_BANKS
> from 8 to 4 can fix this problem. But this constant is used in
> a lot of places in U-Boot, while SDRAM_BANK_SIZE can be easily
> replaced with the code which relies on runtime detection of the
> board type. So we change 4 or 8 banks of 256MiB with just one
> fake bank of 2GiB or 1GiB. The runtime detection check tries to
> read the PRO_ID register in the hope that it might be different
> between Exynos4412 and Exynos4412 Prime and enough to detect
> the difference between X and X2 board variants.
>
> Signed-off-by: Siarhei Siamashka <siarhei.siamashka at gmail.com>
> ---
>
> I'm assuming that the X and X2 hardware is nearly identical
> and can be supported with a common code in U-Boot, based on
> the changelog of PCB revisions:
> http://com.odroid.com/sigong/blog/blog_list.php?bid=132
>
> This is an RFC patch because I don't have an X2 board and can't
> test if checking the PRO_ID register is good enough. If it does
> not work, then maybe some other method could be tried (probe
> the DRAM controller registers?).
>
> Also does the number of DRAM banks have any special meaning on
> this platform in U-Boot and Linux (after the proprietary blob
> has already initialized the DRAM controller)?
>
> If this approach is wrong, then what would be the best way to
> add support for the ODROID-X board?
>
> Thanks.
>
> board/samsung/common/board.c | 21 +++++++++++++++++----
> board/samsung/odroid/odroid.c | 14 ++++++++++----
> include/configs/odroid.h | 10 ++++++----
> 3 files changed, 33 insertions(+), 12 deletions(-)
>
> diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c
> index d32c75d..ac3ed4c 100644
> --- a/board/samsung/common/board.c
> +++ b/board/samsung/common/board.c
> @@ -94,14 +94,26 @@ int board_init(void)
> return exynos_init();
> }
>
> +static u32 get_sdram_bank_size(void)
> +{
> + u32 sdram_bank_size = SDRAM_BANK_SIZE;
> +#ifdef CONFIG_BOARD_TYPES
> + if (strcmp(CONFIG_SYS_BOARD, "odroid") == 0 &&
> + strcmp(get_board_type(), "x") == 0)
> + sdram_bank_size = SDRAM_BANK_SIZE_ODROIDX;
> +#endif
> + return sdram_bank_size;
> +}
> +
> int dram_init(void)
> {
> unsigned int i;
> u32 addr;
> + u32 sdram_bank_size = get_sdram_bank_size();
>
> for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
> - addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE);
> - gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE);
> + addr = CONFIG_SYS_SDRAM_BASE + (i * sdram_bank_size);
> + gd->ram_size += get_ram_size((long *)addr, sdram_bank_size);
> }
> return 0;
> }
> @@ -110,10 +122,11 @@ void dram_init_banksize(void)
> {
> unsigned int i;
> u32 addr, size;
> + u32 sdram_bank_size = get_sdram_bank_size();
>
> for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
> - addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE);
> - size = get_ram_size((long *)addr, SDRAM_BANK_SIZE);
> + addr = CONFIG_SYS_SDRAM_BASE + (i * sdram_bank_size);
> + size = get_ram_size((long *)addr, sdram_bank_size);
>
> gd->bd->bi_dram[i].start = addr;
> gd->bd->bi_dram[i].size = size;
> diff --git a/board/samsung/odroid/odroid.c b/board/samsung/odroid/odroid.c
> index 32155f1..e98e3be 100644
> --- a/board/samsung/odroid/odroid.c
> +++ b/board/samsung/odroid/odroid.c
> @@ -30,6 +30,7 @@ DECLARE_GLOBAL_DATA_PTR;
> enum {
> ODROID_TYPE_U3,
> ODROID_TYPE_X2,
> + ODROID_TYPE_X,
> ODROID_TYPES,
> };
>
> @@ -56,15 +57,20 @@ void set_board_type(void)
> sdelay(200000);
>
> /* Check GPC1 pin2 - LED supplied by XCL205 - X2 only */
> - if (readl(XCL205_STATE_GPIO_DAT) & (1 << XCL205_STATE_GPIO_PIN))
> - gd->board_type = ODROID_TYPE_X2;
> - else
> + if (readl(XCL205_STATE_GPIO_DAT) & (1 << XCL205_STATE_GPIO_PIN)) {
> + /* Check the SoC product information ID */
> + if (readl(EXYNOS4_PRO_ID) == 0xE4412211)
you can use s5p_cpu_id and s5p_cpu_rev.
> + gd->board_type = ODROID_TYPE_X;
> + else
> + gd->board_type = ODROID_TYPE_X2;
> + } else {
> gd->board_type = ODROID_TYPE_U3;
> + }
> }
>
> const char *get_board_type(void)
> {
> - const char *board_type[] = {"u3", "x2"};
> + const char *board_type[] = {"u3", "x2", "x"};
>
> return board_type[gd->board_type];
> }
> diff --git a/include/configs/odroid.h b/include/configs/odroid.h
> index 4c85e85..ae1b2b4 100644
> --- a/include/configs/odroid.h
> +++ b/include/configs/odroid.h
> @@ -22,9 +22,10 @@
>
> #define CONFIG_MACH_TYPE 4289
>
> -#define CONFIG_NR_DRAM_BANKS 8
> +#define CONFIG_NR_DRAM_BANKS 1
> #define CONFIG_SYS_SDRAM_BASE 0x40000000
> -#define SDRAM_BANK_SIZE (256 << 20) /* 256 MB */
> +#define SDRAM_BANK_SIZE ((8 * 256) << 20) /* 8 * 256 MB */
> +#define SDRAM_BANK_SIZE_ODROIDX ((4 * 256) << 20) /* 4 * 256 MB */
Sorry. I don't agree this code.
I think we can split config files to each boards.
> #define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE
> /* Reserve the last 1 MiB for the secure firmware */
> #define CONFIG_SYS_MEM_TOP_HIDE (1UL << 20UL)
> @@ -75,6 +76,7 @@
> "uInitrd fat 0 1;" \
> "exynos4412-odroidu3.dtb fat 0 1;" \
> "exynos4412-odroidx2.dtb fat 0 1;" \
> + "exynos4412-odroidx.dtb fat 0 1;" \
> ""PARTS_BOOT" part 0 1;" \
> ""PARTS_ROOT" part 0 2\0" \
>
> @@ -209,8 +211,8 @@
> #define CONFIG_USB_ETHER_SMSC95XX
>
> /*
> - * Supported Odroid boards: X3, U3
> - * TODO: Add Odroid X support
> + * Supported Odroid boards: X, X2, U3
> + * TODO: Add Odroid U2 support
> */
> #define CONFIG_MISC_COMMON
> #define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
>
Thanks,
Minkyu Kang.
More information about the U-Boot
mailing list