Add command "zynqmp pmufw node close" to disable permission to load
additional pmufw config overlays. This command will make sure that any
other sw will ask for changing permission.

Signed-off-by: Michal Simek <michal.si...@xilinx.com>
---

 board/xilinx/zynqmp/cmds.c         | 16 ++++++++++++++++
 drivers/firmware/firmware-zynqmp.c | 19 +++++++++++++++++++
 include/zynqmp_firmware.h          |  1 +
 3 files changed, 36 insertions(+)

diff --git a/board/xilinx/zynqmp/cmds.c b/board/xilinx/zynqmp/cmds.c
index 5a277c712f60..2ab9596248c0 100644
--- a/board/xilinx/zynqmp/cmds.c
+++ b/board/xilinx/zynqmp/cmds.c
@@ -209,6 +209,19 @@ static int do_zynqmp_pmufw(struct cmd_tbl *cmdtp, int 
flag, int argc,
        if (argc != cmdtp->maxargs)
                return CMD_RET_USAGE;
 
+       if (!strncmp(argv[2], "node", 4)) {
+               u32 id;
+
+               if (!strncmp(argv[3], "close", 5))
+                       return zynqmp_pmufw_config_close();
+
+               id = dectoul(argv[3], NULL);
+
+               printf("Enable permission for node ID %d\n", id);
+
+               return zynqmp_pmufw_node(id);
+       }
+
        addr = hextoul(argv[2], NULL);
        size = hextoul(argv[3], NULL);
 
@@ -416,6 +429,9 @@ static char zynqmp_help_text[] =
        "                      lock(0)/split(1)\n"
 #endif
        "zynqmp pmufw address size - load PMU FW configuration object\n"
+       "zynqmp pmufw node <id> - load PMU FW configuration object\n"
+       "zynqmp pmufw node close - disable config object loading\n"
+       "       node: keyword, id: NODE_ID in decimal format\n"
        "zynqmp rsa srcaddr srclen mod exp rsaop -\n"
        "       Performs RSA encryption and RSA decryption on blob of data\n"
        "       at srcaddr and puts it back in srcaddr using modulus and\n"
diff --git a/drivers/firmware/firmware-zynqmp.c 
b/drivers/firmware/firmware-zynqmp.c
index a80e73307982..2ba0b3a7c5c6 100644
--- a/drivers/firmware/firmware-zynqmp.c
+++ b/drivers/firmware/firmware-zynqmp.c
@@ -49,6 +49,25 @@ static unsigned int xpm_configobject[] = {
        PM_CONFIG_IPI_PSU_CORTEXR5_1_MASK, /* IPI Mask */
 };
 
+static unsigned int xpm_configobject_close[] = {
+       /**********************************************************************/
+       /* HEADER */
+       2,      /* Number of remaining words in the header */
+       1,      /* Number of sections included in config object */
+       PM_CONFIG_OBJECT_TYPE_OVERLAY,  /* Type of Config object as overlay */
+       /**********************************************************************/
+       /* SET CONFIG SECTION */
+       PM_CONFIG_SET_CONFIG_SECTION_ID,
+       0U,     /* Loading permission to Overlay config object */
+};
+
+int zynqmp_pmufw_config_close(void)
+{
+       zynqmp_pmufw_load_config_object(xpm_configobject_close,
+                                       sizeof(xpm_configobject_close));
+       return 0;
+}
+
 int zynqmp_pmufw_node(u32 id)
 {
        /* Record power domain id */
diff --git a/include/zynqmp_firmware.h b/include/zynqmp_firmware.h
index 76c161806a0d..50bf4ef39535 100644
--- a/include/zynqmp_firmware.h
+++ b/include/zynqmp_firmware.h
@@ -368,6 +368,7 @@ enum pm_ioctl_id {
 
 unsigned int zynqmp_firmware_version(void);
 int zynqmp_pmufw_node(u32 id);
+int zynqmp_pmufw_config_close(void);
 void zynqmp_pmufw_load_config_object(const void *cfg_obj, size_t size);
 int xilinx_pm_request(u32 api_id, u32 arg0, u32 arg1, u32 arg2,
                      u32 arg3, u32 *ret_payload);
-- 
2.34.1

Reply via email to