Commit b0a1614f authored by Rob Clark's avatar Rob Clark Committed by Rob Clark
Browse files

firmware: qcom: scm: add OCMEM lock/unlock interface



Add support for the OCMEM lock/unlock interface that is needed by the
On Chip MEMory (OCMEM) that is present on some Snapdragon devices.

Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
[masneyb@onstation.org: ported to latest kernel; minor reformatting.]
Signed-off-by: default avatarBrian Masney <masneyb@onstation.org>
Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: Gabriel Francisco <frc.gabrielgmail.com>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 198a72c8
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -442,6 +442,41 @@ int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req,
		req, req_cnt * sizeof(*req), resp, sizeof(*resp));
}

int __qcom_scm_ocmem_lock(struct device *dev, 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(dev, QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_LOCK_CMD,
			     &request, sizeof(request), NULL, 0);
}

int __qcom_scm_ocmem_unlock(struct device *dev, 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(dev, QCOM_SCM_OCMEM_SVC, QCOM_SCM_OCMEM_UNLOCK_CMD,
			     &request, sizeof(request), NULL, 0);
}

void __qcom_scm_init(void)
{
}
+12 −0
Original line number Diff line number Diff line
@@ -241,6 +241,18 @@ int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req,
	return ret;
}

int __qcom_scm_ocmem_lock(struct device *dev, uint32_t id, uint32_t offset,
			  uint32_t size, uint32_t mode)
{
	return -ENOTSUPP;
}

int __qcom_scm_ocmem_unlock(struct device *dev, uint32_t id, uint32_t offset,
			    uint32_t size)
{
	return -ENOTSUPP;
}

void __qcom_scm_init(void)
{
	u64 cmd;
+40 −0
Original line number Diff line number Diff line
@@ -191,6 +191,46 @@ bool qcom_scm_pas_supported(u32 peripheral)
}
EXPORT_SYMBOL(qcom_scm_pas_supported);

/**
 * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available
 */
bool qcom_scm_ocmem_lock_available(void)
{
	return __qcom_scm_is_call_available(__scm->dev, 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(__scm->dev, 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(__scm->dev, id, offset, size);
}
EXPORT_SYMBOL(qcom_scm_ocmem_unlock);

/**
 * qcom_scm_pas_init_image() - Initialize peripheral authentication service
 *			       state machine for a given peripheral, using the
+9 −0
Original line number Diff line number Diff line
@@ -42,6 +42,15 @@ extern int __qcom_scm_hdcp_req(struct device *dev,

extern void __qcom_scm_init(void);

#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(struct device *dev, u32 id, u32 offset,
				 u32 size, u32 mode);
extern int __qcom_scm_ocmem_unlock(struct device *dev, 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
+15 −0
Original line number Diff line number Diff line
@@ -24,6 +24,16 @@ struct qcom_scm_vmperm {
	int perm;
};

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,
};

#define QCOM_SCM_VMID_HLOS       0x3
#define QCOM_SCM_VMID_MSS_MSA    0xF
#define QCOM_SCM_VMID_WLAN       0x18
@@ -41,6 +51,11 @@ 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);
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);