drm/nouveau/acr/gm20b: regression fixes
authorBen Skeggs <bskeggs@redhat.com>
Mon, 30 Jan 2023 22:37:15 +0000 (08:37 +1000)
committerLyude Paul <lyude@redhat.com>
Mon, 30 Jan 2023 23:50:09 +0000 (18:50 -0500)
Missed some Tegra-specific quirks when reworking ACR to support Ampere.

Fixes: 2541626cfb79 ("drm/nouveau/acr: use common falcon HS FW code for ACR FWs")
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Tested-by: Diogo Ivo <diogo.ivo@tecnico.ulisboa.pt>
Tested-by: Nicolas Chauvet <kwizart@gmail.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230130223715.1831509-3-bskeggs@redhat.com
drivers/gpu/drm/nouveau/nvkm/core/firmware.c
drivers/gpu/drm/nouveau/nvkm/falcon/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c

index fcf2a002f6cb2d6e9868678d5dfbcf922e661f9a..91fb494d4009354d8c0380c74a73688c28625ed9 100644 (file)
@@ -151,6 +151,9 @@ nvkm_firmware_mem_page(struct nvkm_memory *memory)
 static enum nvkm_memory_target
 nvkm_firmware_mem_target(struct nvkm_memory *memory)
 {
+       if (nvkm_firmware_mem(memory)->device->func->tegra)
+               return NVKM_MEM_TARGET_NCOH;
+
        return NVKM_MEM_TARGET_HOST;
 }
 
index 393ade9f7e6c48449a962c1b21f1bf7c7a950def..b7da3ab44c277d764e7f1551dcccc6232554a385 100644 (file)
@@ -48,6 +48,16 @@ gm200_flcn_pio_dmem_rd(struct nvkm_falcon *falcon, u8 port, const u8 *img, int l
                img += 4;
                len -= 4;
        }
+
+       /* Sigh.  Tegra PMU FW's init message... */
+       if (len) {
+               u32 data = nvkm_falcon_rd32(falcon, 0x1c4 + (port * 8));
+
+               while (len--) {
+                       *(u8 *)img++ = data & 0xff;
+                       data >>= 8;
+               }
+       }
 }
 
 static void
@@ -64,6 +74,8 @@ gm200_flcn_pio_dmem_wr(struct nvkm_falcon *falcon, u8 port, const u8 *img, int l
                img += 4;
                len -= 4;
        }
+
+       WARN_ON(len);
 }
 
 static void
@@ -74,7 +86,7 @@ gm200_flcn_pio_dmem_wr_init(struct nvkm_falcon *falcon, u8 port, bool sec, u32 d
 
 const struct nvkm_falcon_func_pio
 gm200_flcn_dmem_pio = {
-       .min = 4,
+       .min = 1,
        .max = 0x100,
        .wr_init = gm200_flcn_pio_dmem_wr_init,
        .wr = gm200_flcn_pio_dmem_wr,
index a72403777329ea00f26eb2c1b3f519ea16b77348..2ed04da3621d53dc2a58b6071444530aea58fec6 100644 (file)
@@ -225,7 +225,7 @@ gm20b_pmu_init(struct nvkm_pmu *pmu)
 
        pmu->initmsg_received = false;
 
-       nvkm_falcon_load_dmem(falcon, &args, addr_args, sizeof(args), 0);
+       nvkm_falcon_pio_wr(falcon, (u8 *)&args, 0, 0, DMEM, addr_args, sizeof(args), 0, false);
        nvkm_falcon_start(falcon);
        return 0;
 }