forked from Minki/linux
drm/i915: avoid wait_for_atomic() in non-atomic host2guc_action()
Rather than using wait_for_atomic() when chacking for a response from the GuC, we can get the effect of a hybrid spin/sleep wait by breaking it into two stages. First, spin-wait for up to 10us to minimise latency for "quick" commands; then, if that times out, sleep-wait for up 10ms (the maximum allowed for a "slow" command). Being able to do this depends on the recent patch18f4b84
drm/i915: Use atomic waits for short non-atomic ones and is similar to the hybrid approach in1758b90
drm/i915: Use a hybrid scheme for fast register waits (although we can't use that as-is, because that interface doesn't quite match what we need here). Signed-off-by: Dave Gordon <david.s.gordon@intel.com> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1467815411-21756-1-git-send-email-david.s.gordon@intel.com
This commit is contained in:
parent
aca34b6e1c
commit
ab0e455bd0
@ -97,8 +97,14 @@ static int host2guc_action(struct intel_guc *guc, u32 *data, u32 len)
|
||||
|
||||
I915_WRITE(HOST2GUC_INTERRUPT, HOST2GUC_TRIGGER);
|
||||
|
||||
/* No HOST2GUC command should take longer than 10ms */
|
||||
ret = wait_for_atomic(host2guc_action_response(dev_priv, &status), 10);
|
||||
/*
|
||||
* Fast commands should complete in less than 10us, so sample quickly
|
||||
* up to that length of time, then switch to a slower sleep-wait loop.
|
||||
* No HOST2GUC command should ever take longer than 10ms.
|
||||
*/
|
||||
ret = wait_for_us(host2guc_action_response(dev_priv, &status), 10);
|
||||
if (ret)
|
||||
ret = wait_for(host2guc_action_response(dev_priv, &status), 10);
|
||||
if (status != GUC2HOST_STATUS_SUCCESS) {
|
||||
/*
|
||||
* Either the GuC explicitly returned an error (which
|
||||
|
Loading…
Reference in New Issue
Block a user