diff options
author | Jordan Crouse <jcrouse@codeaurora.org> | 2016-11-28 12:28:35 -0700 |
---|---|---|
committer | Andy Gross <andy.gross@linaro.org> | 2016-12-01 00:23:44 -0600 |
commit | f8b2ffb27df5efe57f9e16a3355051b600c2785d (patch) | |
tree | fac534f8c8302c77805b4c7ba6e3c2280d3515e9 | |
parent | d0e4f5683b74cde5ef32cb8954c2c40e1e724f9f (diff) | |
download | linux-scm-staging.tar.gz |
firmware: qcom_scm: Add qcom_scm_gpu_zap_resume()scm-staging
Add an interface to trigger the remote processor to reinitialize the GPU
zap shader on power-up.
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
-rw-r--r-- | drivers/firmware/qcom_scm-32.c | 5 | ||||
-rw-r--r-- | drivers/firmware/qcom_scm-64.c | 15 | ||||
-rw-r--r-- | drivers/firmware/qcom_scm.c | 6 | ||||
-rw-r--r-- | drivers/firmware/qcom_scm.h | 2 | ||||
-rw-r--r-- | include/linux/qcom_scm.h | 2 |
5 files changed, 30 insertions, 0 deletions
diff --git a/drivers/firmware/qcom_scm-32.c b/drivers/firmware/qcom_scm-32.c index 82c1d8d0d36bef..6f529ec70617ce 100644 --- a/drivers/firmware/qcom_scm-32.c +++ b/drivers/firmware/qcom_scm-32.c @@ -561,6 +561,11 @@ int __qcom_scm_pas_mss_reset(struct device *dev, bool reset) return ret ? : le32_to_cpu(out); } +int __qcom_scm_gpu_zap_resume(struct device *dev) +{ + return -ENOTSUPP; +} + int __qcom_scm_video_set_state(struct device *dev, u32 state, u32 spare) { struct { diff --git a/drivers/firmware/qcom_scm-64.c b/drivers/firmware/qcom_scm-64.c index 68484ea2aa51d7..ff68430c6fd2b7 100644 --- a/drivers/firmware/qcom_scm-64.c +++ b/drivers/firmware/qcom_scm-64.c @@ -359,6 +359,21 @@ int __qcom_scm_pas_mss_reset(struct device *dev, bool reset) return ret ? : res.a1; } +int __qcom_scm_gpu_zap_resume(struct device *dev) +{ + struct qcom_scm_desc desc = {0}; + struct arm_smccc_res res; + int ret; + + desc.args[0] = 0; + desc.args[1] = 13; + desc.arginfo = QCOM_SCM_ARGS(2); + + ret = qcom_scm_call(dev, QCOM_SCM_SVC_BOOT, 0x0A, &desc, &res); + + return ret ? : res.a1; +} + int __qcom_scm_video_set_state(struct device *dev, u32 state, u32 spare) { struct qcom_scm_desc desc = {0}; diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 54ad4ec1f516d0..7c8d675fb3148a 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -315,6 +315,12 @@ static const struct reset_control_ops qcom_scm_pas_reset_ops = { .deassert = qcom_scm_pas_reset_deassert, }; +int qcom_scm_gpu_zap_resume(void) +{ + return __qcom_scm_gpu_zap_resume(__scm->dev); +} +EXPORT_SYMBOL(qcom_scm_gpu_zap_resume); + /** * qcom_scm_is_available() - Checks if SCM is available */ diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 4830559b26394a..ffa5e2873cf43f 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -58,6 +58,8 @@ extern int __qcom_scm_pas_auth_and_reset(struct device *dev, u32 peripheral); extern int __qcom_scm_pas_shutdown(struct device *dev, u32 peripheral); extern int __qcom_scm_pas_mss_reset(struct device *dev, bool reset); +extern int __qcom_scm_gpu_zap_resume(struct device *dev); + /* common error codes */ #define QCOM_SCM_V2_EBUSY -12 #define QCOM_SCM_ENOMEM -5 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 71b79ffa1a3bb7..89c6ef22f0fd83 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -37,6 +37,7 @@ extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, phys_addr_t size); extern int qcom_scm_pas_auth_and_reset(u32 peripheral); extern int qcom_scm_pas_shutdown(u32 peripheral); +extern int qcom_scm_gpu_zap_resume(void); extern void qcom_scm_cpu_power_down(u32 flags); extern u32 qcom_scm_get_version(void); extern int qcom_scm_video_set_state(u32 state, u32 spare); @@ -63,6 +64,7 @@ static inline int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, static inline int qcom_scm_pas_auth_and_reset(u32 peripheral) { return -ENODEV; } static inline int qcom_scm_pas_shutdown(u32 peripheral) { return -ENODEV; } +static inline int qcom_scm_gpu_zap_resume(void) { return -ENODEV; } static inline void qcom_scm_cpu_power_down(u32 flags) {} static inline u32 qcom_scm_get_version(void) { return 0; } static inline int |