As seen in at least one NV134 VBIOS (... that I obviously don't own myself).

Signed-off-by: Roy Spliet <[email protected]>
---
 drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c | 27 +++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
index 38ed09f..a18f8b4 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
@@ -2196,6 +2196,32 @@ init_gpio_ne(struct nvbios_init *init)
        init->offset += count;
 }
 
+/**
+ * INIT_ZM_REG_SET_LOOP - opcode 0xaf
+ *
+ */
+static void
+init_zm_reg_set_loop(struct nvbios_init *init)
+{
+       struct nvkm_bios *bios = init->bios;
+       u8  sets = nvbios_rd08(bios, init->offset + 1);
+       u8  regs = nvbios_rd08(bios, init->offset + 2);
+       u32 reg_off = init->offset + 3;
+       u32 addr, data, i, j;
+
+       trace("ZM_REG_SET_LOOP 0x%02hhx 0x%02hhx\n", sets, regs);
+       init->offset += 3 + (regs * 4);
+
+       for (i = 0; i < sets; i++) {
+               for (j = 0; j < regs; j++, init->offset += 4) {
+                       addr = nvbios_rd32(bios, reg_off + (j * 4));
+                       data = nvbios_rd32(bios, init->offset);
+                       init_wr32(init, addr, data);
+                       trace("\tR[0x%06x] = 0x%08x\n", addr, data);
+               }
+       }
+}
+
 static struct nvbios_init_opcode {
        void (*exec)(struct nvbios_init *);
 } init_opcode[] = {
@@ -2268,6 +2294,7 @@ static struct nvbios_init_opcode {
        [0x9a] = { init_i2c_long_if },
        [0xa9] = { init_gpio_ne },
        [0xaa] = { init_reserved },
+       [0xaf] = { init_zm_reg_set_loop },
 };
 
 #define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0]))
-- 
2.5.5

_______________________________________________
Nouveau mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to