summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Spliet <rspliet@eclipso.eu>2015-05-23 10:37:47 +0200
committerBen Skeggs <bskeggs@redhat.com>2015-06-03 10:49:28 +1000
commitad7afef970d21daf07e7217045fb423244ba9353 (patch)
tree0cdba6e35450d892a04e9c20b3ced16e8db111fb
parent9a3ad416eb431ff644f66cbf7610593a39208d0d (diff)
bios/rammap: Parse perf mode as if it's a rammap entry
Some of the bits in there are similar to the bits in the gt215 rammap. Signed-off-by: Roy Spliet <rspliet@eclipso.eu> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drm/nouveau/include/nvkm/subdev/bios/ramcfg.h5
-rw-r--r--drm/nouveau/include/nvkm/subdev/bios/rammap.h2
-rw-r--r--drm/nouveau/nvkm/subdev/bios/rammap.c15
-rw-r--r--drm/nouveau/nvkm/subdev/fb/ramnv50.c2
4 files changed, 24 insertions, 0 deletions
diff --git a/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h b/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
index f09b6bf6..26e233a7 100644
--- a/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
+++ b/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
@@ -7,6 +7,11 @@ struct nvbios_ramcfg {
unsigned rammap_max;
union {
struct {
+ unsigned rammap_00_16_20:1;
+ unsigned rammap_00_16_40:1;
+ unsigned rammap_00_17_02:1;
+ };
+ struct {
unsigned rammap_10_04_02:1;
unsigned rammap_10_04_08:1;
};
diff --git a/drm/nouveau/include/nvkm/subdev/bios/rammap.h b/drm/nouveau/include/nvkm/subdev/bios/rammap.h
index 2044fc91..8d8ee137 100644
--- a/drm/nouveau/include/nvkm/subdev/bios/rammap.h
+++ b/drm/nouveau/include/nvkm/subdev/bios/rammap.h
@@ -7,6 +7,8 @@ u32 nvbios_rammapTe(struct nvkm_bios *, u8 *ver, u8 *hdr,
u32 nvbios_rammapEe(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
+u32 nvbios_rammapEp_from_perf(struct nvkm_bios *bios, u32 data, u8 size,
+ struct nvbios_ramcfg *p);
u32 nvbios_rammapEp(struct nvkm_bios *, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *);
u32 nvbios_rammapEm(struct nvkm_bios *, u16 mhz,
diff --git a/drm/nouveau/nvkm/subdev/bios/rammap.c b/drm/nouveau/nvkm/subdev/bios/rammap.c
index d6e4af76..29ba8538 100644
--- a/drm/nouveau/nvkm/subdev/bios/rammap.c
+++ b/drm/nouveau/nvkm/subdev/bios/rammap.c
@@ -72,6 +72,21 @@ nvbios_rammapEe(struct nvkm_bios *bios, int idx,
return 0x0000;
}
+/* Pretend a performance mode is also a rammap entry, helps coalesce entries
+ * later on */
+u32
+nvbios_rammapEp_from_perf(struct nvkm_bios *bios, u32 data, u8 size,
+ struct nvbios_ramcfg *p)
+{
+ memset(p, 0x00, sizeof(*p));
+
+ p->rammap_00_16_20 = (nv_ro08(bios, data + 0x16) & 0x20) >> 5;
+ p->rammap_00_16_40 = (nv_ro08(bios, data + 0x16) & 0x40) >> 6;
+ p->rammap_00_17_02 = (nv_ro08(bios, data + 0x17) & 0x02) >> 1;
+
+ return data;
+}
+
u32
nvbios_rammapEp(struct nvkm_bios *bios, int idx,
u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ramcfg *p)
diff --git a/drm/nouveau/nvkm/subdev/fb/ramnv50.c b/drm/nouveau/nvkm/subdev/fb/ramnv50.c
index 37ccc4db..91e9cff7 100644
--- a/drm/nouveau/nvkm/subdev/fb/ramnv50.c
+++ b/drm/nouveau/nvkm/subdev/fb/ramnv50.c
@@ -169,6 +169,8 @@ nv50_ram_calc(struct nvkm_fb *pfb, u32 freq)
}
} while (perfE.memory < freq);
+ nvbios_rammapEp_from_perf(bios, data, hdr, &next->bios);
+
/* locate specific data set for the attached memory */
strap = nvbios_ramcfg_index(nv_subdev(pfb));
if (strap >= cnt) {