uboot/arch/arm/mach-k3/am6_init.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * AM6: SoC specific initialization
   4 *
   5 * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
   6 *      Lokesh Vutla <lokeshvutla@ti.com>
   7 */
   8
   9#include <common.h>
  10#include <fdt_support.h>
  11#include <init.h>
  12#include <asm/global_data.h>
  13#include <asm/io.h>
  14#include <spl.h>
  15#include <asm/arch/hardware.h>
  16#include <asm/arch/sysfw-loader.h>
  17#include <asm/arch/sys_proto.h>
  18#include "common.h"
  19#include <dm.h>
  20#include <dm/uclass-internal.h>
  21#include <dm/pinctrl.h>
  22#include <linux/soc/ti/ti_sci_protocol.h>
  23#include <log.h>
  24#include <mmc.h>
  25#include <stdlib.h>
  26
  27DECLARE_GLOBAL_DATA_PTR;
  28
  29#ifdef CONFIG_SPL_BUILD
  30#ifdef CONFIG_K3_LOAD_SYSFW
  31#ifdef CONFIG_TI_SECURE_DEVICE
  32struct fwl_data main_cbass_fwls[] = {
  33        { "MMCSD1_CFG", 2057, 1 },
  34        { "MMCSD0_CFG", 2058, 1 },
  35        { "USB3SS0_SLV0", 2176, 2 },
  36        { "PCIE0_SLV", 2336, 8 },
  37        { "PCIE1_SLV", 2337, 8 },
  38        { "PCIE0_CFG", 2688, 1 },
  39        { "PCIE1_CFG", 2689, 1 },
  40}, mcu_cbass_fwls[] = {
  41        { "MCU_ARMSS0_CORE0_SLV", 1024, 1 },
  42        { "MCU_ARMSS0_CORE1_SLV", 1028, 1 },
  43        { "MCU_FSS0_S1", 1033, 8 },
  44        { "MCU_FSS0_S0", 1036, 8 },
  45        { "MCU_CPSW0", 1220, 1 },
  46};
  47#endif
  48#endif
  49
  50static void ctrl_mmr_unlock(void)
  51{
  52        /* Unlock all WKUP_CTRL_MMR0 module registers */
  53        mmr_unlock(WKUP_CTRL_MMR0_BASE, 0);
  54        mmr_unlock(WKUP_CTRL_MMR0_BASE, 1);
  55        mmr_unlock(WKUP_CTRL_MMR0_BASE, 2);
  56        mmr_unlock(WKUP_CTRL_MMR0_BASE, 3);
  57        mmr_unlock(WKUP_CTRL_MMR0_BASE, 6);
  58        mmr_unlock(WKUP_CTRL_MMR0_BASE, 7);
  59
  60        /* Unlock all MCU_CTRL_MMR0 module registers */
  61        mmr_unlock(MCU_CTRL_MMR0_BASE, 0);
  62        mmr_unlock(MCU_CTRL_MMR0_BASE, 1);
  63        mmr_unlock(MCU_CTRL_MMR0_BASE, 2);
  64        mmr_unlock(MCU_CTRL_MMR0_BASE, 6);
  65
  66        /* Unlock all CTRL_MMR0 module registers */
  67        mmr_unlock(CTRL_MMR0_BASE, 0);
  68        mmr_unlock(CTRL_MMR0_BASE, 1);
  69        mmr_unlock(CTRL_MMR0_BASE, 2);
  70        mmr_unlock(CTRL_MMR0_BASE, 3);
  71        mmr_unlock(CTRL_MMR0_BASE, 6);
  72        mmr_unlock(CTRL_MMR0_BASE, 7);
  73}
  74
  75/*
  76 * This uninitialized global variable would normal end up in the .bss section,
  77 * but the .bss is cleared between writing and reading this variable, so move
  78 * it to the .data section.
  79 */
  80u32 bootindex __section(".data");
  81
  82static void store_boot_index_from_rom(void)
  83{
  84        bootindex = *(u32 *)(CONFIG_SYS_K3_BOOT_PARAM_TABLE_INDEX);
  85}
  86
  87#if defined(CONFIG_K3_LOAD_SYSFW) && CONFIG_IS_ENABLED(DM_MMC)
  88void k3_mmc_stop_clock(void)
  89{
  90        if (spl_boot_device() == BOOT_DEVICE_MMC1) {
  91                struct mmc *mmc = find_mmc_device(0);
  92
  93                if (!mmc)
  94                        return;
  95
  96                mmc->saved_clock = mmc->clock;
  97                mmc_set_clock(mmc, 0, true);
  98        }
  99}
 100
 101void k3_mmc_restart_clock(void)
 102{
 103        if (spl_boot_device() == BOOT_DEVICE_MMC1) {
 104                struct mmc *mmc = find_mmc_device(0);
 105
 106                if (!mmc)
 107                        return;
 108
 109                mmc_set_clock(mmc, mmc->saved_clock, false);
 110        }
 111}
 112#else
 113void k3_mmc_stop_clock(void) {}
 114void k3_mmc_restart_clock(void) {}
 115#endif
 116#if CONFIG_IS_ENABLED(DFU) || CONFIG_IS_ENABLED(USB_STORAGE)
 117#define CTRLMMR_SERDES0_CTRL    0x00104080
 118#define PCIE_LANE0              0x1
 119static int fixup_usb_boot(void)
 120{
 121        int ret;
 122
 123        switch (spl_boot_device()) {
 124        case BOOT_DEVICE_USB:
 125                /*
 126                 * If bootmode is Host bootmode, fixup the dr_mode to host
 127                 * before the dwc3 bind takes place
 128                 */
 129                ret = fdt_find_and_setprop((void *)gd->fdt_blob,
 130                                "/interconnect@100000/dwc3@4000000/usb@10000",
 131                                "dr_mode", "host", 11, 0);
 132                if (ret)
 133                        printf("%s: fdt_find_and_setprop() failed:%d\n", __func__,
 134                               ret);
 135                fallthrough;
 136        case BOOT_DEVICE_DFU:
 137                /*
 138                 * The serdes mux between PCIe and USB3 needs to be set to PCIe for
 139                 * accessing the interface at USB 2.0
 140                 */
 141                writel(PCIE_LANE0, CTRLMMR_SERDES0_CTRL);
 142        default:
 143                break;
 144        }
 145
 146        return 0;
 147}
 148
 149int fdtdec_board_setup(const void *fdt_blob)
 150{
 151        return fixup_usb_boot();
 152}
 153#endif
 154
 155static void setup_am654_navss_northbridge(void)
 156{
 157        /*
 158         * NB0 is bridge to SRAM and NB1 is bridge to DDR.
 159         * To ensure that SRAM transfers are not stalled due to
 160         * delays during DDR refreshes, SRAM traffic should be higher
 161         * priority (threadmap=2) than DDR traffic (threadmap=0).
 162         */
 163        writel(0x2, NAVSS0_NBSS_NB0_CFG_BASE + NAVSS_NBSS_THREADMAP);
 164        writel(0x0, NAVSS0_NBSS_NB1_CFG_BASE + NAVSS_NBSS_THREADMAP);
 165}
 166
 167void board_init_f(ulong dummy)
 168{
 169#if defined(CONFIG_K3_LOAD_SYSFW) || defined(CONFIG_K3_AM654_DDRSS)
 170        struct udevice *dev;
 171        size_t pool_size;
 172        void *pool_addr;
 173        int ret;
 174#endif
 175        /*
 176         * Cannot delay this further as there is a chance that
 177         * K3_BOOT_PARAM_TABLE_INDEX can be over written by SPL MALLOC section.
 178         */
 179        store_boot_index_from_rom();
 180
 181        /* Make all control module registers accessible */
 182        ctrl_mmr_unlock();
 183
 184        setup_am654_navss_northbridge();
 185
 186#ifdef CONFIG_CPU_V7R
 187        disable_linefill_optimization();
 188        setup_k3_mpu_regions();
 189#endif
 190
 191        /* Init DM early in-order to invoke system controller */
 192        spl_early_init();
 193
 194#ifdef CONFIG_K3_EARLY_CONS
 195        /*
 196         * Allow establishing an early console as required for example when
 197         * doing a UART-based boot. Note that this console may not "survive"
 198         * through a SYSFW PM-init step and will need a re-init in some way
 199         * due to changing module clock frequencies.
 200         */
 201        early_console_init();
 202#endif
 203
 204#ifdef CONFIG_K3_LOAD_SYSFW
 205        /*
 206         * Initialize an early full malloc environment. Do so by allocating a
 207         * new malloc area inside the currently active pre-relocation "first"
 208         * malloc pool of which we use all that's left.
 209         */
 210        pool_size = CONFIG_VAL(SYS_MALLOC_F_LEN) - gd->malloc_ptr;
 211        pool_addr = malloc(pool_size);
 212        if (!pool_addr)
 213                panic("ERROR: Can't allocate full malloc pool!\n");
 214
 215        mem_malloc_init((ulong)pool_addr, (ulong)pool_size);
 216        gd->flags |= GD_FLG_FULL_MALLOC_INIT;
 217        debug("%s: initialized an early full malloc pool at 0x%08lx of 0x%lx bytes\n",
 218              __func__, (unsigned long)pool_addr, (unsigned long)pool_size);
 219        /*
 220         * Process pinctrl for the serial0 a.k.a. WKUP_UART0 module and continue
 221         * regardless of the result of pinctrl. Do this without probing the
 222         * device, but instead by searching the device that would request the
 223         * given sequence number if probed. The UART will be used by the system
 224         * firmware (SYSFW) image for various purposes and SYSFW depends on us
 225         * to initialize its pin settings.
 226         */
 227        ret = uclass_find_device_by_seq(UCLASS_SERIAL, 0, &dev);
 228        if (!ret)
 229                pinctrl_select_state(dev, "default");
 230
 231        /*
 232         * Load, start up, and configure system controller firmware while
 233         * also populating the SYSFW post-PM configuration callback hook.
 234         */
 235        k3_sysfw_loader(false, k3_mmc_stop_clock, k3_mmc_restart_clock);
 236
 237        /* Prepare console output */
 238        preloader_console_init();
 239
 240        /* Disable ROM configured firewalls right after loading sysfw */
 241#ifdef CONFIG_TI_SECURE_DEVICE
 242        remove_fwl_configs(main_cbass_fwls, ARRAY_SIZE(main_cbass_fwls));
 243        remove_fwl_configs(mcu_cbass_fwls, ARRAY_SIZE(mcu_cbass_fwls));
 244#endif
 245#else
 246        /* Prepare console output */
 247        preloader_console_init();
 248#endif
 249
 250        /* Output System Firmware version info */
 251        k3_sysfw_print_ver();
 252
 253        /* Perform EEPROM-based board detection */
 254        do_board_detect();
 255
 256#if defined(CONFIG_CPU_V7R) && defined(CONFIG_K3_AVS0)
 257        ret = uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(k3_avs),
 258                                          &dev);
 259        if (ret)
 260                printf("AVS init failed: %d\n", ret);
 261#endif
 262
 263#ifdef CONFIG_K3_AM654_DDRSS
 264        ret = uclass_get_device(UCLASS_RAM, 0, &dev);
 265        if (ret)
 266                panic("DRAM init failed: %d\n", ret);
 267#endif
 268        spl_enable_dcache();
 269}
 270
 271u32 spl_mmc_boot_mode(const u32 boot_device)
 272{
 273#if defined(CONFIG_SUPPORT_EMMC_BOOT)
 274        u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
 275
 276        u32 bootmode = (devstat & CTRLMMR_MAIN_DEVSTAT_BOOTMODE_MASK) >>
 277                        CTRLMMR_MAIN_DEVSTAT_BOOTMODE_SHIFT;
 278
 279        /* eMMC boot0 mode is only supported for primary boot */
 280        if (bootindex == K3_PRIMARY_BOOTMODE &&
 281            bootmode == BOOT_DEVICE_MMC1)
 282                return MMCSD_MODE_EMMCBOOT;
 283#endif
 284
 285        /* Everything else use filesystem if available */
 286#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
 287        return MMCSD_MODE_FS;
 288#else
 289        return MMCSD_MODE_RAW;
 290#endif
 291}
 292
 293static u32 __get_backup_bootmedia(u32 devstat)
 294{
 295        u32 bkup_boot = (devstat & CTRLMMR_MAIN_DEVSTAT_BKUP_BOOTMODE_MASK) >>
 296                        CTRLMMR_MAIN_DEVSTAT_BKUP_BOOTMODE_SHIFT;
 297
 298        switch (bkup_boot) {
 299        case BACKUP_BOOT_DEVICE_USB:
 300                return BOOT_DEVICE_USB;
 301        case BACKUP_BOOT_DEVICE_UART:
 302                return BOOT_DEVICE_UART;
 303        case BACKUP_BOOT_DEVICE_ETHERNET:
 304                return BOOT_DEVICE_ETHERNET;
 305        case BACKUP_BOOT_DEVICE_MMC2:
 306        {
 307                u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_MASK) >>
 308                            CTRLMMR_MAIN_DEVSTAT_BKUP_MMC_PORT_SHIFT;
 309                if (port == 0x0)
 310                        return BOOT_DEVICE_MMC1;
 311                return BOOT_DEVICE_MMC2;
 312        }
 313        case BACKUP_BOOT_DEVICE_SPI:
 314                return BOOT_DEVICE_SPI;
 315        case BACKUP_BOOT_DEVICE_HYPERFLASH:
 316                return BOOT_DEVICE_HYPERFLASH;
 317        case BACKUP_BOOT_DEVICE_I2C:
 318                return BOOT_DEVICE_I2C;
 319        };
 320
 321        return BOOT_DEVICE_RAM;
 322}
 323
 324static u32 __get_primary_bootmedia(u32 devstat)
 325{
 326        u32 bootmode = (devstat & CTRLMMR_MAIN_DEVSTAT_BOOTMODE_MASK) >>
 327                        CTRLMMR_MAIN_DEVSTAT_BOOTMODE_SHIFT;
 328
 329        if (bootmode == BOOT_DEVICE_OSPI || bootmode == BOOT_DEVICE_QSPI)
 330                bootmode = BOOT_DEVICE_SPI;
 331
 332        if (bootmode == BOOT_DEVICE_MMC2) {
 333                u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_MMC_PORT_MASK) >>
 334                            CTRLMMR_MAIN_DEVSTAT_MMC_PORT_SHIFT;
 335                if (port == 0x0)
 336                        bootmode = BOOT_DEVICE_MMC1;
 337        } else if (bootmode == BOOT_DEVICE_MMC1) {
 338                u32 port = (devstat & CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_MASK) >>
 339                            CTRLMMR_MAIN_DEVSTAT_EMMC_PORT_SHIFT;
 340                if (port == 0x1)
 341                        bootmode = BOOT_DEVICE_MMC2;
 342        } else if (bootmode == BOOT_DEVICE_DFU) {
 343                u32 mode = (devstat & CTRLMMR_MAIN_DEVSTAT_USB_MODE_MASK) >>
 344                            CTRLMMR_MAIN_DEVSTAT_USB_MODE_SHIFT;
 345                if (mode == 0x2)
 346                        bootmode = BOOT_DEVICE_USB;
 347        }
 348
 349        return bootmode;
 350}
 351
 352u32 spl_boot_device(void)
 353{
 354        u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
 355
 356        if (bootindex == K3_PRIMARY_BOOTMODE)
 357                return __get_primary_bootmedia(devstat);
 358        else
 359                return __get_backup_bootmedia(devstat);
 360}
 361#endif
 362
 363#ifdef CONFIG_SYS_K3_SPL_ATF
 364
 365#define AM6_DEV_MCU_RTI0                        134
 366#define AM6_DEV_MCU_RTI1                        135
 367#define AM6_DEV_MCU_ARMSS0_CPU0                 159
 368#define AM6_DEV_MCU_ARMSS0_CPU1                 245
 369
 370void release_resources_for_core_shutdown(void)
 371{
 372        struct ti_sci_handle *ti_sci = get_ti_sci_handle();
 373        struct ti_sci_dev_ops *dev_ops = &ti_sci->ops.dev_ops;
 374        struct ti_sci_proc_ops *proc_ops = &ti_sci->ops.proc_ops;
 375        int ret;
 376        u32 i;
 377
 378        const u32 put_device_ids[] = {
 379                AM6_DEV_MCU_RTI0,
 380                AM6_DEV_MCU_RTI1,
 381        };
 382
 383        /* Iterate through list of devices to put (shutdown) */
 384        for (i = 0; i < ARRAY_SIZE(put_device_ids); i++) {
 385                u32 id = put_device_ids[i];
 386
 387                ret = dev_ops->put_device(ti_sci, id);
 388                if (ret)
 389                        panic("Failed to put device %u (%d)\n", id, ret);
 390        }
 391
 392        const u32 put_core_ids[] = {
 393                AM6_DEV_MCU_ARMSS0_CPU1,
 394                AM6_DEV_MCU_ARMSS0_CPU0,        /* Handle CPU0 after CPU1 */
 395        };
 396
 397        /* Iterate through list of cores to put (shutdown) */
 398        for (i = 0; i < ARRAY_SIZE(put_core_ids); i++) {
 399                u32 id = put_core_ids[i];
 400
 401                /*
 402                 * Queue up the core shutdown request. Note that this call
 403                 * needs to be followed up by an actual invocation of an WFE
 404                 * or WFI CPU instruction.
 405                 */
 406                ret = proc_ops->proc_shutdown_no_wait(ti_sci, id);
 407                if (ret)
 408                        panic("Failed sending core %u shutdown message (%d)\n",
 409                              id, ret);
 410        }
 411}
 412#endif
 413