drivers: net: fsl-mc: add the nowait option when applying the DPL

The process through which the MC firmware parses the DPL and initializes
all the requested DPAA2 objects is a complex one which can take quite a
bit of time. For the those circumstances in which a fast boot is
required on DPAA2 based SoCs, add the 'nowait' optional parameter for
the fsl_mc [lazy]apply dpl command.

When this option is used, the Linux kernel fsl-mc bus must wait for
the firmware to finish parsing the DPL before proceeding with probing
all the DPAA2 objects.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
This commit is contained in:
Ioana Ciornei
2026-04-01 18:04:45 +03:00
committed by Tom Rini
parent d3c0f53d65
commit f0dbde4675

View File

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2014 Freescale Semiconductor, Inc.
* Copyright 2017-2018, 2020-2021 NXP
* Copyright 2017-2018, 2020-2021, 2025 NXP
*/
#include <config.h>
#include <command.h>
@@ -72,6 +72,7 @@ static u64 mc_lazy_dpl_addr;
static u32 dpsparser_obj_id;
static u16 dpsparser_handle;
static char *mc_err_msg_apply_spb[] = MC_ERROR_MSG_APPLY_SPB;
static bool wait_for_dpl;
#ifdef DEBUG
void dump_ram_words(const char *title, void *addr)
@@ -855,13 +856,20 @@ int mc_apply_dpl(u64 mc_dpl_addr)
* Tell the MC to deploy the DPL:
*/
out_le32(&mc_ccsr_regs->reg_gsr, 0x0);
printf("fsl-mc: Deploying data path layout ... ");
error = wait_for_mc(&reg_gsr);
if (!error)
mc_dpl_applied = 0;
/* Wait for the MC firmware to finish processing the DPL */
if (wait_for_dpl) {
printf("fsl-mc: Deploying data path layout ... ");
error = wait_for_mc(&reg_gsr);
if (error)
return error;
} else {
printf("fsl-mc: Started the DPL deploy process\n");
}
return error;
mc_dpl_applied = 0;
return 0;
}
int get_mc_boot_status(void)
@@ -1995,6 +2003,11 @@ static int do_fsl_mc(struct cmd_tbl *cmdtp, int flag, int argc,
* later from announce_and_cleanup().
*/
mc_lazy_dpl_addr = mc_dpl_addr;
wait_for_dpl = true;
if (argc >= 5 && strcmp(argv[4], "nowait") == 0)
wait_for_dpl = false;
break;
}
@@ -2023,6 +2036,10 @@ static int do_fsl_mc(struct cmd_tbl *cmdtp, int flag, int argc,
mc_apply_addr = simple_strtoull(argv[3], NULL, 16);
wait_for_dpl = true;
if (argc >= 5 && strcmp(argv[4], "nowait") == 0)
wait_for_dpl = false;
/* The user wants DPL applied now */
if (!fsl_mc_ldpaa_exit(NULL))
err = mc_apply_dpl(mc_apply_addr);
@@ -2071,8 +2088,8 @@ U_BOOT_CMD(
fsl_mc, CONFIG_SYS_MAXARGS, 1, do_fsl_mc,
"DPAA2 command to manage Management Complex (MC)",
"fsl_mc start mc <fw_addr> <DPC_addr> - Start the Management Complex firmware\n"
"fsl_mc apply dpl <dpl_addr> - Apply the DPL (Data Path Layout) file\n"
"fsl_mc lazyapply dpl <DPL_addr> - Apply the DPL (Data Path Layout) file on exit\n"
"fsl_mc apply dpl <dpl_addr> [nowait] - Apply the DPL (Data Path Layout) file\n"
"fsl_mc lazyapply dpl <DPL_addr> [nowait] - Apply the DPL (Data Path Layout) file on exit\n"
"fsl_mc apply spb <spb_addr> - Apply the SPB Soft Parser Blob\n"
"fsl_mc start aiop <fw_addr> - Start AIOP\n"
"fsl_mc dump_log - Dump the MC Log\n"