drm/i915/guc: Implement response handling in send_mmio()
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 26 Mar 2018 19:48:21 +0000 (19:48 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 28 Mar 2018 19:35:12 +0000 (20:35 +0100)
We're using data encoded in the status MMIO as return value from send
function, but GuC may also write more data in remaining MMIO regs.
Let's copy content of these registers to the buffer provided by caller.

v2: new line (Michel)
v3: updated commit message

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Michel Thierry <michel.thierry@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20180326194829.58836-5-michal.wajdeczko@intel.com
drivers/gpu/drm/i915/intel_guc.c

index ba5a962ca3d494c56e8538a6bc03be4ec9a85f9d..b83a5ad9cb79a20cb932b9d5418ea507476b1434 100644 (file)
@@ -368,11 +368,20 @@ int intel_guc_send_mmio(struct intel_guc *guc, const u32 *action, u32 len,
                                 " ret=%d status=0x%08X response=0x%08X\n",
                                 action[0], ret, status,
                                 I915_READ(SOFT_SCRATCH(15)));
-       } else {
-               /* Use data from the GuC response as our return value */
-               ret = INTEL_GUC_MSG_TO_DATA(status);
+               goto out;
        }
 
+       if (response_buf) {
+               int count = min(response_buf_size, guc->send_regs.count - 1);
+
+               for (i = 0; i < count; i++)
+                       response_buf[i] = I915_READ(guc_send_reg(guc, i + 1));
+       }
+
+       /* Use data from the GuC response as our return value */
+       ret = INTEL_GUC_MSG_TO_DATA(status);
+
+out:
        intel_uncore_forcewake_put(dev_priv, guc->send_regs.fw_domains);
        mutex_unlock(&guc->send_mutex);