diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 110464d6ac7aef7e0c58a6d6625f12150955bcf1..45b6c0aeee72f1455364e7b2730c5c02744db7c0 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -2283,6 +2283,11 @@ static int adreno_set_constraint(struct kgsl_device *device, break; } + /* If a new constraint has been set for a context, cancel the old one */ + if ((status == 0) && + (context->id == device->pwrctrl.constraint.owner_id)) + device->pwrctrl.constraint.type = KGSL_CONSTRAINT_NONE; + return status; } diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index a55c9d2f9db33ca1a8869c05791595bffa375ba6..60aa618f517d1dfbdbadd66a8365a8a7b172e543 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -1173,8 +1173,9 @@ void adreno_ringbuffer_set_constraint(struct kgsl_device *device, constraint = adreno_ringbuffer_get_constraint(device, context); /* - * If a constraint is already set, set a new - * constraint only if it is faster + * If a constraint is already set, set a new constraint only + * if it is faster. If the requested constraint is the same + * as the current one, update ownership and timestamp. */ if ((device->pwrctrl.constraint.type == KGSL_CONSTRAINT_NONE) || (constraint < @@ -1185,10 +1186,17 @@ void adreno_ringbuffer_set_constraint(struct kgsl_device *device, context->pwr_constraint.type; device->pwrctrl.constraint.hint. pwrlevel.level = constraint; + device->pwrctrl.constraint.owner_id = context->id; + device->pwrctrl.constraint.expires = jiffies + + device->pwrctrl.interval_timeout; + } else if ((device->pwrctrl.constraint.type == + context->pwr_constraint.type) && + (device->pwrctrl.constraint.hint.pwrlevel.level == + constraint)) { + device->pwrctrl.constraint.owner_id = context->id; + device->pwrctrl.constraint.expires = jiffies + + device->pwrctrl.interval_timeout; } - - device->pwrctrl.constraint.expires = jiffies + - device->pwrctrl.interval_timeout; } } diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index f5e7bbc02b36134803b2264aa6e0db1c42b4c524..ece58fafa3212b18498c20df3d3c49e42ed20ef0 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -61,6 +61,7 @@ struct kgsl_pwr_constraint { } pwrlevel; } hint; unsigned long expires; + uint32_t owner_id; }; /**