aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTushar Khandelwal <tushar.khandelwal@arm.com>2017-07-14 11:51:37 +0100
committerRyan Harkin <ryan.harkin@linaro.org>2017-07-27 09:53:34 +0100
commitb03c6e4e4b677c0c3e76d9c6b394d5bbbd6164b6 (patch)
treee02ad178ec54ed174e7f47d4f8318bfaf53e312f
parent93136cff3114374f01c12a3e32bb0a014b35f347 (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.dtsi3
-rwxr-xr-xdrivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c36
-rwxr-xr-xdrivers/gpu/arm/midgard/mali_kbase_core_linux.c16
-rwxr-xr-xdrivers/gpu/arm/midgard/mali_kbase_defs.h4
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