From 2fffbfe12c9f140ea9f01b18fb0f84c3f25f3034 Mon Sep 17 00:00:00 2001 From: Tushar Khandelwal Date: Fri, 14 Jul 2017 11:51:37 +0100 Subject: drivers: gpu: arm: change gpu driver to work with scmi Signed-off-by: Tushar Khandelwal [Resolved merge conflicts] Signed-off-by: Arvind Chauhan Signed-off-by: Amit Daniel Kachhap --- .../arm/midgard/backend/gpu/mali_kbase_devfreq.c | 38 +++++++++++++++++++--- drivers/gpu/arm/midgard/mali_kbase_core_linux.c | 17 +++++++++- drivers/gpu/arm/midgard/mali_kbase_defs.h | 4 +++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c index 683a24cfa6c6..0544a009f5fa 100644 --- a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c +++ b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c @@ -48,6 +48,11 @@ #define dev_pm_opp_find_freq_floor opp_find_freq_floor #endif /* Linux >= 3.13 */ +#ifdef CONFIG_ARM_SCMI_PROTOCOL +#include +extern int scmi_gpu_domain_id_get(void); +#endif + /** * opp_translate - Translate nominal OPP frequency from devicetree into real * frequency and core mask @@ -130,7 +135,14 @@ kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags) } #endif - err = clk_set_rate(kbdev->clock, freq); + if (kbdev->clock) + err = clk_set_rate(kbdev->clock, freq); +#ifdef CONFIG_ARM_SCMI_PROTOCOL + else if(kbdev->scmi_handle) + err = kbdev->scmi_handle->perf_ops->freq_set(kbdev->scmi_handle, + scmi_gpu_domain_id_get(), freq); +#endif + if (err) { dev_err(dev, "Failed to set clock %lu (target %lu)\n", freq, *target_freq); @@ -336,12 +348,28 @@ int kbase_devfreq_init(struct kbase_device *kbdev) struct devfreq_dev_profile *dp; int err; - if (!kbdev->clock) { +#ifdef CONFIG_ARM_SCMI_PROTOCOL + if (!kbdev->scmi_handle) { +#else + if (!kbdev->clock) { +#endif dev_err(kbdev->dev, "Clock not available for devfreq\n"); - return -ENODEV; - } + return -ENODEV; + } + +#ifndef CONFIG_ARM_SCMI_PROTOCOL + if (kbdev->clock) + kbdev->current_freq = clk_get_rate(kbdev->clock); +#else + if (kbdev->scmi_handle) { + struct scmi_perf_ops *perf_ops = kbdev->scmi_handle->perf_ops; + + perf_ops->freq_get(kbdev->scmi_handle, + scmi_gpu_domain_id_get(), + &kbdev->current_freq); + } +#endif - kbdev->current_freq = clk_get_rate(kbdev->clock); kbdev->current_nominal_freq = kbdev->current_freq; dp = &kbdev->devfreq_profile; diff --git a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c index d101d978b1de..c8081b400875 100644 --- a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c @@ -93,6 +93,11 @@ #include +#ifdef CONFIG_ARM_SCMI_PROTOCOL +#include +extern const struct scmi_handle *scmi_gpu_handle_get(void); +#endif + /* GPU IRQ Tags */ #define JOB_IRQ_TAG 0 #define MMU_IRQ_TAG 1 @@ -3131,7 +3136,17 @@ static int power_control_init(struct platform_device *pdev) } #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ - kbdev->clock = of_clk_get(kbdev->dev->of_node, 0); +#ifdef CONFIG_ARM_SCMI_PROTOCOL + kbdev->scmi_handle = scmi_gpu_handle_get(); + if (IS_ERR_OR_NULL(kbdev->scmi_handle)) { + dev_err(&pdev->dev, "Failed to get scmi handle %ld\n", + PTR_ERR(kbdev->scmi_handle)); + err=-EPROBE_DEFER; + return err; + } +#endif + + kbdev->clock = clk_get(kbdev->dev, "clk_mali"); if (IS_ERR_OR_NULL(kbdev->clock)) { err = PTR_ERR(kbdev->clock); kbdev->clock = NULL; diff --git a/drivers/gpu/arm/midgard/mali_kbase_defs.h b/drivers/gpu/arm/midgard/mali_kbase_defs.h index 07ef1406cc76..e5395fe8fc21 100644 --- a/drivers/gpu/arm/midgard/mali_kbase_defs.h +++ b/drivers/gpu/arm/midgard/mali_kbase_defs.h @@ -1441,6 +1441,10 @@ struct kbase_device { #ifdef CONFIG_REGULATOR struct regulator *regulator; #endif + +#ifdef CONFIG_ARM_SCMI_PROTOCOL + const struct scmi_handle *scmi_handle; +#endif char devname[DEVNAME_SIZE]; #ifdef CONFIG_MALI_NO_MALI -- cgit v1.2.3