Commit 5ddf4d4a authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/bios: cache ramcfg strap on later chipsets

This fixes suspend/resume on at least Quadro 400.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 3d8ec277
...@@ -13,6 +13,7 @@ struct nvbios_init { ...@@ -13,6 +13,7 @@ struct nvbios_init {
u32 nested; u32 nested;
u16 repeat; u16 repeat;
u16 repend; u16 repend;
u32 ramcfg;
}; };
int nvbios_exec(struct nvbios_init *); int nvbios_exec(struct nvbios_init *);
......
...@@ -410,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init) ...@@ -410,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init)
return 0x00; return 0x00;
} }
static u8
init_ram_restrict_strap(struct nvbios_init *init)
{
/* This appears to be the behaviour of the VBIOS parser, and *is*
* important to cache the NV_PEXTDEV_BOOT0 on later chipsets to
* avoid fucking up the memory controller (somehow) by reading it
* on every INIT_RAM_RESTRICT_ZM_GROUP opcode.
*
* Preserving the non-caching behaviour on earlier chipsets just
* in case *not* re-reading the strap causes similar breakage.
*/
if (!init->ramcfg || init->bios->version.major < 0x70)
init->ramcfg = init_rd32(init, 0x101000);
return (init->ramcfg & 0x00000003c) >> 2;
}
static u8 static u8
init_ram_restrict(struct nvbios_init *init) init_ram_restrict(struct nvbios_init *init)
{ {
u32 strap = (init_rd32(init, 0x101000) & 0x0000003c) >> 2; u8 strap = init_ram_restrict_strap(init);
u16 table = init_ram_restrict_table(init); u16 table = init_ram_restrict_table(init);
if (table) if (table)
return nv_ro08(init->bios, table + strap); return nv_ro08(init->bios, table + strap);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment