summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2015-06-19 01:19:40 -0400
committerBen Skeggs <bskeggs@redhat.com>2015-06-19 15:31:41 +1000
commita182357ef44bef38f0d42e0934f9fbc401761e8d (patch)
treede5805eaa20e45cc3662697ead9ca39475f1fb1a
parentca8fe8c9f37a56391fc83449af92088a2a38f3ea (diff)
bios: add proper support for opcode 0x59
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>
-rw-r--r--drm/nouveau/nvkm/subdev/bios/init.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drm/nouveau/nvkm/subdev/bios/init.c b/drm/nouveau/nvkm/subdev/bios/init.c
index 1f590f83..f4611e3f 100644
--- a/drm/nouveau/nvkm/subdev/bios/init.c
+++ b/drm/nouveau/nvkm/subdev/bios/init.c
@@ -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;
@@ -1288,6 +1285,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 },