summaryrefslogtreecommitdiff
path: root/drivers/soc/qcom/scm-xpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/soc/qcom/scm-xpu.c')
-rw-r--r--drivers/soc/qcom/scm-xpu.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/soc/qcom/scm-xpu.c b/drivers/soc/qcom/scm-xpu.c
new file mode 100644
index 000000000000..200b313610e7
--- /dev/null
+++ b/drivers/soc/qcom/scm-xpu.c
@@ -0,0 +1,52 @@
+/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <soc/qcom/scm.h>
+
+#if defined(CONFIG_QCOM_XPU_ERR_FATAL)
+#define ERR_FATAL_VAL 0x0
+#elif defined(CONFIG_QCOM_XPU_ERR_NONFATAL)
+#define ERR_FATAL_VAL 0x1
+#endif
+
+#define XPU_ERR_FATAL 0xe
+
+static int __init xpu_err_fatal_init(void)
+{
+ int ret, response;
+ struct {
+ unsigned int config;
+ unsigned int spare;
+ } cmd;
+ struct scm_desc desc = {0};
+
+ desc.arginfo = SCM_ARGS(2);
+ desc.args[0] = cmd.config = ERR_FATAL_VAL;
+ desc.args[1] = cmd.spare = 0;
+
+ if (!is_scm_armv8())
+ ret = scm_call(SCM_SVC_MP, XPU_ERR_FATAL, &cmd, sizeof(cmd),
+ &response, sizeof(response));
+ else
+ ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, XPU_ERR_FATAL), &desc);
+
+ if (ret != 0)
+ pr_warn("Failed to set XPU violations as fatal errors: %d\n",
+ ret);
+ else
+ pr_info("Configuring XPU violations to be fatal errors\n");
+
+ return ret;
+}
+early_initcall(xpu_err_fatal_init);