diff options
author | Tushar Khandelwal <tushar.khandelwal@arm.com> | 2017-07-14 11:51:37 +0100 |
---|---|---|
committer | Ryan Harkin <ryan.harkin@linaro.org> | 2017-07-27 09:53:34 +0100 |
commit | b03c6e4e4b677c0c3e76d9c6b394d5bbbd6164b6 (patch) | |
tree | e02ad178ec54ed174e7f47d4f8318bfaf53e312f | |
parent | 93136cff3114374f01c12a3e32bb0a014b35f347 (diff) |
drivers: gpu: arm: change gpu driver to work with scmi
Change-Id: Ia80d1e9b8b682784ffec4c475036bb76d8ebd4cf
Signed-off-by: Tushar Khandelwal <tushar.khandelwal@arm.com>
-rw-r--r-- | arch/arm64/boot/dts/arm/juno-base.dtsi | 3 | ||||
-rwxr-xr-x | drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c | 36 | ||||
-rwxr-xr-x | drivers/gpu/arm/midgard/mali_kbase_core_linux.c | 16 | ||||
-rwxr-xr-x | drivers/gpu/arm/midgard/mali_kbase_defs.h | 4 |
4 files changed, 52 insertions, 7 deletions
diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi index ac8229063e41..9668c5fb9dd3 100644 --- a/arch/arm64/boot/dts/arm/juno-base.dtsi +++ b/arch/arm64/boot/dts/arm/juno-base.dtsi @@ -371,8 +371,7 @@ interrupts = <0 33 4>, <0 34 4>, <0 32 4>; interrupt-names = "JOB", "MMU", "GPU"; clocks = <&scmi_dvfs 2>; - clock-names = "clk_mali"; - power-domains = <&scmi_devpd 1>; + power-domains = <&scmi_devpd 9>; power_model { compatible = "arm,mali-simple-power-model"; voltage = <800>; 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 6b4afb8998ae..c92690df3549 100755 --- a/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c +++ b/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c @@ -44,6 +44,10 @@ #define dev_pm_opp_find_freq_ceil opp_find_freq_ceil #endif /* Linux >= 3.13 */ +#ifdef CONFIG_ARM_SCMI_PROTOCOL +#include <linux/scmi_protocol.h> +extern int scmi_gpu_domain_id_get(void); +#endif static int kbase_devfreq_target(struct device *dev, unsigned long *target_freq, u32 flags) @@ -84,7 +88,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); @@ -207,10 +218,25 @@ int kbase_devfreq_init(struct kbase_device *kbdev) struct devfreq_dev_profile *dp; int err; - if (!kbdev->clock) - return -ENODEV; - - kbdev->current_freq = clk_get_rate(kbdev->clock); +#ifdef CONFIG_ARM_SCMI_PROTOCOL + if (!kbdev->scmi_handle) +#else + if (!kbdev->clock) +#endif + 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 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 bd2eb0f02b5a..61395d9e64f0 100755 --- a/drivers/gpu/arm/midgard/mali_kbase_core_linux.c +++ b/drivers/gpu/arm/midgard/mali_kbase_core_linux.c @@ -92,6 +92,12 @@ #include <mali_kbase_as_fault_debugfs.h> +#ifdef CONFIG_ARM_SCMI_PROTOCOL +#include <linux/scmi_protocol.h> +extern const struct scmi_handle *scmi_gpu_handle_get(void); +#endif + + /* GPU IRQ Tags */ #define JOB_IRQ_TAG 0 #define MMU_IRQ_TAG 1 @@ -3251,6 +3257,16 @@ static int power_control_init(struct platform_device *pdev) } #endif /* LINUX_VERSION_CODE >= 3, 12, 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); diff --git a/drivers/gpu/arm/midgard/mali_kbase_defs.h b/drivers/gpu/arm/midgard/mali_kbase_defs.h index 4fa7c9b40d8d..ccbddab3ea5b 100755 --- a/drivers/gpu/arm/midgard/mali_kbase_defs.h +++ b/drivers/gpu/arm/midgard/mali_kbase_defs.h @@ -970,6 +970,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 |