{'B', '0'}, {'B', '1'}, {'B', '2'}
 };
 
-static char intel_get_stepping(struct drm_device *dev)
+static const struct stepping_info *intel_get_stepping_info(struct drm_device *dev)
 {
-       if (IS_SKYLAKE(dev) && (dev->pdev->revision <
-                       ARRAY_SIZE(skl_stepping_info)))
-               return skl_stepping_info[dev->pdev->revision].stepping;
-       else if (IS_BROXTON(dev) && (dev->pdev->revision <
-                               ARRAY_SIZE(bxt_stepping_info)))
-               return bxt_stepping_info[dev->pdev->revision].stepping;
-       else
-               return -ENODATA;
-}
+       const struct stepping_info *si;
+       unsigned int size;
+
+       if (IS_SKYLAKE(dev)) {
+               size = ARRAY_SIZE(skl_stepping_info);
+               si = skl_stepping_info;
+       } else if (IS_BROXTON(dev)) {
+               size = ARRAY_SIZE(bxt_stepping_info);
+               si = bxt_stepping_info;
+       } else {
+               return NULL;
+       }
 
-static char intel_get_substepping(struct drm_device *dev)
-{
-       if (IS_SKYLAKE(dev) && (dev->pdev->revision <
-                       ARRAY_SIZE(skl_stepping_info)))
-               return skl_stepping_info[dev->pdev->revision].substepping;
-       else if (IS_BROXTON(dev) && (dev->pdev->revision <
-                       ARRAY_SIZE(bxt_stepping_info)))
-               return bxt_stepping_info[dev->pdev->revision].substepping;
-       else
-               return -ENODATA;
+       if (INTEL_REVID(dev) < size)
+               return si + INTEL_REVID(dev);
+
+       return NULL;
 }
 
 /**
        struct intel_package_header *package_header;
        struct intel_dmc_header *dmc_header;
        struct intel_csr *csr = &dev_priv->csr;
-       char stepping = intel_get_stepping(dev);
-       char substepping = intel_get_substepping(dev);
+       const struct stepping_info *stepping_info = intel_get_stepping_info(dev);
+       char stepping, substepping;
        uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
        uint32_t i;
        uint32_t *dmc_payload;
        if (!fw)
                goto out;
 
-       if ((stepping == -ENODATA) || (substepping == -ENODATA)) {
+       if (!stepping_info) {
                DRM_ERROR("Unknown stepping info, firmware loading failed\n");
                goto out;
        }
 
+       stepping = stepping_info->stepping;
+       substepping = stepping_info->substepping;
+
        /* Extract CSS Header information*/
        css_header = (struct intel_css_header *)fw->data;
        if (sizeof(struct intel_css_header) !=