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; 437b3bd9a7SJ. German Rivera 44125e2bc1SJ. German Rivera #ifdef DEBUG 45125e2bc1SJ. German Rivera void dump_ram_words(const char *title, void *addr) 46125e2bc1SJ. German Rivera { 47125e2bc1SJ. German Rivera int i; 48125e2bc1SJ. German Rivera uint32_t *words = addr; 49125e2bc1SJ. German Rivera 50125e2bc1SJ. German Rivera printf("Dumping beginning of %s (%p):\n", title, addr); 51125e2bc1SJ. German Rivera for (i = 0; i < 16; i++) 52125e2bc1SJ. German Rivera printf("%#x ", words[i]); 53125e2bc1SJ. German Rivera 54125e2bc1SJ. German Rivera printf("\n"); 55125e2bc1SJ. German Rivera } 56125e2bc1SJ. German Rivera 57125e2bc1SJ. German Rivera void dump_mc_ccsr_regs(struct mc_ccsr_registers __iomem *mc_ccsr_regs) 58125e2bc1SJ. German Rivera { 59125e2bc1SJ. German Rivera printf("MC CCSR registers:\n" 60125e2bc1SJ. German Rivera "reg_gcr1 %#x\n" 61125e2bc1SJ. German Rivera "reg_gsr %#x\n" 62125e2bc1SJ. German Rivera "reg_sicbalr %#x\n" 63125e2bc1SJ. German Rivera "reg_sicbahr %#x\n" 64125e2bc1SJ. German Rivera "reg_sicapr %#x\n" 65125e2bc1SJ. German Rivera "reg_mcfbalr %#x\n" 66125e2bc1SJ. German Rivera "reg_mcfbahr %#x\n" 67125e2bc1SJ. German Rivera "reg_mcfapr %#x\n" 68125e2bc1SJ. German Rivera "reg_psr %#x\n", 69125e2bc1SJ. German Rivera mc_ccsr_regs->reg_gcr1, 70125e2bc1SJ. German Rivera mc_ccsr_regs->reg_gsr, 71125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicbalr, 72125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicbahr, 73125e2bc1SJ. German Rivera mc_ccsr_regs->reg_sicapr, 74125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfbalr, 75125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfbahr, 76125e2bc1SJ. German Rivera mc_ccsr_regs->reg_mcfapr, 77125e2bc1SJ. German Rivera mc_ccsr_regs->reg_psr); 78125e2bc1SJ. German Rivera } 79125e2bc1SJ. German Rivera #else 80125e2bc1SJ. German Rivera 81125e2bc1SJ. German Rivera #define dump_ram_words(title, addr) 82125e2bc1SJ. German Rivera #define dump_mc_ccsr_regs(mc_ccsr_regs) 83125e2bc1SJ. German Rivera 84125e2bc1SJ. German Rivera #endif /* DEBUG */ 85125e2bc1SJ. German Rivera 86125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_FW_IN_DDR 877b3bd9a7SJ. German Rivera /** 887b3bd9a7SJ. German Rivera * Copying MC firmware or DPL image to DDR 897b3bd9a7SJ. German Rivera */ 907b3bd9a7SJ. German Rivera static int mc_copy_image(const char *title, 917b3bd9a7SJ. German Rivera u64 image_addr, u32 image_size, u64 mc_ram_addr) 927b3bd9a7SJ. German Rivera { 937b3bd9a7SJ. German Rivera debug("%s copied to address %p\n", title, (void *)mc_ram_addr); 947b3bd9a7SJ. German Rivera memcpy((void *)mc_ram_addr, (void *)image_addr, image_size); 95125e2bc1SJ. German Rivera flush_dcache_range(mc_ram_addr, mc_ram_addr + image_size); 967b3bd9a7SJ. German Rivera return 0; 977b3bd9a7SJ. German Rivera } 987b3bd9a7SJ. German Rivera 997b3bd9a7SJ. German Rivera /** 1007b3bd9a7SJ. German Rivera * MC firmware FIT image parser checks if the image is in FIT 1017b3bd9a7SJ. German Rivera * format, verifies integrity of the image and calculates 1027b3bd9a7SJ. German Rivera * raw image address and size values. 1037b3bd9a7SJ. German Rivera * Returns 0 on success and a negative errno on error. 1047b3bd9a7SJ. German Rivera * task fail. 1057b3bd9a7SJ. German Rivera **/ 106fb4a87a7SPrabhakar Kushwaha int parse_mc_firmware_fit_image(u64 mc_fw_addr, 107fb4a87a7SPrabhakar Kushwaha const void **raw_image_addr, 1087b3bd9a7SJ. German Rivera size_t *raw_image_size) 1097b3bd9a7SJ. German Rivera { 1107b3bd9a7SJ. German Rivera int format; 1117b3bd9a7SJ. German Rivera void *fit_hdr; 1127b3bd9a7SJ. German Rivera int node_offset; 1137b3bd9a7SJ. German Rivera const void *data; 1147b3bd9a7SJ. German Rivera size_t size; 1157b3bd9a7SJ. German Rivera const char *uname = "firmware"; 1167b3bd9a7SJ. German Rivera 117fb4a87a7SPrabhakar Kushwaha fit_hdr = (void *)mc_fw_addr; 1187b3bd9a7SJ. German Rivera 1197b3bd9a7SJ. German Rivera /* Check if Image is in FIT format */ 1207b3bd9a7SJ. German Rivera format = genimg_get_format(fit_hdr); 1217b3bd9a7SJ. German Rivera 1227b3bd9a7SJ. German Rivera if (format != IMAGE_FORMAT_FIT) { 123fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (not a FIT image)\n"); 1247b3bd9a7SJ. German Rivera return -EINVAL; 1257b3bd9a7SJ. German Rivera } 1267b3bd9a7SJ. German Rivera 1277b3bd9a7SJ. German Rivera if (!fit_check_format(fit_hdr)) { 128fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (bad FIT header)\n"); 1297b3bd9a7SJ. German Rivera return -EINVAL; 1307b3bd9a7SJ. German Rivera } 1317b3bd9a7SJ. German Rivera 1327b3bd9a7SJ. German Rivera node_offset = fit_image_get_node(fit_hdr, uname); 1337b3bd9a7SJ. German Rivera 1347b3bd9a7SJ. German Rivera if (node_offset < 0) { 135fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (missing subimage)\n"); 1367b3bd9a7SJ. German Rivera return -ENOENT; 1377b3bd9a7SJ. German Rivera } 1387b3bd9a7SJ. German Rivera 1397b3bd9a7SJ. German Rivera /* Verify MC firmware image */ 1407b3bd9a7SJ. German Rivera if (!(fit_image_verify(fit_hdr, node_offset))) { 141fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: ERR: Bad firmware image (bad CRC)\n"); 1427b3bd9a7SJ. German Rivera return -EINVAL; 1437b3bd9a7SJ. German Rivera } 1447b3bd9a7SJ. German Rivera 1457b3bd9a7SJ. German Rivera /* Get address and size of raw image */ 1467b3bd9a7SJ. German Rivera fit_image_get_data(fit_hdr, node_offset, &data, &size); 1477b3bd9a7SJ. German Rivera 1487b3bd9a7SJ. German Rivera *raw_image_addr = data; 1497b3bd9a7SJ. German Rivera *raw_image_size = size; 1507b3bd9a7SJ. German Rivera 1517b3bd9a7SJ. German Rivera return 0; 1527b3bd9a7SJ. German Rivera } 153125e2bc1SJ. German Rivera #endif 154125e2bc1SJ. German Rivera 155125e2bc1SJ. German Rivera /* 156125e2bc1SJ. German Rivera * Calculates the values to be used to specify the address range 157125e2bc1SJ. German Rivera * for the MC private DRAM block, in the MCFBALR/MCFBAHR registers. 158125e2bc1SJ. German Rivera * It returns the highest 512MB-aligned address within the given 159125e2bc1SJ. German Rivera * address range, in '*aligned_base_addr', and the number of 256 MiB 160125e2bc1SJ. German Rivera * blocks in it, in 'num_256mb_blocks'. 161125e2bc1SJ. German Rivera */ 162125e2bc1SJ. German Rivera static int calculate_mc_private_ram_params(u64 mc_private_ram_start_addr, 163125e2bc1SJ. German Rivera size_t mc_ram_size, 164125e2bc1SJ. German Rivera u64 *aligned_base_addr, 165125e2bc1SJ. German Rivera u8 *num_256mb_blocks) 166125e2bc1SJ. German Rivera { 167125e2bc1SJ. German Rivera u64 addr; 168125e2bc1SJ. German Rivera u16 num_blocks; 169125e2bc1SJ. German Rivera 170125e2bc1SJ. German Rivera if (mc_ram_size % MC_RAM_SIZE_ALIGNMENT != 0) { 171125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n", 172125e2bc1SJ. German Rivera mc_ram_size); 173125e2bc1SJ. German Rivera return -EINVAL; 174125e2bc1SJ. German Rivera } 175125e2bc1SJ. German Rivera 176125e2bc1SJ. German Rivera num_blocks = mc_ram_size / MC_RAM_SIZE_ALIGNMENT; 177125e2bc1SJ. German Rivera if (num_blocks < 1 || num_blocks > 0xff) { 178125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n", 179125e2bc1SJ. German Rivera mc_ram_size); 180125e2bc1SJ. German Rivera return -EINVAL; 181125e2bc1SJ. German Rivera } 182125e2bc1SJ. German Rivera 183125e2bc1SJ. German Rivera addr = (mc_private_ram_start_addr + mc_ram_size - 1) & 184125e2bc1SJ. German Rivera MC_RAM_BASE_ADDR_ALIGNMENT_MASK; 185125e2bc1SJ. German Rivera 186125e2bc1SJ. German Rivera if (addr < mc_private_ram_start_addr) { 187125e2bc1SJ. German Rivera printf("fsl-mc: ERROR: bad start address %#llx\n", 188125e2bc1SJ. German Rivera mc_private_ram_start_addr); 189125e2bc1SJ. German Rivera return -EFAULT; 190125e2bc1SJ. German Rivera } 191125e2bc1SJ. German Rivera 192125e2bc1SJ. German Rivera *aligned_base_addr = addr; 193125e2bc1SJ. German Rivera *num_256mb_blocks = num_blocks; 194125e2bc1SJ. German Rivera return 0; 195125e2bc1SJ. German Rivera } 196125e2bc1SJ. German Rivera 19721c69870SStuart Yoder static int mc_fixup_dpc(u64 dpc_addr) 19821c69870SStuart Yoder { 19921c69870SStuart Yoder void *blob = (void *)dpc_addr; 20021c69870SStuart Yoder int nodeoffset; 20121c69870SStuart Yoder 20221c69870SStuart Yoder /* delete any existing ICID pools */ 20321c69870SStuart Yoder nodeoffset = fdt_path_offset(blob, "/resources/icid_pools"); 20421c69870SStuart Yoder if (fdt_del_node(blob, nodeoffset) < 0) 20521c69870SStuart Yoder printf("\nfsl-mc: WARNING: could not delete ICID pool\n"); 20621c69870SStuart Yoder 20721c69870SStuart Yoder /* add a new pool */ 20821c69870SStuart Yoder nodeoffset = fdt_path_offset(blob, "/resources"); 20921c69870SStuart Yoder if (nodeoffset < 0) { 21021c69870SStuart Yoder printf("\nfsl-mc: ERROR: DPC is missing /resources\n"); 21121c69870SStuart Yoder return -EINVAL; 21221c69870SStuart Yoder } 21321c69870SStuart Yoder nodeoffset = fdt_add_subnode(blob, nodeoffset, "icid_pools"); 21421c69870SStuart Yoder nodeoffset = fdt_add_subnode(blob, nodeoffset, "icid_pool@0"); 21521c69870SStuart Yoder do_fixup_by_path_u32(blob, "/resources/icid_pools/icid_pool@0", 21621c69870SStuart Yoder "base_icid", FSL_DPAA2_STREAM_ID_START, 1); 21721c69870SStuart Yoder do_fixup_by_path_u32(blob, "/resources/icid_pools/icid_pool@0", 21821c69870SStuart Yoder "num", 21921c69870SStuart Yoder FSL_DPAA2_STREAM_ID_END - 22021c69870SStuart Yoder FSL_DPAA2_STREAM_ID_START + 1, 1); 22121c69870SStuart Yoder 22221c69870SStuart Yoder flush_dcache_range(dpc_addr, dpc_addr + fdt_totalsize(blob)); 22321c69870SStuart Yoder 22421c69870SStuart Yoder return 0; 22521c69870SStuart Yoder } 22621c69870SStuart Yoder 227fb4a87a7SPrabhakar Kushwaha static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpc_addr) 228125e2bc1SJ. German Rivera { 229125e2bc1SJ. German Rivera u64 mc_dpc_offset; 230125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR 231125e2bc1SJ. German Rivera int error; 232125e2bc1SJ. German Rivera void *dpc_fdt_hdr; 233125e2bc1SJ. German Rivera int dpc_size; 234125e2bc1SJ. German Rivera #endif 235125e2bc1SJ. German Rivera 236125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET 237125e2bc1SJ. German Rivera BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET & 0x3) != 0 || 238125e2bc1SJ. German Rivera CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET > 0xffffffff); 239125e2bc1SJ. German Rivera 240125e2bc1SJ. German Rivera mc_dpc_offset = CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET; 241125e2bc1SJ. German Rivera #else 242125e2bc1SJ. German Rivera #error "CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET not defined" 243125e2bc1SJ. German Rivera #endif 244125e2bc1SJ. German Rivera 245125e2bc1SJ. German Rivera /* 246125e2bc1SJ. German Rivera * Load the MC DPC blob in the MC private DRAM block: 247125e2bc1SJ. German Rivera */ 248125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR 249125e2bc1SJ. German Rivera printf("MC DPC is preloaded to %#llx\n", mc_ram_addr + mc_dpc_offset); 250125e2bc1SJ. German Rivera #else 251125e2bc1SJ. German Rivera /* 252125e2bc1SJ. German Rivera * Get address and size of the DPC blob stored in flash: 253125e2bc1SJ. German Rivera */ 254fb4a87a7SPrabhakar Kushwaha dpc_fdt_hdr = (void *)mc_dpc_addr; 255125e2bc1SJ. German Rivera 256125e2bc1SJ. German Rivera error = fdt_check_header(dpc_fdt_hdr); 257125e2bc1SJ. German Rivera if (error != 0) { 258125e2bc1SJ. German Rivera /* 259125e2bc1SJ. German Rivera * Don't return with error here, since the MC firmware can 260125e2bc1SJ. German Rivera * still boot without a DPC 261125e2bc1SJ. German Rivera */ 262cc088c3aSJ. German Rivera printf("\nfsl-mc: WARNING: No DPC image found"); 263125e2bc1SJ. German Rivera return 0; 264125e2bc1SJ. German Rivera } 265125e2bc1SJ. German Rivera 266125e2bc1SJ. German Rivera dpc_size = fdt_totalsize(dpc_fdt_hdr); 267125e2bc1SJ. German Rivera if (dpc_size > CONFIG_SYS_LS_MC_DPC_MAX_LENGTH) { 268cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPC image (too large: %d)\n", 269125e2bc1SJ. German Rivera dpc_size); 270125e2bc1SJ. German Rivera return -EINVAL; 271125e2bc1SJ. German Rivera } 272125e2bc1SJ. German Rivera 273125e2bc1SJ. German Rivera mc_copy_image("MC DPC blob", 274125e2bc1SJ. German Rivera (u64)dpc_fdt_hdr, dpc_size, mc_ram_addr + mc_dpc_offset); 275125e2bc1SJ. German Rivera #endif /* not defined CONFIG_SYS_LS_MC_DPC_IN_DDR */ 276125e2bc1SJ. German Rivera 27721c69870SStuart Yoder if (mc_fixup_dpc(mc_ram_addr + mc_dpc_offset)) 27821c69870SStuart Yoder return -EINVAL; 27921c69870SStuart Yoder 280125e2bc1SJ. German Rivera dump_ram_words("DPC", (void *)(mc_ram_addr + mc_dpc_offset)); 281125e2bc1SJ. German Rivera return 0; 282125e2bc1SJ. German Rivera } 283125e2bc1SJ. German Rivera 284fb4a87a7SPrabhakar Kushwaha static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpl_addr) 285125e2bc1SJ. German Rivera { 286125e2bc1SJ. German Rivera u64 mc_dpl_offset; 287125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_DPL_IN_DDR 288125e2bc1SJ. German Rivera int error; 289125e2bc1SJ. German Rivera void *dpl_fdt_hdr; 290125e2bc1SJ. German Rivera int dpl_size; 291125e2bc1SJ. German Rivera #endif 292125e2bc1SJ. German Rivera 293125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET 294125e2bc1SJ. German Rivera BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET & 0x3) != 0 || 295125e2bc1SJ. German Rivera CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET > 0xffffffff); 296125e2bc1SJ. German Rivera 297125e2bc1SJ. German Rivera mc_dpl_offset = CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET; 298125e2bc1SJ. German Rivera #else 299125e2bc1SJ. German Rivera #error "CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET not defined" 300125e2bc1SJ. German Rivera #endif 301125e2bc1SJ. German Rivera 302125e2bc1SJ. German Rivera /* 303125e2bc1SJ. German Rivera * Load the MC DPL blob in the MC private DRAM block: 304125e2bc1SJ. German Rivera */ 305125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_DPL_IN_DDR 306125e2bc1SJ. German Rivera printf("MC DPL is preloaded to %#llx\n", mc_ram_addr + mc_dpl_offset); 307125e2bc1SJ. German Rivera #else 308125e2bc1SJ. German Rivera /* 309125e2bc1SJ. German Rivera * Get address and size of the DPL blob stored in flash: 310125e2bc1SJ. German Rivera */ 311fb4a87a7SPrabhakar Kushwaha dpl_fdt_hdr = (void *)mc_dpl_addr; 312125e2bc1SJ. German Rivera 313125e2bc1SJ. German Rivera error = fdt_check_header(dpl_fdt_hdr); 314125e2bc1SJ. German Rivera if (error != 0) { 315cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPL image (bad header)\n"); 316125e2bc1SJ. German Rivera return error; 317125e2bc1SJ. German Rivera } 318125e2bc1SJ. German Rivera 319125e2bc1SJ. German Rivera dpl_size = fdt_totalsize(dpl_fdt_hdr); 320125e2bc1SJ. German Rivera if (dpl_size > CONFIG_SYS_LS_MC_DPL_MAX_LENGTH) { 321cc088c3aSJ. German Rivera printf("\nfsl-mc: ERROR: Bad DPL image (too large: %d)\n", 322125e2bc1SJ. German Rivera dpl_size); 323125e2bc1SJ. German Rivera return -EINVAL; 324125e2bc1SJ. German Rivera } 325125e2bc1SJ. German Rivera 326125e2bc1SJ. German Rivera mc_copy_image("MC DPL blob", 327125e2bc1SJ. German Rivera (u64)dpl_fdt_hdr, dpl_size, mc_ram_addr + mc_dpl_offset); 328125e2bc1SJ. German Rivera #endif /* not defined CONFIG_SYS_LS_MC_DPL_IN_DDR */ 329125e2bc1SJ. German Rivera 330125e2bc1SJ. German Rivera dump_ram_words("DPL", (void *)(mc_ram_addr + mc_dpl_offset)); 331125e2bc1SJ. German Rivera return 0; 332125e2bc1SJ. German Rivera } 333125e2bc1SJ. German Rivera 334125e2bc1SJ. German Rivera /** 335125e2bc1SJ. German Rivera * Return the MC boot timeout value in milliseconds 336125e2bc1SJ. German Rivera */ 337125e2bc1SJ. German Rivera static unsigned long get_mc_boot_timeout_ms(void) 338125e2bc1SJ. German Rivera { 339125e2bc1SJ. German Rivera unsigned long timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS; 340125e2bc1SJ. German Rivera 341125e2bc1SJ. German Rivera char *timeout_ms_env_var = getenv(MC_BOOT_TIMEOUT_ENV_VAR); 342125e2bc1SJ. German Rivera 343125e2bc1SJ. German Rivera if (timeout_ms_env_var) { 344125e2bc1SJ. German Rivera timeout_ms = simple_strtoul(timeout_ms_env_var, NULL, 10); 345125e2bc1SJ. German Rivera if (timeout_ms == 0) { 346125e2bc1SJ. German Rivera printf("fsl-mc: WARNING: Invalid value for \'" 347125e2bc1SJ. German Rivera MC_BOOT_TIMEOUT_ENV_VAR 348125e2bc1SJ. German Rivera "\' environment variable: %lu\n", 349125e2bc1SJ. German Rivera timeout_ms); 350125e2bc1SJ. German Rivera 351125e2bc1SJ. German Rivera timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS; 352125e2bc1SJ. German Rivera } 353125e2bc1SJ. German Rivera } 354125e2bc1SJ. German Rivera 355125e2bc1SJ. German Rivera return timeout_ms; 356125e2bc1SJ. German Rivera } 357125e2bc1SJ. German Rivera 358fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 359fb4a87a7SPrabhakar Kushwaha static int load_mc_aiop_img(u64 aiop_fw_addr) 360c1000c12SJ. German Rivera { 361fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 362fb4a87a7SPrabhakar Kushwaha #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR 363c1000c12SJ. German Rivera void *aiop_img; 364fb4a87a7SPrabhakar Kushwaha #endif 365c1000c12SJ. German Rivera 366c1000c12SJ. German Rivera /* 367c1000c12SJ. German Rivera * Load the MC AIOP image in the MC private DRAM block: 368c1000c12SJ. German Rivera */ 369c1000c12SJ. German Rivera 370fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR 371fb4a87a7SPrabhakar Kushwaha printf("MC AIOP is preloaded to %#llx\n", mc_ram_addr + 372fb4a87a7SPrabhakar Kushwaha CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); 373fb4a87a7SPrabhakar Kushwaha #else 374fb4a87a7SPrabhakar Kushwaha aiop_img = (void *)aiop_fw_addr; 375c1000c12SJ. German Rivera mc_copy_image("MC AIOP image", 376c1000c12SJ. German Rivera (u64)aiop_img, CONFIG_SYS_LS_MC_AIOP_IMG_MAX_LENGTH, 377c1000c12SJ. German Rivera mc_ram_addr + CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); 378fb4a87a7SPrabhakar Kushwaha #endif 379fb4a87a7SPrabhakar Kushwaha mc_aiop_applied = 0; 380c1000c12SJ. German Rivera 381c1000c12SJ. German Rivera return 0; 382c1000c12SJ. German Rivera } 383c1000c12SJ. German Rivera #endif 384fb4a87a7SPrabhakar Kushwaha 385125e2bc1SJ. German Rivera static int wait_for_mc(bool booting_mc, u32 *final_reg_gsr) 386125e2bc1SJ. German Rivera { 387125e2bc1SJ. German Rivera u32 reg_gsr; 388125e2bc1SJ. German Rivera u32 mc_fw_boot_status; 389125e2bc1SJ. German Rivera unsigned long timeout_ms = get_mc_boot_timeout_ms(); 390125e2bc1SJ. German Rivera struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 391125e2bc1SJ. German Rivera 392125e2bc1SJ. German Rivera dmb(); 393125e2bc1SJ. German Rivera assert(timeout_ms > 0); 394125e2bc1SJ. German Rivera for (;;) { 395125e2bc1SJ. German Rivera udelay(1000); /* throttle polling */ 396125e2bc1SJ. German Rivera reg_gsr = in_le32(&mc_ccsr_regs->reg_gsr); 397125e2bc1SJ. German Rivera mc_fw_boot_status = (reg_gsr & GSR_FS_MASK); 398125e2bc1SJ. German Rivera if (mc_fw_boot_status & 0x1) 399125e2bc1SJ. German Rivera break; 400125e2bc1SJ. German Rivera 401125e2bc1SJ. German Rivera timeout_ms--; 402125e2bc1SJ. German Rivera if (timeout_ms == 0) 403125e2bc1SJ. German Rivera break; 404125e2bc1SJ. German Rivera } 405125e2bc1SJ. German Rivera 406125e2bc1SJ. German Rivera if (timeout_ms == 0) { 407cc088c3aSJ. German Rivera printf("ERROR: timeout\n"); 408125e2bc1SJ. German Rivera 409125e2bc1SJ. German Rivera /* TODO: Get an error status from an MC CCSR register */ 410125e2bc1SJ. German Rivera return -ETIMEDOUT; 411125e2bc1SJ. German Rivera } 412125e2bc1SJ. German Rivera 413125e2bc1SJ. German Rivera if (mc_fw_boot_status != 0x1) { 414125e2bc1SJ. German Rivera /* 415125e2bc1SJ. German Rivera * TODO: Identify critical errors from the GSR register's FS 416125e2bc1SJ. German Rivera * field and for those errors, set error to -ENODEV or other 417125e2bc1SJ. German Rivera * appropriate errno, so that the status property is set to 418125e2bc1SJ. German Rivera * failure in the fsl,dprc device tree node. 419125e2bc1SJ. German Rivera */ 420cc088c3aSJ. German Rivera printf("WARNING: Firmware returned an error (GSR: %#x)\n", 421125e2bc1SJ. German Rivera reg_gsr); 422125e2bc1SJ. German Rivera } else { 423cc088c3aSJ. German Rivera printf("SUCCESS\n"); 424125e2bc1SJ. German Rivera } 425cc088c3aSJ. German Rivera 426125e2bc1SJ. German Rivera 427125e2bc1SJ. German Rivera *final_reg_gsr = reg_gsr; 428125e2bc1SJ. German Rivera return 0; 429125e2bc1SJ. German Rivera } 4307b3bd9a7SJ. German Rivera 431fb4a87a7SPrabhakar Kushwaha int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr) 4327b3bd9a7SJ. German Rivera { 4337b3bd9a7SJ. German Rivera int error = 0; 434a2a55e51SPrabhakar Kushwaha int portal_id = 0; 4357b3bd9a7SJ. German Rivera struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 436fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 4377b3bd9a7SJ. German Rivera u32 reg_gsr; 438125e2bc1SJ. German Rivera u32 reg_mcfbalr; 439125e2bc1SJ. German Rivera #ifndef CONFIG_SYS_LS_MC_FW_IN_DDR 4407b3bd9a7SJ. German Rivera const void *raw_image_addr; 4417b3bd9a7SJ. German Rivera size_t raw_image_size = 0; 442125e2bc1SJ. German Rivera #endif 4437b3bd9a7SJ. German Rivera struct mc_version mc_ver_info; 444125e2bc1SJ. German Rivera u64 mc_ram_aligned_base_addr; 445125e2bc1SJ. German Rivera u8 mc_ram_num_256mb_blocks; 446125e2bc1SJ. German Rivera size_t mc_ram_size = mc_get_dram_block_size(); 4477b3bd9a7SJ. German Rivera 4487b3bd9a7SJ. German Rivera 449125e2bc1SJ. German Rivera error = calculate_mc_private_ram_params(mc_ram_addr, 450125e2bc1SJ. German Rivera mc_ram_size, 451125e2bc1SJ. German Rivera &mc_ram_aligned_base_addr, 452125e2bc1SJ. German Rivera &mc_ram_num_256mb_blocks); 453125e2bc1SJ. German Rivera if (error != 0) 454125e2bc1SJ. German Rivera goto out; 455125e2bc1SJ. German Rivera 4567b3bd9a7SJ. German Rivera /* 4577b3bd9a7SJ. German Rivera * Management Complex cores should be held at reset out of POR. 458*a187559eSBin Meng * U-Boot should be the first software to touch MC. To be safe, 4597b3bd9a7SJ. German Rivera * we reset all cores again by setting GCR1 to 0. It doesn't do 4607b3bd9a7SJ. German Rivera * anything if they are held at reset. After we setup the firmware 4617b3bd9a7SJ. German Rivera * we kick off MC by deasserting the reset bit for core 0, and 4627b3bd9a7SJ. German Rivera * deasserting the reset bits for Command Portal Managers. 4637b3bd9a7SJ. German Rivera * The stop bits are not touched here. They are used to stop the 4647b3bd9a7SJ. German Rivera * cores when they are active. Setting stop bits doesn't stop the 4657b3bd9a7SJ. German Rivera * cores from fetching instructions when they are released from 4667b3bd9a7SJ. German Rivera * reset. 4677b3bd9a7SJ. German Rivera */ 4687b3bd9a7SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gcr1, 0); 4697b3bd9a7SJ. German Rivera dmb(); 4707b3bd9a7SJ. German Rivera 471125e2bc1SJ. German Rivera #ifdef CONFIG_SYS_LS_MC_FW_IN_DDR 472125e2bc1SJ. German Rivera printf("MC firmware is preloaded to %#llx\n", mc_ram_addr); 473125e2bc1SJ. German Rivera #else 474fb4a87a7SPrabhakar Kushwaha error = parse_mc_firmware_fit_image(mc_fw_addr, &raw_image_addr, 475fb4a87a7SPrabhakar Kushwaha &raw_image_size); 4767b3bd9a7SJ. German Rivera if (error != 0) 4777b3bd9a7SJ. German Rivera goto out; 4787b3bd9a7SJ. German Rivera /* 4797b3bd9a7SJ. German Rivera * Load the MC FW at the beginning of the MC private DRAM block: 4807b3bd9a7SJ. German Rivera */ 4817b3bd9a7SJ. German Rivera mc_copy_image("MC Firmware", 4827b3bd9a7SJ. German Rivera (u64)raw_image_addr, raw_image_size, mc_ram_addr); 4837b3bd9a7SJ. German Rivera #endif 484125e2bc1SJ. German Rivera dump_ram_words("firmware", (void *)mc_ram_addr); 4857b3bd9a7SJ. German Rivera 486fb4a87a7SPrabhakar Kushwaha error = load_mc_dpc(mc_ram_addr, mc_ram_size, mc_dpc_addr); 487125e2bc1SJ. German Rivera if (error != 0) 4887b3bd9a7SJ. German Rivera goto out; 4897b3bd9a7SJ. German Rivera 4907b3bd9a7SJ. German Rivera debug("mc_ccsr_regs %p\n", mc_ccsr_regs); 491125e2bc1SJ. German Rivera dump_mc_ccsr_regs(mc_ccsr_regs); 4927b3bd9a7SJ. German Rivera 4937b3bd9a7SJ. German Rivera /* 494125e2bc1SJ. German Rivera * Tell MC what is the address range of the DRAM block assigned to it: 4957b3bd9a7SJ. German Rivera */ 496125e2bc1SJ. German Rivera reg_mcfbalr = (u32)mc_ram_aligned_base_addr | 497125e2bc1SJ. German Rivera (mc_ram_num_256mb_blocks - 1); 498125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_mcfbalr, reg_mcfbalr); 499125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_mcfbahr, 500125e2bc1SJ. German Rivera (u32)(mc_ram_aligned_base_addr >> 32)); 50139da644eSStuart Yoder out_le32(&mc_ccsr_regs->reg_mcfapr, FSL_BYPASS_AMQ); 5027b3bd9a7SJ. German Rivera 5037b3bd9a7SJ. German Rivera /* 504125e2bc1SJ. German Rivera * Tell the MC that we want delayed DPL deployment. 5057b3bd9a7SJ. German Rivera */ 506125e2bc1SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gsr, 0xDD00); 5077b3bd9a7SJ. German Rivera 508cc088c3aSJ. German Rivera printf("\nfsl-mc: Booting Management Complex ... "); 5097b3bd9a7SJ. German Rivera 5107b3bd9a7SJ. German Rivera /* 5117b3bd9a7SJ. German Rivera * Deassert reset and release MC core 0 to run 5127b3bd9a7SJ. German Rivera */ 5137b3bd9a7SJ. German Rivera out_le32(&mc_ccsr_regs->reg_gcr1, GCR1_P1_DE_RST | GCR1_M_ALL_DE_RST); 514125e2bc1SJ. German Rivera error = wait_for_mc(true, ®_gsr); 515125e2bc1SJ. German Rivera if (error != 0) 5167b3bd9a7SJ. German Rivera goto out; 5177b3bd9a7SJ. German Rivera 5187b3bd9a7SJ. German Rivera /* 5197b3bd9a7SJ. German Rivera * TODO: need to obtain the portal_id for the root container from the 5207b3bd9a7SJ. German Rivera * DPL 5217b3bd9a7SJ. German Rivera */ 5227b3bd9a7SJ. German Rivera portal_id = 0; 5237b3bd9a7SJ. German Rivera 5247b3bd9a7SJ. German Rivera /* 525a2a55e51SPrabhakar Kushwaha * Initialize the global default MC portal 526a2a55e51SPrabhakar Kushwaha * And check that the MC firmware is responding portal commands: 5277b3bd9a7SJ. German Rivera */ 5281730a17dSPrabhakar Kushwaha root_mc_io = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io)); 5291730a17dSPrabhakar Kushwaha if (!root_mc_io) { 530a2a55e51SPrabhakar Kushwaha printf(" No memory: malloc() failed\n"); 531a2a55e51SPrabhakar Kushwaha return -ENOMEM; 532a2a55e51SPrabhakar Kushwaha } 5337b3bd9a7SJ. German Rivera 5341730a17dSPrabhakar Kushwaha root_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(portal_id); 535a2a55e51SPrabhakar Kushwaha debug("Checking access to MC portal of root DPRC container (portal_id %d, portal physical addr %p)\n", 5361730a17dSPrabhakar Kushwaha portal_id, root_mc_io->mmio_regs); 537a2a55e51SPrabhakar Kushwaha 5381730a17dSPrabhakar Kushwaha error = mc_get_version(root_mc_io, MC_CMD_NO_FLAGS, &mc_ver_info); 5397b3bd9a7SJ. German Rivera if (error != 0) { 5407b3bd9a7SJ. German Rivera printf("fsl-mc: ERROR: Firmware version check failed (error: %d)\n", 5417b3bd9a7SJ. German Rivera error); 5427b3bd9a7SJ. German Rivera goto out; 5437b3bd9a7SJ. German Rivera } 5447b3bd9a7SJ. German Rivera 5457b3bd9a7SJ. German Rivera printf("fsl-mc: Management Complex booted (version: %d.%d.%d, boot status: %#x)\n", 5467b3bd9a7SJ. German Rivera mc_ver_info.major, mc_ver_info.minor, mc_ver_info.revision, 547125e2bc1SJ. German Rivera reg_gsr & GSR_FS_MASK); 548125e2bc1SJ. German Rivera 5497b3bd9a7SJ. German Rivera out: 5507b3bd9a7SJ. German Rivera if (error != 0) 5512b7c4a19SPrabhakar Kushwaha mc_boot_status = error; 5527b3bd9a7SJ. German Rivera else 5537b3bd9a7SJ. German Rivera mc_boot_status = 0; 5547b3bd9a7SJ. German Rivera 5557b3bd9a7SJ. German Rivera return error; 5567b3bd9a7SJ. German Rivera } 5577b3bd9a7SJ. German Rivera 558fb4a87a7SPrabhakar Kushwaha int mc_apply_dpl(u64 mc_dpl_addr) 559fb4a87a7SPrabhakar Kushwaha { 560fb4a87a7SPrabhakar Kushwaha struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; 561fb4a87a7SPrabhakar Kushwaha int error = 0; 562fb4a87a7SPrabhakar Kushwaha u32 reg_gsr; 563fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr = mc_get_dram_addr(); 564fb4a87a7SPrabhakar Kushwaha size_t mc_ram_size = mc_get_dram_block_size(); 565fb4a87a7SPrabhakar Kushwaha 566fb4a87a7SPrabhakar Kushwaha error = load_mc_dpl(mc_ram_addr, mc_ram_size, mc_dpl_addr); 567fb4a87a7SPrabhakar Kushwaha if (error != 0) 568fb4a87a7SPrabhakar Kushwaha return error; 569fb4a87a7SPrabhakar Kushwaha 570fb4a87a7SPrabhakar Kushwaha /* 571fb4a87a7SPrabhakar Kushwaha * Tell the MC to deploy the DPL: 572fb4a87a7SPrabhakar Kushwaha */ 573fb4a87a7SPrabhakar Kushwaha out_le32(&mc_ccsr_regs->reg_gsr, 0x0); 574fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: Deploying data path layout ... "); 575fb4a87a7SPrabhakar Kushwaha error = wait_for_mc(false, ®_gsr); 576fb4a87a7SPrabhakar Kushwaha 577fb4a87a7SPrabhakar Kushwaha if (!error) 578fb4a87a7SPrabhakar Kushwaha mc_dpl_applied = 0; 579fb4a87a7SPrabhakar Kushwaha 580fb4a87a7SPrabhakar Kushwaha return error; 581fb4a87a7SPrabhakar Kushwaha } 582fb4a87a7SPrabhakar Kushwaha 5837b3bd9a7SJ. German Rivera int get_mc_boot_status(void) 5847b3bd9a7SJ. German Rivera { 5857b3bd9a7SJ. German Rivera return mc_boot_status; 5867b3bd9a7SJ. German Rivera } 5877b3bd9a7SJ. German Rivera 588fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 589fb4a87a7SPrabhakar Kushwaha int get_aiop_apply_status(void) 590fb4a87a7SPrabhakar Kushwaha { 591fb4a87a7SPrabhakar Kushwaha return mc_aiop_applied; 592fb4a87a7SPrabhakar Kushwaha } 593fb4a87a7SPrabhakar Kushwaha #endif 594fb4a87a7SPrabhakar Kushwaha 595fb4a87a7SPrabhakar Kushwaha int get_dpl_apply_status(void) 596fb4a87a7SPrabhakar Kushwaha { 597fb4a87a7SPrabhakar Kushwaha return mc_dpl_applied; 598fb4a87a7SPrabhakar Kushwaha } 599fb4a87a7SPrabhakar Kushwaha 600fb4a87a7SPrabhakar Kushwaha /** 601fb4a87a7SPrabhakar Kushwaha * Return the MC address of private DRAM block. 602fb4a87a7SPrabhakar Kushwaha */ 603fb4a87a7SPrabhakar Kushwaha u64 mc_get_dram_addr(void) 604fb4a87a7SPrabhakar Kushwaha { 605fb4a87a7SPrabhakar Kushwaha u64 mc_ram_addr; 606fb4a87a7SPrabhakar Kushwaha 607fb4a87a7SPrabhakar Kushwaha /* 608fb4a87a7SPrabhakar Kushwaha * The MC private DRAM block was already carved at the end of DRAM 609fb4a87a7SPrabhakar Kushwaha * by board_init_f() using CONFIG_SYS_MEM_TOP_HIDE: 610fb4a87a7SPrabhakar Kushwaha */ 611fb4a87a7SPrabhakar Kushwaha if (gd->bd->bi_dram[1].start) { 612fb4a87a7SPrabhakar Kushwaha mc_ram_addr = 613fb4a87a7SPrabhakar Kushwaha gd->bd->bi_dram[1].start + gd->bd->bi_dram[1].size; 614fb4a87a7SPrabhakar Kushwaha } else { 615fb4a87a7SPrabhakar Kushwaha mc_ram_addr = 616fb4a87a7SPrabhakar Kushwaha gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size; 617fb4a87a7SPrabhakar Kushwaha } 618fb4a87a7SPrabhakar Kushwaha 619fb4a87a7SPrabhakar Kushwaha return mc_ram_addr; 620fb4a87a7SPrabhakar Kushwaha } 621fb4a87a7SPrabhakar Kushwaha 6227b3bd9a7SJ. German Rivera /** 6237b3bd9a7SJ. German Rivera * Return the actual size of the MC private DRAM block. 6247b3bd9a7SJ. German Rivera */ 6257b3bd9a7SJ. German Rivera unsigned long mc_get_dram_block_size(void) 6267b3bd9a7SJ. German Rivera { 627125e2bc1SJ. German Rivera unsigned long dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE; 628125e2bc1SJ. German Rivera 629125e2bc1SJ. German Rivera char *dram_block_size_env_var = getenv(MC_MEM_SIZE_ENV_VAR); 630125e2bc1SJ. German Rivera 631125e2bc1SJ. German Rivera if (dram_block_size_env_var) { 632125e2bc1SJ. German Rivera dram_block_size = simple_strtoul(dram_block_size_env_var, NULL, 633125e2bc1SJ. German Rivera 10); 634125e2bc1SJ. German Rivera 635125e2bc1SJ. German Rivera if (dram_block_size < CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE) { 636125e2bc1SJ. German Rivera printf("fsl-mc: WARNING: Invalid value for \'" 637125e2bc1SJ. German Rivera MC_MEM_SIZE_ENV_VAR 638125e2bc1SJ. German Rivera "\' environment variable: %lu\n", 639125e2bc1SJ. German Rivera dram_block_size); 640125e2bc1SJ. German Rivera 641125e2bc1SJ. German Rivera dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE; 642125e2bc1SJ. German Rivera } 643125e2bc1SJ. German Rivera } 644125e2bc1SJ. German Rivera 645125e2bc1SJ. German Rivera return dram_block_size; 6467b3bd9a7SJ. German Rivera } 647a2a55e51SPrabhakar Kushwaha 6481730a17dSPrabhakar Kushwaha int fsl_mc_ldpaa_init(bd_t *bis) 6491730a17dSPrabhakar Kushwaha { 650c919ab9eSPrabhakar Kushwaha int i; 651c919ab9eSPrabhakar Kushwaha 652c919ab9eSPrabhakar Kushwaha for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) 653c919ab9eSPrabhakar Kushwaha if ((wriop_is_enabled_dpmac(i) == 1) && 654c919ab9eSPrabhakar Kushwaha (wriop_get_phy_address(i) != -1)) 655c919ab9eSPrabhakar Kushwaha ldpaa_eth_init(i, wriop_get_enet_if(i)); 6561730a17dSPrabhakar Kushwaha return 0; 6571730a17dSPrabhakar Kushwaha } 6581730a17dSPrabhakar Kushwaha 6599a696f56SPrabhakar Kushwaha static int dprc_version_check(struct fsl_mc_io *mc_io, uint16_t handle) 6609a696f56SPrabhakar Kushwaha { 6619a696f56SPrabhakar Kushwaha struct dprc_attributes attr; 6629a696f56SPrabhakar Kushwaha int error; 6639a696f56SPrabhakar Kushwaha 6649a696f56SPrabhakar Kushwaha memset(&attr, 0, sizeof(struct dprc_attributes)); 6659a696f56SPrabhakar Kushwaha error = dprc_get_attributes(mc_io, MC_CMD_NO_FLAGS, handle, &attr); 6669a696f56SPrabhakar Kushwaha if (error == 0) { 6679a696f56SPrabhakar Kushwaha if ((attr.version.major != DPRC_VER_MAJOR) || 6689a696f56SPrabhakar Kushwaha (attr.version.minor != DPRC_VER_MINOR)) { 6699a696f56SPrabhakar Kushwaha printf("DPRC version mismatch found %u.%u,", 6709a696f56SPrabhakar Kushwaha attr.version.major, 6719a696f56SPrabhakar Kushwaha attr.version.minor); 6729a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 6739a696f56SPrabhakar Kushwaha DPRC_VER_MAJOR, DPRC_VER_MINOR); 6749a696f56SPrabhakar Kushwaha } 6759a696f56SPrabhakar Kushwaha } 6769a696f56SPrabhakar Kushwaha return error; 6779a696f56SPrabhakar Kushwaha } 6789a696f56SPrabhakar Kushwaha 6791730a17dSPrabhakar Kushwaha static int dpio_init(void) 680a2a55e51SPrabhakar Kushwaha { 681a2a55e51SPrabhakar Kushwaha struct qbman_swp_desc p_des; 682a2a55e51SPrabhakar Kushwaha struct dpio_attr attr; 6831730a17dSPrabhakar Kushwaha struct dpio_cfg dpio_cfg; 684a2a55e51SPrabhakar Kushwaha int err = 0; 685a2a55e51SPrabhakar Kushwaha 686a2a55e51SPrabhakar Kushwaha dflt_dpio = (struct fsl_dpio_obj *)malloc(sizeof(struct fsl_dpio_obj)); 687a2a55e51SPrabhakar Kushwaha if (!dflt_dpio) { 688a2a55e51SPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 6891730a17dSPrabhakar Kushwaha err = -ENOMEM; 6901730a17dSPrabhakar Kushwaha goto err_malloc; 691a2a55e51SPrabhakar Kushwaha } 692a2a55e51SPrabhakar Kushwaha 6931730a17dSPrabhakar Kushwaha dpio_cfg.channel_mode = DPIO_LOCAL_CHANNEL; 6941730a17dSPrabhakar Kushwaha dpio_cfg.num_priorities = 8; 695a2a55e51SPrabhakar Kushwaha 6961730a17dSPrabhakar Kushwaha err = dpio_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpio_cfg, 6971730a17dSPrabhakar Kushwaha &dflt_dpio->dpio_handle); 6981730a17dSPrabhakar Kushwaha if (err < 0) { 6991730a17dSPrabhakar Kushwaha printf("dpio_create() failed: %d\n", err); 7001730a17dSPrabhakar Kushwaha err = -ENODEV; 7011730a17dSPrabhakar Kushwaha goto err_create; 702a2a55e51SPrabhakar Kushwaha } 703a2a55e51SPrabhakar Kushwaha 7041730a17dSPrabhakar Kushwaha memset(&attr, 0, sizeof(struct dpio_attr)); 70587457d11SPrabhakar Kushwaha err = dpio_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 7061730a17dSPrabhakar Kushwaha dflt_dpio->dpio_handle, &attr); 7071730a17dSPrabhakar Kushwaha if (err < 0) { 7081730a17dSPrabhakar Kushwaha printf("dpio_get_attributes() failed: %d\n", err); 709a2a55e51SPrabhakar Kushwaha goto err_get_attr; 710a2a55e51SPrabhakar Kushwaha } 711a2a55e51SPrabhakar Kushwaha 7129a696f56SPrabhakar Kushwaha if ((attr.version.major != DPIO_VER_MAJOR) || 7139a696f56SPrabhakar Kushwaha (attr.version.minor != DPIO_VER_MINOR)) { 7149a696f56SPrabhakar Kushwaha printf("DPIO version mismatch found %u.%u,", 7159a696f56SPrabhakar Kushwaha attr.version.major, attr.version.minor); 7169a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 7179a696f56SPrabhakar Kushwaha DPIO_VER_MAJOR, DPIO_VER_MINOR); 7189a696f56SPrabhakar Kushwaha } 7199a696f56SPrabhakar Kushwaha 7201730a17dSPrabhakar Kushwaha dflt_dpio->dpio_id = attr.id; 7211730a17dSPrabhakar Kushwaha #ifdef DEBUG 7221730a17dSPrabhakar Kushwaha printf("Init: DPIO id=0x%d\n", dflt_dpio->dpio_id); 7231730a17dSPrabhakar Kushwaha #endif 7241730a17dSPrabhakar Kushwaha err = dpio_enable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7251730a17dSPrabhakar Kushwaha if (err < 0) { 726a2a55e51SPrabhakar Kushwaha printf("dpio_enable() failed %d\n", err); 727a2a55e51SPrabhakar Kushwaha goto err_get_enable; 728a2a55e51SPrabhakar Kushwaha } 7291f1c25c7SPrabhakar Kushwaha debug("ce_offset=0x%llx, ci_offset=0x%llx, portalid=%d, prios=%d\n", 7301f1c25c7SPrabhakar Kushwaha attr.qbman_portal_ce_offset, 7311f1c25c7SPrabhakar Kushwaha attr.qbman_portal_ci_offset, 732a2a55e51SPrabhakar Kushwaha attr.qbman_portal_id, 733a2a55e51SPrabhakar Kushwaha attr.num_priorities); 734a2a55e51SPrabhakar Kushwaha 7351f1c25c7SPrabhakar Kushwaha p_des.cena_bar = (void *)(SOC_QBMAN_PORTALS_BASE_ADDR 7361f1c25c7SPrabhakar Kushwaha + attr.qbman_portal_ce_offset); 7371f1c25c7SPrabhakar Kushwaha p_des.cinh_bar = (void *)(SOC_QBMAN_PORTALS_BASE_ADDR 7381f1c25c7SPrabhakar Kushwaha + attr.qbman_portal_ci_offset); 739a2a55e51SPrabhakar Kushwaha 740a2a55e51SPrabhakar Kushwaha dflt_dpio->sw_portal = qbman_swp_init(&p_des); 741a2a55e51SPrabhakar Kushwaha if (dflt_dpio->sw_portal == NULL) { 742a2a55e51SPrabhakar Kushwaha printf("qbman_swp_init() failed\n"); 743a2a55e51SPrabhakar Kushwaha goto err_get_swp_init; 744a2a55e51SPrabhakar Kushwaha } 745a2a55e51SPrabhakar Kushwaha return 0; 746a2a55e51SPrabhakar Kushwaha 747a2a55e51SPrabhakar Kushwaha err_get_swp_init: 7481730a17dSPrabhakar Kushwaha dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 749a2a55e51SPrabhakar Kushwaha err_get_enable: 750a2a55e51SPrabhakar Kushwaha free(dflt_dpio); 7511730a17dSPrabhakar Kushwaha err_get_attr: 7521730a17dSPrabhakar Kushwaha dpio_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7531730a17dSPrabhakar Kushwaha dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7541730a17dSPrabhakar Kushwaha err_create: 7551730a17dSPrabhakar Kushwaha err_malloc: 756a2a55e51SPrabhakar Kushwaha return err; 757a2a55e51SPrabhakar Kushwaha } 758a2a55e51SPrabhakar Kushwaha 7591730a17dSPrabhakar Kushwaha static int dpio_exit(void) 760a2a55e51SPrabhakar Kushwaha { 7611730a17dSPrabhakar Kushwaha int err; 7621730a17dSPrabhakar Kushwaha 7631730a17dSPrabhakar Kushwaha err = dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7641730a17dSPrabhakar Kushwaha if (err < 0) { 7651730a17dSPrabhakar Kushwaha printf("dpio_disable() failed: %d\n", err); 7661730a17dSPrabhakar Kushwaha goto err; 7671730a17dSPrabhakar Kushwaha } 7681730a17dSPrabhakar Kushwaha 7691730a17dSPrabhakar Kushwaha err = dpio_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpio->dpio_handle); 7701730a17dSPrabhakar Kushwaha if (err < 0) { 7711730a17dSPrabhakar Kushwaha printf("dpio_destroy() failed: %d\n", err); 7721730a17dSPrabhakar Kushwaha goto err; 7731730a17dSPrabhakar Kushwaha } 7741730a17dSPrabhakar Kushwaha 7751730a17dSPrabhakar Kushwaha #ifdef DEBUG 7761730a17dSPrabhakar Kushwaha printf("Exit: DPIO id=0x%d\n", dflt_dpio->dpio_id); 7771730a17dSPrabhakar Kushwaha #endif 7781730a17dSPrabhakar Kushwaha 7791730a17dSPrabhakar Kushwaha if (dflt_dpio) 7801730a17dSPrabhakar Kushwaha free(dflt_dpio); 7811730a17dSPrabhakar Kushwaha 7821730a17dSPrabhakar Kushwaha return 0; 7831730a17dSPrabhakar Kushwaha err: 7841730a17dSPrabhakar Kushwaha return err; 7851730a17dSPrabhakar Kushwaha } 7861730a17dSPrabhakar Kushwaha 7871730a17dSPrabhakar Kushwaha static int dprc_init(void) 7881730a17dSPrabhakar Kushwaha { 7891730a17dSPrabhakar Kushwaha int err, child_portal_id, container_id; 7901730a17dSPrabhakar Kushwaha struct dprc_cfg cfg; 7911730a17dSPrabhakar Kushwaha uint64_t mc_portal_offset; 7921730a17dSPrabhakar Kushwaha 7931730a17dSPrabhakar Kushwaha /* Open root container */ 7941730a17dSPrabhakar Kushwaha err = dprc_get_container_id(root_mc_io, MC_CMD_NO_FLAGS, &container_id); 7951730a17dSPrabhakar Kushwaha if (err < 0) { 7961730a17dSPrabhakar Kushwaha printf("dprc_get_container_id(): Root failed: %d\n", err); 7971730a17dSPrabhakar Kushwaha goto err_root_container_id; 7981730a17dSPrabhakar Kushwaha } 7991730a17dSPrabhakar Kushwaha 8001730a17dSPrabhakar Kushwaha #ifdef DEBUG 8011730a17dSPrabhakar Kushwaha printf("Root container id = %d\n", container_id); 8021730a17dSPrabhakar Kushwaha #endif 8031730a17dSPrabhakar Kushwaha err = dprc_open(root_mc_io, MC_CMD_NO_FLAGS, container_id, 8041730a17dSPrabhakar Kushwaha &root_dprc_handle); 8051730a17dSPrabhakar Kushwaha if (err < 0) { 8061730a17dSPrabhakar Kushwaha printf("dprc_open(): Root Container failed: %d\n", err); 8071730a17dSPrabhakar Kushwaha goto err_root_open; 8081730a17dSPrabhakar Kushwaha } 8091730a17dSPrabhakar Kushwaha 8101730a17dSPrabhakar Kushwaha if (!root_dprc_handle) { 8111730a17dSPrabhakar Kushwaha printf("dprc_open(): Root Container Handle is not valid\n"); 8121730a17dSPrabhakar Kushwaha goto err_root_open; 8131730a17dSPrabhakar Kushwaha } 8141730a17dSPrabhakar Kushwaha 8159a696f56SPrabhakar Kushwaha err = dprc_version_check(root_mc_io, root_dprc_handle); 8169a696f56SPrabhakar Kushwaha if (err < 0) { 8179a696f56SPrabhakar Kushwaha printf("dprc_version_check() failed: %d\n", err); 8189a696f56SPrabhakar Kushwaha goto err_root_open; 8199a696f56SPrabhakar Kushwaha } 8209a696f56SPrabhakar Kushwaha 8215373b204SPrabhakar Kushwaha memset(&cfg, 0, sizeof(struct dprc_cfg)); 8221730a17dSPrabhakar Kushwaha cfg.options = DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED | 8231730a17dSPrabhakar Kushwaha DPRC_CFG_OPT_OBJ_CREATE_ALLOWED | 8241730a17dSPrabhakar Kushwaha DPRC_CFG_OPT_ALLOC_ALLOWED; 8251730a17dSPrabhakar Kushwaha cfg.icid = DPRC_GET_ICID_FROM_POOL; 826335b1936SPrabhakar Kushwaha cfg.portal_id = DPRC_GET_PORTAL_ID_FROM_POOL; 8271730a17dSPrabhakar Kushwaha err = dprc_create_container(root_mc_io, MC_CMD_NO_FLAGS, 8281730a17dSPrabhakar Kushwaha root_dprc_handle, 8291730a17dSPrabhakar Kushwaha &cfg, 8301730a17dSPrabhakar Kushwaha &child_dprc_id, 8311730a17dSPrabhakar Kushwaha &mc_portal_offset); 8321730a17dSPrabhakar Kushwaha if (err < 0) { 8331730a17dSPrabhakar Kushwaha printf("dprc_create_container() failed: %d\n", err); 8341730a17dSPrabhakar Kushwaha goto err_create; 8351730a17dSPrabhakar Kushwaha } 8361730a17dSPrabhakar Kushwaha 8371730a17dSPrabhakar Kushwaha dflt_mc_io = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io)); 8381730a17dSPrabhakar Kushwaha if (!dflt_mc_io) { 8391730a17dSPrabhakar Kushwaha err = -ENOMEM; 8401730a17dSPrabhakar Kushwaha printf(" No memory: malloc() failed\n"); 8411730a17dSPrabhakar Kushwaha goto err_malloc; 8421730a17dSPrabhakar Kushwaha } 8431730a17dSPrabhakar Kushwaha 8441730a17dSPrabhakar Kushwaha child_portal_id = MC_PORTAL_OFFSET_TO_PORTAL_ID(mc_portal_offset); 8451730a17dSPrabhakar Kushwaha dflt_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(child_portal_id); 8461730a17dSPrabhakar Kushwaha #ifdef DEBUG 8471730a17dSPrabhakar Kushwaha printf("MC portal of child DPRC container: %d, physical addr %p)\n", 8481730a17dSPrabhakar Kushwaha child_dprc_id, dflt_mc_io->mmio_regs); 8491730a17dSPrabhakar Kushwaha #endif 8501730a17dSPrabhakar Kushwaha 8511730a17dSPrabhakar Kushwaha err = dprc_open(dflt_mc_io, MC_CMD_NO_FLAGS, child_dprc_id, 8521730a17dSPrabhakar Kushwaha &dflt_dprc_handle); 8531730a17dSPrabhakar Kushwaha if (err < 0) { 8541730a17dSPrabhakar Kushwaha printf("dprc_open(): Child container failed: %d\n", err); 8551730a17dSPrabhakar Kushwaha goto err_child_open; 8561730a17dSPrabhakar Kushwaha } 8571730a17dSPrabhakar Kushwaha 8581730a17dSPrabhakar Kushwaha if (!dflt_dprc_handle) { 8591730a17dSPrabhakar Kushwaha printf("dprc_open(): Child container Handle is not valid\n"); 8601730a17dSPrabhakar Kushwaha goto err_child_open; 8611730a17dSPrabhakar Kushwaha } 8621730a17dSPrabhakar Kushwaha 8631730a17dSPrabhakar Kushwaha return 0; 8641730a17dSPrabhakar Kushwaha err_child_open: 8651730a17dSPrabhakar Kushwaha free(dflt_mc_io); 8661730a17dSPrabhakar Kushwaha err_malloc: 8671730a17dSPrabhakar Kushwaha dprc_destroy_container(root_mc_io, MC_CMD_NO_FLAGS, 8681730a17dSPrabhakar Kushwaha root_dprc_handle, child_dprc_id); 8691730a17dSPrabhakar Kushwaha err_create: 8701730a17dSPrabhakar Kushwaha dprc_close(root_mc_io, MC_CMD_NO_FLAGS, root_dprc_handle); 8711730a17dSPrabhakar Kushwaha err_root_open: 8721730a17dSPrabhakar Kushwaha err_root_container_id: 8731730a17dSPrabhakar Kushwaha return err; 8741730a17dSPrabhakar Kushwaha } 8751730a17dSPrabhakar Kushwaha 8761730a17dSPrabhakar Kushwaha static int dprc_exit(void) 8771730a17dSPrabhakar Kushwaha { 8781730a17dSPrabhakar Kushwaha int err; 8791730a17dSPrabhakar Kushwaha 8801730a17dSPrabhakar Kushwaha err = dprc_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle); 8811730a17dSPrabhakar Kushwaha if (err < 0) { 8821730a17dSPrabhakar Kushwaha printf("dprc_close(): Child failed: %d\n", err); 8831730a17dSPrabhakar Kushwaha goto err; 8841730a17dSPrabhakar Kushwaha } 8851730a17dSPrabhakar Kushwaha 8861730a17dSPrabhakar Kushwaha err = dprc_destroy_container(root_mc_io, MC_CMD_NO_FLAGS, 8871730a17dSPrabhakar Kushwaha root_dprc_handle, child_dprc_id); 8881730a17dSPrabhakar Kushwaha if (err < 0) { 8891730a17dSPrabhakar Kushwaha printf("dprc_destroy_container() failed: %d\n", err); 8901730a17dSPrabhakar Kushwaha goto err; 8911730a17dSPrabhakar Kushwaha } 8921730a17dSPrabhakar Kushwaha 8931730a17dSPrabhakar Kushwaha err = dprc_close(root_mc_io, MC_CMD_NO_FLAGS, root_dprc_handle); 8941730a17dSPrabhakar Kushwaha if (err < 0) { 8951730a17dSPrabhakar Kushwaha printf("dprc_close(): Root failed: %d\n", err); 8961730a17dSPrabhakar Kushwaha goto err; 8971730a17dSPrabhakar Kushwaha } 8981730a17dSPrabhakar Kushwaha 8991730a17dSPrabhakar Kushwaha if (dflt_mc_io) 9001730a17dSPrabhakar Kushwaha free(dflt_mc_io); 9011730a17dSPrabhakar Kushwaha 9021730a17dSPrabhakar Kushwaha if (root_mc_io) 9031730a17dSPrabhakar Kushwaha free(root_mc_io); 9041730a17dSPrabhakar Kushwaha 9051730a17dSPrabhakar Kushwaha return 0; 9061730a17dSPrabhakar Kushwaha 9071730a17dSPrabhakar Kushwaha err: 9081730a17dSPrabhakar Kushwaha return err; 9091730a17dSPrabhakar Kushwaha } 9101730a17dSPrabhakar Kushwaha 9111730a17dSPrabhakar Kushwaha static int dpbp_init(void) 9121730a17dSPrabhakar Kushwaha { 9131730a17dSPrabhakar Kushwaha int err; 9141730a17dSPrabhakar Kushwaha struct dpbp_attr dpbp_attr; 9151730a17dSPrabhakar Kushwaha struct dpbp_cfg dpbp_cfg; 9161730a17dSPrabhakar Kushwaha 917a2a55e51SPrabhakar Kushwaha dflt_dpbp = (struct fsl_dpbp_obj *)malloc(sizeof(struct fsl_dpbp_obj)); 918a2a55e51SPrabhakar Kushwaha if (!dflt_dpbp) { 919a2a55e51SPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 9201730a17dSPrabhakar Kushwaha err = -ENOMEM; 9211730a17dSPrabhakar Kushwaha goto err_malloc; 922a2a55e51SPrabhakar Kushwaha } 9231730a17dSPrabhakar Kushwaha 9241730a17dSPrabhakar Kushwaha dpbp_cfg.options = 512; 9251730a17dSPrabhakar Kushwaha 9261730a17dSPrabhakar Kushwaha err = dpbp_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpbp_cfg, 9271730a17dSPrabhakar Kushwaha &dflt_dpbp->dpbp_handle); 9281730a17dSPrabhakar Kushwaha 9291730a17dSPrabhakar Kushwaha if (err < 0) { 9301730a17dSPrabhakar Kushwaha err = -ENODEV; 9311730a17dSPrabhakar Kushwaha printf("dpbp_create() failed: %d\n", err); 9321730a17dSPrabhakar Kushwaha goto err_create; 9331730a17dSPrabhakar Kushwaha } 9341730a17dSPrabhakar Kushwaha 9351730a17dSPrabhakar Kushwaha memset(&dpbp_attr, 0, sizeof(struct dpbp_attr)); 9361730a17dSPrabhakar Kushwaha err = dpbp_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 9371730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_handle, 9381730a17dSPrabhakar Kushwaha &dpbp_attr); 9391730a17dSPrabhakar Kushwaha if (err < 0) { 9401730a17dSPrabhakar Kushwaha printf("dpbp_get_attributes() failed: %d\n", err); 9411730a17dSPrabhakar Kushwaha goto err_get_attr; 9421730a17dSPrabhakar Kushwaha } 9431730a17dSPrabhakar Kushwaha 9449a696f56SPrabhakar Kushwaha if ((dpbp_attr.version.major != DPBP_VER_MAJOR) || 9459a696f56SPrabhakar Kushwaha (dpbp_attr.version.minor != DPBP_VER_MINOR)) { 9469a696f56SPrabhakar Kushwaha printf("DPBP version mismatch found %u.%u,", 9479a696f56SPrabhakar Kushwaha dpbp_attr.version.major, dpbp_attr.version.minor); 9489a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 9499a696f56SPrabhakar Kushwaha DPBP_VER_MAJOR, DPBP_VER_MINOR); 9509a696f56SPrabhakar Kushwaha } 9519a696f56SPrabhakar Kushwaha 9521730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_attr.id = dpbp_attr.id; 9531730a17dSPrabhakar Kushwaha #ifdef DEBUG 9541730a17dSPrabhakar Kushwaha printf("Init: DPBP id=0x%d\n", dflt_dpbp->dpbp_attr.id); 9551730a17dSPrabhakar Kushwaha #endif 9561730a17dSPrabhakar Kushwaha 9571730a17dSPrabhakar Kushwaha err = dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9581730a17dSPrabhakar Kushwaha if (err < 0) { 9591730a17dSPrabhakar Kushwaha printf("dpbp_close() failed: %d\n", err); 9601730a17dSPrabhakar Kushwaha goto err_close; 9611730a17dSPrabhakar Kushwaha } 962a2a55e51SPrabhakar Kushwaha 963a2a55e51SPrabhakar Kushwaha return 0; 9641730a17dSPrabhakar Kushwaha 9651730a17dSPrabhakar Kushwaha err_close: 9661730a17dSPrabhakar Kushwaha free(dflt_dpbp); 9671730a17dSPrabhakar Kushwaha err_get_attr: 9681730a17dSPrabhakar Kushwaha dpbp_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9691730a17dSPrabhakar Kushwaha dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_handle); 9701730a17dSPrabhakar Kushwaha err_create: 9711730a17dSPrabhakar Kushwaha err_malloc: 9721730a17dSPrabhakar Kushwaha return err; 973a2a55e51SPrabhakar Kushwaha } 974a2a55e51SPrabhakar Kushwaha 9751730a17dSPrabhakar Kushwaha static int dpbp_exit(void) 976a2a55e51SPrabhakar Kushwaha { 9771730a17dSPrabhakar Kushwaha int err; 9781730a17dSPrabhakar Kushwaha 9791730a17dSPrabhakar Kushwaha err = dpbp_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpbp->dpbp_attr.id, 9801730a17dSPrabhakar Kushwaha &dflt_dpbp->dpbp_handle); 9811730a17dSPrabhakar Kushwaha if (err < 0) { 9821730a17dSPrabhakar Kushwaha printf("dpbp_open() failed: %d\n", err); 9831730a17dSPrabhakar Kushwaha goto err; 9841730a17dSPrabhakar Kushwaha } 9851730a17dSPrabhakar Kushwaha 9861730a17dSPrabhakar Kushwaha err = dpbp_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, 9871730a17dSPrabhakar Kushwaha dflt_dpbp->dpbp_handle); 9881730a17dSPrabhakar Kushwaha if (err < 0) { 9891730a17dSPrabhakar Kushwaha printf("dpbp_destroy() failed: %d\n", err); 9901730a17dSPrabhakar Kushwaha goto err; 9911730a17dSPrabhakar Kushwaha } 9921730a17dSPrabhakar Kushwaha 9931730a17dSPrabhakar Kushwaha #ifdef DEBUG 9941730a17dSPrabhakar Kushwaha printf("Exit: DPBP id=0x%d\n", dflt_dpbp->dpbp_attr.id); 9951730a17dSPrabhakar Kushwaha #endif 9961730a17dSPrabhakar Kushwaha 9971730a17dSPrabhakar Kushwaha if (dflt_dpbp) 9981730a17dSPrabhakar Kushwaha free(dflt_dpbp); 9991730a17dSPrabhakar Kushwaha return 0; 10001730a17dSPrabhakar Kushwaha 10011730a17dSPrabhakar Kushwaha err: 10021730a17dSPrabhakar Kushwaha return err; 10031730a17dSPrabhakar Kushwaha } 10041730a17dSPrabhakar Kushwaha 10051730a17dSPrabhakar Kushwaha static int dpni_init(void) 10061730a17dSPrabhakar Kushwaha { 10071730a17dSPrabhakar Kushwaha int err; 10081730a17dSPrabhakar Kushwaha struct dpni_attr dpni_attr; 1009879a59acSPrabhakar Kushwaha uint8_t ext_cfg_buf[256] = {0}; 1010879a59acSPrabhakar Kushwaha struct dpni_extended_cfg dpni_extended_cfg; 10111730a17dSPrabhakar Kushwaha struct dpni_cfg dpni_cfg; 10121730a17dSPrabhakar Kushwaha 10131730a17dSPrabhakar Kushwaha dflt_dpni = (struct fsl_dpni_obj *)malloc(sizeof(struct fsl_dpni_obj)); 10141730a17dSPrabhakar Kushwaha if (!dflt_dpni) { 10151730a17dSPrabhakar Kushwaha printf("No memory: malloc() failed\n"); 10161730a17dSPrabhakar Kushwaha err = -ENOMEM; 10171730a17dSPrabhakar Kushwaha goto err_malloc; 10181730a17dSPrabhakar Kushwaha } 10191730a17dSPrabhakar Kushwaha 1020879a59acSPrabhakar Kushwaha memset(&dpni_extended_cfg, 0, sizeof(dpni_extended_cfg)); 1021879a59acSPrabhakar Kushwaha err = dpni_prepare_extended_cfg(&dpni_extended_cfg, &ext_cfg_buf[0]); 1022879a59acSPrabhakar Kushwaha if (err < 0) { 1023879a59acSPrabhakar Kushwaha err = -ENODEV; 1024879a59acSPrabhakar Kushwaha printf("dpni_prepare_extended_cfg() failed: %d\n", err); 1025879a59acSPrabhakar Kushwaha goto err_prepare_extended_cfg; 1026879a59acSPrabhakar Kushwaha } 1027879a59acSPrabhakar Kushwaha 10281730a17dSPrabhakar Kushwaha memset(&dpni_cfg, 0, sizeof(dpni_cfg)); 10291730a17dSPrabhakar Kushwaha dpni_cfg.adv.options = DPNI_OPT_UNICAST_FILTER | 10301730a17dSPrabhakar Kushwaha DPNI_OPT_MULTICAST_FILTER; 10311730a17dSPrabhakar Kushwaha 1032879a59acSPrabhakar Kushwaha dpni_cfg.adv.ext_cfg_iova = (uint64_t)&ext_cfg_buf[0]; 10331730a17dSPrabhakar Kushwaha err = dpni_create(dflt_mc_io, MC_CMD_NO_FLAGS, &dpni_cfg, 10341730a17dSPrabhakar Kushwaha &dflt_dpni->dpni_handle); 10351730a17dSPrabhakar Kushwaha 10361730a17dSPrabhakar Kushwaha if (err < 0) { 10371730a17dSPrabhakar Kushwaha err = -ENODEV; 10381730a17dSPrabhakar Kushwaha printf("dpni_create() failed: %d\n", err); 10391730a17dSPrabhakar Kushwaha goto err_create; 10401730a17dSPrabhakar Kushwaha } 10411730a17dSPrabhakar Kushwaha 10421730a17dSPrabhakar Kushwaha memset(&dpni_attr, 0, sizeof(struct dpni_attr)); 10431730a17dSPrabhakar Kushwaha err = dpni_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, 10441730a17dSPrabhakar Kushwaha dflt_dpni->dpni_handle, 10451730a17dSPrabhakar Kushwaha &dpni_attr); 10461730a17dSPrabhakar Kushwaha if (err < 0) { 10471730a17dSPrabhakar Kushwaha printf("dpni_get_attributes() failed: %d\n", err); 10481730a17dSPrabhakar Kushwaha goto err_get_attr; 10491730a17dSPrabhakar Kushwaha } 10501730a17dSPrabhakar Kushwaha 10519a696f56SPrabhakar Kushwaha if ((dpni_attr.version.major != DPNI_VER_MAJOR) || 10529a696f56SPrabhakar Kushwaha (dpni_attr.version.minor != DPNI_VER_MINOR)) { 10539a696f56SPrabhakar Kushwaha printf("DPNI version mismatch found %u.%u,", 10549a696f56SPrabhakar Kushwaha dpni_attr.version.major, dpni_attr.version.minor); 10559a696f56SPrabhakar Kushwaha printf("supported version is %u.%u\n", 10569a696f56SPrabhakar Kushwaha DPNI_VER_MAJOR, DPNI_VER_MINOR); 10579a696f56SPrabhakar Kushwaha } 10589a696f56SPrabhakar Kushwaha 10591730a17dSPrabhakar Kushwaha dflt_dpni->dpni_id = dpni_attr.id; 10601730a17dSPrabhakar Kushwaha #ifdef DEBUG 10611730a17dSPrabhakar Kushwaha printf("Init: DPNI id=0x%d\n", dflt_dpni->dpni_id); 10621730a17dSPrabhakar Kushwaha #endif 10631730a17dSPrabhakar Kushwaha 10641730a17dSPrabhakar Kushwaha err = dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10651730a17dSPrabhakar Kushwaha if (err < 0) { 10661730a17dSPrabhakar Kushwaha printf("dpni_close() failed: %d\n", err); 10671730a17dSPrabhakar Kushwaha goto err_close; 10681730a17dSPrabhakar Kushwaha } 1069a2a55e51SPrabhakar Kushwaha 1070fb4a87a7SPrabhakar Kushwaha return 0; 10711730a17dSPrabhakar Kushwaha 10721730a17dSPrabhakar Kushwaha err_close: 10731730a17dSPrabhakar Kushwaha err_get_attr: 10741730a17dSPrabhakar Kushwaha dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10751730a17dSPrabhakar Kushwaha dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); 10761730a17dSPrabhakar Kushwaha err_create: 1077879a59acSPrabhakar Kushwaha err_prepare_extended_cfg: 1078879a59acSPrabhakar Kushwaha free(dflt_dpni); 10791730a17dSPrabhakar Kushwaha err_malloc: 10801730a17dSPrabhakar Kushwaha return err; 1081a2a55e51SPrabhakar Kushwaha } 1082a2a55e51SPrabhakar Kushwaha 10831730a17dSPrabhakar Kushwaha static int dpni_exit(void) 1084a2a55e51SPrabhakar Kushwaha { 10851730a17dSPrabhakar Kushwaha int err; 10861730a17dSPrabhakar Kushwaha 10871730a17dSPrabhakar Kushwaha err = dpni_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_id, 10881730a17dSPrabhakar Kushwaha &dflt_dpni->dpni_handle); 10891730a17dSPrabhakar Kushwaha if (err < 0) { 10901730a17dSPrabhakar Kushwaha printf("dpni_open() failed: %d\n", err); 10911730a17dSPrabhakar Kushwaha goto err; 10921730a17dSPrabhakar Kushwaha } 10931730a17dSPrabhakar Kushwaha 10941730a17dSPrabhakar Kushwaha err = dpni_destroy(dflt_mc_io, MC_CMD_NO_FLAGS, 10951730a17dSPrabhakar Kushwaha dflt_dpni->dpni_handle); 10961730a17dSPrabhakar Kushwaha if (err < 0) { 10971730a17dSPrabhakar Kushwaha printf("dpni_destroy() failed: %d\n", err); 10981730a17dSPrabhakar Kushwaha goto err; 10991730a17dSPrabhakar Kushwaha } 11001730a17dSPrabhakar Kushwaha 11011730a17dSPrabhakar Kushwaha #ifdef DEBUG 11021730a17dSPrabhakar Kushwaha printf("Exit: DPNI id=0x%d\n", dflt_dpni->dpni_id); 11031730a17dSPrabhakar Kushwaha #endif 11041730a17dSPrabhakar Kushwaha 11051730a17dSPrabhakar Kushwaha if (dflt_dpni) 11061730a17dSPrabhakar Kushwaha free(dflt_dpni); 11071730a17dSPrabhakar Kushwaha return 0; 11081730a17dSPrabhakar Kushwaha 11091730a17dSPrabhakar Kushwaha err: 11101730a17dSPrabhakar Kushwaha return err; 11111730a17dSPrabhakar Kushwaha } 11121730a17dSPrabhakar Kushwaha 11131730a17dSPrabhakar Kushwaha static int mc_init_object(void) 11141730a17dSPrabhakar Kushwaha { 11151730a17dSPrabhakar Kushwaha int err = 0; 11161730a17dSPrabhakar Kushwaha 11171730a17dSPrabhakar Kushwaha err = dprc_init(); 11181730a17dSPrabhakar Kushwaha if (err < 0) { 11191730a17dSPrabhakar Kushwaha printf("dprc_init() failed: %d\n", err); 11201730a17dSPrabhakar Kushwaha goto err; 11211730a17dSPrabhakar Kushwaha } 11221730a17dSPrabhakar Kushwaha 11231730a17dSPrabhakar Kushwaha err = dpbp_init(); 11241730a17dSPrabhakar Kushwaha if (err < 0) { 11251730a17dSPrabhakar Kushwaha printf("dpbp_init() failed: %d\n", err); 11261730a17dSPrabhakar Kushwaha goto err; 11271730a17dSPrabhakar Kushwaha } 11281730a17dSPrabhakar Kushwaha 11291730a17dSPrabhakar Kushwaha err = dpio_init(); 11301730a17dSPrabhakar Kushwaha if (err < 0) { 11311730a17dSPrabhakar Kushwaha printf("dpio_init() failed: %d\n", err); 11321730a17dSPrabhakar Kushwaha goto err; 11331730a17dSPrabhakar Kushwaha } 11341730a17dSPrabhakar Kushwaha 11351730a17dSPrabhakar Kushwaha err = dpni_init(); 11361730a17dSPrabhakar Kushwaha if (err < 0) { 11371730a17dSPrabhakar Kushwaha printf("dpni_init() failed: %d\n", err); 11381730a17dSPrabhakar Kushwaha goto err; 11391730a17dSPrabhakar Kushwaha } 11401730a17dSPrabhakar Kushwaha 11411730a17dSPrabhakar Kushwaha return 0; 11421730a17dSPrabhakar Kushwaha err: 11431730a17dSPrabhakar Kushwaha return err; 11441730a17dSPrabhakar Kushwaha } 11451730a17dSPrabhakar Kushwaha 11461730a17dSPrabhakar Kushwaha int fsl_mc_ldpaa_exit(bd_t *bd) 11471730a17dSPrabhakar Kushwaha { 11481730a17dSPrabhakar Kushwaha int err = 0; 11491730a17dSPrabhakar Kushwaha 11501730a17dSPrabhakar Kushwaha if (bd && get_mc_boot_status() == -1) 11511730a17dSPrabhakar Kushwaha return 0; 11521730a17dSPrabhakar Kushwaha 11531730a17dSPrabhakar Kushwaha if (bd && !get_mc_boot_status() && get_dpl_apply_status() == -1) { 11541730a17dSPrabhakar Kushwaha printf("ERROR: fsl-mc: DPL is not applied\n"); 11551730a17dSPrabhakar Kushwaha err = -ENODEV; 11561730a17dSPrabhakar Kushwaha return err; 11571730a17dSPrabhakar Kushwaha } 11581730a17dSPrabhakar Kushwaha 11591730a17dSPrabhakar Kushwaha if (bd && !get_mc_boot_status() && !get_dpl_apply_status()) 11601730a17dSPrabhakar Kushwaha return err; 11611730a17dSPrabhakar Kushwaha 11621730a17dSPrabhakar Kushwaha err = dpbp_exit(); 11631730a17dSPrabhakar Kushwaha if (err < 0) { 1164a2a4dc56SPrabhakar Kushwaha printf("dpbp_exit() failed: %d\n", err); 11651730a17dSPrabhakar Kushwaha goto err; 11661730a17dSPrabhakar Kushwaha } 11671730a17dSPrabhakar Kushwaha 11681730a17dSPrabhakar Kushwaha err = dpio_exit(); 11691730a17dSPrabhakar Kushwaha if (err < 0) { 11701730a17dSPrabhakar Kushwaha printf("dpio_exit() failed: %d\n", err); 11711730a17dSPrabhakar Kushwaha goto err; 11721730a17dSPrabhakar Kushwaha } 11731730a17dSPrabhakar Kushwaha 11741730a17dSPrabhakar Kushwaha err = dpni_exit(); 11751730a17dSPrabhakar Kushwaha if (err < 0) { 11761730a17dSPrabhakar Kushwaha printf("dpni_exit() failed: %d\n", err); 11771730a17dSPrabhakar Kushwaha goto err; 11781730a17dSPrabhakar Kushwaha } 11791730a17dSPrabhakar Kushwaha 11801730a17dSPrabhakar Kushwaha err = dprc_exit(); 11811730a17dSPrabhakar Kushwaha if (err < 0) { 11821730a17dSPrabhakar Kushwaha printf("dprc_exit() failed: %d\n", err); 11831730a17dSPrabhakar Kushwaha goto err; 11841730a17dSPrabhakar Kushwaha } 11851730a17dSPrabhakar Kushwaha 11861730a17dSPrabhakar Kushwaha return 0; 11871730a17dSPrabhakar Kushwaha err: 11881730a17dSPrabhakar Kushwaha return err; 1189fb4a87a7SPrabhakar Kushwaha } 1190fb4a87a7SPrabhakar Kushwaha 1191fb4a87a7SPrabhakar Kushwaha static int do_fsl_mc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 1192fb4a87a7SPrabhakar Kushwaha { 1193fb4a87a7SPrabhakar Kushwaha int err = 0; 1194fb4a87a7SPrabhakar Kushwaha if (argc < 3) 1195fb4a87a7SPrabhakar Kushwaha goto usage; 1196fb4a87a7SPrabhakar Kushwaha 1197fb4a87a7SPrabhakar Kushwaha switch (argv[1][0]) { 1198fb4a87a7SPrabhakar Kushwaha case 's': { 1199fb4a87a7SPrabhakar Kushwaha char sub_cmd; 120044937214SPrabhakar Kushwaha u64 mc_fw_addr, mc_dpc_addr; 120144937214SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 120244937214SPrabhakar Kushwaha u64 aiop_fw_addr; 120344937214SPrabhakar Kushwaha #endif 1204fb4a87a7SPrabhakar Kushwaha 1205fb4a87a7SPrabhakar Kushwaha sub_cmd = argv[2][0]; 1206fb4a87a7SPrabhakar Kushwaha switch (sub_cmd) { 1207fb4a87a7SPrabhakar Kushwaha case 'm': 1208fb4a87a7SPrabhakar Kushwaha if (argc < 5) 1209fb4a87a7SPrabhakar Kushwaha goto usage; 1210a2a55e51SPrabhakar Kushwaha 1211125e2bc1SJ. German Rivera if (get_mc_boot_status() == 0) { 1212fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: MC is already booted"); 1213fb4a87a7SPrabhakar Kushwaha printf("\n"); 1214fb4a87a7SPrabhakar Kushwaha return err; 1215a2a55e51SPrabhakar Kushwaha } 1216fb4a87a7SPrabhakar Kushwaha mc_fw_addr = simple_strtoull(argv[3], NULL, 16); 1217fb4a87a7SPrabhakar Kushwaha mc_dpc_addr = simple_strtoull(argv[4], NULL, 1218fb4a87a7SPrabhakar Kushwaha 16); 12191730a17dSPrabhakar Kushwaha 12201730a17dSPrabhakar Kushwaha if (!mc_init(mc_fw_addr, mc_dpc_addr)) 12211730a17dSPrabhakar Kushwaha err = mc_init_object(); 1222fb4a87a7SPrabhakar Kushwaha break; 1223fb4a87a7SPrabhakar Kushwaha 1224fb4a87a7SPrabhakar Kushwaha #ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET 1225fb4a87a7SPrabhakar Kushwaha case 'a': 1226fb4a87a7SPrabhakar Kushwaha if (argc < 4) 1227fb4a87a7SPrabhakar Kushwaha goto usage; 1228fb4a87a7SPrabhakar Kushwaha if (get_aiop_apply_status() == 0) { 1229fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: AIOP FW is already"); 1230fb4a87a7SPrabhakar Kushwaha printf(" applied\n"); 1231fb4a87a7SPrabhakar Kushwaha return err; 1232a2a55e51SPrabhakar Kushwaha } 1233a2a55e51SPrabhakar Kushwaha 1234fb4a87a7SPrabhakar Kushwaha aiop_fw_addr = simple_strtoull(argv[3], NULL, 1235fb4a87a7SPrabhakar Kushwaha 16); 1236fb4a87a7SPrabhakar Kushwaha 1237fb4a87a7SPrabhakar Kushwaha err = load_mc_aiop_img(aiop_fw_addr); 1238fb4a87a7SPrabhakar Kushwaha if (!err) 1239fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: AIOP FW applied\n"); 1240fb4a87a7SPrabhakar Kushwaha break; 1241fb4a87a7SPrabhakar Kushwaha #endif 1242fb4a87a7SPrabhakar Kushwaha default: 1243fb4a87a7SPrabhakar Kushwaha printf("Invalid option: %s\n", argv[2]); 1244fb4a87a7SPrabhakar Kushwaha goto usage; 1245fb4a87a7SPrabhakar Kushwaha 1246fb4a87a7SPrabhakar Kushwaha break; 1247fb4a87a7SPrabhakar Kushwaha } 1248fb4a87a7SPrabhakar Kushwaha } 1249fb4a87a7SPrabhakar Kushwaha break; 1250fb4a87a7SPrabhakar Kushwaha 1251fb4a87a7SPrabhakar Kushwaha case 'a': { 1252fb4a87a7SPrabhakar Kushwaha u64 mc_dpl_addr; 1253fb4a87a7SPrabhakar Kushwaha 1254fb4a87a7SPrabhakar Kushwaha if (argc < 4) 1255fb4a87a7SPrabhakar Kushwaha goto usage; 1256fb4a87a7SPrabhakar Kushwaha 1257fb4a87a7SPrabhakar Kushwaha if (get_dpl_apply_status() == 0) { 1258fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: DPL already applied\n"); 1259fb4a87a7SPrabhakar Kushwaha return err; 1260125e2bc1SJ. German Rivera } 1261125e2bc1SJ. German Rivera 1262fb4a87a7SPrabhakar Kushwaha mc_dpl_addr = simple_strtoull(argv[3], NULL, 1263fb4a87a7SPrabhakar Kushwaha 16); 12641730a17dSPrabhakar Kushwaha 1265fb4a87a7SPrabhakar Kushwaha if (get_mc_boot_status() != 0) { 1266fb4a87a7SPrabhakar Kushwaha printf("fsl-mc: Deploying data path layout .."); 1267fb4a87a7SPrabhakar Kushwaha printf("ERROR (MC is not booted)\n"); 1268fb4a87a7SPrabhakar Kushwaha return -ENODEV; 1269a2a55e51SPrabhakar Kushwaha } 12701730a17dSPrabhakar Kushwaha 12711730a17dSPrabhakar Kushwaha if (!fsl_mc_ldpaa_exit(NULL)) 1272fb4a87a7SPrabhakar Kushwaha err = mc_apply_dpl(mc_dpl_addr); 1273fb4a87a7SPrabhakar Kushwaha break; 1274fb4a87a7SPrabhakar Kushwaha } 1275fb4a87a7SPrabhakar Kushwaha default: 1276fb4a87a7SPrabhakar Kushwaha printf("Invalid option: %s\n", argv[1]); 1277fb4a87a7SPrabhakar Kushwaha goto usage; 1278fb4a87a7SPrabhakar Kushwaha break; 1279fb4a87a7SPrabhakar Kushwaha } 1280fb4a87a7SPrabhakar Kushwaha return err; 1281fb4a87a7SPrabhakar Kushwaha usage: 1282fb4a87a7SPrabhakar Kushwaha return CMD_RET_USAGE; 1283fb4a87a7SPrabhakar Kushwaha } 1284fb4a87a7SPrabhakar Kushwaha 1285fb4a87a7SPrabhakar Kushwaha U_BOOT_CMD( 1286fb4a87a7SPrabhakar Kushwaha fsl_mc, CONFIG_SYS_MAXARGS, 1, do_fsl_mc, 1287fb4a87a7SPrabhakar Kushwaha "DPAA2 command to manage Management Complex (MC)", 1288fb4a87a7SPrabhakar Kushwaha "start mc [FW_addr] [DPC_addr] - Start Management Complex\n" 1289fb4a87a7SPrabhakar Kushwaha "fsl_mc apply DPL [DPL_addr] - Apply DPL file\n" 1290fb4a87a7SPrabhakar Kushwaha "fsl_mc start aiop [FW_addr] - Start AIOP\n" 1291fb4a87a7SPrabhakar Kushwaha ); 1292