All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] gr: fallback to legacy paths during firmware lookup
@ 2016-11-04  9:36 Alexandre Courbot
       [not found] ` <20161104093617.11370-1-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Alexandre Courbot @ 2016-11-04  9:36 UTC (permalink / raw)
  To: Ben Skeggs; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

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@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

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] gr: fallback to legacy paths during firmware lookup
       [not found] ` <20161104093617.11370-1-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2016-11-05 15:12   ` Peter Wu
  2016-11-06  9:02     ` Alexandre Courbot
  0 siblings, 1 reply; 3+ messages in thread
From: Peter Wu @ 2016-11-05 15:12 UTC (permalink / raw)
  To: Alexandre Courbot; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Ben Skeggs

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@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
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] gr: fallback to legacy paths during firmware lookup
  2016-11-05 15:12   ` Peter Wu
@ 2016-11-06  9:02     ` Alexandre Courbot
  0 siblings, 0 replies; 3+ messages in thread
From: Alexandre Courbot @ 2016-11-06  9:02 UTC (permalink / raw)
  To: Peter Wu; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Ben Skeggs

On Sun, Nov 6, 2016 at 12:12 AM, Peter Wu <peter@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@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.
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-11-06  9:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-04  9:36 [PATCH v2] gr: fallback to legacy paths during firmware lookup Alexandre Courbot
     [not found] ` <20161104093617.11370-1-acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-11-05 15:12   ` Peter Wu
2016-11-06  9:02     ` Alexandre Courbot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.