diff mbox series

firmware: zynqmp: Change panic logic in zynqmp_pmufw_load_config_object()

Message ID f7c873e88aeef6f168caf6841c2af582c0b6c5cc.1589264709.git.michal.simek@xilinx.com
State Accepted
Commit 4c86e0834aeb3ae06389534ccbc90b8bcf5d95bf
Headers show
Series firmware: zynqmp: Change panic logic in zynqmp_pmufw_load_config_object() | expand

Commit Message

Michal Simek May 12, 2020, 6:25 a.m. UTC
There is no need to panic all the time when pmufw config object loading
failed. The patch improves function logic to report permission deny case
and also panic only for SPL case.

Signed-off-by: Michal Simek <michal.simek at xilinx.com>
---

 drivers/firmware/firmware-zynqmp.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

Comments

Luca Ceresoli May 12, 2020, 9 a.m. UTC | #1
Hi Michal,

On 12/05/20 08:25, Michal Simek wrote:
> There is no need to panic all the time when pmufw config object loading
> failed. The patch improves function logic to report permission deny case
> and also panic only for SPL case.
> 
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>

Looks good to me.

Reviewed-by: Luca Ceresoli <luca at lucaceresoli.net>
diff mbox series

Patch

diff --git a/drivers/firmware/firmware-zynqmp.c b/drivers/firmware/firmware-zynqmp.c
index c37642569dda..bef6fc05dc69 100644
--- a/drivers/firmware/firmware-zynqmp.c
+++ b/drivers/firmware/firmware-zynqmp.c
@@ -15,6 +15,8 @@ 
 
 #define PMUFW_PAYLOAD_ARG_CNT	8
 
+#define XST_PM_NO_ACCESS	2002L
+
 struct zynqmp_power {
 	struct mbox_chan tx_chan;
 	struct mbox_chan rx_chan;
@@ -96,16 +98,25 @@  void zynqmp_pmufw_load_config_object(const void *cfg_obj, size_t size)
 		PM_SET_CONFIGURATION,
 		(u32)((u64)cfg_obj)
 	};
-	u32 response;
+	u32 response = 0;
 	int err;
 
 	printf("Loading new PMUFW cfg obj (%ld bytes)\n", size);
 
 	err = send_req(request, ARRAY_SIZE(request), &response, 1);
+	if (err == XST_PM_NO_ACCESS) {
+		printf("PMUFW no permission to change config object\n");
+		return;
+	}
+
 	if (err)
-		panic("Cannot load PMUFW configuration object (%d)\n", err);
-	if (response != 0)
-		panic("PMUFW returned 0x%08x status!\n", response);
+		printf("Cannot load PMUFW configuration object (%d)\n", err);
+
+	if (response)
+		printf("PMUFW returned 0x%08x status!\n", response);
+
+	if ((err || response) && IS_ENABLED(CONFIG_SPL_BUILD))
+		panic("PMUFW config object loading failed in EL3\n");
 }
 
 static int zynqmp_power_probe(struct udevice *dev)