Skip to content

Commit

Permalink
drm/nouveau/bios: add proper support for opcode 0x59
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
imirkin authored and Ben Skeggs committed Jul 27, 2015
1 parent 360ccb8 commit d31b11d
Showing 1 changed file with 20 additions and 4 deletions.
24 changes: 20 additions & 4 deletions drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
*
Expand Down Expand Up @@ -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 },
Expand Down

0 comments on commit d31b11d

Please sign in to comment.