drm/nouveau/bios/ramcfg: Separate out RON pull value
authorRoy Spliet <rspliet@eclipso.eu>
Sun, 24 May 2015 08:43:59 +0000 (10:43 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:39:56 +0000 (12:39 +1000)
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/nvkm/subdev/bios/rammap.c
drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c

index 26e233a7b4d4c2c7b096f45a5f528f3f40529bae..3a9abd38aca8d5b732aa7366e0cf069130d996df 100644 (file)
@@ -38,6 +38,7 @@ struct nvbios_ramcfg {
        unsigned ramcfg_hdr;
        unsigned ramcfg_timing;
        unsigned ramcfg_DLLoff;
+       unsigned ramcfg_RON;
        union {
                struct {
                        unsigned ramcfg_00_03_01:1;
index 29ba85387adcfbac90edbc36f5d2c2217fa6e030..1abd9fe4194cec5ef9db60b51d16e9185202bc5c 100644 (file)
@@ -164,12 +164,13 @@ nvbios_rammapSp_from_perf(struct nvkm_bios *bios, u32 data, u8 size, int idx,
        if (size < 11)
                return 0x00000000;
 
+       p->ramcfg_ver = 0;
        p->ramcfg_timing   =  nv_ro08(bios, data + 0x01);
        p->ramcfg_00_03_01 = (nv_ro08(bios, data + 0x03) & 0x01) >> 0;
        p->ramcfg_00_03_02 = (nv_ro08(bios, data + 0x03) & 0x02) >> 1;
        p->ramcfg_DLLoff   = (nv_ro08(bios, data + 0x03) & 0x04) >> 2;
        p->ramcfg_00_03_08 = (nv_ro08(bios, data + 0x03) & 0x08) >> 3;
-       p->ramcfg_00_03_10 = (nv_ro08(bios, data + 0x03) & 0x10) >> 4;
+       p->ramcfg_RON      = (nv_ro08(bios, data + 0x03) & 0x10) >> 3;
        p->ramcfg_00_04_02 = (nv_ro08(bios, data + 0x04) & 0x02) >> 1;
        p->ramcfg_00_04_04 = (nv_ro08(bios, data + 0x04) & 0x04) >> 2;
        p->ramcfg_00_04_20 = (nv_ro08(bios, data + 0x04) & 0x20) >> 5;
index 763fd29a58f212128b933926518556ff97e45c1f..bacd43321826fd62de755e7c354ac603599f80f0 100644 (file)
@@ -102,6 +102,8 @@ nvbios_timingEp(struct nvkm_bios *bios, int idx,
                p->timing_10_RRD   = nv_ro08(bios, data + 0x0c);
                p->timing_10_13    = nv_ro08(bios, data + 0x0d);
                p->timing_10_ODT   = nv_ro08(bios, data + 0x0e) & 0x07;
+               if (p->ramcfg_ver >= 0x10)
+                       p->ramcfg_RON = nv_ro08(bios, data + 0x0e) & 0x07;
 
                p->timing_10_24  = 0xff;
                p->timing_10_21  = 0;
index e1d11f709a711d9bb3743e04d1ee4a935567cb4e..8d759f8a87531cfde9c0238cf9fe0eac7e607531 100644 (file)
@@ -70,7 +70,7 @@ ramgddr3_wr_lo[] = {
 int
 nvkm_gddr3_calc(struct nvkm_ram *ram)
 {
-       int CL, WR, CWL, DLL = 0, ODT = 0, hi;
+       int CL, WR, CWL, DLL = 0, ODT = 0, RON, hi;
 
        switch (ram->next->bios.timing_ver) {
        case 0x10:
@@ -79,6 +79,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram)
                WR  = ram->next->bios.timing_10_WR;
                DLL = !ram->next->bios.ramcfg_DLLoff;
                ODT = ram->next->bios.timing_10_ODT;
+               RON = ram->next->bios.ramcfg_RON;
                break;
        case 0x20:
                CWL = (ram->next->bios.timing[1] & 0x00000f80) >> 7;
@@ -89,6 +90,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram)
                ODT =  (ram->mr[1] & 0x004) >> 2 |
                       (ram->mr[1] & 0x040) >> 5 |
                       (ram->mr[1] & 0x200) >> 7;
+               RON = !(ram->mr[1] & 0x300) >> 8;
                break;
        default:
                return -ENOSYS;
@@ -107,7 +109,7 @@ nvkm_gddr3_calc(struct nvkm_ram *ram)
 
        ram->mr[1] &= ~0x3fc;
        ram->mr[1] |= (ODT & 0x03) << 2;
-       ram->mr[1] |= (ODT & 0x03) << 8;
+       ram->mr[1] |= (RON & 0x03) << 8;
        ram->mr[1] |= (WR  & 0x03) << 4;
        ram->mr[1] |= (WR  & 0x04) << 5;
        ram->mr[1] |= !DLL << 6;