Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ struct nvbios_init {
	u32 nested;
	u16 repeat;
	u16 repend;
	u32 ramcfg;
};

int nvbios_exec(struct nvbios_init *);
+17 −1
Original line number Diff line number Diff line
@@ -410,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init)
	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
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);
	if (table)
		return nv_ro08(init->bios, table + strap);