msm: kgsl: Add functions for enabling / disabling a powerscale policy
Sometimes you want to enable or disable a policy for a bit without
actually swapping out the policy. These functions allow the kernel
to control the policy functionality.
Change-Id: Ic0dedbad4406e5fffe1ebd8e8ba4e6bf84d82203
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c
index ddc641d..b2b3071 100644
--- a/drivers/gpu/msm/kgsl_pwrscale.c
+++ b/drivers/gpu/msm/kgsl_pwrscale.c
@@ -84,10 +84,14 @@
{
int ret;
- if (device->pwrscale.policy)
- ret = snprintf(buf, PAGE_SIZE, "%s\n",
+ if (device->pwrscale.policy) {
+ ret = snprintf(buf, PAGE_SIZE, "%s",
device->pwrscale.policy->name);
- else
+ if (device->pwrscale.enabled == 0)
+ ret += snprintf(buf + ret, PAGE_SIZE - ret,
+ " (disabled)");
+ ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
+ } else
ret = snprintf(buf, PAGE_SIZE, "none\n");
return ret;
@@ -210,23 +214,26 @@
.release = pwrscale_sysfs_release
};
+#define PWRSCALE_ACTIVE(_d) \
+ ((_d)->pwrscale.policy && (_d)->pwrscale.enabled)
+
void kgsl_pwrscale_sleep(struct kgsl_device *device)
{
- if (device->pwrscale.policy && device->pwrscale.policy->sleep)
+ if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->sleep)
device->pwrscale.policy->sleep(device, &device->pwrscale);
}
EXPORT_SYMBOL(kgsl_pwrscale_sleep);
void kgsl_pwrscale_wake(struct kgsl_device *device)
{
- if (device->pwrscale.policy && device->pwrscale.policy->wake)
+ if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->wake)
device->pwrscale.policy->wake(device, &device->pwrscale);
}
EXPORT_SYMBOL(kgsl_pwrscale_wake);
void kgsl_pwrscale_busy(struct kgsl_device *device)
{
- if (device->pwrscale.policy && device->pwrscale.policy->busy)
+ if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->busy)
if ((!device->pwrscale.gpu_busy) &&
(device->requested_state != KGSL_STATE_SLUMBER))
device->pwrscale.policy->busy(device,
@@ -236,7 +243,7 @@
void kgsl_pwrscale_idle(struct kgsl_device *device)
{
- if (device->pwrscale.policy && device->pwrscale.policy->idle)
+ if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->idle)
if (device->requested_state !=
(KGSL_STATE_SLUMBER | KGSL_STATE_SLEEP))
device->pwrscale.policy->idle(device,
@@ -245,6 +252,18 @@
}
EXPORT_SYMBOL(kgsl_pwrscale_idle);
+void kgsl_pwrscale_disable(struct kgsl_device *device)
+{
+ device->pwrscale.enabled = 0;
+}
+EXPORT_SYMBOL(kgsl_pwrscale_disable);
+
+void kgsl_pwrscale_enable(struct kgsl_device *device)
+{
+ device->pwrscale.enabled = 1;
+}
+EXPORT_SYMBOL(kgsl_pwrscale_enable);
+
int kgsl_pwrscale_policy_add_files(struct kgsl_device *device,
struct kgsl_pwrscale *pwrscale,
struct attribute_group *attr_group)
@@ -314,6 +333,9 @@
device->pwrscale.policy = policy;
+ /* Pwrscale is enabled by default at attach time */
+ kgsl_pwrscale_enable(device);
+
if (policy) {
ret = device->pwrscale.policy->init(device, &device->pwrscale);
if (ret)