* [PATCH 0/5] qcom-scm fixes and support for OCMEM
@ 2015-10-05 14:22 Rob Clark
2015-10-05 14:22 ` [PATCH 1/5] qcom-scm: fix endianess issue in __qcom_scm_is_call_available Rob Clark
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Stephen Boyd, Bjorn Andersson
Split out the restore-secure-config part from the ocmem lock/unlock,
and updates to address review comments.
Rob Clark (5):
qcom-scm: fix endianess issue in __qcom_scm_is_call_available
qcom-scm: fix header compile errors
qcom-scm: add missing prototype for qcom_scm_is_available()
qcom-scm: add support to restore secure config
qcom-scm: add OCMEM lock/unlock interface
drivers/firmware/qcom_scm-32.c | 60 ++++++++++++++++++++++++++++++++++++--
drivers/firmware/qcom_scm-64.c | 16 +++++++++++
drivers/firmware/qcom_scm.c | 65 ++++++++++++++++++++++++++++++++++++++++--
drivers/firmware/qcom_scm.h | 12 ++++++++
include/linux/qcom_scm.h | 16 +++++++++--
5 files changed, 162 insertions(+), 7 deletions(-)
--
2.4.3
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/5] qcom-scm: fix endianess issue in __qcom_scm_is_call_available
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
@ 2015-10-05 14:22 ` Rob Clark
2015-10-05 14:22 ` [PATCH 2/5] qcom-scm: fix header compile errors Rob Clark
` (3 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Bjorn Andersson, Stephen Boyd, Rob Clark
Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
---
drivers/firmware/qcom_scm-32.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
index e9c306b..c1e4325 100644
--- a/drivers/firmware/qcom_scm-32.c
+++ b/drivers/firmware/qcom_scm-32.c
@@ -480,15 +480,15 @@ void __qcom_scm_cpu_power_down(u32 flags)
int __qcom_scm_is_call_available(u32 svc_id, u32 cmd_id)
{
int ret;
- u32 svc_cmd = (svc_id << 10) | cmd_id;
- u32 ret_val = 0;
+ __le32 svc_cmd = cpu_to_le32((svc_id << 10) | cmd_id);
+ __le32 ret_val = 0;
ret = qcom_scm_call(QCOM_SCM_SVC_INFO, QCOM_IS_CALL_AVAIL_CMD, &svc_cmd,
sizeof(svc_cmd), &ret_val, sizeof(ret_val));
if (ret)
return ret;
- return ret_val;
+ return le32_to_cpu(ret_val);
}
int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/5] qcom-scm: fix header compile errors
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
2015-10-05 14:22 ` [PATCH 1/5] qcom-scm: fix endianess issue in __qcom_scm_is_call_available Rob Clark
@ 2015-10-05 14:22 ` Rob Clark
2015-10-05 14:22 ` [PATCH 3/5] qcom-scm: add missing prototype for qcom_scm_is_available() Rob Clark
` (2 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Bjorn Andersson, Stephen Boyd, Rob Clark
Add missing #include for types.h to have u32, etc. And fwd declare
'struct cpumask'.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
drivers/firmware/qcom_scm.c | 4 ++--
include/linux/qcom_scm.h | 7 +++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index 118df0a..39082c1 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -76,7 +76,7 @@ static void qcom_scm_clk_disable(void)
* Set the cold boot address of the cpus. Any cpu outside the supported
* range would be removed from the cpu present mask.
*/
-int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus)
+int qcom_scm_set_cold_boot_addr(void *entry, const struct cpumask *cpus)
{
return __qcom_scm_set_cold_boot_addr(entry, cpus);
}
@@ -90,7 +90,7 @@ EXPORT_SYMBOL(qcom_scm_set_cold_boot_addr);
* Set the Linux entry point for the SCM to transfer control to when coming
* out of a power down. CPU power down may be executed on cpuidle or hotplug.
*/
-int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus)
+int qcom_scm_set_warm_boot_addr(void *entry, const struct cpumask *cpus)
{
return __qcom_scm_set_warm_boot_addr(entry, cpus);
}
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index 46d41e4..c536b70 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -13,8 +13,11 @@
#ifndef __QCOM_SCM_H
#define __QCOM_SCM_H
-extern int qcom_scm_set_cold_boot_addr(void *entry, const cpumask_t *cpus);
-extern int qcom_scm_set_warm_boot_addr(void *entry, const cpumask_t *cpus);
+#include <linux/types.h>
+
+struct cpumask;
+extern int qcom_scm_set_cold_boot_addr(void *entry, const struct cpumask *cpus);
+extern int qcom_scm_set_warm_boot_addr(void *entry, const struct cpumask *cpus);
#define QCOM_SCM_HDCP_MAX_REQ_CNT 5
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/5] qcom-scm: add missing prototype for qcom_scm_is_available()
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
2015-10-05 14:22 ` [PATCH 1/5] qcom-scm: fix endianess issue in __qcom_scm_is_call_available Rob Clark
2015-10-05 14:22 ` [PATCH 2/5] qcom-scm: fix header compile errors Rob Clark
@ 2015-10-05 14:22 ` Rob Clark
2015-10-05 14:22 ` [PATCH 4/5] qcom-scm: add support to restore secure config Rob Clark
2015-10-05 14:22 ` [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface Rob Clark
4 siblings, 0 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Bjorn Andersson, Stephen Boyd, Rob Clark
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
include/linux/qcom_scm.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index c536b70..e407c0a 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -26,6 +26,8 @@ struct qcom_scm_hdcp_req {
u32 val;
};
+extern bool qcom_scm_is_available(void);
+
extern bool qcom_scm_hdcp_available(void);
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/5] qcom-scm: add support to restore secure config
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
` (2 preceding siblings ...)
2015-10-05 14:22 ` [PATCH 3/5] qcom-scm: add missing prototype for qcom_scm_is_available() Rob Clark
@ 2015-10-05 14:22 ` Rob Clark
2015-10-05 14:29 ` Rob Clark
2015-10-05 14:22 ` [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface Rob Clark
4 siblings, 1 reply; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Stephen Boyd, Bjorn Andersson
Needed by OCMEM driver.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
drivers/firmware/qcom_scm-32.c | 20 ++++++++++++++++++++
drivers/firmware/qcom_scm-64.c | 5 +++++
drivers/firmware/qcom_scm.c | 22 ++++++++++++++++++++++
drivers/firmware/qcom_scm.h | 5 +++++
include/linux/qcom_scm.h | 3 +++
5 files changed, 55 insertions(+)
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
index c1e4325..a7bf6d4 100644
--- a/drivers/firmware/qcom_scm-32.c
+++ b/drivers/firmware/qcom_scm-32.c
@@ -500,6 +500,26 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
req, req_cnt * sizeof(*req), resp, sizeof(*resp));
}
+int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
+{
+ int ret, scm_ret = 0;
+ struct msm_scm_sec_cfg {
+ __le32 id;
+ __le32 ctx_bank_num;
+ } cfg;
+
+ cfg.id = cpu_to_le32(sec_id);
+ cfg.ctx_bank_num = cpu_to_le32(sec_id);
+
+ ret = qcom_scm_call(QCOM_SCM_MP_SVC, QCOM_SCM_MP_RESTORE_SEC_CFG,
+ &cfg, sizeof(cfg), &scm_ret, sizeof(scm_ret));
+
+ if (ret || scm_ret)
+ return ret ? ret : -EINVAL;
+
+ return 0;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
__le32 out;
diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
index e64fd92..7329cf0f 100644
--- a/drivers/firmware/qcom_scm-64.c
+++ b/drivers/firmware/qcom_scm-64.c
@@ -62,6 +62,11 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
return -ENOTSUPP;
}
+int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
+{
+ return -ENOTSUPP;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
return false;
diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index 39082c1..8f43c0b 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -154,6 +154,28 @@ int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
EXPORT_SYMBOL(qcom_scm_hdcp_req);
/**
+ * qcom_scm_restore_sec_config_available() - Check if secure environment
+ * supports restore security config interface.
+ *
+ * Return true if restore-cfg interface is supported, false if not.
+ */
+bool qcom_scm_restore_sec_config_available(void)
+{
+ return __qcom_scm_is_call_available(QCOM_SCM_MP_SVC,
+ QCOM_SCM_MP_RESTORE_SEC_CFG);
+}
+EXPORT_SYMBOL(qcom_scm_restore_sec_config_available);
+
+/**
+ * qcom_scm_restore_sec_config() - call restore-cfg interface
+ */
+int qcom_scm_restore_sec_config(unsigned sec_id)
+{
+ return __qcom_scm_restore_sec_config(sec_id, 0);
+}
+EXPORT_SYMBOL(qcom_scm_restore_sec_config);
+
+/**
* qcom_scm_pas_supported() - Check if the peripheral authentication service is
* available for the given peripherial
* @peripheral: peripheral id
diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
index 220d19c..3085616 100644
--- a/drivers/firmware/qcom_scm.h
+++ b/drivers/firmware/qcom_scm.h
@@ -36,6 +36,11 @@ extern int __qcom_scm_is_call_available(u32 svc_id, u32 cmd_id);
extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
+#define QCOM_SCM_MP_SVC 0xc
+#define QCOM_SCM_MP_RESTORE_SEC_CFG 0x2
+
+extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
+
#define QCOM_SCM_SVC_PIL 0x2
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index e407c0a..7be3d91 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -32,6 +32,9 @@ extern bool qcom_scm_hdcp_available(void);
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
+extern bool qcom_scm_restore_sec_config_available(void);
+extern int qcom_scm_restore_sec_config(unsigned sec_id);
+
extern bool qcom_scm_pas_supported(u32 peripheral);
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
--
2.4.3
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
` (3 preceding siblings ...)
2015-10-05 14:22 ` [PATCH 4/5] qcom-scm: add support to restore secure config Rob Clark
@ 2015-10-05 14:22 ` Rob Clark
2015-10-05 15:41 ` Rob Clark
4 siblings, 1 reply; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:22 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Bjorn Andersson, Stephen Boyd, Rob Clark
Needed to enable device access to OCMEM.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
drivers/firmware/qcom_scm-32.c | 34 ++++++++++++++++++++++++++++++++++
drivers/firmware/qcom_scm-64.c | 11 +++++++++++
drivers/firmware/qcom_scm.c | 39 +++++++++++++++++++++++++++++++++++++++
drivers/firmware/qcom_scm.h | 7 +++++++
include/linux/qcom_scm.h | 4 ++++
5 files changed, 95 insertions(+)
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
index a7bf6d4..dc84771b 100644
--- a/drivers/firmware/qcom_scm-32.c
+++ b/drivers/firmware/qcom_scm-32.c
@@ -520,6 +520,40 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
return 0;
}
+int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode)
+{
+ struct ocmem_tz_lock {
+ __le32 id;
+ __le32 offset;
+ __le32 size;
+ __le32 mode;
+ } request;
+
+ request.id = cpu_to_le32(id);
+ request.offset = cpu_to_le32(offset);
+ request.size = cpu_to_le32(size);
+ request.mode = cpu_to_le32(mode);
+
+ return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_LOCK_CMD,
+ &request, sizeof(request), NULL, 0);
+}
+
+int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size)
+{
+ struct ocmem_tz_unlock {
+ __le32 id;
+ __le32 offset;
+ __le32 size;
+ } request;
+
+ request.id = cpu_to_le32(id);
+ request.offset = cpu_to_le32(offset);
+ request.size = cpu_to_le32(size);
+
+ return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_UNLOCK_CMD,
+ &request, sizeof(request), NULL, 0);
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
__le32 out;
diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
index 7329cf0f..0ca20a3 100644
--- a/drivers/firmware/qcom_scm-64.c
+++ b/drivers/firmware/qcom_scm-64.c
@@ -67,6 +67,17 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
return -ENOTSUPP;
}
+int __qcom_scm_ocmem_lock(uint32_t id, uint32_t offset, uint32_t size,
+ uint32_t mode)
+{
+ return -ENOTSUPP;
+}
+
+int __qcom_scm_ocmem_unlock(uint32_t id, uint32_t offset, uint32_t size)
+{
+ return -ENOTSUPP;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
return false;
diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index 8f43c0b..0e7ce42 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -176,6 +176,45 @@ int qcom_scm_restore_sec_config(unsigned sec_id)
EXPORT_SYMBOL(qcom_scm_restore_sec_config);
/**
+ * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available
+ */
+bool qcom_scm_ocmem_lock_available(void)
+{
+ return __qcom_scm_is_call_available(QCOM_SCM_OCMEM_SVC,
+ QCOM_SCM_OCMEM_LOCK_CMD);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_lock_available);
+
+/**
+ * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM
+ * region to the specified initiator
+ *
+ * @id: tz initiator id
+ * @offset: OCMEM offset
+ * @size: OCMEM size
+ * @mode: access mode (WIDE/NARROW)
+ */
+int qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode)
+{
+ return __qcom_scm_ocmem_lock(id, offset, size, mode);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_lock);
+
+/**
+ * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM
+ * region from the specified initiator
+ *
+ * @id: tz initiator id
+ * @offset: OCMEM offset
+ * @size: OCMEM size
+ */
+int qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size)
+{
+ return __qcom_scm_ocmem_unlock(id, offset, size);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_unlock);
+
+/**
* qcom_scm_pas_supported() - Check if the peripheral authentication service is
* available for the given peripherial
* @peripheral: peripheral id
diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
index 3085616..ec3435e 100644
--- a/drivers/firmware/qcom_scm.h
+++ b/drivers/firmware/qcom_scm.h
@@ -41,6 +41,13 @@ extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
+#define QCOM_SCM_OCMEM_SVC 0xf
+#define QCOM_SCM_OCMEM_LOCK_CMD 0x1
+#define QCOM_SCM_OCMEM_UNLOCK_CMD 0x2
+
+extern int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
+extern int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
+
#define QCOM_SCM_SVC_PIL 0x2
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index 7be3d91..beadca4 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -35,6 +35,10 @@ extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
extern bool qcom_scm_restore_sec_config_available(void);
extern int qcom_scm_restore_sec_config(unsigned sec_id);
+extern bool qcom_scm_ocmem_lock_available(void);
+extern int qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
+extern int qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
+
extern bool qcom_scm_pas_supported(u32 peripheral);
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 4/5] qcom-scm: add support to restore secure config
2015-10-05 14:22 ` [PATCH 4/5] qcom-scm: add support to restore secure config Rob Clark
@ 2015-10-05 14:29 ` Rob Clark
2015-10-06 23:48 ` [PATCH] " Rob Clark
0 siblings, 1 reply; 10+ messages in thread
From: Rob Clark @ 2015-10-05 14:29 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Stephen Boyd, Bjorn Andersson
On Mon, Oct 5, 2015 at 10:22 AM, Rob Clark <robdclark@gmail.com> wrote:
> Needed by OCMEM driver.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
Note: I am contemplating squashing something like this in:
----------------
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index beadca4..d3f209d 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -32,8 +32,18 @@ extern bool qcom_scm_hdcp_available(void);
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
+enum qcom_scm_sec_dev_id {
+ QCOM_SCM_MDSS_DEV_ID = 1,
+ QCOM_SCM_OCMEM_DEV_ID = 5,
+ QCOM_SCM_PCIE0_DEV_ID = 11,
+ QCOM_SCM_PCIE1_DEV_ID = 12,
+ QCOM_SCM_GFX_DEV_ID = 18,
+ QCOM_SCM_UFS_DEV_ID = 19,
+ QCOM_SCM_ICE_DEV_ID = 20,
+};
+
extern bool qcom_scm_restore_sec_config_available(void);
-extern int qcom_scm_restore_sec_config(unsigned sec_id);
+extern int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id);
----------------
The thing I am unsure about is whether the device-id's are always
stable across different parts. From what I can tell from
dumpster-diving the downstream kernel, there is a mix of hard-coding
dev-id in code, vs taking it out of devicetree. But in cases where it
comes from devicetree, it seems like it is always using the same
values across different SoCs. But I may be missing something.. and
since downstream kernel branches tend to shed support for older
generations I may not be going far enough back in time..
BR,
-R
> drivers/firmware/qcom_scm-32.c | 20 ++++++++++++++++++++
> drivers/firmware/qcom_scm-64.c | 5 +++++
> drivers/firmware/qcom_scm.c | 22 ++++++++++++++++++++++
> drivers/firmware/qcom_scm.h | 5 +++++
> include/linux/qcom_scm.h | 3 +++
> 5 files changed, 55 insertions(+)
>
> diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
> index c1e4325..a7bf6d4 100644
> --- a/drivers/firmware/qcom_scm-32.c
> +++ b/drivers/firmware/qcom_scm-32.c
> @@ -500,6 +500,26 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
> req, req_cnt * sizeof(*req), resp, sizeof(*resp));
> }
>
> +int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
> +{
> + int ret, scm_ret = 0;
> + struct msm_scm_sec_cfg {
> + __le32 id;
> + __le32 ctx_bank_num;
> + } cfg;
> +
> + cfg.id = cpu_to_le32(sec_id);
> + cfg.ctx_bank_num = cpu_to_le32(sec_id);
> +
> + ret = qcom_scm_call(QCOM_SCM_MP_SVC, QCOM_SCM_MP_RESTORE_SEC_CFG,
> + &cfg, sizeof(cfg), &scm_ret, sizeof(scm_ret));
> +
> + if (ret || scm_ret)
> + return ret ? ret : -EINVAL;
> +
> + return 0;
> +}
> +
> bool __qcom_scm_pas_supported(u32 peripheral)
> {
> __le32 out;
> diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
> index e64fd92..7329cf0f 100644
> --- a/drivers/firmware/qcom_scm-64.c
> +++ b/drivers/firmware/qcom_scm-64.c
> @@ -62,6 +62,11 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
> return -ENOTSUPP;
> }
>
> +int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
> +{
> + return -ENOTSUPP;
> +}
> +
> bool __qcom_scm_pas_supported(u32 peripheral)
> {
> return false;
> diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
> index 39082c1..8f43c0b 100644
> --- a/drivers/firmware/qcom_scm.c
> +++ b/drivers/firmware/qcom_scm.c
> @@ -154,6 +154,28 @@ int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
> EXPORT_SYMBOL(qcom_scm_hdcp_req);
>
> /**
> + * qcom_scm_restore_sec_config_available() - Check if secure environment
> + * supports restore security config interface.
> + *
> + * Return true if restore-cfg interface is supported, false if not.
> + */
> +bool qcom_scm_restore_sec_config_available(void)
> +{
> + return __qcom_scm_is_call_available(QCOM_SCM_MP_SVC,
> + QCOM_SCM_MP_RESTORE_SEC_CFG);
> +}
> +EXPORT_SYMBOL(qcom_scm_restore_sec_config_available);
> +
> +/**
> + * qcom_scm_restore_sec_config() - call restore-cfg interface
> + */
> +int qcom_scm_restore_sec_config(unsigned sec_id)
> +{
> + return __qcom_scm_restore_sec_config(sec_id, 0);
> +}
> +EXPORT_SYMBOL(qcom_scm_restore_sec_config);
> +
> +/**
> * qcom_scm_pas_supported() - Check if the peripheral authentication service is
> * available for the given peripherial
> * @peripheral: peripheral id
> diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
> index 220d19c..3085616 100644
> --- a/drivers/firmware/qcom_scm.h
> +++ b/drivers/firmware/qcom_scm.h
> @@ -36,6 +36,11 @@ extern int __qcom_scm_is_call_available(u32 svc_id, u32 cmd_id);
> extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
> u32 *resp);
>
> +#define QCOM_SCM_MP_SVC 0xc
> +#define QCOM_SCM_MP_RESTORE_SEC_CFG 0x2
> +
> +extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
> +
> #define QCOM_SCM_SVC_PIL 0x2
> #define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
> #define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
> diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
> index e407c0a..7be3d91 100644
> --- a/include/linux/qcom_scm.h
> +++ b/include/linux/qcom_scm.h
> @@ -32,6 +32,9 @@ extern bool qcom_scm_hdcp_available(void);
> extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
> u32 *resp);
>
> +extern bool qcom_scm_restore_sec_config_available(void);
> +extern int qcom_scm_restore_sec_config(unsigned sec_id);
> +
> extern bool qcom_scm_pas_supported(u32 peripheral);
> extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
> extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
> --
> 2.4.3
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface
2015-10-05 14:22 ` [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface Rob Clark
@ 2015-10-05 15:41 ` Rob Clark
2015-10-06 23:49 ` [PATCH] " Rob Clark
0 siblings, 1 reply; 10+ messages in thread
From: Rob Clark @ 2015-10-05 15:41 UTC (permalink / raw)
To: dri-devel, linux-arm-msm; +Cc: Bjorn Andersson, Stephen Boyd, Rob Clark
On Mon, Oct 5, 2015 at 10:22 AM, Rob Clark <robdclark@gmail.com> wrote:
> Needed to enable device access to OCMEM.
>
> Signed-off-by: Rob Clark <robdclark@gmail.com>
> ---
and similar to the previous patch, considering squashing in:
-----------
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index d3f209d..41ad996 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -45,9 +45,19 @@ enum qcom_scm_sec_dev_id {
extern bool qcom_scm_restore_sec_config_available(void);
extern int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id);
+enum qcom_scm_ocmem_client {
+ QCOM_SCM_OCMEM_UNUSED_ID = 0x0,
+ QCOM_SCM_OCMEM_GRAPHICS_ID,
+ QCOM_SCM_OCMEM_VIDEO_ID,
+ QCOM_SCM_OCMEM_LP_AUDIO_ID,
+ QCOM_SCM_OCMEM_SENSORS_ID,
+ QCOM_SCM_OCMEM_OTHER_OS_ID,
+ QCOM_SCM_OCMEM_DEBUG_ID,
+};
+
extern bool qcom_scm_ocmem_lock_available(void);
-extern int qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
-extern int qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
+extern int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32
offset, u32 size, u32 mode);
+extern int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32
offset, u32 size);
-----------
BR,
-R
> drivers/firmware/qcom_scm-32.c | 34 ++++++++++++++++++++++++++++++++++
> drivers/firmware/qcom_scm-64.c | 11 +++++++++++
> drivers/firmware/qcom_scm.c | 39 +++++++++++++++++++++++++++++++++++++++
> drivers/firmware/qcom_scm.h | 7 +++++++
> include/linux/qcom_scm.h | 4 ++++
> 5 files changed, 95 insertions(+)
>
> diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
> index a7bf6d4..dc84771b 100644
> --- a/drivers/firmware/qcom_scm-32.c
> +++ b/drivers/firmware/qcom_scm-32.c
> @@ -520,6 +520,40 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
> return 0;
> }
>
> +int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode)
> +{
> + struct ocmem_tz_lock {
> + __le32 id;
> + __le32 offset;
> + __le32 size;
> + __le32 mode;
> + } request;
> +
> + request.id = cpu_to_le32(id);
> + request.offset = cpu_to_le32(offset);
> + request.size = cpu_to_le32(size);
> + request.mode = cpu_to_le32(mode);
> +
> + return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_LOCK_CMD,
> + &request, sizeof(request), NULL, 0);
> +}
> +
> +int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size)
> +{
> + struct ocmem_tz_unlock {
> + __le32 id;
> + __le32 offset;
> + __le32 size;
> + } request;
> +
> + request.id = cpu_to_le32(id);
> + request.offset = cpu_to_le32(offset);
> + request.size = cpu_to_le32(size);
> +
> + return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_UNLOCK_CMD,
> + &request, sizeof(request), NULL, 0);
> +}
> +
> bool __qcom_scm_pas_supported(u32 peripheral)
> {
> __le32 out;
> diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
> index 7329cf0f..0ca20a3 100644
> --- a/drivers/firmware/qcom_scm-64.c
> +++ b/drivers/firmware/qcom_scm-64.c
> @@ -67,6 +67,17 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
> return -ENOTSUPP;
> }
>
> +int __qcom_scm_ocmem_lock(uint32_t id, uint32_t offset, uint32_t size,
> + uint32_t mode)
> +{
> + return -ENOTSUPP;
> +}
> +
> +int __qcom_scm_ocmem_unlock(uint32_t id, uint32_t offset, uint32_t size)
> +{
> + return -ENOTSUPP;
> +}
> +
> bool __qcom_scm_pas_supported(u32 peripheral)
> {
> return false;
> diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
> index 8f43c0b..0e7ce42 100644
> --- a/drivers/firmware/qcom_scm.c
> +++ b/drivers/firmware/qcom_scm.c
> @@ -176,6 +176,45 @@ int qcom_scm_restore_sec_config(unsigned sec_id)
> EXPORT_SYMBOL(qcom_scm_restore_sec_config);
>
> /**
> + * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available
> + */
> +bool qcom_scm_ocmem_lock_available(void)
> +{
> + return __qcom_scm_is_call_available(QCOM_SCM_OCMEM_SVC,
> + QCOM_SCM_OCMEM_LOCK_CMD);
> +}
> +EXPORT_SYMBOL(qcom_scm_ocmem_lock_available);
> +
> +/**
> + * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM
> + * region to the specified initiator
> + *
> + * @id: tz initiator id
> + * @offset: OCMEM offset
> + * @size: OCMEM size
> + * @mode: access mode (WIDE/NARROW)
> + */
> +int qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode)
> +{
> + return __qcom_scm_ocmem_lock(id, offset, size, mode);
> +}
> +EXPORT_SYMBOL(qcom_scm_ocmem_lock);
> +
> +/**
> + * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM
> + * region from the specified initiator
> + *
> + * @id: tz initiator id
> + * @offset: OCMEM offset
> + * @size: OCMEM size
> + */
> +int qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size)
> +{
> + return __qcom_scm_ocmem_unlock(id, offset, size);
> +}
> +EXPORT_SYMBOL(qcom_scm_ocmem_unlock);
> +
> +/**
> * qcom_scm_pas_supported() - Check if the peripheral authentication service is
> * available for the given peripherial
> * @peripheral: peripheral id
> diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
> index 3085616..ec3435e 100644
> --- a/drivers/firmware/qcom_scm.h
> +++ b/drivers/firmware/qcom_scm.h
> @@ -41,6 +41,13 @@ extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
>
> extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
>
> +#define QCOM_SCM_OCMEM_SVC 0xf
> +#define QCOM_SCM_OCMEM_LOCK_CMD 0x1
> +#define QCOM_SCM_OCMEM_UNLOCK_CMD 0x2
> +
> +extern int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
> +extern int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
> +
> #define QCOM_SCM_SVC_PIL 0x2
> #define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
> #define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
> diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
> index 7be3d91..beadca4 100644
> --- a/include/linux/qcom_scm.h
> +++ b/include/linux/qcom_scm.h
> @@ -35,6 +35,10 @@ extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
> extern bool qcom_scm_restore_sec_config_available(void);
> extern int qcom_scm_restore_sec_config(unsigned sec_id);
>
> +extern bool qcom_scm_ocmem_lock_available(void);
> +extern int qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
> +extern int qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
> +
> extern bool qcom_scm_pas_supported(u32 peripheral);
> extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
> extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
> --
> 2.4.3
>
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] qcom-scm: add support to restore secure config
2015-10-05 14:29 ` Rob Clark
@ 2015-10-06 23:48 ` Rob Clark
0 siblings, 0 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-06 23:48 UTC (permalink / raw)
To: linux-arm-msm; +Cc: Bjorn Andersson, Andy Gross, Stephen Boyd, Rob Clark
Needed by OCMEM driver.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
Note: no objections to the device-id enum on mailing list and positive
feedback on ##linux-msm so squashing that part in and re-sending
drivers/firmware/qcom_scm-32.c | 20 ++++++++++++++++++++
drivers/firmware/qcom_scm-64.c | 5 +++++
drivers/firmware/qcom_scm.c | 22 ++++++++++++++++++++++
drivers/firmware/qcom_scm.h | 5 +++++
include/linux/qcom_scm.h | 13 +++++++++++++
5 files changed, 65 insertions(+)
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
index c1e4325..a7bf6d4 100644
--- a/drivers/firmware/qcom_scm-32.c
+++ b/drivers/firmware/qcom_scm-32.c
@@ -500,6 +500,26 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
req, req_cnt * sizeof(*req), resp, sizeof(*resp));
}
+int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
+{
+ int ret, scm_ret = 0;
+ struct msm_scm_sec_cfg {
+ __le32 id;
+ __le32 ctx_bank_num;
+ } cfg;
+
+ cfg.id = cpu_to_le32(sec_id);
+ cfg.ctx_bank_num = cpu_to_le32(sec_id);
+
+ ret = qcom_scm_call(QCOM_SCM_MP_SVC, QCOM_SCM_MP_RESTORE_SEC_CFG,
+ &cfg, sizeof(cfg), &scm_ret, sizeof(scm_ret));
+
+ if (ret || scm_ret)
+ return ret ? ret : -EINVAL;
+
+ return 0;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
__le32 out;
diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
index e64fd92..7329cf0f 100644
--- a/drivers/firmware/qcom_scm-64.c
+++ b/drivers/firmware/qcom_scm-64.c
@@ -62,6 +62,11 @@ int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
return -ENOTSUPP;
}
+int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
+{
+ return -ENOTSUPP;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
return false;
diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index 39082c1..c9c99a3 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -154,6 +154,28 @@ int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp)
EXPORT_SYMBOL(qcom_scm_hdcp_req);
/**
+ * qcom_scm_restore_sec_config_available() - Check if secure environment
+ * supports restore security config interface.
+ *
+ * Return true if restore-cfg interface is supported, false if not.
+ */
+bool qcom_scm_restore_sec_config_available(void)
+{
+ return __qcom_scm_is_call_available(QCOM_SCM_MP_SVC,
+ QCOM_SCM_MP_RESTORE_SEC_CFG);
+}
+EXPORT_SYMBOL(qcom_scm_restore_sec_config_available);
+
+/**
+ * qcom_scm_restore_sec_config() - call restore-cfg interface
+ */
+int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id)
+{
+ return __qcom_scm_restore_sec_config(sec_id, 0);
+}
+EXPORT_SYMBOL(qcom_scm_restore_sec_config);
+
+/**
* qcom_scm_pas_supported() - Check if the peripheral authentication service is
* available for the given peripherial
* @peripheral: peripheral id
diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
index 220d19c..3085616 100644
--- a/drivers/firmware/qcom_scm.h
+++ b/drivers/firmware/qcom_scm.h
@@ -36,6 +36,11 @@ extern int __qcom_scm_is_call_available(u32 svc_id, u32 cmd_id);
extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
+#define QCOM_SCM_MP_SVC 0xc
+#define QCOM_SCM_MP_RESTORE_SEC_CFG 0x2
+
+extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
+
#define QCOM_SCM_SVC_PIL 0x2
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index e407c0a..ee31eec 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -32,6 +32,19 @@ extern bool qcom_scm_hdcp_available(void);
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
u32 *resp);
+enum qcom_scm_sec_dev_id {
+ QCOM_SCM_MDSS_DEV_ID = 1,
+ QCOM_SCM_OCMEM_DEV_ID = 5,
+ QCOM_SCM_PCIE0_DEV_ID = 11,
+ QCOM_SCM_PCIE1_DEV_ID = 12,
+ QCOM_SCM_GFX_DEV_ID = 18,
+ QCOM_SCM_UFS_DEV_ID = 19,
+ QCOM_SCM_ICE_DEV_ID = 20,
+};
+
+extern bool qcom_scm_restore_sec_config_available(void);
+extern int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id);
+
extern bool qcom_scm_pas_supported(u32 peripheral);
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] qcom-scm: add OCMEM lock/unlock interface
2015-10-05 15:41 ` Rob Clark
@ 2015-10-06 23:49 ` Rob Clark
0 siblings, 0 replies; 10+ messages in thread
From: Rob Clark @ 2015-10-06 23:49 UTC (permalink / raw)
To: linux-arm-msm; +Cc: Bjorn Andersson, Andy Gross, Stephen Boyd, Rob Clark
Needed to enable device access to OCMEM.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
Note: no objections to the client-id enum on mailing list and positive
feedback on ##linux-msm so squashing that part in and re-sending
drivers/firmware/qcom_scm-32.c | 34 ++++++++++++++++++++++++++++++++++
drivers/firmware/qcom_scm-64.c | 11 +++++++++++
drivers/firmware/qcom_scm.c | 39 +++++++++++++++++++++++++++++++++++++++
drivers/firmware/qcom_scm.h | 7 +++++++
include/linux/qcom_scm.h | 14 ++++++++++++++
5 files changed, 105 insertions(+)
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c
index a7bf6d4..dc84771b 100644
--- a/drivers/firmware/qcom_scm-32.c
+++ b/drivers/firmware/qcom_scm-32.c
@@ -520,6 +520,40 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
return 0;
}
+int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode)
+{
+ struct ocmem_tz_lock {
+ __le32 id;
+ __le32 offset;
+ __le32 size;
+ __le32 mode;
+ } request;
+
+ request.id = cpu_to_le32(id);
+ request.offset = cpu_to_le32(offset);
+ request.size = cpu_to_le32(size);
+ request.mode = cpu_to_le32(mode);
+
+ return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_LOCK_CMD,
+ &request, sizeof(request), NULL, 0);
+}
+
+int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size)
+{
+ struct ocmem_tz_unlock {
+ __le32 id;
+ __le32 offset;
+ __le32 size;
+ } request;
+
+ request.id = cpu_to_le32(id);
+ request.offset = cpu_to_le32(offset);
+ request.size = cpu_to_le32(size);
+
+ return qcom_scm_call(QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_UNLOCK_CMD,
+ &request, sizeof(request), NULL, 0);
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
__le32 out;
diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c
index 7329cf0f..0ca20a3 100644
--- a/drivers/firmware/qcom_scm-64.c
+++ b/drivers/firmware/qcom_scm-64.c
@@ -67,6 +67,17 @@ int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num)
return -ENOTSUPP;
}
+int __qcom_scm_ocmem_lock(uint32_t id, uint32_t offset, uint32_t size,
+ uint32_t mode)
+{
+ return -ENOTSUPP;
+}
+
+int __qcom_scm_ocmem_unlock(uint32_t id, uint32_t offset, uint32_t size)
+{
+ return -ENOTSUPP;
+}
+
bool __qcom_scm_pas_supported(u32 peripheral)
{
return false;
diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c
index c9c99a3..5c5841d 100644
--- a/drivers/firmware/qcom_scm.c
+++ b/drivers/firmware/qcom_scm.c
@@ -176,6 +176,45 @@ int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id)
EXPORT_SYMBOL(qcom_scm_restore_sec_config);
/**
+ * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available
+ */
+bool qcom_scm_ocmem_lock_available(void)
+{
+ return __qcom_scm_is_call_available(QCOM_SCM_OCMEM_SVC,
+ QCOM_SCM_OCMEM_LOCK_CMD);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_lock_available);
+
+/**
+ * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM
+ * region to the specified initiator
+ *
+ * @id: tz initiator id
+ * @offset: OCMEM offset
+ * @size: OCMEM size
+ * @mode: access mode (WIDE/NARROW)
+ */
+int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size, u32 mode)
+{
+ return __qcom_scm_ocmem_lock(id, offset, size, mode);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_lock);
+
+/**
+ * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM
+ * region from the specified initiator
+ *
+ * @id: tz initiator id
+ * @offset: OCMEM offset
+ * @size: OCMEM size
+ */
+int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size)
+{
+ return __qcom_scm_ocmem_unlock(id, offset, size);
+}
+EXPORT_SYMBOL(qcom_scm_ocmem_unlock);
+
+/**
* qcom_scm_pas_supported() - Check if the peripheral authentication service is
* available for the given peripherial
* @peripheral: peripheral id
diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
index 3085616..ec3435e 100644
--- a/drivers/firmware/qcom_scm.h
+++ b/drivers/firmware/qcom_scm.h
@@ -41,6 +41,13 @@ extern int __qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
extern int __qcom_scm_restore_sec_config(u32 sec_id, u32 ctx_bank_num);
+#define QCOM_SCM_OCMEM_SVC 0xf
+#define QCOM_SCM_OCMEM_LOCK_CMD 0x1
+#define QCOM_SCM_OCMEM_UNLOCK_CMD 0x2
+
+extern int __qcom_scm_ocmem_lock(u32 id, u32 offset, u32 size, u32 mode);
+extern int __qcom_scm_ocmem_unlock(u32 id, u32 offset, u32 size);
+
#define QCOM_SCM_SVC_PIL 0x2
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index ee31eec..41ad996 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -45,6 +45,20 @@ enum qcom_scm_sec_dev_id {
extern bool qcom_scm_restore_sec_config_available(void);
extern int qcom_scm_restore_sec_config(enum qcom_scm_sec_dev_id sec_id);
+enum qcom_scm_ocmem_client {
+ QCOM_SCM_OCMEM_UNUSED_ID = 0x0,
+ QCOM_SCM_OCMEM_GRAPHICS_ID,
+ QCOM_SCM_OCMEM_VIDEO_ID,
+ QCOM_SCM_OCMEM_LP_AUDIO_ID,
+ QCOM_SCM_OCMEM_SENSORS_ID,
+ QCOM_SCM_OCMEM_OTHER_OS_ID,
+ QCOM_SCM_OCMEM_DEBUG_ID,
+};
+
+extern bool qcom_scm_ocmem_lock_available(void);
+extern int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size, u32 mode);
+extern int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size);
+
extern bool qcom_scm_pas_supported(u32 peripheral);
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size);
extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size);
--
2.4.3
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-10-06 23:49 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-05 14:22 [PATCH 0/5] qcom-scm fixes and support for OCMEM Rob Clark
2015-10-05 14:22 ` [PATCH 1/5] qcom-scm: fix endianess issue in __qcom_scm_is_call_available Rob Clark
2015-10-05 14:22 ` [PATCH 2/5] qcom-scm: fix header compile errors Rob Clark
2015-10-05 14:22 ` [PATCH 3/5] qcom-scm: add missing prototype for qcom_scm_is_available() Rob Clark
2015-10-05 14:22 ` [PATCH 4/5] qcom-scm: add support to restore secure config Rob Clark
2015-10-05 14:29 ` Rob Clark
2015-10-06 23:48 ` [PATCH] " Rob Clark
2015-10-05 14:22 ` [PATCH 5/5] qcom-scm: add OCMEM lock/unlock interface Rob Clark
2015-10-05 15:41 ` Rob Clark
2015-10-06 23:49 ` [PATCH] " Rob Clark
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.