aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c')
-rw-r--r--drivers/gpu/arm/midgard/backend/gpu/mali_kbase_devfreq.c38
1 files changed, 33 insertions, 5 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;