Alexandre Courbot
2016-Nov-04  09:36 UTC
[Nouveau] [PATCH v2] gr: fallback to legacy paths during firmware lookup
Look for firmware files using the legacy ("nouveau/nvxx_fucxxxx") path
if they cannot be found in the new, "official" path. User setups were
broken by the switch, which is bad.
There are only 4 firmware files we may want to look up that way, so
hardcode them into the lookup function. All new firmware files should
use the standard "nvidia/<chip>/gr/" path.
Fixes: 8539b37acef7 ("drm/nouveau/gr: use NVIDIA-provided external
firmwares")
Signed-off-by: Alexandre Courbot <acourbot at nvidia.com>
---
Changes since v1:
* Moved file name translation into the legacy function
 drm/nouveau/nvkm/engine/gr/gf100.c | 53 +++++++++++++++++++++++++++++++++++---
 1 file changed, 49 insertions(+), 4 deletions(-)
diff --git a/drm/nouveau/nvkm/engine/gr/gf100.c
b/drm/nouveau/nvkm/engine/gr/gf100.c
index eccdee04107d..ed45f923442f 100644
--- a/drm/nouveau/nvkm/engine/gr/gf100.c
+++ b/drm/nouveau/nvkm/engine/gr/gf100.c
@@ -1756,6 +1756,53 @@ gf100_gr_ = {
 };
 
 int
+gf100_gr_ctor_fw_legacy(struct gf100_gr *gr, const char *fwname,
+			struct gf100_gr_fuc *fuc, int ret)
+{
+	struct nvkm_subdev *subdev = &gr->base.engine.subdev;
+	struct nvkm_device *device = subdev->device;
+	const struct firmware *fw;
+	char f[32];
+
+	/* see if this firmware has a legacy path */
+	if (!strcmp(fwname, "fecs_inst"))
+		fwname = "fuc409c";
+	else if (!strcmp(fwname, "fecs_data"))
+		fwname = "fuc409d";
+	else if (!strcmp(fwname, "gpccs_inst"))
+		fwname = "fuc41ac";
+	else if (!strcmp(fwname, "gpccs_data"))
+		fwname = "fuc41ad";
+	else
+		fwname = NULL;
+
+	/* nope, let's just return the error we got */
+	if (!fwname) {
+		nvkm_error(subdev, "failed to load %s\n", fwname);
+		return ret;
+	}
+
+	/* yes, try to load from the legacy path */
+	nvkm_debug(subdev, "%s: falling back to legacy path\n", fwname);
+
+	snprintf(f, sizeof(f), "nouveau/nv%02x_%s", device->chipset,
fwname);
+	ret = request_firmware(&fw, f, device->dev);
+	if (ret) {
+		snprintf(f, sizeof(f), "nouveau/%s", fwname);
+		ret = request_firmware(&fw, f, device->dev);
+		if (ret) {
+			nvkm_error(subdev, "failed to load %s\n", fwname);
+			return ret;
+		}
+	}
+
+	fuc->size = fw->size;
+	fuc->data = kmemdup(fw->data, fuc->size, GFP_KERNEL);
+	release_firmware(fw);
+	return (fuc->data != NULL) ? 0 : -ENOMEM;
+}
+
+int
 gf100_gr_ctor_fw(struct gf100_gr *gr, const char *fwname,
 		 struct gf100_gr_fuc *fuc)
 {
@@ -1765,10 +1812,8 @@ gf100_gr_ctor_fw(struct gf100_gr *gr, const char *fwname,
 	int ret;
 
 	ret = nvkm_firmware_get(device, fwname, &fw);
-	if (ret) {
-		nvkm_error(subdev, "failed to load %s\n", fwname);
-		return ret;
-	}
+	if (ret)
+		return gf100_gr_ctor_fw_legacy(gr, fwname, fuc, ret);
 
 	fuc->size = fw->size;
 	fuc->data = kmemdup(fw->data, fuc->size, GFP_KERNEL);
-- 
2.10.0
Peter Wu
2016-Nov-05  15:12 UTC
[Nouveau] [PATCH v2] gr: fallback to legacy paths during firmware lookup
On Fri, Nov 04, 2016 at 06:36:17PM +0900, Alexandre Courbot wrote:> Look for firmware files using the legacy ("nouveau/nvxx_fucxxxx") path > if they cannot be found in the new, "official" path. User setups were > broken by the switch, which is bad. > > There are only 4 firmware files we may want to look up that way, so > hardcode them into the lookup function. All new firmware files should > use the standard "nvidia/<chip>/gr/" path. > > Fixes: 8539b37acef7 ("drm/nouveau/gr: use NVIDIA-provided external firmwares") > Signed-off-by: Alexandre Courbot <acourbot at nvidia.com> > --- > Changes since v1: > * Moved file name translation into the legacy function > > drm/nouveau/nvkm/engine/gr/gf100.c | 53 +++++++++++++++++++++++++++++++++++--- > 1 file changed, 49 insertions(+), 4 deletions(-) > > diff --git a/drm/nouveau/nvkm/engine/gr/gf100.c b/drm/nouveau/nvkm/engine/gr/gf100.c > index eccdee04107d..ed45f923442f 100644 > --- a/drm/nouveau/nvkm/engine/gr/gf100.c > +++ b/drm/nouveau/nvkm/engine/gr/gf100.c > @@ -1756,6 +1756,53 @@ gf100_gr_ = { > }; > > int > +gf100_gr_ctor_fw_legacy(struct gf100_gr *gr, const char *fwname, > + struct gf100_gr_fuc *fuc, int ret) > +{ > + struct nvkm_subdev *subdev = &gr->base.engine.subdev; > + struct nvkm_device *device = subdev->device; > + const struct firmware *fw; > + char f[32]; > + > + /* see if this firmware has a legacy path */ > + if (!strcmp(fwname, "fecs_inst")) > + fwname = "fuc409c"; > + else if (!strcmp(fwname, "fecs_data")) > + fwname = "fuc409d"; > + else if (!strcmp(fwname, "gpccs_inst")) > + fwname = "fuc41ac"; > + else if (!strcmp(fwname, "gpccs_data")) > + fwname = "fuc41ad"; > + else > + fwname = NULL; > + > + /* nope, let's just return the error we got */ > + if (!fwname) { > + nvkm_error(subdev, "failed to load %s\n", fwname);Due to the rename from legacy_fwname -> fwname, this can be NULL. What about replacing the else branch above by this block? Kind regards, Peter> + return ret; > + } > + > + /* yes, try to load from the legacy path */ > + nvkm_debug(subdev, "%s: falling back to legacy path\n", fwname); > + > + snprintf(f, sizeof(f), "nouveau/nv%02x_%s", device->chipset, fwname); > + ret = request_firmware(&fw, f, device->dev); > + if (ret) { > + snprintf(f, sizeof(f), "nouveau/%s", fwname); > + ret = request_firmware(&fw, f, device->dev); > + if (ret) { > + nvkm_error(subdev, "failed to load %s\n", fwname); > + return ret; > + } > + } > + > + fuc->size = fw->size; > + fuc->data = kmemdup(fw->data, fuc->size, GFP_KERNEL); > + release_firmware(fw); > + return (fuc->data != NULL) ? 0 : -ENOMEM; > +} > + > +int > gf100_gr_ctor_fw(struct gf100_gr *gr, const char *fwname, > struct gf100_gr_fuc *fuc) > { > @@ -1765,10 +1812,8 @@ gf100_gr_ctor_fw(struct gf100_gr *gr, const char *fwname, > int ret; > > ret = nvkm_firmware_get(device, fwname, &fw); > - if (ret) { > - nvkm_error(subdev, "failed to load %s\n", fwname); > - return ret; > - } > + if (ret) > + return gf100_gr_ctor_fw_legacy(gr, fwname, fuc, ret); > > fuc->size = fw->size; > fuc->data = kmemdup(fw->data, fuc->size, GFP_KERNEL); > -- > 2.10.0
Alexandre Courbot
2016-Nov-06  09:02 UTC
[Nouveau] [PATCH v2] gr: fallback to legacy paths during firmware lookup
On Sun, Nov 6, 2016 at 12:12 AM, Peter Wu <peter at lekensteyn.nl> wrote:> On Fri, Nov 04, 2016 at 06:36:17PM +0900, Alexandre Courbot wrote: >> Look for firmware files using the legacy ("nouveau/nvxx_fucxxxx") path >> if they cannot be found in the new, "official" path. User setups were >> broken by the switch, which is bad. >> >> There are only 4 firmware files we may want to look up that way, so >> hardcode them into the lookup function. All new firmware files should >> use the standard "nvidia/<chip>/gr/" path. >> >> Fixes: 8539b37acef7 ("drm/nouveau/gr: use NVIDIA-provided external firmwares") >> Signed-off-by: Alexandre Courbot <acourbot at nvidia.com> >> --- >> Changes since v1: >> * Moved file name translation into the legacy function >> >> drm/nouveau/nvkm/engine/gr/gf100.c | 53 +++++++++++++++++++++++++++++++++++--- >> 1 file changed, 49 insertions(+), 4 deletions(-) >> >> diff --git a/drm/nouveau/nvkm/engine/gr/gf100.c b/drm/nouveau/nvkm/engine/gr/gf100.c >> index eccdee04107d..ed45f923442f 100644 >> --- a/drm/nouveau/nvkm/engine/gr/gf100.c >> +++ b/drm/nouveau/nvkm/engine/gr/gf100.c >> @@ -1756,6 +1756,53 @@ gf100_gr_ = { >> }; >> >> int >> +gf100_gr_ctor_fw_legacy(struct gf100_gr *gr, const char *fwname, >> + struct gf100_gr_fuc *fuc, int ret) >> +{ >> + struct nvkm_subdev *subdev = &gr->base.engine.subdev; >> + struct nvkm_device *device = subdev->device; >> + const struct firmware *fw; >> + char f[32]; >> + >> + /* see if this firmware has a legacy path */ >> + if (!strcmp(fwname, "fecs_inst")) >> + fwname = "fuc409c"; >> + else if (!strcmp(fwname, "fecs_data")) >> + fwname = "fuc409d"; >> + else if (!strcmp(fwname, "gpccs_inst")) >> + fwname = "fuc41ac"; >> + else if (!strcmp(fwname, "gpccs_data")) >> + fwname = "fuc41ad"; >> + else >> + fwname = NULL; >> + >> + /* nope, let's just return the error we got */ >> + if (!fwname) { >> + nvkm_error(subdev, "failed to load %s\n", fwname); > > Due to the rename from legacy_fwname -> fwname, this can be NULL. > What about replacing the else branch above by this block?Ah, stupid me - I wanted to save a variable and here is the result. Thanks for catching this, I will send a fixup patch to Ben.
Seemingly Similar Threads
- [PATCH] gr: fallback to legacy paths during firmware lookup
- [PATCH] gr: fallback to legacy paths during firmware lookup
- [PATCH v2] gr: fallback to legacy paths during firmware lookup
- [PATCH] gr: fallback to legacy paths during firmware lookup
- [PATCH] gr: fallback to legacy paths during firmware lookup