17b3bd9a7SJ. German Rivera /* 27b3bd9a7SJ. German Rivera * Copyright (C) 2014 Freescale Semiconductor 37b3bd9a7SJ. German Rivera * 47b3bd9a7SJ. German Rivera * SPDX-License-Identifier: GPL-2.0+ 57b3bd9a7SJ. German Rivera */ 621c69870SStuart Yoder #include <common.h> 77b3bd9a7SJ. German Rivera #include <errno.h> 884b8bf6dSMasahiro Yamada #include <linux/bug.h> 97b3bd9a7SJ. German Rivera #include <asm/io.h> 1021c69870SStuart Yoder #include <libfdt.h> 1121c69870SStuart Yoder #include <fdt_support.h> 127b3bd9a7SJ. German Rivera #include <fsl-mc/fsl_mc.h> 137b3bd9a7SJ. German Rivera #include <fsl-mc/fsl_mc_sys.h> 14a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_private.h> 157b3bd9a7SJ. German Rivera #include <fsl-mc/fsl_dpmng.h> 16a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_dprc.h> 17a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_dpio.h> 18fb4a87a7SPrabhakar Kushwaha #include <fsl-mc/fsl_dpni.h> 19a2a55e51SPrabhakar Kushwaha #include <fsl-mc/fsl_qbman_portal.h> 20fb4a87a7SPrabhakar Kushwaha #include <fsl-mc/ldpaa_wriop.h> 217b3bd9a7SJ. German Rivera 22125e2bc1SJ. German Rivera #define MC_RAM_BASE_ADDR_ALIGNMENT (512UL * 1024 * 1024) 23125e2bc1SJ. German Rivera #define MC_RAM_BASE_ADDR_ALIGNMENT_MASK (~(MC_RAM_BASE_ADDR_ALIGNMENT - 1)) 24125e2bc1SJ. German Rivera #define MC_RAM_SIZE_ALIGNMENT (256UL * 1024 * 1024) 25125e2bc1SJ. German Rivera 26125e2bc1SJ. German Rivera #define MC_MEM_SIZE_ENV_VAR "mcmemsize" 27125e2bc1SJ. German Rivera #define MC_BOOT_TIMEOUT_ENV_VAR "mcboottimeout" 28125e2bc1SJ. German Rivera 297b3bd9a7SJ. German Rivera DECLARE_GLOBAL_DATA_PTR; 30fb4a87a7SPrabhakar Kushwaha static int mc_boot_status = -1; 31fb4a87a7SPrabhakar Kushwaha static int mc_dpl_applied = -1; 32fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 33fb4a87a7SPrabhakar Kushwaha static int mc_aiop_applied = -1; 34fb4a87a7SPrabhakar Kushwaha #endif 351730a17dSPrabhakar Kushwaha struct fsl_mc_io *root_mc_io = NULL; 361730a17dSPrabhakar Kushwaha struct fsl_mc_io *dflt_mc_io = NULL; /* child container */ 371730a17dSPrabhakar Kushwaha uint16_t root_dprc_handle = 0; 38a2a55e51SPrabhakar Kushwaha uint16_t dflt_dprc_handle = 0; 391730a17dSPrabhakar Kushwaha int child_dprc_id; 40a2a55e51SPrabhakar Kushwaha struct fsl_dpbp_obj *dflt_dpbp = NULL; 41a2a55e51SPrabhakar Kushwaha struct fsl_dpio_obj *dflt_dpio = NULL; 421730a17dSPrabhakar Kushwaha struct fsl_dpni_obj *dflt_dpni = NULL; 43*b7b8410aSAlexander Graf static u64 mc_lazy_dpl_addr; 447b3bd9a7SJ. German Rivera 45125e2bc1SJ. German Rivera #ifdef DEBUG 46125e2bc1SJ. German Rivera void dump_ram_words(const char *title, void *addr) 47125e2bc1SJ. German Rivera { 48125e2bc1SJ. German Rivera int i; 49125e2bc1SJ. German Rivera uint32_t *words = addr; 50125e2bc1SJ. German Rivera 51125e2bc1SJ. German Rivera printf("Dumping beginning of %s (%p):\n", title, addr); 52125e2bc1SJ. German Rivera for (i = 0; i < 16; i++) 53125e2bc1SJ. German Rivera printf("%#x ", words[i]); 54125e2bc1SJ. German Rivera 55125e2bc1SJ. German Rivera printf("\n"); 56125e2bc1SJ. German Rivera } 57125e2bc1SJ. German Rivera 58125e2bc1SJ. German Rivera void dump_mc_ccsr_regs(struct mc_ccsr_registers __iomem *mc_ccsr_regs) 59125e2bc1SJ. German Rivera { 60125e2bc1SJ. German Rivera printf("MC CCSR registers:\n" 61125e2bc1SJ. German Rivera "reg_gcr1 %#x\n" 62125e2bc1SJ. German Rivera "reg_gsr %#x\n" 63125e2bc1SJ. German Rivera "reg_sicbalr %#x\n" 64125e2bc1SJ. German Rivera "reg_sicbahr %#x\n" 65125e2bc1SJ. German Rivera "reg_sicapr %#x\n" 66125e2bc1SJ. German Rivera "reg_mcfbalr %#x\n" 67125e2bc1SJ. German Rivera "reg_mcfbahr %#x\n" 68125e2bc1SJ. German Rivera "reg_mcfapr %#x\n" 69125e2bc1SJ. German Rivera "reg_psr %#x\n", 70125e2bc1SJ. German Rivera mc_ccsr_regs->reg_gcr1, 71125e2bc1SJ. German Rivera mc_ccsr_regs->reg_gsr, 72125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicbalr, 73125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicbahr, 74125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicapr, 75125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfbalr, 76125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfbahr, 77125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfapr, 78125e2bc1SJ. German Rivera mc_ccsr_regs->reg_psr); 79125e2bc1SJ. German Rivera } 80125e2bc1SJ. German Rivera #else 81125e2bc1SJ. German Rivera 82125e2bc1SJ. German Rivera #define dump_ram_words(title, addr) 83125e2bc1SJ. German Rivera #define dump_mc_ccsr_regs(mc_ccsr_regs) 84125e2bc1SJ. German Rivera 85125e2bc1SJ. German Rivera #endif /* DEBUG */ 86125e2bc1SJ. German Rivera 87125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_FW_IN_DDR 887b3bd9a7SJ. German Rivera /** 897b3bd9a7SJ. German Rivera * Copying MC firmware or DPL image to DDR 907b3bd9a7SJ. German Rivera */ 917b3bd9a7SJ. German Rivera static int mc_copy_image(const char *title, 927b3bd9a7SJ. German Rivera u64 image_addr, u32 image_size, u64 mc_ram_addr) 937b3bd9a7SJ. German Rivera { 947b3bd9a7SJ. German Rivera debug("%s copied to address %p\n", title, (void *)mc_ram_addr); 957b3bd9a7SJ. German Rivera memcpy((void *)mc_ram_addr, (void *)image_addr, image_size); 96125e2bc1SJ. German Rivera flush_dcache_range(mc_ram_addr, mc_ram_addr + image_size); 977b3bd9a7SJ. German Rivera return 0; 987b3bd9a7SJ. German Rivera } 997b3bd9a7SJ. German Rivera 1007b3bd9a7SJ. German Rivera /** 1017b3bd9a7SJ. German Rivera * MC firmware FIT image parser checks if the image is in FIT 1027b3bd9a7SJ. German Rivera * format, verifies integrity of the image and calculates 1037b3bd9a7SJ. German Rivera * raw image address and size values. 1047b3bd9a7SJ. German Rivera * Returns 0 on success and a negative errno on error. 1057b3bd9a7SJ. German Rivera * task fail. 1067b3bd9a7SJ. German Rivera **/ 107fb4a87a7SPrabhakar Kushwaha int parse_mc_firmware_fit_image(u64 mc_fw_addr, 108fb4a87a7SPrabhakar Kushwaha const void **raw_image_addr, 1097b3bd9a7SJ. German Rivera size_t *raw_image_size) 1107b3bd9a7SJ. German Rivera { 1117b3bd9a7SJ. German Rivera int format; 1127b3bd9a7SJ. German Rivera void *fit_hdr; 1137b3bd9a7SJ. German Rivera int node_offset; 1147b3bd9a7SJ. German Rivera const void *data; 1157b3bd9a7SJ. German Rivera size_t size; 1167b3bd9a7SJ. German Rivera const char *uname = "firmware"; 1177b3bd9a7SJ. German Rivera 118fb4a87a7SPrabhakar Kushwaha fit_hdr = (void *)mc_fw_addr; 1197b3bd9a7SJ. German Rivera 1207b3bd9a7SJ. German Rivera /* Check if Image is in FIT format */ 1217b3bd9a7SJ. German Rivera format = genimg_get_format(fit_hdr); 1227b3bd9a7SJ. German Rivera 1237b3bd9a7SJ. German Rivera if (format != IMAGE_FORMAT_FIT) { 124fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (not a FIT image)\n"); 1257b3bd9a7SJ. German Rivera return -EINVAL; 1267b3bd9a7SJ. German Rivera } 1277b3bd9a7SJ. German Rivera 1287b3bd9a7SJ. German Rivera if (!fit_check_format(fit_hdr)) { 129fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (bad FIT header)\n"); 1307b3bd9a7SJ. German Rivera return -EINVAL; 1317b3bd9a7SJ. German Rivera } 1327b3bd9a7SJ. German Rivera 1337b3bd9a7SJ. German Rivera node_offset = fit_image_get_node(fit_hdr, uname); 1347b3bd9a7SJ. German Rivera 1357b3bd9a7SJ. German Rivera if (node_offset < 0) { 136fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (missing subimage)\n"); 1377b3bd9a7SJ. German Rivera return -ENOENT; 1387b3bd9a7SJ. German Rivera } 1397b3bd9a7SJ. German Rivera 1407b3bd9a7SJ. German Rivera /* Verify MC firmware image */ 1417b3bd9a7SJ. German Rivera if (!(fit_image_verify(fit_hdr, node_offset))) { 142fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (bad CRC)\n"); 1437b3bd9a7SJ. German Rivera return -EINVAL; 1447b3bd9a7SJ. German Rivera } 1457b3bd9a7SJ. German Rivera 1467b3bd9a7SJ. German Rivera /* Get address and size of raw image */ 1477b3bd9a7SJ. German Rivera fit_image_get_data(fit_hdr, node_offset, &data, &size); 1487b3bd9a7SJ. German Rivera 1497b3bd9a7SJ. German Rivera *raw_image_addr = data; 1507b3bd9a7SJ. German Rivera *raw_image_size = size; 1517b3bd9a7SJ. German Rivera 1527b3bd9a7SJ. German Rivera return 0; 1537b3bd9a7SJ. German Rivera } 154125e2bc1SJ. German Rivera #endif 155125e2bc1SJ. German Rivera 156125e2bc1SJ. German Rivera /* 157125e2bc1SJ. German Rivera * Calculates the values to be used to specify the address range 158125e2bc1SJ. German Rivera * for the MC private DRAM block, in the MCFBALR/MCFBAHR registers. 159125e2bc1SJ. German Rivera * It returns the highest 512MB-aligned address within the given 160125e2bc1SJ. German Rivera * address range, in '*aligned_base_addr', and the number of 256 MiB 161125e2bc1SJ. German Rivera * blocks in it, in 'num_256mb_blocks'. 162125e2bc1SJ. German Rivera */ 163125e2bc1SJ. German Rivera static int calculate_mc_private_ram_params(u64 mc_private_ram_start_addr, 164125e2bc1SJ. German Rivera size_t mc_ram_size, 165125e2bc1SJ. German Rivera u64 *aligned_base_addr, 166125e2bc1SJ. German Rivera u8 *num_256mb_blocks) 167125e2bc1SJ. German Rivera { 168125e2bc1SJ. German Rivera u64 addr; 169125e2bc1SJ. German Rivera u16 num_blocks; 170125e2bc1SJ. German Rivera 171125e2bc1SJ. German Rivera if (mc_ram_size % MC_RAM_SIZE_ALIGNMENT != 0) { 172125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n", 173125e2bc1SJ. German Rivera mc_ram_size); 174125e2bc1SJ. German Rivera return -EINVAL; 175125e2bc1SJ. German Rivera } 176125e2bc1SJ. German Rivera 177125e2bc1SJ. German Rivera num_blocks = mc_ram_size / MC_RAM_SIZE_ALIGNMENT; 178125e2bc1SJ. German Rivera if (num_blocks < 1 || num_blocks > 0xff) { 179125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n", 180125e2bc1SJ. German Rivera mc_ram_size); 181125e2bc1SJ. German Rivera return -EINVAL; 182125e2bc1SJ. German Rivera } 183125e2bc1SJ. German Rivera 184125e2bc1SJ. German Rivera addr = (mc_private_ram_start_addr + mc_ram_size - 1) & 185125e2bc1SJ. German Rivera MC_RAM_BASE_ADDR_ALIGNMENT_MASK; 186125e2bc1SJ. German Rivera 187125e2bc1SJ. German Rivera if (addr < mc_private_ram_start_addr) { 188125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: bad start address %#llx\n", 189125e2bc1SJ. German Rivera mc_private_ram_start_addr); 190125e2bc1SJ. German Rivera return -EFAULT; 191125e2bc1SJ. German Rivera } 192125e2bc1SJ. German Rivera 193125e2bc1SJ. German Rivera *aligned_base_addr = addr; 194125e2bc1SJ. German Rivera *num_256mb_blocks = num_blocks; 195125e2bc1SJ. German Rivera return 0; 196125e2bc1SJ. German Rivera } 197125e2bc1SJ. German Rivera 19821c69870SStuart Yoder static int mc_fixup_dpc(u64 dpc_addr) 19921c69870SStuart Yoder { 20021c69870SStuart Yoder void *blob = (void *)dpc_addr; 20121c69870SStuart Yoder int nodeoffset; 20221c69870SStuart Yoder 20321c69870SStuart Yoder /* delete any existing ICID pools */ 20421c69870SStuart Yoder nodeoffset = fdt_path_offset(blob, "/resources/icid_pools"); 20521c69870SStuart Yoder if (fdt_del_node(blob, nodeoffset) < 0) 20621c69870SStuart Yoder printf("\nfsl-mc: WARNING: could not delete ICID pool\n"); 20721c69870SStuart Yoder 20821c69870SStuart Yoder /* add a new pool */ 20921c69870SStuart Yoder nodeoffset = fdt_path_offset(blob, "/resources"); 21021c69870SStuart Yoder if (nodeoffset < 0) { 21121c69870SStuart Yoder printf("\nfsl-mc: ERROR: DPC is missing /resources\n"); 21221c69870SStuart Yoder return -EINVAL; 21321c69870SStuart Yoder } 21421c69870SStuart Yoder nodeoffset = fdt_add_subnode(blob, nodeoffset, "icid_pools"); 21521c69870SStuart Yoder nodeoffset = fdt_add_subnode(blob, nodeoffset, "icid_pool@0"); 21621c69870SStuart Yoder do_fixup_by_path_u32(blob, "/resources/icid_pools/icid_pool@0", 21721c69870SStuart Yoder "base_icid", FSL_DPAA2_STREAM_ID_START, 1); 21821c69870SStuart Yoder do_fixup_by_path_u32(blob, "/resources/icid_pools/icid_pool@0", 21921c69870SStuart Yoder "num", 22021c69870SStuart Yoder FSL_DPAA2_STREAM_ID_END - 22121c69870SStuart Yoder FSL_DPAA2_STREAM_ID_START + 1, 1); 22221c69870SStuart Yoder 22321c69870SStuart Yoder flush_dcache_range(dpc_addr, dpc_addr + fdt_totalsize(blob)); 22421c69870SStuart Yoder 22521c69870SStuart Yoder return 0; 22621c69870SStuart Yoder } 22721c69870SStuart Yoder 228fb4a87a7SPrabhakar Kushwaha static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpc_addr) 229125e2bc1SJ. German Rivera { 230125e2bc1SJ. German Rivera u64 mc_dpc_offset; 231125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR 232125e2bc1SJ. German Rivera int error; 233125e2bc1SJ. German Rivera void *dpc_fdt_hdr; 234125e2bc1SJ. German Rivera int dpc_size; 235125e2bc1SJ. German Rivera #endif 236125e2bc1SJ. German Rivera 237125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET 238125e2bc1SJ. German Rivera BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET & 0x3) != 0 || 239125e2bc1SJ. German Rivera CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET > 0xffffffff); 240125e2bc1SJ. German Rivera 241125e2bc1SJ. German Rivera mc_dpc_offset = CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET; 242125e2bc1SJ. German Rivera #else 243125e2bc1SJ. German Rivera #error "CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET not defined" 244125e2bc1SJ. German Rivera #endif 245125e2bc1SJ. German Rivera 246125e2bc1SJ. German Rivera /* 247125e2bc1SJ. German Rivera * Load the MC DPC blob in the MC private DRAM block: 248125e2bc1SJ. German Rivera */ 249125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR 250125e2bc1SJ. German Rivera printf("MC DPC is preloaded to %#llx\n", mc_ram_addr + mc_dpc_offset); 251125e2bc1SJ. German Rivera #else 252125e2bc1SJ. German Rivera /* 253125e2bc1SJ. German Rivera * Get address and size of the DPC blob stored in flash: 254125e2bc1SJ. German Rivera */ 255fb4a87a7SPrabhakar Kushwaha dpc_fdt_hdr = (void *)mc_dpc_addr; 256125e2bc1SJ. German Rivera 257125e2bc1SJ. German Rivera error = fdt_check_header(dpc_fdt_hdr); 258125e2bc1SJ. German Rivera if (error != 0) { 259125e2bc1SJ. German Rivera /* 260125e2bc1SJ. German Rivera * Don't return with error here, since the MC firmware can 261125e2bc1SJ. German Rivera * still boot without a DPC 262125e2bc1SJ. German Rivera */ 263cc088c3aSJ. German Rivera printf("\nfsl-mc: WARNING: No DPC image found"); 264125e2bc1SJ. German Rivera return 0; 265125e2bc1SJ. German Rivera } 266125e2bc1SJ. German Rivera 267125e2bc1SJ. German Rivera dpc_size = fdt_totalsize(dpc_fdt_hdr); 268125e2bc1SJ. German Rivera if (dpc_size > CONFIG_SYS_LS_MC_DPC_MAX_LENGTH) { 269cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPC image (too large: %d)\n", 270125e2bc1SJ. German Rivera dpc_size); 271125e2bc1SJ. German Rivera return -EINVAL; 272125e2bc1SJ. German Rivera } 273125e2bc1SJ. German Rivera 274125e2bc1SJ. German Rivera mc_copy_image("MC DPC blob", 275125e2bc1SJ. German Rivera (u64)dpc_fdt_hdr, dpc_size, mc_ram_addr + mc_dpc_offset); 276125e2bc1SJ. German Rivera #endif /* not defined CONFIG_SYS_LS_MC_DPC_IN_DDR */ 277125e2bc1SJ. German Rivera 27821c69870SStuart Yoder if (mc_fixup_dpc(mc_ram_addr + mc_dpc_offset)) 27921c69870SStuart Yoder return -EINVAL; 28021c69870SStuart Yoder 281125e2bc1SJ. German Rivera dump_ram_words("DPC", (void *)(mc_ram_addr + mc_dpc_offset)); 282125e2bc1SJ. German Rivera return 0; 283125e2bc1SJ. German Rivera } 284125e2bc1SJ. German Rivera 285fb4a87a7SPrabhakar Kushwaha static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpl_addr) 286125e2bc1SJ. German Rivera { 287125e2bc1SJ. German Rivera u64 mc_dpl_offset; 288125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_DPL_IN_DDR 289125e2bc1SJ. German Rivera int error; 290125e2bc1SJ. German Rivera void *dpl_fdt_hdr; 291125e2bc1SJ. German Rivera int dpl_size; 292125e2bc1SJ. German Rivera #endif 293125e2bc1SJ. German Rivera 294125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET 295125e2bc1SJ. German Rivera BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET & 0x3) != 0 || 296125e2bc1SJ. German Rivera CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET > 0xffffffff); 297125e2bc1SJ. German Rivera 298125e2bc1SJ. German Rivera mc_dpl_offset = CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET; 299125e2bc1SJ. German Rivera #else 300125e2bc1SJ. German Rivera #error "CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET not defined" 301125e2bc1SJ. German Rivera #endif 302125e2bc1SJ. German Rivera 303125e2bc1SJ. German Rivera /* 304125e2bc1SJ. German Rivera * Load the MC DPL blob in the MC private DRAM block: 305125e2bc1SJ. German Rivera */ 306125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DPL_IN_DDR 307125e2bc1SJ. German Rivera printf("MC DPL is preloaded to %#llx\n", mc_ram_addr + mc_dpl_offset); 308125e2bc1SJ. German Rivera #else 309125e2bc1SJ. German Rivera /* 310125e2bc1SJ. German Rivera * Get address and size of the DPL blob stored in flash: 311125e2bc1SJ. German Rivera */ 312fb4a87a7SPrabhakar Kushwaha dpl_fdt_hdr = (void *)mc_dpl_addr; 313125e2bc1SJ. German Rivera 314125e2bc1SJ. German Rivera error = fdt_check_header(dpl_fdt_hdr); 315125e2bc1SJ. German Rivera if (error != 0) { 316cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPL image (bad header)\n"); 317125e2bc1SJ. German Rivera return error; 318125e2bc1SJ. German Rivera } 319125e2bc1SJ. German Rivera 320125e2bc1SJ. German Rivera dpl_size = fdt_totalsize(dpl_fdt_hdr); 321125e2bc1SJ. German Rivera if (dpl_size > CONFIG_SYS_LS_MC_DPL_MAX_LENGTH) { 322cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPL image (too large: %d)\n", 323125e2bc1SJ. German Rivera dpl_size); 324125e2bc1SJ. German Rivera return -EINVAL; 325125e2bc1SJ. German Rivera } 326125e2bc1SJ. German Rivera 327125e2bc1SJ. German Rivera mc_copy_image("MC DPL blob", 328125e2bc1SJ. German Rivera (u64)dpl_fdt_hdr, dpl_size, mc_ram_addr + mc_dpl_offset); 329125e2bc1SJ. German Rivera #endif /* not defined CONFIG_SYS_LS_MC_DPL_IN_DDR */ 330125e2bc1SJ. German Rivera 331125e2bc1SJ. German Rivera dump_ram_words("DPL", (void *)(mc_ram_addr + mc_dpl_offset)); 332125e2bc1SJ. German Rivera return 0; 333125e2bc1SJ. German Rivera } 334125e2bc1SJ. German Rivera 335125e2bc1SJ. German Rivera /** 336125e2bc1SJ. German Rivera * Return the MC boot timeout value in milliseconds 337125e2bc1SJ. German Rivera */ 338125e2bc1SJ. German Rivera static unsigned long get_mc_boot_timeout_ms(void) 339125e2bc1SJ. German Rivera { 340125e2bc1SJ. German Rivera unsigned long timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS; 341125e2bc1SJ. German Rivera 342125e2bc1SJ. German Rivera char *timeout_ms_env_var = getenv(MC_BOOT_TIMEOUT_ENV_VAR); 343125e2bc1SJ. German Rivera 344125e2bc1SJ. German Rivera if (timeout_ms_env_var) { 345125e2bc1SJ. German Rivera timeout_ms = simple_strtoul(timeout_ms_env_var, NULL, 10); 346125e2bc1SJ. German Rivera if (timeout_ms == 0) { 347125e2bc1SJ. German Rivera printf("fsl-mc: WARNING: Invalid value for \'" 348125e2bc1SJ. German Rivera MC_BOOT_TIMEOUT_ENV_VAR 349125e2bc1SJ. German Rivera "\' environment variable: %lu\n", 350125e2bc1SJ. German Rivera timeout_ms); 351125e2bc1SJ. German Rivera 352125e2bc1SJ. German Rivera timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS; 353125e2bc1SJ. German Rivera } 354125e2bc1SJ. German Rivera } 355125e2bc1SJ. German Rivera 356125e2bc1SJ. German Rivera return timeout_ms; 357125e2bc1SJ. German Rivera } 358125e2bc1SJ. German Rivera 359fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 3603c1d218aSYork Sun 3613c1d218aSYork Sun __weak bool soc_has_aiop(void) 3623c1d218aSYork Sun { 3633c1d218aSYork Sun return false; 3643c1d218aSYork Sun } 3653c1d218aSYork Sun 366fb4a87a7SPrabhakar Kushwaha static int load_mc_aiop_img(u64 aiop_fw_addr) 367c1000c12SJ. German Rivera { 368fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 369fb4a87a7SPrabhakar Kushwaha #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR 370c1000c12SJ. German Rivera void *aiop_img; 371fb4a87a7SPrabhakar Kushwaha #endif 372c1000c12SJ. German Rivera 3733c1d218aSYork Sun /* Check if AIOP is available */ 3743c1d218aSYork Sun if (!soc_has_aiop()) 3753c1d218aSYork Sun return -ENODEV; 376c1000c12SJ. German Rivera /* 377c1000c12SJ. German Rivera * Load the MC AIOP image in the MC private DRAM block: 378c1000c12SJ. German Rivera */ 379c1000c12SJ. German Rivera 380fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR 381fb4a87a7SPrabhakar Kushwaha printf("MC AIOP is preloaded to %#llx\n", mc_ram_addr + 382fb4a87a7SPrabhakar Kushwaha CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); 383fb4a87a7SPrabhakar Kushwaha #else 384fb4a87a7SPrabhakar Kushwaha aiop_img = (void *)aiop_fw_addr; 385c1000c12SJ. German Rivera mc_copy_image("MC AIOP image", 386c1000c12SJ. German Rivera (u64)aiop_img, CONFIG_SYS_LS_MC_AIOP_IMG_MAX_LENGTH, 387c1000c12SJ. German Rivera mc_ram_addr + CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); 388fb4a87a7SPrabhakar Kushwaha #endif 389fb4a87a7SPrabhakar Kushwaha mc_aiop_applied = 0; 390c1000c12SJ. German Rivera 391c1000c12SJ. German Rivera return 0; 392c1000c12SJ. German Rivera } 393c1000c12SJ. German Rivera #endif 394fb4a87a7SPrabhakar Kushwaha 395125e2bc1SJ. German Rivera static int wait_for_mc(bool booting_mc, u32 *final_reg_gsr) 396125e2bc1SJ. German Rivera { 397125e2bc1SJ. German Rivera u32 reg_gsr; 398125e2bc1SJ. German Rivera u32 mc_fw_boot_status; 399125e2bc1SJ. German Rivera unsigned long timeout_ms = get_mc_boot_timeout_ms(); 400125e2bc1SJ. German Rivera struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 401125e2bc1SJ. German Rivera 402125e2bc1SJ. German Rivera dmb(); 403125e2bc1SJ. German Rivera assert(timeout_ms > 0); 404125e2bc1SJ. German Rivera for (;;) { 405125e2bc1SJ. German Rivera udelay(1000); /* throttle polling */ 406125e2bc1SJ. German Rivera reg_gsr = in_le32(&mc_ccsr_regs->reg_gsr); 407125e2bc1SJ. German Rivera mc_fw_boot_status = (reg_gsr & GSR_FS_MASK); 408125e2bc1SJ. German Rivera if (mc_fw_boot_status & 0x1) 409125e2bc1SJ. German Rivera break; 410125e2bc1SJ. German Rivera 411125e2bc1SJ. German Rivera timeout_ms--; 412125e2bc1SJ. German Rivera if (timeout_ms == 0) 413125e2bc1SJ. German Rivera break; 414125e2bc1SJ. German Rivera } 415125e2bc1SJ. German Rivera 416125e2bc1SJ. German Rivera if (timeout_ms == 0) { 417cc088c3aSJ. German Rivera printf("ERROR: timeout\n"); 418125e2bc1SJ. German Rivera 419125e2bc1SJ. German Rivera /* TODO: Get an error status from an MC CCSR register */ 420125e2bc1SJ. German Rivera return -ETIMEDOUT; 421125e2bc1SJ. German Rivera } 422125e2bc1SJ. German Rivera 423125e2bc1SJ. German Rivera if (mc_fw_boot_status != 0x1) { 424125e2bc1SJ. German Rivera /* 425125e2bc1SJ. German Rivera * TODO: Identify critical errors from the GSR register's FS 426125e2bc1SJ. German Rivera * field and for those errors, set error to -ENODEV or other 427125e2bc1SJ. German Rivera * appropriate errno, so that the status property is set to 428125e2bc1SJ. German Rivera * failure in the fsl,dprc device tree node. 429125e2bc1SJ. German Rivera */ 430cc088c3aSJ. German Rivera printf("WARNING: Firmware returned an error (GSR: %#x)\n", 431125e2bc1SJ. German Rivera reg_gsr); 432125e2bc1SJ. German Rivera } else { 433cc088c3aSJ. German Rivera printf("SUCCESS\n"); 434125e2bc1SJ. German Rivera } 435cc088c3aSJ. German Rivera 436125e2bc1SJ. German Rivera 437125e2bc1SJ. German Rivera *final_reg_gsr = reg_gsr; 438125e2bc1SJ. German Rivera return 0; 439125e2bc1SJ. German Rivera } 4407b3bd9a7SJ. German Rivera 441fb4a87a7SPrabhakar Kushwaha int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr) 4427b3bd9a7SJ. German Rivera { 4437b3bd9a7SJ. German Rivera int error = 0; 444a2a55e51SPrabhakar Kushwaha int portal_id = 0; 4457b3bd9a7SJ. German Rivera struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 446fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 4477b3bd9a7SJ. German Rivera u32 reg_gsr; 448125e2bc1SJ. German Rivera u32 reg_mcfbalr; 449125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_FW_IN_DDR 4507b3bd9a7SJ. German Rivera const void *raw_image_addr; 4517b3bd9a7SJ. German Rivera size_t raw_image_size = 0; 452125e2bc1SJ. German Rivera #endif 4537b3bd9a7SJ. German Rivera struct mc_version mc_ver_info; 454125e2bc1SJ. German Rivera u64 mc_ram_aligned_base_addr; 455125e2bc1SJ. German Rivera u8 mc_ram_num_256mb_blocks; 456125e2bc1SJ. German Rivera size_t mc_ram_size = mc_get_dram_block_size(); 4577b3bd9a7SJ. German Rivera 4587b3bd9a7SJ. German Rivera 459125e2bc1SJ. German Rivera error = calculate_mc_private_ram_params(mc_ram_addr, 460125e2bc1SJ. German Rivera mc_ram_size, 461125e2bc1SJ. German Rivera &mc_ram_aligned_base_addr, 462125e2bc1SJ. German Rivera &mc_ram_num_256mb_blocks); 463125e2bc1SJ. German Rivera if (error != 0) 464125e2bc1SJ. German Rivera goto out; 465125e2bc1SJ. German Rivera 4667b3bd9a7SJ. German Rivera /* 4677b3bd9a7SJ. German Rivera * Management Complex cores should be held at reset out of POR. 468a187559eSBin Meng * U-Boot should be the first software to touch MC. To be safe, 4697b3bd9a7SJ. German Rivera * we reset all cores again by setting GCR1 to 0. It doesn't do 4707b3bd9a7SJ. German Rivera * anything if they are held at reset. After we setup the firmware 4717b3bd9a7SJ. German Rivera * we kick off MC by deasserting the reset bit for core 0, and 4727b3bd9a7SJ. German Rivera * deasserting the reset bits for Command Portal Managers. 4737b3bd9a7SJ. German Rivera * The stop bits are not touched here. They are used to stop the 4747b3bd9a7SJ. German Rivera * cores when they are active. Setting stop bits doesn't stop the 4757b3bd9a7SJ. German Rivera * cores from fetching instructions when they are released from 4767b3bd9a7SJ. German Rivera * reset. 4777b3bd9a7SJ. German Rivera */ 4787b3bd9a7SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gcr1, 0); 4797b3bd9a7SJ. German Rivera dmb(); 4807b3bd9a7SJ. German Rivera 481125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_FW_IN_DDR 482125e2bc1SJ. German Rivera printf("MC firmware is preloaded to %#llx\n", mc_ram_addr); 483125e2bc1SJ. German Rivera #else 484fb4a87a7SPrabhakar Kushwaha error = parse_mc_firmware_fit_image(mc_fw_addr, &raw_image_addr, 485fb4a87a7SPrabhakar Kushwaha &raw_image_size); 4867b3bd9a7SJ. German Rivera if (error != 0) 4877b3bd9a7SJ. German Rivera goto out; 4887b3bd9a7SJ. German Rivera /* 4897b3bd9a7SJ. German Rivera * Load the MC FW at the beginning of the MC private DRAM block: 4907b3bd9a7SJ. German Rivera */ 4917b3bd9a7SJ. German Rivera mc_copy_image("MC Firmware", 4927b3bd9a7SJ. German Rivera (u64)raw_image_addr, raw_image_size, mc_ram_addr); 4937b3bd9a7SJ. German Rivera #endif 494125e2bc1SJ. German Rivera dump_ram_words("firmware", (void *)mc_ram_addr); 4957b3bd9a7SJ. German Rivera 496fb4a87a7SPrabhakar Kushwaha error = load_mc_dpc(mc_ram_addr, mc_ram_size, mc_dpc_addr); 497125e2bc1SJ. German Rivera if (error != 0) 4987b3bd9a7SJ. German Rivera goto out; 4997b3bd9a7SJ. German Rivera 5007b3bd9a7SJ. German Rivera debug("mc_ccsr_regs %p\n", mc_ccsr_regs); 501125e2bc1SJ. German Rivera dump_mc_ccsr_regs(mc_ccsr_regs); 5027b3bd9a7SJ. German Rivera 5037b3bd9a7SJ. German Rivera /* 504125e2bc1SJ. German Rivera * Tell MC what is the address range of the DRAM block assigned to it: 5057b3bd9a7SJ. German Rivera */ 506125e2bc1SJ. German Rivera reg_mcfbalr = (u32)mc_ram_aligned_base_addr | 507125e2bc1SJ. German Rivera (mc_ram_num_256mb_blocks - 1); 508125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_mcfbalr, reg_mcfbalr); 509125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_mcfbahr, 510125e2bc1SJ. German Rivera (u32)(mc_ram_aligned_base_addr >> 32)); 51139da644eSStuart Yoder out_le32(&mc_ccsr_regs->reg_mcfapr, FSL_BYPASS_AMQ); 5127b3bd9a7SJ. German Rivera 5137b3bd9a7SJ. German Rivera /* 514125e2bc1SJ. German Rivera * Tell the MC that we want delayed DPL deployment. 5157b3bd9a7SJ. German Rivera */ 516125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gsr, 0xDD00); 5177b3bd9a7SJ. German Rivera 518cc088c3aSJ. German Rivera printf("\nfsl-mc: Booting Management Complex ... "); 5197b3bd9a7SJ. German Rivera 5207b3bd9a7SJ. German Rivera /* 5217b3bd9a7SJ. German Rivera * Deassert reset and release MC core 0 to run 5227b3bd9a7SJ. German Rivera */ 5237b3bd9a7SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gcr1, GCR1_P1_DE_RST | GCR1_M_ALL_DE_RST); 524125e2bc1SJ. German Rivera error = wait_for_mc(true, ®_gsr); 525125e2bc1SJ. German Rivera if (error != 0) 5267b3bd9a7SJ. German Rivera goto out; 5277b3bd9a7SJ. German Rivera 5287b3bd9a7SJ. German Rivera /* 5297b3bd9a7SJ. German Rivera * TODO: need to obtain the portal_id for the root container from the 5307b3bd9a7SJ. German Rivera * DPL 5317b3bd9a7SJ. German Rivera */ 5327b3bd9a7SJ. German Rivera portal_id = 0; 5337b3bd9a7SJ. German Rivera 5347b3bd9a7SJ. German Rivera /* 535a2a55e51SPrabhakar Kushwaha * Initialize the global default MC portal 536a2a55e51SPrabhakar Kushwaha * And check that the MC firmware is responding portal commands: 5377b3bd9a7SJ. German Rivera */ 5381730a17dSPrabhakar Kushwaha root_mc_io = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io)); 5391730a17dSPrabhakar Kushwaha if (!root_mc_io) { 540a2a55e51SPrabhakar Kushwaha printf(" No memory: malloc() failed\n"); 541a2a55e51SPrabhakar Kushwaha return -ENOMEM; 542a2a55e51SPrabhakar Kushwaha } 5437b3bd9a7SJ. German Rivera 5441730a17dSPrabhakar Kushwaha root_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(portal_id); 545a2a55e51SPrabhakar Kushwaha debug("Checking access to MC portal of root DPRC container (portal_id %d, portal physical addr %p)\n", 5461730a17dSPrabhakar Kushwaha portal_id, root_mc_io->mmio_regs); 547a2a55e51SPrabhakar Kushwaha 5481730a17dSPrabhakar Kushwaha error = mc_get_version(root_mc_io, MC_CMD_NO_FLAGS, &mc_ver_info); 5497b3bd9a7SJ. German Rivera if (error != 0) { 5507b3bd9a7SJ. German Rivera printf("fsl-mc: ERROR: Firmware version check failed (error: %d)\n", 5517b3bd9a7SJ. German Rivera error); 5527b3bd9a7SJ. German Rivera goto out; 5537b3bd9a7SJ. German Rivera } 5547b3bd9a7SJ. German Rivera 5557b3bd9a7SJ. German Rivera printf("fsl-mc: Management Complex booted (version: %d.%d.%d, boot status: %#x)\n", 5567b3bd9a7SJ. German Rivera mc_ver_info.major, mc_ver_info.minor, mc_ver_info.revision, 557125e2bc1SJ. German Rivera reg_gsr & GSR_FS_MASK); 558125e2bc1SJ. German Rivera 5597b3bd9a7SJ. German Rivera out: 5607b3bd9a7SJ. German Rivera if (error != 0) 5612b7c4a19SPrabhakar Kushwaha mc_boot_status = error; 5627b3bd9a7SJ. German Rivera else 5637b3bd9a7SJ. German Rivera mc_boot_status = 0; 5647b3bd9a7SJ. German Rivera 5657b3bd9a7SJ. German Rivera return error; 5667b3bd9a7SJ. German Rivera } 5677b3bd9a7SJ. German Rivera 568fb4a87a7SPrabhakar Kushwaha int mc_apply_dpl(u64 mc_dpl_addr) 569fb4a87a7SPrabhakar Kushwaha { 570fb4a87a7SPrabhakar Kushwaha struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 571fb4a87a7SPrabhakar Kushwaha int error = 0; 572fb4a87a7SPrabhakar Kushwaha u32 reg_gsr; 573fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 574fb4a87a7SPrabhakar Kushwaha size_t mc_ram_size = mc_get_dram_block_size(); 575fb4a87a7SPrabhakar Kushwaha 576*b7b8410aSAlexander Graf if (!mc_dpl_addr) 577*b7b8410aSAlexander Graf return -1; 578*b7b8410aSAlexander Graf 579fb4a87a7SPrabhakar Kushwaha error = load_mc_dpl(mc_ram_addr, mc_ram_size, mc_dpl_addr); 580fb4a87a7SPrabhakar Kushwaha if (error != 0) 581fb4a87a7SPrabhakar Kushwaha return error; 582fb4a87a7SPrabhakar Kushwaha 583fb4a87a7SPrabhakar Kushwaha /* 584fb4a87a7SPrabhakar Kushwaha * Tell the MC to deploy the DPL: 585fb4a87a7SPrabhakar Kushwaha */ 586fb4a87a7SPrabhakar Kushwaha out_le32(&mc_ccsr_regs->reg_gsr, 0x0); 587fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: Deploying data path layout ... "); 588fb4a87a7SPrabhakar Kushwaha error = wait_for_mc(false, ®_gsr); 589fb4a87a7SPrabhakar Kushwaha 590fb4a87a7SPrabhakar Kushwaha if (!error) 591fb4a87a7SPrabhakar Kushwaha mc_dpl_applied = 0; 592fb4a87a7SPrabhakar Kushwaha 593fb4a87a7SPrabhakar Kushwaha return error; 594fb4a87a7SPrabhakar Kushwaha } 595fb4a87a7SPrabhakar Kushwaha 5967b3bd9a7SJ. German Rivera int get_mc_boot_status(void) 5977b3bd9a7SJ. German Rivera { 5987b3bd9a7SJ. German Rivera return mc_boot_status; 5997b3bd9a7SJ. German Rivera } 6007b3bd9a7SJ. German Rivera 601fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 602fb4a87a7SPrabhakar Kushwaha int get_aiop_apply_status(void) 603fb4a87a7SPrabhakar Kushwaha { 604fb4a87a7SPrabhakar Kushwaha return mc_aiop_applied; 605fb4a87a7SPrabhakar Kushwaha } 606fb4a87a7SPrabhakar Kushwaha #endif 607fb4a87a7SPrabhakar Kushwaha 608fb4a87a7SPrabhakar Kushwaha int get_dpl_apply_status(void) 609fb4a87a7SPrabhakar Kushwaha { 610fb4a87a7SPrabhakar Kushwaha return mc_dpl_applied; 611fb4a87a7SPrabhakar Kushwaha } 612fb4a87a7SPrabhakar Kushwaha 613fb4a87a7SPrabhakar Kushwaha /** 614fb4a87a7SPrabhakar Kushwaha * Return the MC address of private DRAM block. 615fb4a87a7SPrabhakar Kushwaha */ 616fb4a87a7SPrabhakar Kushwaha u64 mc_get_dram_addr(void) 617fb4a87a7SPrabhakar Kushwaha { 618fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr; 619fb4a87a7SPrabhakar Kushwaha 620fb4a87a7SPrabhakar Kushwaha /* 621fb4a87a7SPrabhakar Kushwaha * The MC private DRAM block was already carved at the end of DRAM 622fb4a87a7SPrabhakar Kushwaha * by board_init_f() using CONFIG_SYS_MEM_TOP_HIDE: 623fb4a87a7SPrabhakar Kushwaha */ 624fb4a87a7SPrabhakar Kushwaha if (gd->bd->bi_dram[1].start) { 625fb4a87a7SPrabhakar Kushwaha mc_ram_addr = 626fb4a87a7SPrabhakar Kushwaha gd->bd->bi_dram[1].start + gd->bd->bi_dram[1].size; 627fb4a87a7SPrabhakar Kushwaha } else { 628fb4a87a7SPrabhakar Kushwaha mc_ram_addr = 629fb4a87a7SPrabhakar Kushwaha gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size; 630fb4a87a7SPrabhakar Kushwaha } 631fb4a87a7SPrabhakar Kushwaha 632fb4a87a7SPrabhakar Kushwaha return mc_ram_addr; 633fb4a87a7SPrabhakar Kushwaha } 634fb4a87a7SPrabhakar Kushwaha 6357b3bd9a7SJ. German Rivera /** 6367b3bd9a7SJ. German Rivera * Return the actual size of the MC private DRAM block. 6377b3bd9a7SJ. German Rivera */ 6387b3bd9a7SJ. German Rivera unsigned long mc_get_dram_block_size(void) 6397b3bd9a7SJ. German Rivera { 640125e2bc1SJ. German Rivera unsigned long dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE; 641125e2bc1SJ. German Rivera 642125e2bc1SJ. German Rivera char *dram_block_size_env_var = getenv(MC_MEM_SIZE_ENV_VAR); 643125e2bc1SJ. German Rivera 644125e2bc1SJ. German Rivera if (dram_block_size_env_var) { 645125e2bc1SJ. German Rivera dram_block_size = simple_strtoul(dram_block_size_env_var, NULL, 646125e2bc1SJ. German Rivera 10); 647125e2bc1SJ. German Rivera 648125e2bc1SJ. German Rivera if (dram_block_size < CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE) { 649125e2bc1SJ. German Rivera printf("fsl-mc: WARNING: Invalid value for \'" 650125e2bc1SJ. German Rivera MC_MEM_SIZE_ENV_VAR 651125e2bc1SJ. German Rivera "\' environment variable: %lu\n", 652125e2bc1SJ. German Rivera dram_block_size); 653125e2bc1SJ. German Rivera 654125e2bc1SJ. German Rivera dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE; 655125e2bc1SJ. German Rivera } 656125e2bc1SJ. German Rivera } 657125e2bc1SJ. German Rivera 658125e2bc1SJ. German Rivera return dram_block_size; 6597b3bd9a7SJ. German Rivera } 660a2a55e51SPrabhakar Kushwaha 6611730a17dSPrabhakar Kushwaha int fsl_mc_ldpaa_init(bd_t *bis) 6621730a17dSPrabhakar Kushwaha { 663c919ab9eSPrabhakar Kushwaha int i; 664c919ab9eSPrabhakar Kushwaha 665c919ab9eSPrabhakar Kushwaha for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) 666c919ab9eSPrabhakar Kushwaha if ((wriop_is_enabled_dpmac(i) == 1) && 667c919ab9eSPrabhakar Kushwaha (wriop_get_phy_address(i) != -1)) 668c919ab9eSPrabhakar Kushwaha ldpaa_eth_init(i, wriop_get_enet_if(i)); 6691730a17dSPrabhakar Kushwaha return 0; 6701730a17dSPrabhakar Kushwaha } 6711730a17dSPrabhakar Kushwaha 6729a696f56SPrabhakar Kushwaha static int dprc_version_check(struct fsl_mc_io *mc_io, uint16_t handle) 6739a696f56SPrabhakar Kushwaha { 6749a696f56SPrabhakar Kushwaha struct dprc_attributes attr; 6759a696f56SPrabhakar Kushwaha int error; 6769a696f56SPrabhakar Kushwaha 6779a696f56SPrabhakar Kushwaha memset(&attr, 0, sizeof(struct dprc_attributes)); 6789a696f56SPrabhakar Kushwaha error = dprc_get_attributes(mc_io, MC_CMD_NO_FLAGS, handle, &attr); 6799a696f56SPrabhakar Kushwaha if (error == 0) { 6809a696f56SPrabhakar Kushwaha if ((attr.version.major != DPRC_VER_MAJOR) || 6819a696f56SPrabhakar Kushwaha (attr.version.minor != DPRC_VER_MINOR)) { 6829a696f56SPrabhakar Kushwaha printf("DPRC version mismatch found %u.%u,", 6839a696f56SPrabhakar Kushwaha attr.version.major, 6849a696f56SPrabhakar Kushwaha attr.version.minor); 6859a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 6869a696f56SPrabhakar Kushwaha DPRC_VER_MAJOR, DPRC_VER_MINOR); 6879a696f56SPrabhakar Kushwaha } 6889a696f56SPrabhakar Kushwaha } 6899a696f56SPrabhakar Kushwaha return error; 6909a696f56SPrabhakar Kushwaha } 6919a696f56SPrabhakar Kushwaha 6921730a17dSPrabhakar Kushwaha static int dpio_init(void) 693a2a55e51SPrabhakar Kushwaha { 694a2a55e51SPrabhakar Kushwaha struct qbman_swp_desc p_des; 695a2a55e51SPrabhakar Kushwaha struct dpio_attr attr; 6961730a17dSPrabhakar Kushwaha struct dpio_cfg dpio_cfg; 697a2a55e51SPrabhakar Kushwaha int err = 0; 698a2a55e51SPrabhakar Kushwaha 699a2a55e51SPrabhakar Kushwaha dflt_dpio = (struct fsl_dpio_obj *)malloc(sizeof(struct fsl_dpio_obj)); 700a2a55e51SPrabhakar Kushwaha if (!dflt_dpio) { 701a2a55e51SPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 7021730a17dSPrabhakar Kushwaha err = -ENOMEM; 7031730a17dSPrabhakar Kushwaha goto err_malloc; 704a2a55e51SPrabhakar Kushwaha } 705a2a55e51SPrabhakar Kushwaha 7061730a17dSPrabhakar Kushwaha dpio_cfg.channel_mode = DPIO_LOCAL_CHANNEL; 7071730a17dSPrabhakar Kushwaha dpio_cfg.num_priorities = 8; 708a2a55e51SPrabhakar Kushwaha 7091730a17dSPrabhakar Kushwaha err = dpio_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpio_cfg, 7101730a17dSPrabhakar Kushwaha &dflt_dpio->dpio_handle); 7111730a17dSPrabhakar Kushwaha if (err < 0) { 7121730a17dSPrabhakar Kushwaha printf("dpio_create() failed: %d\n", err); 7131730a17dSPrabhakar Kushwaha err = -ENODEV; 7141730a17dSPrabhakar Kushwaha goto err_create; 715a2a55e51SPrabhakar Kushwaha } 716a2a55e51SPrabhakar Kushwaha 7171730a17dSPrabhakar Kushwaha memset(&attr, 0, sizeof(struct dpio_attr)); 71887457d11SPrabhakar Kushwaha err = dpio_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 7191730a17dSPrabhakar Kushwaha dflt_dpio->dpio_handle, &attr); 7201730a17dSPrabhakar Kushwaha if (err < 0) { 7211730a17dSPrabhakar Kushwaha printf("dpio_get_attributes() failed: %d\n", err); 722a2a55e51SPrabhakar Kushwaha goto err_get_attr; 723a2a55e51SPrabhakar Kushwaha } 724a2a55e51SPrabhakar Kushwaha 7259a696f56SPrabhakar Kushwaha if ((attr.version.major != DPIO_VER_MAJOR) || 7269a696f56SPrabhakar Kushwaha (attr.version.minor != DPIO_VER_MINOR)) { 7279a696f56SPrabhakar Kushwaha printf("DPIO version mismatch found %u.%u,", 7289a696f56SPrabhakar Kushwaha attr.version.major, attr.version.minor); 7299a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 7309a696f56SPrabhakar Kushwaha DPIO_VER_MAJOR, DPIO_VER_MINOR); 7319a696f56SPrabhakar Kushwaha } 7329a696f56SPrabhakar Kushwaha 7331730a17dSPrabhakar Kushwaha dflt_dpio->dpio_id = attr.id; 7341730a17dSPrabhakar Kushwaha #ifdef DEBUG 7351730a17dSPrabhakar Kushwaha printf("Init: DPIO id=0x%d\n", dflt_dpio->dpio_id); 7361730a17dSPrabhakar Kushwaha #endif 7371730a17dSPrabhakar Kushwaha err = dpio_enable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7381730a17dSPrabhakar Kushwaha if (err < 0) { 739a2a55e51SPrabhakar Kushwaha printf("dpio_enable() failed %d\n", err); 740a2a55e51SPrabhakar Kushwaha goto err_get_enable; 741a2a55e51SPrabhakar Kushwaha } 7421f1c25c7SPrabhakar Kushwaha debug("ce_offset=0x%llx, ci_offset=0x%llx, portalid=%d, prios=%d\n", 7431f1c25c7SPrabhakar Kushwaha attr.qbman_portal_ce_offset, 7441f1c25c7SPrabhakar Kushwaha attr.qbman_portal_ci_offset, 745a2a55e51SPrabhakar Kushwaha attr.qbman_portal_id, 746a2a55e51SPrabhakar Kushwaha attr.num_priorities); 747a2a55e51SPrabhakar Kushwaha 7481f1c25c7SPrabhakar Kushwaha p_des.cena_bar = (void *)(SOC_QBMAN_PORTALS_BASE_ADDR 7491f1c25c7SPrabhakar Kushwaha + attr.qbman_portal_ce_offset); 7501f1c25c7SPrabhakar Kushwaha p_des.cinh_bar = (void *)(SOC_QBMAN_PORTALS_BASE_ADDR 7511f1c25c7SPrabhakar Kushwaha + attr.qbman_portal_ci_offset); 752a2a55e51SPrabhakar Kushwaha 753a2a55e51SPrabhakar Kushwaha dflt_dpio->sw_portal = qbman_swp_init(&p_des); 754a2a55e51SPrabhakar Kushwaha if (dflt_dpio->sw_portal == NULL) { 755a2a55e51SPrabhakar Kushwaha printf("qbman_swp_init() failed\n"); 756a2a55e51SPrabhakar Kushwaha goto err_get_swp_init; 757a2a55e51SPrabhakar Kushwaha } 758a2a55e51SPrabhakar Kushwaha return 0; 759a2a55e51SPrabhakar Kushwaha 760a2a55e51SPrabhakar Kushwaha err_get_swp_init: 7611730a17dSPrabhakar Kushwaha dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 762a2a55e51SPrabhakar Kushwaha err_get_enable: 7631730a17dSPrabhakar Kushwaha err_get_attr: 7641730a17dSPrabhakar Kushwaha dpio_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7651730a17dSPrabhakar Kushwaha dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7661730a17dSPrabhakar Kushwaha err_create: 767cd7b3fbcSPrabhakar Kushwaha free(dflt_dpio); 7681730a17dSPrabhakar Kushwaha err_malloc: 769a2a55e51SPrabhakar Kushwaha return err; 770a2a55e51SPrabhakar Kushwaha } 771a2a55e51SPrabhakar Kushwaha 7721730a17dSPrabhakar Kushwaha static int dpio_exit(void) 773a2a55e51SPrabhakar Kushwaha { 7741730a17dSPrabhakar Kushwaha int err; 7751730a17dSPrabhakar Kushwaha 7761730a17dSPrabhakar Kushwaha err = dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7771730a17dSPrabhakar Kushwaha if (err < 0) { 7781730a17dSPrabhakar Kushwaha printf("dpio_disable() failed: %d\n", err); 7791730a17dSPrabhakar Kushwaha goto err; 7801730a17dSPrabhakar Kushwaha } 7811730a17dSPrabhakar Kushwaha 7821730a17dSPrabhakar Kushwaha err = dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7831730a17dSPrabhakar Kushwaha if (err < 0) { 7841730a17dSPrabhakar Kushwaha printf("dpio_destroy() failed: %d\n", err); 7851730a17dSPrabhakar Kushwaha goto err; 7861730a17dSPrabhakar Kushwaha } 7871730a17dSPrabhakar Kushwaha 7881730a17dSPrabhakar Kushwaha #ifdef DEBUG 7891730a17dSPrabhakar Kushwaha printf("Exit: DPIO id=0x%d\n", dflt_dpio->dpio_id); 7901730a17dSPrabhakar Kushwaha #endif 7911730a17dSPrabhakar Kushwaha 7921730a17dSPrabhakar Kushwaha if (dflt_dpio) 7931730a17dSPrabhakar Kushwaha free(dflt_dpio); 7941730a17dSPrabhakar Kushwaha 7951730a17dSPrabhakar Kushwaha return 0; 7961730a17dSPrabhakar Kushwaha err: 7971730a17dSPrabhakar Kushwaha return err; 7981730a17dSPrabhakar Kushwaha } 7991730a17dSPrabhakar Kushwaha 8001730a17dSPrabhakar Kushwaha static int dprc_init(void) 8011730a17dSPrabhakar Kushwaha { 8021730a17dSPrabhakar Kushwaha int err, child_portal_id, container_id; 8031730a17dSPrabhakar Kushwaha struct dprc_cfg cfg; 8041730a17dSPrabhakar Kushwaha uint64_t mc_portal_offset; 8051730a17dSPrabhakar Kushwaha 8061730a17dSPrabhakar Kushwaha /* Open root container */ 8071730a17dSPrabhakar Kushwaha err = dprc_get_container_id(root_mc_io, MC_CMD_NO_FLAGS, &container_id); 8081730a17dSPrabhakar Kushwaha if (err < 0) { 8091730a17dSPrabhakar Kushwaha printf("dprc_get_container_id(): Root failed: %d\n", err); 8101730a17dSPrabhakar Kushwaha goto err_root_container_id; 8111730a17dSPrabhakar Kushwaha } 8121730a17dSPrabhakar Kushwaha 8131730a17dSPrabhakar Kushwaha #ifdef DEBUG 8141730a17dSPrabhakar Kushwaha printf("Root container id = %d\n", container_id); 8151730a17dSPrabhakar Kushwaha #endif 8161730a17dSPrabhakar Kushwaha err = dprc_open(root_mc_io, MC_CMD_NO_FLAGS, container_id, 8171730a17dSPrabhakar Kushwaha &root_dprc_handle); 8181730a17dSPrabhakar Kushwaha if (err < 0) { 8191730a17dSPrabhakar Kushwaha printf("dprc_open(): Root Container failed: %d\n", err); 8201730a17dSPrabhakar Kushwaha goto err_root_open; 8211730a17dSPrabhakar Kushwaha } 8221730a17dSPrabhakar Kushwaha 8231730a17dSPrabhakar Kushwaha if (!root_dprc_handle) { 8241730a17dSPrabhakar Kushwaha printf("dprc_open(): Root Container Handle is not valid\n"); 8251730a17dSPrabhakar Kushwaha goto err_root_open; 8261730a17dSPrabhakar Kushwaha } 8271730a17dSPrabhakar Kushwaha 8289a696f56SPrabhakar Kushwaha err = dprc_version_check(root_mc_io, root_dprc_handle); 8299a696f56SPrabhakar Kushwaha if (err < 0) { 8309a696f56SPrabhakar Kushwaha printf("dprc_version_check() failed: %d\n", err); 8319a696f56SPrabhakar Kushwaha goto err_root_open; 8329a696f56SPrabhakar Kushwaha } 8339a696f56SPrabhakar Kushwaha 8345373b204SPrabhakar Kushwaha memset(&cfg, 0, sizeof(struct dprc_cfg)); 8351730a17dSPrabhakar Kushwaha cfg.options = DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED | 8361730a17dSPrabhakar Kushwaha DPRC_CFG_OPT_OBJ_CREATE_ALLOWED | 8371730a17dSPrabhakar Kushwaha DPRC_CFG_OPT_ALLOC_ALLOWED; 8381730a17dSPrabhakar Kushwaha cfg.icid = DPRC_GET_ICID_FROM_POOL; 839335b1936SPrabhakar Kushwaha cfg.portal_id = DPRC_GET_PORTAL_ID_FROM_POOL; 8401730a17dSPrabhakar Kushwaha err = dprc_create_container(root_mc_io, MC_CMD_NO_FLAGS, 8411730a17dSPrabhakar Kushwaha root_dprc_handle, 8421730a17dSPrabhakar Kushwaha &cfg, 8431730a17dSPrabhakar Kushwaha &child_dprc_id, 8441730a17dSPrabhakar Kushwaha &mc_portal_offset); 8451730a17dSPrabhakar Kushwaha if (err < 0) { 8461730a17dSPrabhakar Kushwaha printf("dprc_create_container() failed: %d\n", err); 8471730a17dSPrabhakar Kushwaha goto err_create; 8481730a17dSPrabhakar Kushwaha } 8491730a17dSPrabhakar Kushwaha 8501730a17dSPrabhakar Kushwaha dflt_mc_io = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io)); 8511730a17dSPrabhakar Kushwaha if (!dflt_mc_io) { 8521730a17dSPrabhakar Kushwaha err = -ENOMEM; 8531730a17dSPrabhakar Kushwaha printf(" No memory: malloc() failed\n"); 8541730a17dSPrabhakar Kushwaha goto err_malloc; 8551730a17dSPrabhakar Kushwaha } 8561730a17dSPrabhakar Kushwaha 8571730a17dSPrabhakar Kushwaha child_portal_id = MC_PORTAL_OFFSET_TO_PORTAL_ID(mc_portal_offset); 8581730a17dSPrabhakar Kushwaha dflt_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(child_portal_id); 8591730a17dSPrabhakar Kushwaha #ifdef DEBUG 8601730a17dSPrabhakar Kushwaha printf("MC portal of child DPRC container: %d, physical addr %p)\n", 8611730a17dSPrabhakar Kushwaha child_dprc_id, dflt_mc_io->mmio_regs); 8621730a17dSPrabhakar Kushwaha #endif 8631730a17dSPrabhakar Kushwaha 8641730a17dSPrabhakar Kushwaha err = dprc_open(dflt_mc_io, MC_CMD_NO_FLAGS, child_dprc_id, 8651730a17dSPrabhakar Kushwaha &dflt_dprc_handle); 8661730a17dSPrabhakar Kushwaha if (err < 0) { 8671730a17dSPrabhakar Kushwaha printf("dprc_open(): Child container failed: %d\n", err); 8681730a17dSPrabhakar Kushwaha goto err_child_open; 8691730a17dSPrabhakar Kushwaha } 8701730a17dSPrabhakar Kushwaha 8711730a17dSPrabhakar Kushwaha if (!dflt_dprc_handle) { 8721730a17dSPrabhakar Kushwaha printf("dprc_open(): Child container Handle is not valid\n"); 8731730a17dSPrabhakar Kushwaha goto err_child_open; 8741730a17dSPrabhakar Kushwaha } 8751730a17dSPrabhakar Kushwaha 8761730a17dSPrabhakar Kushwaha return 0; 8771730a17dSPrabhakar Kushwaha err_child_open: 8781730a17dSPrabhakar Kushwaha free(dflt_mc_io); 8791730a17dSPrabhakar Kushwaha err_malloc: 8801730a17dSPrabhakar Kushwaha dprc_destroy_container(root_mc_io, MC_CMD_NO_FLAGS, 8811730a17dSPrabhakar Kushwaha root_dprc_handle, child_dprc_id); 8821730a17dSPrabhakar Kushwaha err_create: 8831730a17dSPrabhakar Kushwaha dprc_close(root_mc_io, MC_CMD_NO_FLAGS, root_dprc_handle); 8841730a17dSPrabhakar Kushwaha err_root_open: 8851730a17dSPrabhakar Kushwaha err_root_container_id: 8861730a17dSPrabhakar Kushwaha return err; 8871730a17dSPrabhakar Kushwaha } 8881730a17dSPrabhakar Kushwaha 8891730a17dSPrabhakar Kushwaha static int dprc_exit(void) 8901730a17dSPrabhakar Kushwaha { 8911730a17dSPrabhakar Kushwaha int err; 8921730a17dSPrabhakar Kushwaha 8931730a17dSPrabhakar Kushwaha err = dprc_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle); 8941730a17dSPrabhakar Kushwaha if (err < 0) { 8951730a17dSPrabhakar Kushwaha printf("dprc_close(): Child failed: %d\n", err); 8961730a17dSPrabhakar Kushwaha goto err; 8971730a17dSPrabhakar Kushwaha } 8981730a17dSPrabhakar Kushwaha 8991730a17dSPrabhakar Kushwaha err = dprc_destroy_container(root_mc_io, MC_CMD_NO_FLAGS, 9001730a17dSPrabhakar Kushwaha root_dprc_handle, child_dprc_id); 9011730a17dSPrabhakar Kushwaha if (err < 0) { 9021730a17dSPrabhakar Kushwaha printf("dprc_destroy_container() failed: %d\n", err); 9031730a17dSPrabhakar Kushwaha goto err; 9041730a17dSPrabhakar Kushwaha } 9051730a17dSPrabhakar Kushwaha 9061730a17dSPrabhakar Kushwaha err = dprc_close(root_mc_io, MC_CMD_NO_FLAGS, root_dprc_handle); 9071730a17dSPrabhakar Kushwaha if (err < 0) { 9081730a17dSPrabhakar Kushwaha printf("dprc_close(): Root failed: %d\n", err); 9091730a17dSPrabhakar Kushwaha goto err; 9101730a17dSPrabhakar Kushwaha } 9111730a17dSPrabhakar Kushwaha 9121730a17dSPrabhakar Kushwaha if (dflt_mc_io) 9131730a17dSPrabhakar Kushwaha free(dflt_mc_io); 9141730a17dSPrabhakar Kushwaha 9151730a17dSPrabhakar Kushwaha if (root_mc_io) 9161730a17dSPrabhakar Kushwaha free(root_mc_io); 9171730a17dSPrabhakar Kushwaha 9181730a17dSPrabhakar Kushwaha return 0; 9191730a17dSPrabhakar Kushwaha 9201730a17dSPrabhakar Kushwaha err: 9211730a17dSPrabhakar Kushwaha return err; 9221730a17dSPrabhakar Kushwaha } 9231730a17dSPrabhakar Kushwaha 9241730a17dSPrabhakar Kushwaha static int dpbp_init(void) 9251730a17dSPrabhakar Kushwaha { 9261730a17dSPrabhakar Kushwaha int err; 9271730a17dSPrabhakar Kushwaha struct dpbp_attr dpbp_attr; 9281730a17dSPrabhakar Kushwaha struct dpbp_cfg dpbp_cfg; 9291730a17dSPrabhakar Kushwaha 930a2a55e51SPrabhakar Kushwaha dflt_dpbp = (struct fsl_dpbp_obj *)malloc(sizeof(struct fsl_dpbp_obj)); 931a2a55e51SPrabhakar Kushwaha if (!dflt_dpbp) { 932a2a55e51SPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 9331730a17dSPrabhakar Kushwaha err = -ENOMEM; 9341730a17dSPrabhakar Kushwaha goto err_malloc; 935a2a55e51SPrabhakar Kushwaha } 9361730a17dSPrabhakar Kushwaha 9371730a17dSPrabhakar Kushwaha dpbp_cfg.options = 512; 9381730a17dSPrabhakar Kushwaha 9391730a17dSPrabhakar Kushwaha err = dpbp_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpbp_cfg, 9401730a17dSPrabhakar Kushwaha &dflt_dpbp->dpbp_handle); 9411730a17dSPrabhakar Kushwaha 9421730a17dSPrabhakar Kushwaha if (err < 0) { 9431730a17dSPrabhakar Kushwaha err = -ENODEV; 9441730a17dSPrabhakar Kushwaha printf("dpbp_create() failed: %d\n", err); 9451730a17dSPrabhakar Kushwaha goto err_create; 9461730a17dSPrabhakar Kushwaha } 9471730a17dSPrabhakar Kushwaha 9481730a17dSPrabhakar Kushwaha memset(&dpbp_attr, 0, sizeof(struct dpbp_attr)); 9491730a17dSPrabhakar Kushwaha err = dpbp_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 9501730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_handle, 9511730a17dSPrabhakar Kushwaha &dpbp_attr); 9521730a17dSPrabhakar Kushwaha if (err < 0) { 9531730a17dSPrabhakar Kushwaha printf("dpbp_get_attributes() failed: %d\n", err); 9541730a17dSPrabhakar Kushwaha goto err_get_attr; 9551730a17dSPrabhakar Kushwaha } 9561730a17dSPrabhakar Kushwaha 9579a696f56SPrabhakar Kushwaha if ((dpbp_attr.version.major != DPBP_VER_MAJOR) || 9589a696f56SPrabhakar Kushwaha (dpbp_attr.version.minor != DPBP_VER_MINOR)) { 9599a696f56SPrabhakar Kushwaha printf("DPBP version mismatch found %u.%u,", 9609a696f56SPrabhakar Kushwaha dpbp_attr.version.major, dpbp_attr.version.minor); 9619a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 9629a696f56SPrabhakar Kushwaha DPBP_VER_MAJOR, DPBP_VER_MINOR); 9639a696f56SPrabhakar Kushwaha } 9649a696f56SPrabhakar Kushwaha 9651730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_attr.id = dpbp_attr.id; 9661730a17dSPrabhakar Kushwaha #ifdef DEBUG 9671730a17dSPrabhakar Kushwaha printf("Init: DPBP id=0x%d\n", dflt_dpbp->dpbp_attr.id); 9681730a17dSPrabhakar Kushwaha #endif 9691730a17dSPrabhakar Kushwaha 9701730a17dSPrabhakar Kushwaha err = dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9711730a17dSPrabhakar Kushwaha if (err < 0) { 9721730a17dSPrabhakar Kushwaha printf("dpbp_close() failed: %d\n", err); 9731730a17dSPrabhakar Kushwaha goto err_close; 9741730a17dSPrabhakar Kushwaha } 975a2a55e51SPrabhakar Kushwaha 976a2a55e51SPrabhakar Kushwaha return 0; 9771730a17dSPrabhakar Kushwaha 9781730a17dSPrabhakar Kushwaha err_close: 9791730a17dSPrabhakar Kushwaha free(dflt_dpbp); 9801730a17dSPrabhakar Kushwaha err_get_attr: 9811730a17dSPrabhakar Kushwaha dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9821730a17dSPrabhakar Kushwaha dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9831730a17dSPrabhakar Kushwaha err_create: 9841730a17dSPrabhakar Kushwaha err_malloc: 9851730a17dSPrabhakar Kushwaha return err; 986a2a55e51SPrabhakar Kushwaha } 987a2a55e51SPrabhakar Kushwaha 9881730a17dSPrabhakar Kushwaha static int dpbp_exit(void) 989a2a55e51SPrabhakar Kushwaha { 9901730a17dSPrabhakar Kushwaha int err; 9911730a17dSPrabhakar Kushwaha 9921730a17dSPrabhakar Kushwaha err = dpbp_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_attr.id, 9931730a17dSPrabhakar Kushwaha &dflt_dpbp->dpbp_handle); 9941730a17dSPrabhakar Kushwaha if (err < 0) { 9951730a17dSPrabhakar Kushwaha printf("dpbp_open() failed: %d\n", err); 9961730a17dSPrabhakar Kushwaha goto err; 9971730a17dSPrabhakar Kushwaha } 9981730a17dSPrabhakar Kushwaha 9991730a17dSPrabhakar Kushwaha err = dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, 10001730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_handle); 10011730a17dSPrabhakar Kushwaha if (err < 0) { 10021730a17dSPrabhakar Kushwaha printf("dpbp_destroy() failed: %d\n", err); 10031730a17dSPrabhakar Kushwaha goto err; 10041730a17dSPrabhakar Kushwaha } 10051730a17dSPrabhakar Kushwaha 10061730a17dSPrabhakar Kushwaha #ifdef DEBUG 10071730a17dSPrabhakar Kushwaha printf("Exit: DPBP id=0x%d\n", dflt_dpbp->dpbp_attr.id); 10081730a17dSPrabhakar Kushwaha #endif 10091730a17dSPrabhakar Kushwaha 10101730a17dSPrabhakar Kushwaha if (dflt_dpbp) 10111730a17dSPrabhakar Kushwaha free(dflt_dpbp); 10121730a17dSPrabhakar Kushwaha return 0; 10131730a17dSPrabhakar Kushwaha 10141730a17dSPrabhakar Kushwaha err: 10151730a17dSPrabhakar Kushwaha return err; 10161730a17dSPrabhakar Kushwaha } 10171730a17dSPrabhakar Kushwaha 10181730a17dSPrabhakar Kushwaha static int dpni_init(void) 10191730a17dSPrabhakar Kushwaha { 10201730a17dSPrabhakar Kushwaha int err; 10211730a17dSPrabhakar Kushwaha struct dpni_attr dpni_attr; 1022879a59acSPrabhakar Kushwaha uint8_t ext_cfg_buf[256] = {0}; 1023879a59acSPrabhakar Kushwaha struct dpni_extended_cfg dpni_extended_cfg; 10241730a17dSPrabhakar Kushwaha struct dpni_cfg dpni_cfg; 10251730a17dSPrabhakar Kushwaha 10261730a17dSPrabhakar Kushwaha dflt_dpni = (struct fsl_dpni_obj *)malloc(sizeof(struct fsl_dpni_obj)); 10271730a17dSPrabhakar Kushwaha if (!dflt_dpni) { 10281730a17dSPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 10291730a17dSPrabhakar Kushwaha err = -ENOMEM; 10301730a17dSPrabhakar Kushwaha goto err_malloc; 10311730a17dSPrabhakar Kushwaha } 10321730a17dSPrabhakar Kushwaha 1033879a59acSPrabhakar Kushwaha memset(&dpni_extended_cfg, 0, sizeof(dpni_extended_cfg)); 1034879a59acSPrabhakar Kushwaha err = dpni_prepare_extended_cfg(&dpni_extended_cfg, &ext_cfg_buf[0]); 1035879a59acSPrabhakar Kushwaha if (err < 0) { 1036879a59acSPrabhakar Kushwaha err = -ENODEV; 1037879a59acSPrabhakar Kushwaha printf("dpni_prepare_extended_cfg() failed: %d\n", err); 1038879a59acSPrabhakar Kushwaha goto err_prepare_extended_cfg; 1039879a59acSPrabhakar Kushwaha } 1040879a59acSPrabhakar Kushwaha 10411730a17dSPrabhakar Kushwaha memset(&dpni_cfg, 0, sizeof(dpni_cfg)); 10421730a17dSPrabhakar Kushwaha dpni_cfg.adv.options = DPNI_OPT_UNICAST_FILTER | 10431730a17dSPrabhakar Kushwaha DPNI_OPT_MULTICAST_FILTER; 10441730a17dSPrabhakar Kushwaha 1045879a59acSPrabhakar Kushwaha dpni_cfg.adv.ext_cfg_iova = (uint64_t)&ext_cfg_buf[0]; 10461730a17dSPrabhakar Kushwaha err = dpni_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpni_cfg, 10471730a17dSPrabhakar Kushwaha &dflt_dpni->dpni_handle); 10481730a17dSPrabhakar Kushwaha 10491730a17dSPrabhakar Kushwaha if (err < 0) { 10501730a17dSPrabhakar Kushwaha err = -ENODEV; 10511730a17dSPrabhakar Kushwaha printf("dpni_create() failed: %d\n", err); 10521730a17dSPrabhakar Kushwaha goto err_create; 10531730a17dSPrabhakar Kushwaha } 10541730a17dSPrabhakar Kushwaha 10551730a17dSPrabhakar Kushwaha memset(&dpni_attr, 0, sizeof(struct dpni_attr)); 10561730a17dSPrabhakar Kushwaha err = dpni_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 10571730a17dSPrabhakar Kushwaha dflt_dpni->dpni_handle, 10581730a17dSPrabhakar Kushwaha &dpni_attr); 10591730a17dSPrabhakar Kushwaha if (err < 0) { 10601730a17dSPrabhakar Kushwaha printf("dpni_get_attributes() failed: %d\n", err); 10611730a17dSPrabhakar Kushwaha goto err_get_attr; 10621730a17dSPrabhakar Kushwaha } 10631730a17dSPrabhakar Kushwaha 10649a696f56SPrabhakar Kushwaha if ((dpni_attr.version.major != DPNI_VER_MAJOR) || 10659a696f56SPrabhakar Kushwaha (dpni_attr.version.minor != DPNI_VER_MINOR)) { 10669a696f56SPrabhakar Kushwaha printf("DPNI version mismatch found %u.%u,", 10679a696f56SPrabhakar Kushwaha dpni_attr.version.major, dpni_attr.version.minor); 10689a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 10699a696f56SPrabhakar Kushwaha DPNI_VER_MAJOR, DPNI_VER_MINOR); 10709a696f56SPrabhakar Kushwaha } 10719a696f56SPrabhakar Kushwaha 10721730a17dSPrabhakar Kushwaha dflt_dpni->dpni_id = dpni_attr.id; 10731730a17dSPrabhakar Kushwaha #ifdef DEBUG 10741730a17dSPrabhakar Kushwaha printf("Init: DPNI id=0x%d\n", dflt_dpni->dpni_id); 10751730a17dSPrabhakar Kushwaha #endif 10761730a17dSPrabhakar Kushwaha 10771730a17dSPrabhakar Kushwaha err = dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10781730a17dSPrabhakar Kushwaha if (err < 0) { 10791730a17dSPrabhakar Kushwaha printf("dpni_close() failed: %d\n", err); 10801730a17dSPrabhakar Kushwaha goto err_close; 10811730a17dSPrabhakar Kushwaha } 1082a2a55e51SPrabhakar Kushwaha 1083fb4a87a7SPrabhakar Kushwaha return 0; 10841730a17dSPrabhakar Kushwaha 10851730a17dSPrabhakar Kushwaha err_close: 10861730a17dSPrabhakar Kushwaha err_get_attr: 10871730a17dSPrabhakar Kushwaha dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10881730a17dSPrabhakar Kushwaha dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10891730a17dSPrabhakar Kushwaha err_create: 1090879a59acSPrabhakar Kushwaha err_prepare_extended_cfg: 1091879a59acSPrabhakar Kushwaha free(dflt_dpni); 10921730a17dSPrabhakar Kushwaha err_malloc: 10931730a17dSPrabhakar Kushwaha return err; 1094a2a55e51SPrabhakar Kushwaha } 1095a2a55e51SPrabhakar Kushwaha 10961730a17dSPrabhakar Kushwaha static int dpni_exit(void) 1097a2a55e51SPrabhakar Kushwaha { 10981730a17dSPrabhakar Kushwaha int err; 10991730a17dSPrabhakar Kushwaha 11001730a17dSPrabhakar Kushwaha err = dpni_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_id, 11011730a17dSPrabhakar Kushwaha &dflt_dpni->dpni_handle); 11021730a17dSPrabhakar Kushwaha if (err < 0) { 11031730a17dSPrabhakar Kushwaha printf("dpni_open() failed: %d\n", err); 11041730a17dSPrabhakar Kushwaha goto err; 11051730a17dSPrabhakar Kushwaha } 11061730a17dSPrabhakar Kushwaha 11071730a17dSPrabhakar Kushwaha err = dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, 11081730a17dSPrabhakar Kushwaha dflt_dpni->dpni_handle); 11091730a17dSPrabhakar Kushwaha if (err < 0) { 11101730a17dSPrabhakar Kushwaha printf("dpni_destroy() failed: %d\n", err); 11111730a17dSPrabhakar Kushwaha goto err; 11121730a17dSPrabhakar Kushwaha } 11131730a17dSPrabhakar Kushwaha 11141730a17dSPrabhakar Kushwaha #ifdef DEBUG 11151730a17dSPrabhakar Kushwaha printf("Exit: DPNI id=0x%d\n", dflt_dpni->dpni_id); 11161730a17dSPrabhakar Kushwaha #endif 11171730a17dSPrabhakar Kushwaha 11181730a17dSPrabhakar Kushwaha if (dflt_dpni) 11191730a17dSPrabhakar Kushwaha free(dflt_dpni); 11201730a17dSPrabhakar Kushwaha return 0; 11211730a17dSPrabhakar Kushwaha 11221730a17dSPrabhakar Kushwaha err: 11231730a17dSPrabhakar Kushwaha return err; 11241730a17dSPrabhakar Kushwaha } 11251730a17dSPrabhakar Kushwaha 11261730a17dSPrabhakar Kushwaha static int mc_init_object(void) 11271730a17dSPrabhakar Kushwaha { 11281730a17dSPrabhakar Kushwaha int err = 0; 11291730a17dSPrabhakar Kushwaha 11301730a17dSPrabhakar Kushwaha err = dprc_init(); 11311730a17dSPrabhakar Kushwaha if (err < 0) { 11321730a17dSPrabhakar Kushwaha printf("dprc_init() failed: %d\n", err); 11331730a17dSPrabhakar Kushwaha goto err; 11341730a17dSPrabhakar Kushwaha } 11351730a17dSPrabhakar Kushwaha 11361730a17dSPrabhakar Kushwaha err = dpbp_init(); 11371730a17dSPrabhakar Kushwaha if (err < 0) { 11381730a17dSPrabhakar Kushwaha printf("dpbp_init() failed: %d\n", err); 11391730a17dSPrabhakar Kushwaha goto err; 11401730a17dSPrabhakar Kushwaha } 11411730a17dSPrabhakar Kushwaha 11421730a17dSPrabhakar Kushwaha err = dpio_init(); 11431730a17dSPrabhakar Kushwaha if (err < 0) { 11441730a17dSPrabhakar Kushwaha printf("dpio_init() failed: %d\n", err); 11451730a17dSPrabhakar Kushwaha goto err; 11461730a17dSPrabhakar Kushwaha } 11471730a17dSPrabhakar Kushwaha 11481730a17dSPrabhakar Kushwaha err = dpni_init(); 11491730a17dSPrabhakar Kushwaha if (err < 0) { 11501730a17dSPrabhakar Kushwaha printf("dpni_init() failed: %d\n", err); 11511730a17dSPrabhakar Kushwaha goto err; 11521730a17dSPrabhakar Kushwaha } 11531730a17dSPrabhakar Kushwaha 11541730a17dSPrabhakar Kushwaha return 0; 11551730a17dSPrabhakar Kushwaha err: 11561730a17dSPrabhakar Kushwaha return err; 11571730a17dSPrabhakar Kushwaha } 11581730a17dSPrabhakar Kushwaha 11591730a17dSPrabhakar Kushwaha int fsl_mc_ldpaa_exit(bd_t *bd) 11601730a17dSPrabhakar Kushwaha { 11611730a17dSPrabhakar Kushwaha int err = 0; 11621730a17dSPrabhakar Kushwaha 1163*b7b8410aSAlexander Graf if (bd && mc_lazy_dpl_addr && !fsl_mc_ldpaa_exit(NULL)) { 1164*b7b8410aSAlexander Graf mc_apply_dpl(mc_lazy_dpl_addr); 1165*b7b8410aSAlexander Graf mc_lazy_dpl_addr = 0; 1166*b7b8410aSAlexander Graf } 1167*b7b8410aSAlexander Graf 11686dedceddSPrabhakar Kushwaha /* MC is not loaded intentionally, So return success. */ 11696dedceddSPrabhakar Kushwaha if (bd && get_mc_boot_status() != 0) 11701730a17dSPrabhakar Kushwaha return 0; 11711730a17dSPrabhakar Kushwaha 11721730a17dSPrabhakar Kushwaha if (bd && !get_mc_boot_status() && get_dpl_apply_status() == -1) { 11731730a17dSPrabhakar Kushwaha printf("ERROR: fsl-mc: DPL is not applied\n"); 11741730a17dSPrabhakar Kushwaha err = -ENODEV; 11751730a17dSPrabhakar Kushwaha return err; 11761730a17dSPrabhakar Kushwaha } 11771730a17dSPrabhakar Kushwaha 11781730a17dSPrabhakar Kushwaha if (bd && !get_mc_boot_status() && !get_dpl_apply_status()) 11791730a17dSPrabhakar Kushwaha return err; 11801730a17dSPrabhakar Kushwaha 11811730a17dSPrabhakar Kushwaha err = dpbp_exit(); 11821730a17dSPrabhakar Kushwaha if (err < 0) { 1183a2a4dc56SPrabhakar Kushwaha printf("dpbp_exit() failed: %d\n", err); 11841730a17dSPrabhakar Kushwaha goto err; 11851730a17dSPrabhakar Kushwaha } 11861730a17dSPrabhakar Kushwaha 11871730a17dSPrabhakar Kushwaha err = dpio_exit(); 11881730a17dSPrabhakar Kushwaha if (err < 0) { 11891730a17dSPrabhakar Kushwaha printf("dpio_exit() failed: %d\n", err); 11901730a17dSPrabhakar Kushwaha goto err; 11911730a17dSPrabhakar Kushwaha } 11921730a17dSPrabhakar Kushwaha 11931730a17dSPrabhakar Kushwaha err = dpni_exit(); 11941730a17dSPrabhakar Kushwaha if (err < 0) { 11951730a17dSPrabhakar Kushwaha printf("dpni_exit() failed: %d\n", err); 11961730a17dSPrabhakar Kushwaha goto err; 11971730a17dSPrabhakar Kushwaha } 11981730a17dSPrabhakar Kushwaha 11991730a17dSPrabhakar Kushwaha err = dprc_exit(); 12001730a17dSPrabhakar Kushwaha if (err < 0) { 12011730a17dSPrabhakar Kushwaha printf("dprc_exit() failed: %d\n", err); 12021730a17dSPrabhakar Kushwaha goto err; 12031730a17dSPrabhakar Kushwaha } 12041730a17dSPrabhakar Kushwaha 12051730a17dSPrabhakar Kushwaha return 0; 12061730a17dSPrabhakar Kushwaha err: 12071730a17dSPrabhakar Kushwaha return err; 1208fb4a87a7SPrabhakar Kushwaha } 1209fb4a87a7SPrabhakar Kushwaha 1210fb4a87a7SPrabhakar Kushwaha static int do_fsl_mc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 1211fb4a87a7SPrabhakar Kushwaha { 1212fb4a87a7SPrabhakar Kushwaha int err = 0; 1213fb4a87a7SPrabhakar Kushwaha if (argc < 3) 1214fb4a87a7SPrabhakar Kushwaha goto usage; 1215fb4a87a7SPrabhakar Kushwaha 1216fb4a87a7SPrabhakar Kushwaha switch (argv[1][0]) { 1217fb4a87a7SPrabhakar Kushwaha case 's': { 1218fb4a87a7SPrabhakar Kushwaha char sub_cmd; 121944937214SPrabhakar Kushwaha u64 mc_fw_addr, mc_dpc_addr; 122044937214SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 122144937214SPrabhakar Kushwaha u64 aiop_fw_addr; 122244937214SPrabhakar Kushwaha #endif 1223fb4a87a7SPrabhakar Kushwaha 1224fb4a87a7SPrabhakar Kushwaha sub_cmd = argv[2][0]; 1225fb4a87a7SPrabhakar Kushwaha switch (sub_cmd) { 1226fb4a87a7SPrabhakar Kushwaha case 'm': 1227fb4a87a7SPrabhakar Kushwaha if (argc < 5) 1228fb4a87a7SPrabhakar Kushwaha goto usage; 1229a2a55e51SPrabhakar Kushwaha 1230125e2bc1SJ. German Rivera if (get_mc_boot_status() == 0) { 1231fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: MC is already booted"); 1232fb4a87a7SPrabhakar Kushwaha printf("\n"); 1233fb4a87a7SPrabhakar Kushwaha return err; 1234a2a55e51SPrabhakar Kushwaha } 1235fb4a87a7SPrabhakar Kushwaha mc_fw_addr = simple_strtoull(argv[3], NULL, 16); 1236fb4a87a7SPrabhakar Kushwaha mc_dpc_addr = simple_strtoull(argv[4], NULL, 1237fb4a87a7SPrabhakar Kushwaha 16); 12381730a17dSPrabhakar Kushwaha 12391730a17dSPrabhakar Kushwaha if (!mc_init(mc_fw_addr, mc_dpc_addr)) 12401730a17dSPrabhakar Kushwaha err = mc_init_object(); 1241fb4a87a7SPrabhakar Kushwaha break; 1242fb4a87a7SPrabhakar Kushwaha 1243fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 1244fb4a87a7SPrabhakar Kushwaha case 'a': 1245fb4a87a7SPrabhakar Kushwaha if (argc < 4) 1246fb4a87a7SPrabhakar Kushwaha goto usage; 1247fb4a87a7SPrabhakar Kushwaha if (get_aiop_apply_status() == 0) { 1248fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: AIOP FW is already"); 1249fb4a87a7SPrabhakar Kushwaha printf(" applied\n"); 1250fb4a87a7SPrabhakar Kushwaha return err; 1251a2a55e51SPrabhakar Kushwaha } 1252a2a55e51SPrabhakar Kushwaha 1253fb4a87a7SPrabhakar Kushwaha aiop_fw_addr = simple_strtoull(argv[3], NULL, 1254fb4a87a7SPrabhakar Kushwaha 16); 1255fb4a87a7SPrabhakar Kushwaha 12563c1d218aSYork Sun /* if SoC doesn't have AIOP, err = -ENODEV */ 1257fb4a87a7SPrabhakar Kushwaha err = load_mc_aiop_img(aiop_fw_addr); 1258fb4a87a7SPrabhakar Kushwaha if (!err) 1259fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: AIOP FW applied\n"); 1260fb4a87a7SPrabhakar Kushwaha break; 1261fb4a87a7SPrabhakar Kushwaha #endif 1262fb4a87a7SPrabhakar Kushwaha default: 1263fb4a87a7SPrabhakar Kushwaha printf("Invalid option: %s\n", argv[2]); 1264fb4a87a7SPrabhakar Kushwaha goto usage; 1265fb4a87a7SPrabhakar Kushwaha 1266fb4a87a7SPrabhakar Kushwaha break; 1267fb4a87a7SPrabhakar Kushwaha } 1268fb4a87a7SPrabhakar Kushwaha } 1269fb4a87a7SPrabhakar Kushwaha break; 1270fb4a87a7SPrabhakar Kushwaha 1271*b7b8410aSAlexander Graf case 'l': 1272fb4a87a7SPrabhakar Kushwaha case 'a': { 1273fb4a87a7SPrabhakar Kushwaha u64 mc_dpl_addr; 1274fb4a87a7SPrabhakar Kushwaha 1275fb4a87a7SPrabhakar Kushwaha if (argc < 4) 1276fb4a87a7SPrabhakar Kushwaha goto usage; 1277fb4a87a7SPrabhakar Kushwaha 1278fb4a87a7SPrabhakar Kushwaha if (get_dpl_apply_status() == 0) { 1279fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: DPL already applied\n"); 1280fb4a87a7SPrabhakar Kushwaha return err; 1281125e2bc1SJ. German Rivera } 1282125e2bc1SJ. German Rivera 1283fb4a87a7SPrabhakar Kushwaha mc_dpl_addr = simple_strtoull(argv[3], NULL, 1284fb4a87a7SPrabhakar Kushwaha 16); 12851730a17dSPrabhakar Kushwaha 1286fb4a87a7SPrabhakar Kushwaha if (get_mc_boot_status() != 0) { 1287fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: Deploying data path layout .."); 1288fb4a87a7SPrabhakar Kushwaha printf("ERROR (MC is not booted)\n"); 1289fb4a87a7SPrabhakar Kushwaha return -ENODEV; 1290a2a55e51SPrabhakar Kushwaha } 12911730a17dSPrabhakar Kushwaha 1292*b7b8410aSAlexander Graf if (argv[1][0] == 'l') { 1293*b7b8410aSAlexander Graf /* 1294*b7b8410aSAlexander Graf * We will do the actual dpaa exit and dpl apply 1295*b7b8410aSAlexander Graf * later from announce_and_cleanup(). 1296*b7b8410aSAlexander Graf */ 1297*b7b8410aSAlexander Graf mc_lazy_dpl_addr = mc_dpl_addr; 1298*b7b8410aSAlexander Graf } else { 1299*b7b8410aSAlexander Graf /* The user wants it applied now */ 13001730a17dSPrabhakar Kushwaha if (!fsl_mc_ldpaa_exit(NULL)) 1301fb4a87a7SPrabhakar Kushwaha err = mc_apply_dpl(mc_dpl_addr); 1302*b7b8410aSAlexander Graf } 1303fb4a87a7SPrabhakar Kushwaha break; 1304fb4a87a7SPrabhakar Kushwaha } 1305fb4a87a7SPrabhakar Kushwaha default: 1306fb4a87a7SPrabhakar Kushwaha printf("Invalid option: %s\n", argv[1]); 1307fb4a87a7SPrabhakar Kushwaha goto usage; 1308fb4a87a7SPrabhakar Kushwaha break; 1309fb4a87a7SPrabhakar Kushwaha } 1310fb4a87a7SPrabhakar Kushwaha return err; 1311fb4a87a7SPrabhakar Kushwaha usage: 1312fb4a87a7SPrabhakar Kushwaha return CMD_RET_USAGE; 1313fb4a87a7SPrabhakar Kushwaha } 1314fb4a87a7SPrabhakar Kushwaha 1315fb4a87a7SPrabhakar Kushwaha U_BOOT_CMD( 1316fb4a87a7SPrabhakar Kushwaha fsl_mc, CONFIG_SYS_MAXARGS, 1, do_fsl_mc, 1317fb4a87a7SPrabhakar Kushwaha "DPAA2 command to manage Management Complex (MC)", 1318fb4a87a7SPrabhakar Kushwaha "start mc [FW_addr] [DPC_addr] - Start Management Complex\n" 1319fb4a87a7SPrabhakar Kushwaha "fsl_mc apply DPL [DPL_addr] - Apply DPL file\n" 1320*b7b8410aSAlexander Graf "fsl_mc lazyapply DPL [DPL_addr] - Apply DPL file on exit\n" 1321fb4a87a7SPrabhakar Kushwaha "fsl_mc start aiop [FW_addr] - Start AIOP\n" 1322fb4a87a7SPrabhakar Kushwaha ); 1323