From: Randolph Sapp <[email protected]> Take Phytec's current DDR fixup functions and utilize them to dynamically adjust for variants in the pocketbeagle2. There are currently 3 skews, two of which are both 512MB with the same memory configuration, and one which is 1GB using the same CWL and CL settings but a modified density [1].
Based off of Bryan Brattlof's patch [2]. [1] https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/5411/8G%20Bits%20DDR4%20SDRAM.pdf [2] https://github.com/bryanbrattlof/beagleboot/commit/fb2f022e27427e990d7a33fd001ffb571e13cfc3 Signed-off-by: Randolph Sapp <[email protected]> --- board/beagle/pocketbeagle2/Kconfig | 26 ++++ board/beagle/pocketbeagle2/Makefile | 2 + board/beagle/pocketbeagle2/pocketbeagle2.c | 112 +++++++++++++++++- .../beagle/pocketbeagle2/pocketbeagle2_ddr.h | 50 ++++++++ configs/am62_pocketbeagle2_r5_defconfig | 5 +- 5 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 board/beagle/pocketbeagle2/pocketbeagle2_ddr.h diff --git a/board/beagle/pocketbeagle2/Kconfig b/board/beagle/pocketbeagle2/Kconfig index e957b8e8377..a361fcebfc1 100644 --- a/board/beagle/pocketbeagle2/Kconfig +++ b/board/beagle/pocketbeagle2/Kconfig @@ -12,6 +12,7 @@ config TARGET_AM62X_A53_POCKETBEAGLE2 select ARM64 select BINMAN select OF_SYSTEM_SETUP + imply TI_I2C_BOARD_DETECT config TARGET_AM62X_R5_POCKETBEAGLE2 bool "BeagleBoard.org AM62X PocketBeagle 2 running on R5" @@ -23,6 +24,7 @@ config TARGET_AM62X_R5_POCKETBEAGLE2 select K3_DDRSS select BINMAN imply SYS_K3_SPL_ATF + imply TI_I2C_BOARD_DETECT endchoice @@ -58,3 +60,27 @@ config SPL_LDSCRIPT source "board/ti/common/Kconfig" endif + +config POCKETBEAGLE2_AM62X_RAM_SIZE_FIX + bool "Set the PocketBeagle 2 RAM size instead of detecting it" + default false + help + RAM size is automatically detected through the device revision stored + in EEPROM. This overrides the detection logic with a fixed value. + +choice + prompt "PocketBeagle 2 RAM size" + depends on POCKETBEAGLE2_AM62X_RAM_SIZE_FIX + default POCKETBEAGLE2_AM62X_RAM_SIZE_512MB + +config POCKETBEAGLE2_AM62X_RAM_SIZE_512MB + bool "512MB RAM" + help + Set RAM size fix to 512MB for the PocketBeagle 2. + +config POCKETBEAGLE2_AM62X_RAM_SIZE_1GB + bool "1GB RAM" + help + Set RAM size fix to 1GB for the PocketBeagle 2. + +endchoice diff --git a/board/beagle/pocketbeagle2/Makefile b/board/beagle/pocketbeagle2/Makefile index 3d42c160716..dd529fe6d75 100644 --- a/board/beagle/pocketbeagle2/Makefile +++ b/board/beagle/pocketbeagle2/Makefile @@ -7,3 +7,5 @@ # obj-y += pocketbeagle2.o +obj-${CONFIG_K3_DDRSS} += ../../phytec/common/k3/k3_ddrss_patch.o +obj-${CONFIG_TI_I2C_BOARD_DETECT} += ../../ti/common/board_detect.o diff --git a/board/beagle/pocketbeagle2/pocketbeagle2.c b/board/beagle/pocketbeagle2/pocketbeagle2.c index b6768caa34b..1bfc79350b6 100644 --- a/board/beagle/pocketbeagle2/pocketbeagle2.c +++ b/board/beagle/pocketbeagle2/pocketbeagle2.c @@ -15,15 +15,123 @@ #include <spl.h> #include <asm/arch/k3-ddr.h> +#include "../../ti/common/board_detect.h" +#include "pocketbeagle2_ddr.h" + +DECLARE_GLOBAL_DATA_PTR; + +static int pocketbeagle2_get_ddr_size(void) +{ + // check config overrides first + if (IS_ENABLED(CONFIG_POCKETBEAGLE2_AM62X_RAM_SIZE_FIX)) { + if (IS_ENABLED(CONFIG_POCKETBEAGLE2_AM62X_RAM_SIZE_512MB)) + return EEPROM_RAM_SIZE_512MB; + if (IS_ENABLED(CONFIG_POCKETBEAGLE2_AM62X_RAM_SIZE_1GB)) + return EEPROM_RAM_SIZE_1GB; + } + +#if IS_ENABLED(CONFIG_TI_I2C_BOARD_DETECT) + // dynamically detect the config if we can + if (!do_board_detect_am6()) { + struct ti_am6_eeprom *ep = TI_AM6_EEPROM_DATA; + + if (strlen(ep->name) > 11 && ep->name[0] == 'P') { + /* + * POCKETBEAGL2A00 (am6232 512MB) + * POCKETBEAGL2A10 (am625 512MB) + * POCKETBEAGL2A1I (am625 1GB) + */ + if (!strncmp(&ep->name[11], "2A1I", 4)) + return EEPROM_RAM_SIZE_1GB; + } + } +#endif + + return EEPROM_RAM_SIZE_512MB; +} + int dram_init(void) { - return fdtdec_setup_mem_size_base(); + if (!IS_ENABLED(CONFIG_CPU_V7R)) + return fdtdec_setup_mem_size_base(); + + return 0; } +// logic after this block assumes that there is only 1 DRAM bank currently +#if CONFIG_NR_DRAM_BANKS != 1 +#error Unsupported number of DRAM banks! +#endif + int dram_init_banksize(void) { - return fdtdec_setup_memory_banksize(); + u8 ram_size; + + if (!IS_ENABLED(CONFIG_CPU_V7R)) + return fdtdec_setup_memory_banksize(); + + memset(gd->bd->bi_dram, 0, sizeof(gd->bd->bi_dram[0])); + + ram_size = pocketbeagle2_get_ddr_size(); + switch (ram_size) { + case EEPROM_RAM_SIZE_1GB: + gd->bd->bi_dram[0].start = CFG_SYS_SDRAM_BASE; + gd->bd->bi_dram[0].size = 0x40000000; + gd->ram_size = 0x40000000; + break; + case EEPROM_RAM_SIZE_512MB: + default: + gd->bd->bi_dram[0].start = CFG_SYS_SDRAM_BASE; + gd->bd->bi_dram[0].size = 0x20000000; + gd->ram_size = 0x20000000; + break; + } + + return 0; +} + +#if IS_ENABLED(CONFIG_K3_DDRSS) +static int update_ddrss_timings(void) +{ + int ret = 0; + u8 ram_size = 0; + struct ddrss *ddr_patch = NULL; + void *fdt = (void *)gd->fdt_blob; + + ram_size = pocketbeagle2_get_ddr_size(); + ddr_patch = &pocketbeagle2_ddrss_data[ram_size]; + + if (!ddr_patch) + return ret; + + ret = fdt_apply_ddrss_timings_patch(fdt, ddr_patch); + if (ret) { + printf("Failed to apply ddrs timings patch: %d\n", ret); + return ret; + } + + return ret; +} + +int do_board_detect(void) +{ + void *fdt = (void *)gd->fdt_blob; + u64 start[] = {gd->bd->bi_dram[0].start}; + u64 size[] = {gd->bd->bi_dram[0].size}; + int ret; + + dram_init(); + dram_init_banksize(); + + ret = fdt_fixup_memory_banks(fdt, start, size, 1); + if (ret) { + printf("Failed to fixup memory banks: %d\n", ret); + return ret; + } + + return update_ddrss_timings(); } +#endif /* CONFIG_K3_DDRSS */ #if IS_ENABLED(CONFIG_BOARD_LATE_INIT) int board_late_init(void) diff --git a/board/beagle/pocketbeagle2/pocketbeagle2_ddr.h b/board/beagle/pocketbeagle2/pocketbeagle2_ddr.h new file mode 100644 index 00000000000..6d248ce6dfa --- /dev/null +++ b/board/beagle/pocketbeagle2/pocketbeagle2_ddr.h @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * DDR override logic for AM625 PocketBeagle 2 + * https://www.beagleboard.org/boards/pocketbeagle-2 + * + * Copyright (C) 2025 Texas Instruments Incorporated - https://www.ti.com/ + */ + +#ifndef __POCKETBEAGLE2_DDR_H +#define __POCKETBEAGLE2_DDR_H + +#include "../../phytec/common/k3/k3_ddrss_patch.h" + +enum { + EEPROM_RAM_SIZE_512MB = 0, + EEPROM_RAM_SIZE_1GB = 1 +}; + +struct ddr_reg ddr_1gb_ctl_regs[] = { + { 317, 0x00000101 }, + { 318, 0x1FFF0000 }, +}; + +struct ddr_reg ddr_1gb_pi_regs[] = { + { 77, 0x04010100 }, +}; + +struct ddrss pocketbeagle2_ddrss_data[] = { + // default configuration + [EEPROM_RAM_SIZE_512MB] = { + .ctl_regs = NULL, + .ctl_regs_num = 0, + .pi_regs = NULL, + .pi_regs_num = 0, + .phy_regs = NULL, + .phy_regs_num = 0, + }, + + // industrial configuration + [EEPROM_RAM_SIZE_1GB] = { + .ctl_regs = &ddr_1gb_ctl_regs[0], + .ctl_regs_num = ARRAY_SIZE(ddr_1gb_ctl_regs), + .pi_regs = &ddr_1gb_pi_regs[0], + .pi_regs_num = ARRAY_SIZE(ddr_1gb_pi_regs), + .phy_regs = NULL, + .phy_regs_num = 0, + }, +}; + +#endif /* __POCKETBEAGLE2_DDR_H */ diff --git a/configs/am62_pocketbeagle2_r5_defconfig b/configs/am62_pocketbeagle2_r5_defconfig index e863204cfef..d72f78b932c 100644 --- a/configs/am62_pocketbeagle2_r5_defconfig +++ b/configs/am62_pocketbeagle2_r5_defconfig @@ -14,7 +14,7 @@ CONFIG_DM_GPIO=y CONFIG_SPL_DM_SPI=y CONFIG_DEFAULT_DEVICE_TREE="k3-am62-r5-pocketbeagle2" CONFIG_DM_RESET=y -CONFIG_SPL_SYS_MALLOC_F_LEN=0x7000 +CONFIG_SPL_SYS_MALLOC_F_LEN=0x8000 CONFIG_SPL_MMC=y CONFIG_SPL_SERIAL=y CONFIG_SPL_DRIVERS_MISC=y @@ -42,6 +42,7 @@ CONFIG_SPL_SYS_MALLOC=y CONFIG_SPL_EARLY_BSS=y CONFIG_SPL_SYS_MMCSD_RAW_MODE=y CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x400 +CONFIG_SPL_I2C=y CONFIG_SPL_DM_MAILBOX=y CONFIG_SPL_DM_RESET=y CONFIG_SPL_POWER_DOMAIN=y @@ -73,6 +74,8 @@ CONFIG_SPL_CLK_K3_PLL=y CONFIG_SPL_CLK_K3=y CONFIG_TI_SCI_PROTOCOL=y CONFIG_DA8XX_GPIO=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_OMAP24XX=y CONFIG_DM_MAILBOX=y CONFIG_K3_SEC_PROXY=y CONFIG_SPL_MISC=y -- 2.53.0

