Commit 9787d4e0 authored by Itai Katz's avatar Itai Katz Committed by Greg Kroah-Hartman

staging: fsl-mc: don't use object versions to make binding decisions

Up until now if the object version expected by a driver (in the API header
file) did not match the actual object version in the MC hardware the bus
driver refused to bind the object to the driver or printed out WARN_ON
dumps.

This patch removes those checks, and the responsibility of object version
checking should now be done in the object drivers themselves.  If the actual
version discovered is not supported, the driver's probe function should fail.
Drivers should use version checks to support new features and provide
backwards compatibility if at all possible.

This patch also removes the checks that caused bus driver probing to fail
if the overall MC version discovered did not match the firmware version
from the API header...this was too strict.  The overall MC version is
informational like a release number, and continues to be printed in the
boot log.
Signed-off-by: default avatarItai Katz <itai.katz@nxp.com>
(Stuart: reworded commit log)
Signed-off-by: default avatarStuart Yoder <stuart.yoder@nxp.com>
Acked-by: default avatarGerman Rivera <german.rivera@nxp.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ac061998
...@@ -780,9 +780,7 @@ static int dprc_remove(struct fsl_mc_device *mc_dev) ...@@ -780,9 +780,7 @@ static int dprc_remove(struct fsl_mc_device *mc_dev)
static const struct fsl_mc_device_match_id match_id_table[] = { static const struct fsl_mc_device_match_id match_id_table[] = {
{ {
.vendor = FSL_MC_VENDOR_FREESCALE, .vendor = FSL_MC_VENDOR_FREESCALE,
.obj_type = "dprc", .obj_type = "dprc"},
.ver_major = DPRC_VER_MAJOR,
.ver_minor = DPRC_VER_MINOR},
{.vendor = 0x0}, {.vendor = 0x0},
}; };
......
...@@ -709,20 +709,14 @@ static const struct fsl_mc_device_match_id match_id_table[] = { ...@@ -709,20 +709,14 @@ static const struct fsl_mc_device_match_id match_id_table[] = {
{ {
.vendor = FSL_MC_VENDOR_FREESCALE, .vendor = FSL_MC_VENDOR_FREESCALE,
.obj_type = "dpbp", .obj_type = "dpbp",
.ver_major = DPBP_VER_MAJOR,
.ver_minor = DPBP_VER_MINOR
}, },
{ {
.vendor = FSL_MC_VENDOR_FREESCALE, .vendor = FSL_MC_VENDOR_FREESCALE,
.obj_type = "dpmcp", .obj_type = "dpmcp",
.ver_major = DPMCP_VER_MAJOR,
.ver_minor = DPMCP_VER_MINOR
}, },
{ {
.vendor = FSL_MC_VENDOR_FREESCALE, .vendor = FSL_MC_VENDOR_FREESCALE,
.obj_type = "dpcon", .obj_type = "dpcon",
.ver_major = DPCON_VER_MAJOR,
.ver_minor = DPCON_VER_MINOR
}, },
{.vendor = 0x0}, {.vendor = 0x0},
}; };
......
...@@ -40,8 +40,6 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv) ...@@ -40,8 +40,6 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev); struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv); struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv);
bool found = false; bool found = false;
bool major_version_mismatch = false;
bool minor_version_mismatch = false;
if (WARN_ON(!fsl_mc_bus_exists())) if (WARN_ON(!fsl_mc_bus_exists()))
goto out; goto out;
...@@ -64,32 +62,12 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv) ...@@ -64,32 +62,12 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
for (id = mc_drv->match_id_table; id->vendor != 0x0; id++) { for (id = mc_drv->match_id_table; id->vendor != 0x0; id++) {
if (id->vendor == mc_dev->obj_desc.vendor && if (id->vendor == mc_dev->obj_desc.vendor &&
strcmp(id->obj_type, mc_dev->obj_desc.type) == 0) { strcmp(id->obj_type, mc_dev->obj_desc.type) == 0) {
if (id->ver_major == mc_dev->obj_desc.ver_major) {
found = true; found = true;
if (id->ver_minor != mc_dev->obj_desc.ver_minor)
minor_version_mismatch = true;
} else {
major_version_mismatch = true;
}
break; break;
} }
} }
if (major_version_mismatch) {
dev_warn(dev,
"Major version mismatch: driver version %u.%u, MC object version %u.%u\n",
id->ver_major, id->ver_minor,
mc_dev->obj_desc.ver_major,
mc_dev->obj_desc.ver_minor);
} else if (minor_version_mismatch) {
dev_warn(dev,
"Minor version mismatch: driver version %u.%u, MC object version %u.%u\n",
id->ver_major, id->ver_minor,
mc_dev->obj_desc.ver_major,
mc_dev->obj_desc.ver_minor);
}
out: out:
dev_dbg(dev, "%smatched\n", found ? "" : "not "); dev_dbg(dev, "%smatched\n", found ? "" : "not ");
return found; return found;
...@@ -722,20 +700,6 @@ static int fsl_mc_bus_probe(struct platform_device *pdev) ...@@ -722,20 +700,6 @@ static int fsl_mc_bus_probe(struct platform_device *pdev)
"Freescale Management Complex Firmware version: %u.%u.%u\n", "Freescale Management Complex Firmware version: %u.%u.%u\n",
mc_version.major, mc_version.minor, mc_version.revision); mc_version.major, mc_version.minor, mc_version.revision);
if (mc_version.major < MC_VER_MAJOR) {
dev_err(&pdev->dev,
"ERROR: MC firmware version not supported by driver (driver version: %u.%u)\n",
MC_VER_MAJOR, MC_VER_MINOR);
error = -ENOTSUPP;
goto error_cleanup_mc_io;
}
if (mc_version.major > MC_VER_MAJOR) {
dev_warn(&pdev->dev,
"WARNING: driver may not support newer MC firmware features (driver version: %u.%u)\n",
MC_VER_MAJOR, MC_VER_MINOR);
}
error = get_mc_addr_translation_ranges(&pdev->dev, error = get_mc_addr_translation_ranges(&pdev->dev,
&mc->translation_ranges, &mc->translation_ranges,
&mc->num_translation_ranges); &mc->num_translation_ranges);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment