@@ -101,3 +101,16 @@ Description:
# echo 0 > /sys/devices/platform/firmware\:zynqmp-firmware/health_status
Users: Xilinx
+
+What: /sys/devices/platform/firmware\:zynqmp-firmware/last_reset_reason
+Date: June 2020
+KernelVersion: 5.9.0
+Contact: "Tejas Patel" <tejasp@xilinx.com>
+Description:
+ This sysfs interface allows to get last reset reason.
+
+ Usage:
+ Get last reset reason
+ # cat /sys/devices/platform/firmware\:zynqmp-firmware/last_reset_reason
+
+Users: Xilinx
@@ -1266,6 +1266,42 @@ static DEVICE_ATTR_RW(pggs1);
static DEVICE_ATTR_RW(pggs2);
static DEVICE_ATTR_RW(pggs3);
+static ssize_t last_reset_reason_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ int ret;
+ u32 ret_payload[PAYLOAD_ARG_CNT];
+
+ ret = zynqmp_pm_get_last_reset_reason(ret_payload);
+ if (-EINVAL == ret)
+ return sprintf(buf, "Feature not supported\n");
+ else if (ret)
+ return ret;
+
+ switch (ret_payload[1]) {
+ case PM_RESET_REASON_EXT_POR:
+ return sprintf(buf, "ext_por\n");
+ case PM_RESET_REASON_SW_POR:
+ return sprintf(buf, "sw_por\n");
+ case PM_RESET_REASON_SLR_POR:
+ return sprintf(buf, "sl_por\n");
+ case PM_RESET_REASON_ERR_POR:
+ return sprintf(buf, "err_por\n");
+ case PM_RESET_REASON_DAP_SRST:
+ return sprintf(buf, "dap_srst\n");
+ case PM_RESET_REASON_ERR_SRST:
+ return sprintf(buf, "err_srst\n");
+ case PM_RESET_REASON_SW_SRST:
+ return sprintf(buf, "sw_srst\n");
+ case PM_RESET_REASON_SLR_SRST:
+ return sprintf(buf, "slr_srst\n");
+ default:
+ return sprintf(buf, "unknown reset\n");
+ }
+}
+
+static DEVICE_ATTR_RO(last_reset_reason);
+
static struct attribute *zynqmp_firmware_attrs[] = {
&dev_attr_ggs0.attr,
&dev_attr_ggs1.attr,
@@ -1277,6 +1313,7 @@ static struct attribute *zynqmp_firmware_attrs[] = {
&dev_attr_pggs3.attr,
&dev_attr_shutdown_scope.attr,
&dev_attr_health_status.attr,
+ &dev_attr_last_reset_reason.attr,
NULL,
};
@@ -302,6 +302,17 @@ enum zynqmp_pm_shutdown_subtype {
ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM,
};
+enum pm_reset_reason {
+ PM_RESET_REASON_EXT_POR = 0,
+ PM_RESET_REASON_SW_POR = 1,
+ PM_RESET_REASON_SLR_POR = 2,
+ PM_RESET_REASON_ERR_POR = 3,
+ PM_RESET_REASON_DAP_SRST = 7,
+ PM_RESET_REASON_ERR_SRST = 8,
+ PM_RESET_REASON_SW_SRST = 9,
+ PM_RESET_REASON_SLR_SRST = 10,
+};
+
/**
* struct zynqmp_pm_query_data - PM query data
* @qid: query ID