]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/guc: Add support for data reporting in GuC responses
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 26 Mar 2018 19:48:19 +0000 (19:48 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 28 Mar 2018 19:35:10 +0000 (20:35 +0100)
GuC may return additional data in the response message.
Format and meaning of this data is action specific. We will
use this non-negative data as a new success return value.
Currently used actions don't return data that way yet.

v2: fix prohibited space after '~' (Michel)
    update commit message (Daniele)
v3: rebase

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Oscar Mateo <oscar.mateo@intel.com>
Cc: Michel Thierry <michel.thierry@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@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-3-michal.wajdeczko@intel.com
drivers/gpu/drm/i915/intel_guc.c
drivers/gpu/drm/i915/intel_guc_ct.c

index 78e68b169cf2d4a9449d81091d0ceb62672fb9c3..1af32a0648dbf9da4be8372b5ceb923fc4609026 100644 (file)
@@ -366,6 +366,9 @@ 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);
        }
 
        intel_uncore_forcewake_put(dev_priv, guc->send_regs.fw_domains);
index 1dafa7a20d89593046aed66e90d56466866248f6..fa522594d7167e4a3c795d12285605eba803a46b 100644 (file)
@@ -400,7 +400,9 @@ static int ctch_send(struct intel_guc *guc,
                return err;
        if (!INTEL_GUC_MSG_IS_RESPONSE_SUCCESS(*status))
                return -EIO;
-       return 0;
+
+       /* Use data from the GuC status as our return value */
+       return INTEL_GUC_MSG_TO_DATA(*status);
 }
 
 /*
@@ -410,18 +412,18 @@ static int intel_guc_send_ct(struct intel_guc *guc, const u32 *action, u32 len)
 {
        struct intel_guc_ct_channel *ctch = &guc->ct.host_channel;
        u32 status = ~0; /* undefined */
-       int err;
+       int ret;
 
        mutex_lock(&guc->send_mutex);
 
-       err = ctch_send(guc, ctch, action, len, &status);
-       if (unlikely(err)) {
+       ret = ctch_send(guc, ctch, action, len, &status);
+       if (unlikely(ret < 0)) {
                DRM_ERROR("CT: send action %#X failed; err=%d status=%#X\n",
-                         action[0], err, status);
+                         action[0], ret, status);
        }
 
        mutex_unlock(&guc->send_mutex);
-       return err;
+       return ret;
 }
 
 /**