diff options
| author | Ilia Mirkin <imirkin@alum.mit.edu> | 2015-06-19 01:19:40 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2015-07-27 04:56:09 -0400 |
| commit | d31b11d85814ff669cfeb93c0f85b9d659a85ef8 (patch) | |
| tree | 715cf2004d9f703914e21565c1ee0b9f58cb3fb3 | |
| parent | 360ccb8436ce83b9c25f969cee7b1b607899063b (diff) | |
drm/nouveau/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-- | drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c index 1f590f839f76..f4611e3f0971 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.c | |||
| @@ -577,9 +577,6 @@ init_reserved(struct nvbios_init *init) | |||
| 577 | u8 length, i; | 577 | u8 length, i; |
| 578 | 578 | ||
| 579 | switch (opcode) { | 579 | switch (opcode) { |
| 580 | case 0x59: | ||
| 581 | length = 7; | ||
| 582 | break; | ||
| 583 | case 0xaa: | 580 | case 0xaa: |
| 584 | length = 4; | 581 | length = 4; |
| 585 | break; | 582 | break; |
| @@ -1288,6 +1285,25 @@ init_zm_reg_sequence(struct nvbios_init *init) | |||
| 1288 | } | 1285 | } |
| 1289 | 1286 | ||
| 1290 | /** | 1287 | /** |
| 1288 | * INIT_PLL_INDIRECT - opcode 0x59 | ||
| 1289 | * | ||
| 1290 | */ | ||
| 1291 | static void | ||
| 1292 | init_pll_indirect(struct nvbios_init *init) | ||
| 1293 | { | ||
| 1294 | struct nvkm_bios *bios = init->bios; | ||
| 1295 | u32 reg = nv_ro32(bios, init->offset + 1); | ||
| 1296 | u16 addr = nv_ro16(bios, init->offset + 5); | ||
| 1297 | u32 freq = (u32)nv_ro16(bios, addr) * 1000; | ||
| 1298 | |||
| 1299 | trace("PLL_INDIRECT\tR[0x%06x] =PLL= VBIOS[%04x] = %dkHz\n", | ||
| 1300 | reg, addr, freq); | ||
| 1301 | init->offset += 7; | ||
| 1302 | |||
| 1303 | init_prog_pll(init, reg, freq); | ||
| 1304 | } | ||
| 1305 | |||
| 1306 | /** | ||
| 1291 | * INIT_ZM_REG_INDIRECT - opcode 0x5a | 1307 | * INIT_ZM_REG_INDIRECT - opcode 0x5a |
| 1292 | * | 1308 | * |
| 1293 | */ | 1309 | */ |
| @@ -2167,7 +2183,7 @@ static struct nvbios_init_opcode { | |||
| 2167 | [0x56] = { init_condition_time }, | 2183 | [0x56] = { init_condition_time }, |
| 2168 | [0x57] = { init_ltime }, | 2184 | [0x57] = { init_ltime }, |
| 2169 | [0x58] = { init_zm_reg_sequence }, | 2185 | [0x58] = { init_zm_reg_sequence }, |
| 2170 | [0x59] = { init_reserved }, | 2186 | [0x59] = { init_pll_indirect }, |
| 2171 | [0x5a] = { init_zm_reg_indirect }, | 2187 | [0x5a] = { init_zm_reg_indirect }, |
| 2172 | [0x5b] = { init_sub_direct }, | 2188 | [0x5b] = { init_sub_direct }, |
| 2173 | [0x5c] = { init_jump }, | 2189 | [0x5c] = { init_jump }, |
