drm/nouveau/bios/rammap: Parse perf mode as if it's a rammap entry
authorRoy Spliet <rspliet@eclipso.eu>
Sat, 23 May 2015 08:37:47 +0000 (10:37 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:39:56 +0000 (12:39 +1000)
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>
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/rammap.h
drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c

index f09b6bf69098cd5cbd0723ea20d9e8298495aa74..26e233a7b4d4c2c7b096f45a5f528f3f40529bae 100644 (file)
@@ -6,6 +6,11 @@ struct nvbios_ramcfg {
        unsigned rammap_min;
        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;
index 2044fc911ceb928325942a80f412f30323d24d1b..8d8ee13721ec80ec4018d9b8a8710367f3d3ed15 100644 (file)
@@ -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,
index d6e4af7606ba8d01cd6c12d849575b630a58e36a..29ba85387adcfbac90edbc36f5d2c2217fa6e030 100644 (file)
@@ -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)
index 37ccc4dbeaf554d59a509b7bb4c0a5eb13df0710..91e9cff7a6458f51c97e0fe201c7c51300f56a48 100644 (file)
@@ -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) {