drm/nouveau/bios: add proper support for opcode 0x59
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 19 Jun 2015 05:19:40 +0000 (01:19 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 27 Jul 2015 08:56:09 +0000 (18:56 +1000)
More analysis shows that this is identical to 0x79 except that it loads
the frequency indirectly from elsewhere in the VBIOS.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91025
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c

index 1f590f839f76d9b0414702f811bbec5e85819b23..f4611e3f097187002e68dc54af44c45bfd0006d9 100644 (file)
@@ -577,9 +577,6 @@ init_reserved(struct nvbios_init *init)
        u8 length, i;
 
        switch (opcode) {
-       case 0x59:
-               length = 7;
-               break;
        case 0xaa:
                length = 4;
                break;
@@ -1287,6 +1284,25 @@ init_zm_reg_sequence(struct nvbios_init *init)
        }
 }
 
+/**
+ * INIT_PLL_INDIRECT - opcode 0x59
+ *
+ */
+static void
+init_pll_indirect(struct nvbios_init *init)
+{
+       struct nvkm_bios *bios = init->bios;
+       u32  reg = nv_ro32(bios, init->offset + 1);
+       u16 addr = nv_ro16(bios, init->offset + 5);
+       u32 freq = (u32)nv_ro16(bios, addr) * 1000;
+
+       trace("PLL_INDIRECT\tR[0x%06x] =PLL= VBIOS[%04x] = %dkHz\n",
+             reg, addr, freq);
+       init->offset += 7;
+
+       init_prog_pll(init, reg, freq);
+}
+
 /**
  * INIT_ZM_REG_INDIRECT - opcode 0x5a
  *
@@ -2167,7 +2183,7 @@ static struct nvbios_init_opcode {
        [0x56] = { init_condition_time },
        [0x57] = { init_ltime },
        [0x58] = { init_zm_reg_sequence },
-       [0x59] = { init_reserved },
+       [0x59] = { init_pll_indirect },
        [0x5a] = { init_zm_reg_indirect },
        [0x5b] = { init_sub_direct },
        [0x5c] = { init_jump },