drm/tegra: falcon: Set DMACTX field on DMA transactions
authorMikko Perttunen <mperttunen@nvidia.com>
Mon, 27 Jun 2022 14:19:51 +0000 (17:19 +0300)
committerThierry Reding <treding@nvidia.com>
Fri, 8 Jul 2022 14:27:52 +0000 (16:27 +0200)
The DMACTX field determines which context, as specified in the
TRANSCFG register, is used. While during boot it doesn't matter
which is used, later on it matters and this value is reused by
the firmware.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/falcon.c
drivers/gpu/drm/tegra/falcon.h

index 3762d87759d98cba5bbd39a5c36ed0611841fe7a..c0d85463eb1ac215d2920e14a02c32fad7c1c35b 100644 (file)
@@ -48,6 +48,14 @@ static int falcon_copy_chunk(struct falcon *falcon,
        if (target == FALCON_MEMORY_IMEM)
                cmd |= FALCON_DMATRFCMD_IMEM;
 
+       /*
+        * Use second DMA context (i.e. the one for firmware). Strictly
+        * speaking, at this point both DMA contexts point to the firmware
+        * stream ID, but this register's value will be reused by the firmware
+        * for later DMA transactions, so we need to use the correct value.
+        */
+       cmd |= FALCON_DMATRFCMD_DMACTX(1);
+
        falcon_writel(falcon, offset, FALCON_DMATRFMOFFS);
        falcon_writel(falcon, base, FALCON_DMATRFFBOFFS);
        falcon_writel(falcon, cmd, FALCON_DMATRFCMD);
index c56ee32d92eec26e69ef60bbdeecee3d1205663b..1955cf11a8a656788200709b9fd9a7648d3d966e 100644 (file)
@@ -50,6 +50,7 @@
 #define FALCON_DMATRFCMD_IDLE                  (1 << 1)
 #define FALCON_DMATRFCMD_IMEM                  (1 << 4)
 #define FALCON_DMATRFCMD_SIZE_256B             (6 << 8)
+#define FALCON_DMATRFCMD_DMACTX(v)             (((v) & 0x7) << 12)
 
 #define FALCON_DMATRFFBOFFS                    0x0000111c