aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTushar Khandelwal <tushar.khandelwal@arm.com>2017-07-14 11:51:37 +0100
committerAmit Daniel Kachhap <amit.kachhap@arm.com>2019-01-22 12:36:36 +0530
commit2fffbfe12c9f140ea9f01b18fb0f84c3f25f3034 (patch)
treead2af8a0be92d2a6509e18641c634c09dce0bd86
parent8f15904dcb0a976ee1389dc6da9ec51541222054 (diff)
drivers: gpu: arm: change gpu driver to work with scmi
Signed-off-by: Tushar Khandelwal <tushar.khandelwal@arm.com> [Resolved merge conflicts] Signed-off-by: Arvind Chauhan <arvind.chauhan@arm.com> Signed-off-by: Amit Daniel Kachhap <amit.kachhap@arm.com>
-rw-r--r--drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c38
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_core_linux.c17
-rw-r--r--drivers/gpu/arm/midgard/mali_kbase_defs.h4
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 <linux/scmi_protocol.h>
+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 <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
@@ -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