ce/gf100: fix incorrect CE0 address calculation on some GPUs
authorBen Skeggs <bskeggs@redhat.com>
Wed, 3 Nov 2021 01:10:57 +0000 (11:10 +1000)
committerKarol Herbst <kherbst@redhat.com>
Wed, 3 Nov 2021 23:40:27 +0000 (00:40 +0100)
The code which constructs the modules for each engine present on the GPU
passes -1 for 'instance' on non-instanced engines, which affects how the
name for a sub-device is generated.  This is then stored as 'instance 0'
in nvkm_subdev.inst, so code can potentially be shared with earlier GPUs
that only had a single instance of an engine.

However, GF100's CE constructor uses this value to calculate the address
of its falcon before it's translated, resulting in CE0 getting the wrong
address.

This slightly modifies the approach, always passing a valid instance for
engines that *can* have multiple copies, and having the code for earlier
GPUs explicitly ask for non-instanced name generation.

Bug: https://gitlab.freedesktop.org/drm/nouveau/-/issues/91

Fixes: 50551b15c760 ("drm/nouveau/ce: switch to instanced constructor")
Cc: <stable@vger.kernel.org> # v5.12+
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Tested-by: Karol Herbst <kherbst@redhat.com>
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211103011057.15344-1-skeggsb@gmail.com
drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.c
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c

index 704df0f2d1f16c39fc5cbe897b80ffdc76fe3461..09a112af2f89359e0122f95acdae9a7ad849d9d8 100644 (file)
@@ -78,6 +78,6 @@ int
 gt215_ce_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
             struct nvkm_engine **pengine)
 {
-       return nvkm_falcon_new_(&gt215_ce, device, type, inst,
+       return nvkm_falcon_new_(&gt215_ce, device, type, -1,
                                (device->chipset != 0xaf), 0x104000, pengine);
 }
index ca75c5f6ecaf80a96429b5a6a81432183ccd02f5..b51d690f375ff4721ababf34a2fc53c27b2976f8 100644 (file)
@@ -3147,8 +3147,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
        WARN_ON(device->chip->ptr.inst & ~((1 << ARRAY_SIZE(device->ptr)) - 1));             \
        for (j = 0; device->chip->ptr.inst && j < ARRAY_SIZE(device->ptr); j++) {            \
                if ((device->chip->ptr.inst & BIT(j)) && (subdev_mask & BIT_ULL(type))) {    \
-                       int inst = (device->chip->ptr.inst == 1) ? -1 : (j);                 \
-                       ret = device->chip->ptr.ctor(device, (type), inst, &device->ptr[j]); \
+                       ret = device->chip->ptr.ctor(device, (type), (j), &device->ptr[j]);  \
                        subdev = nvkm_device_subdev(device, (type), (j));                    \
                        if (ret) {                                                           \
                                nvkm_subdev_del(&subdev);                                    \