|
@@ -177,28 +177,25 @@ static const struct stepping_info bxt_stepping_info[] = {
|
|
{'B', '0'}, {'B', '1'}, {'B', '2'}
|
|
{'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;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -285,8 +282,8 @@ static void finish_csr_load(const struct firmware *fw, void *context)
|
|
struct intel_package_header *package_header;
|
|
struct intel_package_header *package_header;
|
|
struct intel_dmc_header *dmc_header;
|
|
struct intel_dmc_header *dmc_header;
|
|
struct intel_csr *csr = &dev_priv->csr;
|
|
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 dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
|
|
uint32_t i;
|
|
uint32_t i;
|
|
uint32_t *dmc_payload;
|
|
uint32_t *dmc_payload;
|
|
@@ -295,11 +292,14 @@ static void finish_csr_load(const struct firmware *fw, void *context)
|
|
if (!fw)
|
|
if (!fw)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- if ((stepping == -ENODATA) || (substepping == -ENODATA)) {
|
|
|
|
|
|
+ if (!stepping_info) {
|
|
DRM_ERROR("Unknown stepping info, firmware loading failed\n");
|
|
DRM_ERROR("Unknown stepping info, firmware loading failed\n");
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ stepping = stepping_info->stepping;
|
|
|
|
+ substepping = stepping_info->substepping;
|
|
|
|
+
|
|
/* Extract CSS Header information*/
|
|
/* Extract CSS Header information*/
|
|
css_header = (struct intel_css_header *)fw->data;
|
|
css_header = (struct intel_css_header *)fw->data;
|
|
if (sizeof(struct intel_css_header) !=
|
|
if (sizeof(struct intel_css_header) !=
|