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: Rob Clark <robdclark@gmail.com> [masneyb@onstation.org: ported to latest kernel; minor reformatting.] Signed-off-by: Brian Masney <masneyb@onstation.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Tested-by: Gabriel Francisco <frc.gabrielgmail.com> Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
198a72c8f9
commit
b0a1614fb1
@ -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));
|
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)
|
void __qcom_scm_init(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -241,6 +241,18 @@ int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req,
|
|||||||
return ret;
|
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)
|
void __qcom_scm_init(void)
|
||||||
{
|
{
|
||||||
u64 cmd;
|
u64 cmd;
|
||||||
|
@ -191,6 +191,46 @@ bool qcom_scm_pas_supported(u32 peripheral)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(qcom_scm_pas_supported);
|
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
|
* qcom_scm_pas_init_image() - Initialize peripheral authentication service
|
||||||
* state machine for a given peripheral, using the
|
* state machine for a given peripheral, using the
|
||||||
|
@ -42,6 +42,15 @@ extern int __qcom_scm_hdcp_req(struct device *dev,
|
|||||||
|
|
||||||
extern void __qcom_scm_init(void);
|
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_SVC_PIL 0x2
|
||||||
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
|
#define QCOM_SCM_PAS_INIT_IMAGE_CMD 0x1
|
||||||
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
|
#define QCOM_SCM_PAS_MEM_SETUP_CMD 0x2
|
||||||
|
@ -24,6 +24,16 @@ struct qcom_scm_vmperm {
|
|||||||
int perm;
|
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_HLOS 0x3
|
||||||
#define QCOM_SCM_VMID_MSS_MSA 0xF
|
#define QCOM_SCM_VMID_MSS_MSA 0xF
|
||||||
#define QCOM_SCM_VMID_WLAN 0x18
|
#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 bool qcom_scm_hdcp_available(void);
|
||||||
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
|
extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt,
|
||||||
u32 *resp);
|
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 bool qcom_scm_pas_supported(u32 peripheral);
|
||||||
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata,
|
extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata,
|
||||||
size_t size);
|
size_t size);
|
||||||
|
Loading…
Reference in New Issue
Block a user