drm/i915/bxt: Reject DMC firmware versions with known bugs
authorImre Deak <imre.deak@intel.com>
Fri, 1 Apr 2016 13:02:32 +0000 (16:02 +0300)
committerImre Deak <imre.deak@intel.com>
Fri, 15 Apr 2016 11:12:35 +0000 (14:12 +0300)
DMC version 1.06 has a known bug, where the firmware polls forever for a
port PLL to lock, if the PLL was disabled when entering DC5, which locks
up the machine. Version 1.07 fixes this, so make that the minimum
required version on BXT.

CC: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1459515767-29228-2-git-send-email-imre.deak@intel.com
drivers/gpu/drm/i915/intel_csr.c

index 3f57cb94d9ad3de331805c86e877fd6e9759d1b6..d57b00ed5e5e9dfb724290142088d3ead8b7967b 100644 (file)
@@ -50,6 +50,7 @@ MODULE_FIRMWARE(I915_CSR_SKL);
 MODULE_FIRMWARE(I915_CSR_BXT);
 
 #define SKL_CSR_VERSION_REQUIRED       CSR_VERSION(1, 23)
+#define BXT_CSR_VERSION_REQUIRED       CSR_VERSION(1, 7)
 
 #define CSR_MAX_FW_SIZE                        0x2FFF
 #define CSR_DEFAULT_FW_OFFSET          0xFFFFFFFF
@@ -281,6 +282,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
        uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
        uint32_t i;
        uint32_t *dmc_payload;
+       uint32_t required_min_version;
 
        if (!fw)
                return NULL;
@@ -296,15 +298,23 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
 
        csr->version = css_header->version;
 
-       if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
-           csr->version < SKL_CSR_VERSION_REQUIRED) {
-               DRM_INFO("Refusing to load old Skylake DMC firmware v%u.%u,"
+       if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
+               required_min_version = SKL_CSR_VERSION_REQUIRED;
+       } else if (IS_BROXTON(dev_priv)) {
+               required_min_version = BXT_CSR_VERSION_REQUIRED;
+       } else {
+               MISSING_CASE(INTEL_REVID(dev_priv));
+               required_min_version = 0;
+       }
+
+       if (csr->version < required_min_version) {
+               DRM_INFO("Refusing to load old DMC firmware v%u.%u,"
                         " please upgrade to v%u.%u or later"
                           " [" FIRMWARE_URL "].\n",
                         CSR_VERSION_MAJOR(csr->version),
                         CSR_VERSION_MINOR(csr->version),
-                        CSR_VERSION_MAJOR(SKL_CSR_VERSION_REQUIRED),
-                        CSR_VERSION_MINOR(SKL_CSR_VERSION_REQUIRED));
+                        CSR_VERSION_MAJOR(required_min_version),
+                        CSR_VERSION_MINOR(required_min_version));
                return NULL;
        }