diff options
| author | Ben Skeggs <bskeggs@redhat.com> | 2014-09-14 22:30:08 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2014-09-15 08:25:15 -0400 |
| commit | c378eb746167e0e96e9a2da72781c0d409a8d94e (patch) | |
| tree | 8b49d35636582cb9651957f23eac43b553e0c834 | |
| parent | a407318913b11362e10d0948ae82de6edaf98a9e (diff) | |
drm/nouveau/bios: parse older ramcfg/timing data like we do newer ones
Done after discussion with Roy.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/include/subdev/bios/ramcfg.h | 162 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/include/subdev/fb.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/bios/timing.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/fb/ramnva3.c | 87 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/fb/sddr2.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/fb/sddr3.c | 21 |
7 files changed, 184 insertions, 132 deletions
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/bios/ramcfg.h b/drivers/gpu/drm/nouveau/core/include/subdev/bios/ramcfg.h index 7e5b06733143..a685bbd04568 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/bios/ramcfg.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/bios/ramcfg.h | |||
| @@ -8,76 +8,114 @@ struct nvbios_ramcfg { | |||
| 8 | unsigned rammap_hdr; | 8 | unsigned rammap_hdr; |
| 9 | unsigned rammap_min; | 9 | unsigned rammap_min; |
| 10 | unsigned rammap_max; | 10 | unsigned rammap_max; |
| 11 | unsigned rammap_11_08_01:1; | 11 | union { |
| 12 | unsigned rammap_11_08_0c:2; | 12 | struct { |
| 13 | unsigned rammap_11_08_10:1; | 13 | unsigned rammap_10_04_02:1; |
| 14 | unsigned rammap_11_09_01ff:9; | 14 | unsigned rammap_10_04_08:1; |
| 15 | unsigned rammap_11_0a_03fe:9; | 15 | }; |
| 16 | unsigned rammap_11_0a_0400:1; | 16 | struct { |
| 17 | unsigned rammap_11_0a_0800:1; | 17 | unsigned rammap_11_08_01:1; |
| 18 | unsigned rammap_11_0b_01f0:5; | 18 | unsigned rammap_11_08_0c:2; |
| 19 | unsigned rammap_11_0b_0200:1; | 19 | unsigned rammap_11_08_10:1; |
| 20 | unsigned rammap_11_0b_0400:1; | 20 | unsigned rammap_11_09_01ff:9; |
| 21 | unsigned rammap_11_0b_0800:1; | 21 | unsigned rammap_11_0a_03fe:9; |
| 22 | unsigned rammap_11_0d:8; | 22 | unsigned rammap_11_0a_0400:1; |
| 23 | unsigned rammap_11_0e:8; | 23 | unsigned rammap_11_0a_0800:1; |
| 24 | unsigned rammap_11_0f:8; | 24 | unsigned rammap_11_0b_01f0:5; |
| 25 | unsigned rammap_11_11_0c:2; | 25 | unsigned rammap_11_0b_0200:1; |
| 26 | unsigned rammap_11_0b_0400:1; | ||
| 27 | unsigned rammap_11_0b_0800:1; | ||
| 28 | unsigned rammap_11_0d:8; | ||
| 29 | unsigned rammap_11_0e:8; | ||
| 30 | unsigned rammap_11_0f:8; | ||
| 31 | unsigned rammap_11_11_0c:2; | ||
| 32 | }; | ||
| 33 | }; | ||
| 26 | 34 | ||
| 27 | unsigned ramcfg_ver; | 35 | unsigned ramcfg_ver; |
| 28 | unsigned ramcfg_hdr; | 36 | unsigned ramcfg_hdr; |
| 29 | unsigned ramcfg_timing; | 37 | unsigned ramcfg_timing; |
| 30 | unsigned ramcfg_11_01_01:1; | 38 | union { |
| 31 | unsigned ramcfg_11_01_02:1; | 39 | struct { |
| 32 | unsigned ramcfg_11_01_04:1; | 40 | unsigned ramcfg_10_02_01:1; |
| 33 | unsigned ramcfg_11_01_08:1; | 41 | unsigned ramcfg_10_02_02:1; |
| 34 | unsigned ramcfg_11_01_10:1; | 42 | unsigned ramcfg_10_02_04:1; |
| 35 | unsigned ramcfg_11_01_20:1; | 43 | unsigned ramcfg_10_02_08:1; |
| 36 | unsigned ramcfg_11_01_40:1; | 44 | unsigned ramcfg_10_02_10:1; |
| 37 | unsigned ramcfg_11_01_80:1; | 45 | unsigned ramcfg_10_02_20:1; |
| 38 | unsigned ramcfg_11_02_03:2; | 46 | unsigned ramcfg_10_02_40:1; |
| 39 | unsigned ramcfg_11_02_04:1; | 47 | unsigned ramcfg_10_03_0f:4; |
| 40 | unsigned ramcfg_11_02_08:1; | 48 | unsigned ramcfg_10_05:8; |
| 41 | unsigned ramcfg_11_02_10:1; | 49 | unsigned ramcfg_10_06:8; |
| 42 | unsigned ramcfg_11_02_40:1; | 50 | unsigned ramcfg_10_07:8; |
| 43 | unsigned ramcfg_11_02_80:1; | 51 | unsigned ramcfg_10_08:8; |
| 44 | unsigned ramcfg_11_03_0f:4; | 52 | unsigned ramcfg_10_09_0f:4; |
| 45 | unsigned ramcfg_11_03_30:2; | 53 | unsigned ramcfg_10_09_f0:4; |
| 46 | unsigned ramcfg_11_03_c0:2; | 54 | }; |
| 47 | unsigned ramcfg_11_03_f0:4; | 55 | struct { |
| 48 | unsigned ramcfg_11_04:8; | 56 | unsigned ramcfg_11_01_01:1; |
| 49 | unsigned ramcfg_11_06:8; | 57 | unsigned ramcfg_11_01_02:1; |
| 50 | unsigned ramcfg_11_07_02:1; | 58 | unsigned ramcfg_11_01_04:1; |
| 51 | unsigned ramcfg_11_07_04:1; | 59 | unsigned ramcfg_11_01_08:1; |
| 52 | unsigned ramcfg_11_07_08:1; | 60 | unsigned ramcfg_11_01_10:1; |
| 53 | unsigned ramcfg_11_07_10:1; | 61 | unsigned ramcfg_11_01_20:1; |
| 54 | unsigned ramcfg_11_07_40:1; | 62 | unsigned ramcfg_11_01_40:1; |
| 55 | unsigned ramcfg_11_07_80:1; | 63 | unsigned ramcfg_11_01_80:1; |
| 56 | unsigned ramcfg_11_08_01:1; | 64 | unsigned ramcfg_11_02_03:2; |
| 57 | unsigned ramcfg_11_08_02:1; | 65 | unsigned ramcfg_11_02_04:1; |
| 58 | unsigned ramcfg_11_08_04:1; | 66 | unsigned ramcfg_11_02_08:1; |
| 59 | unsigned ramcfg_11_08_08:1; | 67 | unsigned ramcfg_11_02_10:1; |
| 60 | unsigned ramcfg_11_08_10:1; | 68 | unsigned ramcfg_11_02_40:1; |
| 61 | unsigned ramcfg_11_08_20:1; | 69 | unsigned ramcfg_11_02_80:1; |
| 62 | unsigned ramcfg_11_09:8; | 70 | unsigned ramcfg_11_03_0f:4; |
| 71 | unsigned ramcfg_11_03_30:2; | ||
| 72 | unsigned ramcfg_11_03_c0:2; | ||
| 73 | unsigned ramcfg_11_03_f0:4; | ||
| 74 | unsigned ramcfg_11_04:8; | ||
| 75 | unsigned ramcfg_11_06:8; | ||
| 76 | unsigned ramcfg_11_07_02:1; | ||
| 77 | unsigned ramcfg_11_07_04:1; | ||
| 78 | unsigned ramcfg_11_07_08:1; | ||
| 79 | unsigned ramcfg_11_07_10:1; | ||
| 80 | unsigned ramcfg_11_07_40:1; | ||
| 81 | unsigned ramcfg_11_07_80:1; | ||
| 82 | unsigned ramcfg_11_08_01:1; | ||
| 83 | unsigned ramcfg_11_08_02:1; | ||
| 84 | unsigned ramcfg_11_08_04:1; | ||
| 85 | unsigned ramcfg_11_08_08:1; | ||
| 86 | unsigned ramcfg_11_08_10:1; | ||
| 87 | unsigned ramcfg_11_08_20:1; | ||
| 88 | unsigned ramcfg_11_09:8; | ||
| 89 | }; | ||
| 90 | }; | ||
| 63 | 91 | ||
| 64 | unsigned timing_ver; | 92 | unsigned timing_ver; |
| 65 | unsigned timing_hdr; | 93 | unsigned timing_hdr; |
| 66 | unsigned timing[11]; | 94 | unsigned timing[11]; |
| 67 | unsigned timing_20_2e_03:2; | 95 | union { |
| 68 | unsigned timing_20_2e_30:2; | 96 | struct { |
| 69 | unsigned timing_20_2e_c0:2; | 97 | unsigned timing_10_WR:8; |
| 70 | unsigned timing_20_2f_03:2; | 98 | unsigned timing_10_CL:8; |
| 71 | unsigned timing_20_2c_003f:6; | 99 | unsigned timing_10_ODT:3; |
| 72 | unsigned timing_20_2c_1fc0:7; | 100 | unsigned timing_10_CWL:8; |
| 73 | unsigned timing_20_30_f8:5; | 101 | }; |
| 74 | unsigned timing_20_30_07:3; | 102 | struct { |
| 75 | unsigned timing_20_31_0007:3; | 103 | unsigned timing_20_2e_03:2; |
| 76 | unsigned timing_20_31_0078:4; | 104 | unsigned timing_20_2e_30:2; |
| 77 | unsigned timing_20_31_0780:4; | 105 | unsigned timing_20_2e_c0:2; |
| 78 | unsigned timing_20_31_0800:1; | 106 | unsigned timing_20_2f_03:2; |
| 79 | unsigned timing_20_31_7000:3; | 107 | unsigned timing_20_2c_003f:6; |
| 80 | unsigned timing_20_31_8000:1; | 108 | unsigned timing_20_2c_1fc0:7; |
| 109 | unsigned timing_20_30_f8:5; | ||
| 110 | unsigned timing_20_30_07:3; | ||
| 111 | unsigned timing_20_31_0007:3; | ||
| 112 | unsigned timing_20_31_0078:4; | ||
| 113 | unsigned timing_20_31_0780:4; | ||
| 114 | unsigned timing_20_31_0800:1; | ||
| 115 | unsigned timing_20_31_7000:3; | ||
| 116 | unsigned timing_20_31_8000:1; | ||
| 117 | }; | ||
| 118 | }; | ||
| 81 | }; | 119 | }; |
| 82 | 120 | ||
| 83 | u8 nvbios_ramcfg_count(struct nouveau_bios *); | 121 | u8 nvbios_ramcfg_count(struct nouveau_bios *); |
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/fb.h b/drivers/gpu/drm/nouveau/core/include/subdev/fb.h index 507c3b44e560..8d0032f15205 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/fb.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/fb.h | |||
| @@ -146,11 +146,6 @@ struct nouveau_ram { | |||
| 146 | int (*calc)(struct nouveau_fb *, u32 freq); | 146 | int (*calc)(struct nouveau_fb *, u32 freq); |
| 147 | int (*prog)(struct nouveau_fb *); | 147 | int (*prog)(struct nouveau_fb *); |
| 148 | void (*tidy)(struct nouveau_fb *); | 148 | void (*tidy)(struct nouveau_fb *); |
| 149 | struct { | ||
| 150 | u8 version; | ||
| 151 | u32 data; | ||
| 152 | u8 size; | ||
| 153 | } rammap, ramcfg, timing; | ||
| 154 | u32 freq; | 149 | u32 freq; |
| 155 | u32 mr[16]; | 150 | u32 mr[16]; |
| 156 | u32 mr1_nuts; | 151 | u32 mr1_nuts; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c b/drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c index ae3d956aec99..585e69331ccc 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/rammap.c | |||
| @@ -87,6 +87,8 @@ nvbios_rammapEp(struct nouveau_bios *bios, int idx, | |||
| 87 | case 0x10: | 87 | case 0x10: |
| 88 | p->rammap_min = nv_ro16(bios, data + 0x00); | 88 | p->rammap_min = nv_ro16(bios, data + 0x00); |
| 89 | p->rammap_max = nv_ro16(bios, data + 0x02); | 89 | p->rammap_max = nv_ro16(bios, data + 0x02); |
| 90 | p->rammap_10_04_02 = (nv_ro08(bios, data + 0x04) & 0x02) >> 1; | ||
| 91 | p->rammap_10_04_08 = (nv_ro08(bios, data + 0x04) & 0x08) >> 3; | ||
| 90 | break; | 92 | break; |
| 91 | case 0x11: | 93 | case 0x11: |
| 92 | p->rammap_min = nv_ro16(bios, data + 0x00); | 94 | p->rammap_min = nv_ro16(bios, data + 0x00); |
| @@ -152,6 +154,23 @@ nvbios_rammapSp(struct nouveau_bios *bios, u32 data, | |||
| 152 | p->ramcfg_ver = *ver; | 154 | p->ramcfg_ver = *ver; |
| 153 | p->ramcfg_hdr = *hdr; | 155 | p->ramcfg_hdr = *hdr; |
| 154 | switch (!!data * *ver) { | 156 | switch (!!data * *ver) { |
| 157 | case 0x10: | ||
| 158 | p->ramcfg_timing = nv_ro08(bios, data + 0x01); | ||
| 159 | p->ramcfg_10_02_01 = (nv_ro08(bios, data + 0x02) & 0x01) >> 0; | ||
| 160 | p->ramcfg_10_02_02 = (nv_ro08(bios, data + 0x02) & 0x02) >> 1; | ||
| 161 | p->ramcfg_10_02_04 = (nv_ro08(bios, data + 0x02) & 0x04) >> 2; | ||
| 162 | p->ramcfg_10_02_08 = (nv_ro08(bios, data + 0x02) & 0x08) >> 3; | ||
| 163 | p->ramcfg_10_02_10 = (nv_ro08(bios, data + 0x02) & 0x10) >> 4; | ||
| 164 | p->ramcfg_10_02_20 = (nv_ro08(bios, data + 0x02) & 0x20) >> 5; | ||
| 165 | p->ramcfg_10_02_40 = (nv_ro08(bios, data + 0x02) & 0x40) >> 6; | ||
| 166 | p->ramcfg_10_03_0f = (nv_ro08(bios, data + 0x03) & 0x0f) >> 0; | ||
| 167 | p->ramcfg_10_05 = (nv_ro08(bios, data + 0x05) & 0xff) >> 0; | ||
| 168 | p->ramcfg_10_06 = (nv_ro08(bios, data + 0x06) & 0xff) >> 0; | ||
| 169 | p->ramcfg_10_07 = (nv_ro08(bios, data + 0x07) & 0xff) >> 0; | ||
| 170 | p->ramcfg_10_08 = (nv_ro08(bios, data + 0x08) & 0xff) >> 0; | ||
| 171 | p->ramcfg_10_09_0f = (nv_ro08(bios, data + 0x09) & 0x0f) >> 0; | ||
| 172 | p->ramcfg_10_09_f0 = (nv_ro08(bios, data + 0x09) & 0xf0) >> 4; | ||
| 173 | break; | ||
| 155 | case 0x11: | 174 | case 0x11: |
| 156 | p->ramcfg_timing = nv_ro08(bios, data + 0x00); | 175 | p->ramcfg_timing = nv_ro08(bios, data + 0x00); |
| 157 | p->ramcfg_11_01_01 = (nv_ro08(bios, data + 0x01) & 0x01) >> 0; | 176 | p->ramcfg_11_01_01 = (nv_ro08(bios, data + 0x01) & 0x01) >> 0; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/timing.c b/drivers/gpu/drm/nouveau/core/subdev/bios/timing.c index c320bfdd1102..46d955eb51eb 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/timing.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/timing.c | |||
| @@ -92,6 +92,12 @@ nvbios_timingEp(struct nouveau_bios *bios, int idx, | |||
| 92 | p->timing_ver = *ver; | 92 | p->timing_ver = *ver; |
| 93 | p->timing_hdr = *hdr; | 93 | p->timing_hdr = *hdr; |
| 94 | switch (!!data * *ver) { | 94 | switch (!!data * *ver) { |
| 95 | case 0x10: | ||
| 96 | p->timing_10_WR = nv_ro08(bios, data + 0x00); | ||
| 97 | p->timing_10_CL = nv_ro08(bios, data + 0x02); | ||
| 98 | p->timing_10_ODT = nv_ro08(bios, data + 0x0e) & 0x07; | ||
| 99 | p->timing_10_CWL = nv_ro08(bios, data + 0x13); | ||
| 100 | break; | ||
| 95 | case 0x20: | 101 | case 0x20: |
| 96 | p->timing[0] = nv_ro32(bios, data + 0x00); | 102 | p->timing[0] = nv_ro32(bios, data + 0x00); |
| 97 | p->timing[1] = nv_ro32(bios, data + 0x04); | 103 | p->timing[1] = nv_ro32(bios, data + 0x04); |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnva3.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnva3.c index c2037b943d00..3601deca0bd5 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnva3.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnva3.c | |||
| @@ -79,21 +79,27 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 79 | struct nva3_ram *ram = (void *)pfb->ram; | 79 | struct nva3_ram *ram = (void *)pfb->ram; |
| 80 | struct nva3_ramfuc *fuc = &ram->fuc; | 80 | struct nva3_ramfuc *fuc = &ram->fuc; |
| 81 | struct nva3_clock_info mclk; | 81 | struct nva3_clock_info mclk; |
| 82 | struct nvbios_ramcfg cfg; | 82 | struct nouveau_ram_data *next; |
| 83 | u8 ver, cnt, len, strap; | 83 | u8 ver, hdr, cnt, len, strap; |
| 84 | u32 data; | 84 | u32 data; |
| 85 | struct { | ||
| 86 | u32 data; | ||
| 87 | u8 size; | ||
| 88 | } rammap, ramcfg, timing; | ||
| 89 | u32 r004018, r100760, ctrl; | 85 | u32 r004018, r100760, ctrl; |
| 90 | u32 unk714, unk718, unk71c; | 86 | u32 unk714, unk718, unk71c; |
| 91 | int ret; | 87 | int ret, i; |
| 88 | |||
| 89 | next = &ram->base.target; | ||
| 90 | next->freq = freq; | ||
| 91 | ram->base.next = next; | ||
| 92 | 92 | ||
| 93 | /* lookup memory config data relevant to the target frequency */ | 93 | /* lookup memory config data relevant to the target frequency */ |
| 94 | rammap.data = nvbios_rammapEm(bios, freq / 1000, &ver, &rammap.size, | 94 | i = 0; |
| 95 | &cnt, &ramcfg.size, &cfg); | 95 | while ((data = nvbios_rammapEp(bios, i++, &ver, &hdr, &cnt, &len, |
| 96 | if (!rammap.data || ver != 0x10 || rammap.size < 0x0e) { | 96 | &next->bios))) { |
| 97 | if (freq / 1000 >= next->bios.rammap_min && | ||
| 98 | freq / 1000 <= next->bios.rammap_max) | ||
| 99 | break; | ||
| 100 | } | ||
| 101 | |||
| 102 | if (!data || ver != 0x10 || hdr < 0x0e) { | ||
| 97 | nv_error(pfb, "invalid/missing rammap entry\n"); | 103 | nv_error(pfb, "invalid/missing rammap entry\n"); |
| 98 | return -EINVAL; | 104 | return -EINVAL; |
| 99 | } | 105 | } |
| @@ -105,23 +111,22 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 105 | return -EINVAL; | 111 | return -EINVAL; |
| 106 | } | 112 | } |
| 107 | 113 | ||
| 108 | ramcfg.data = rammap.data + rammap.size + (strap * ramcfg.size); | 114 | data = nvbios_rammapSp(bios, data, ver, hdr, cnt, len, strap, |
| 109 | if (!ramcfg.data || ver != 0x10 || ramcfg.size < 0x0e) { | 115 | &ver, &hdr, &next->bios); |
| 116 | if (!data || ver != 0x10 || hdr < 0x0e) { | ||
| 110 | nv_error(pfb, "invalid/missing ramcfg entry\n"); | 117 | nv_error(pfb, "invalid/missing ramcfg entry\n"); |
| 111 | return -EINVAL; | 118 | return -EINVAL; |
| 112 | } | 119 | } |
| 113 | 120 | ||
| 114 | /* lookup memory timings, if bios says they're present */ | 121 | /* lookup memory timings, if bios says they're present */ |
| 115 | strap = nv_ro08(bios, ramcfg.data + 0x01); | 122 | if (next->bios.ramcfg_timing != 0xff) { |
| 116 | if (strap != 0xff) { | 123 | data = nvbios_timingEp(bios, next->bios.ramcfg_timing, |
| 117 | timing.data = nvbios_timingEe(bios, strap, &ver, &timing.size, | 124 | &ver, &hdr, &cnt, &len, |
| 118 | &cnt, &len); | 125 | &next->bios); |
| 119 | if (!timing.data || ver != 0x10 || timing.size < 0x19) { | 126 | if (!data || ver != 0x10 || hdr < 0x19) { |
| 120 | nv_error(pfb, "invalid/missing timing entry\n"); | 127 | nv_error(pfb, "invalid/missing timing entry\n"); |
| 121 | return -EINVAL; | 128 | return -EINVAL; |
| 122 | } | 129 | } |
| 123 | } else { | ||
| 124 | timing.data = 0; | ||
| 125 | } | 130 | } |
| 126 | 131 | ||
| 127 | ret = nva3_pll_info(nouveau_clock(pfb), 0x12, 0x4000, freq, &mclk); | 132 | ret = nva3_pll_info(nouveau_clock(pfb), 0x12, 0x4000, freq, &mclk); |
| @@ -164,17 +169,17 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 164 | ram_mask(fuc, 0x004168, 0x003f3141, ctrl); | 169 | ram_mask(fuc, 0x004168, 0x003f3141, ctrl); |
| 165 | } | 170 | } |
| 166 | 171 | ||
| 167 | if ( (nv_ro08(bios, ramcfg.data + 0x02) & 0x10)) { | 172 | if (next->bios.ramcfg_10_02_10) { |
| 168 | ram_mask(fuc, 0x111104, 0x00000600, 0x00000000); | 173 | ram_mask(fuc, 0x111104, 0x00000600, 0x00000000); |
| 169 | } else { | 174 | } else { |
| 170 | ram_mask(fuc, 0x111100, 0x40000000, 0x40000000); | 175 | ram_mask(fuc, 0x111100, 0x40000000, 0x40000000); |
| 171 | ram_mask(fuc, 0x111104, 0x00000180, 0x00000000); | 176 | ram_mask(fuc, 0x111104, 0x00000180, 0x00000000); |
| 172 | } | 177 | } |
| 173 | 178 | ||
| 174 | if (!(nv_ro08(bios, rammap.data + 0x04) & 0x02)) | 179 | if (!next->bios.rammap_10_04_02) |
| 175 | ram_mask(fuc, 0x100200, 0x00000800, 0x00000000); | 180 | ram_mask(fuc, 0x100200, 0x00000800, 0x00000000); |
| 176 | ram_wr32(fuc, 0x611200, 0x00003300); | 181 | ram_wr32(fuc, 0x611200, 0x00003300); |
| 177 | if (!(nv_ro08(bios, ramcfg.data + 0x02) & 0x10)) | 182 | if (!next->bios.ramcfg_10_02_10) |
| 178 | ram_wr32(fuc, 0x111100, 0x4c020000); /*XXX*/ | 183 | ram_wr32(fuc, 0x111100, 0x4c020000); /*XXX*/ |
| 179 | 184 | ||
| 180 | ram_wr32(fuc, 0x1002d4, 0x00000001); | 185 | ram_wr32(fuc, 0x1002d4, 0x00000001); |
| @@ -203,17 +208,16 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 203 | ram_wr32(fuc, 0x004018, 0x0000d000 | r004018); | 208 | ram_wr32(fuc, 0x004018, 0x0000d000 | r004018); |
| 204 | } | 209 | } |
| 205 | 210 | ||
| 206 | if ( (nv_ro08(bios, rammap.data + 0x04) & 0x08)) { | 211 | if (next->bios.rammap_10_04_08) { |
| 207 | u32 unk5a0 = (nv_ro16(bios, ramcfg.data + 0x05) << 8) | | 212 | ram_wr32(fuc, 0x1005a0, next->bios.ramcfg_10_06 << 16 | |
| 208 | nv_ro08(bios, ramcfg.data + 0x05); | 213 | next->bios.ramcfg_10_05 << 8 | |
| 209 | u32 unk5a4 = (nv_ro16(bios, ramcfg.data + 0x07)); | 214 | next->bios.ramcfg_10_05); |
| 210 | u32 unk804 = (nv_ro08(bios, ramcfg.data + 0x09) & 0xf0) << 16 | | 215 | ram_wr32(fuc, 0x1005a4, next->bios.ramcfg_10_08 << 8 | |
| 211 | (nv_ro08(bios, ramcfg.data + 0x03) & 0x0f) << 16 | | 216 | next->bios.ramcfg_10_07); |
| 212 | (nv_ro08(bios, ramcfg.data + 0x09) & 0x0f) | | 217 | ram_wr32(fuc, 0x10f804, next->bios.ramcfg_10_09_f0 << 20 | |
| 213 | 0x80000000; | 218 | next->bios.ramcfg_10_03_0f << 16 | |
| 214 | ram_wr32(fuc, 0x1005a0, unk5a0); | 219 | next->bios.ramcfg_10_09_0f | |
| 215 | ram_wr32(fuc, 0x1005a4, unk5a4); | 220 | 0x80000000); |
| 216 | ram_wr32(fuc, 0x10f804, unk804); | ||
| 217 | ram_mask(fuc, 0x10053c, 0x00001000, 0x00000000); | 221 | ram_mask(fuc, 0x10053c, 0x00001000, 0x00000000); |
| 218 | } else { | 222 | } else { |
| 219 | ram_mask(fuc, 0x10053c, 0x00001000, 0x00001000); | 223 | ram_mask(fuc, 0x10053c, 0x00001000, 0x00001000); |
| @@ -251,27 +255,26 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 251 | ram_mask(fuc, 0x100220[0], 0x00000000, 0x00000000); | 255 | ram_mask(fuc, 0x100220[0], 0x00000000, 0x00000000); |
| 252 | ram_mask(fuc, 0x100220[8], 0x00000000, 0x00000000); | 256 | ram_mask(fuc, 0x100220[8], 0x00000000, 0x00000000); |
| 253 | 257 | ||
| 254 | data = (nv_ro08(bios, ramcfg.data + 0x02) & 0x08) ? 0x00000000 : 0x00001000; | 258 | ram_mask(fuc, 0x100200, 0x00001000, !next->bios.ramcfg_10_02_08 << 12); |
| 255 | ram_mask(fuc, 0x100200, 0x00001000, data); | ||
| 256 | 259 | ||
| 257 | unk714 = ram_rd32(fuc, 0x100714) & ~0xf0000010; | 260 | unk714 = ram_rd32(fuc, 0x100714) & ~0xf0000010; |
| 258 | unk718 = ram_rd32(fuc, 0x100718) & ~0x00000100; | 261 | unk718 = ram_rd32(fuc, 0x100718) & ~0x00000100; |
| 259 | unk71c = ram_rd32(fuc, 0x10071c) & ~0x00000100; | 262 | unk71c = ram_rd32(fuc, 0x10071c) & ~0x00000100; |
| 260 | if ( (nv_ro08(bios, ramcfg.data + 0x02) & 0x20)) | 263 | if (next->bios.ramcfg_10_02_20) |
| 261 | unk714 |= 0xf0000000; | 264 | unk714 |= 0xf0000000; |
| 262 | if (!(nv_ro08(bios, ramcfg.data + 0x02) & 0x04)) | 265 | if (!next->bios.ramcfg_10_02_04) |
| 263 | unk714 |= 0x00000010; | 266 | unk714 |= 0x00000010; |
| 264 | ram_wr32(fuc, 0x100714, unk714); | 267 | ram_wr32(fuc, 0x100714, unk714); |
| 265 | 268 | ||
| 266 | if (nv_ro08(bios, ramcfg.data + 0x02) & 0x01) | 269 | if (next->bios.ramcfg_10_02_01) |
| 267 | unk71c |= 0x00000100; | 270 | unk71c |= 0x00000100; |
| 268 | ram_wr32(fuc, 0x10071c, unk71c); | 271 | ram_wr32(fuc, 0x10071c, unk71c); |
| 269 | 272 | ||
| 270 | if (nv_ro08(bios, ramcfg.data + 0x02) & 0x02) | 273 | if (next->bios.ramcfg_10_02_02) |
| 271 | unk718 |= 0x00000100; | 274 | unk718 |= 0x00000100; |
| 272 | ram_wr32(fuc, 0x100718, unk718); | 275 | ram_wr32(fuc, 0x100718, unk718); |
| 273 | 276 | ||
| 274 | if (nv_ro08(bios, ramcfg.data + 0x02) & 0x10) | 277 | if (next->bios.ramcfg_10_02_10) |
| 275 | ram_wr32(fuc, 0x111100, 0x48000000); /*XXX*/ | 278 | ram_wr32(fuc, 0x111100, 0x48000000); /*XXX*/ |
| 276 | 279 | ||
| 277 | ram_mask(fuc, mr[0], 0x100, 0x100); | 280 | ram_mask(fuc, mr[0], 0x100, 0x100); |
| @@ -283,9 +286,9 @@ nva3_ram_calc(struct nouveau_fb *pfb, u32 freq) | |||
| 283 | ram_nsec(fuc, 12000); | 286 | ram_nsec(fuc, 12000); |
| 284 | 287 | ||
| 285 | ram_wr32(fuc, 0x611200, 0x00003330); | 288 | ram_wr32(fuc, 0x611200, 0x00003330); |
| 286 | if ( (nv_ro08(bios, rammap.data + 0x04) & 0x02)) | 289 | if (next->bios.rammap_10_04_02) |
| 287 | ram_mask(fuc, 0x100200, 0x00000800, 0x00000800); | 290 | ram_mask(fuc, 0x100200, 0x00000800, 0x00000800); |
| 288 | if ( (nv_ro08(bios, ramcfg.data + 0x02) & 0x10)) { | 291 | if (next->bios.ramcfg_10_02_10) { |
| 289 | ram_mask(fuc, 0x111104, 0x00000180, 0x00000180); | 292 | ram_mask(fuc, 0x111104, 0x00000180, 0x00000180); |
| 290 | ram_mask(fuc, 0x111100, 0x40000000, 0x00000000); | 293 | ram_mask(fuc, 0x111100, 0x40000000, 0x00000000); |
| 291 | } else { | 294 | } else { |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/sddr2.c b/drivers/gpu/drm/nouveau/core/subdev/fb/sddr2.c index b5b043238e6c..bb1eb8f3e639 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/sddr2.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/sddr2.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | * Ben Skeggs | 23 | * Ben Skeggs |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include <subdev/bios.h> | ||
| 27 | #include "priv.h" | 26 | #include "priv.h" |
| 28 | 27 | ||
| 29 | struct ramxlat { | 28 | struct ramxlat { |
| @@ -61,19 +60,18 @@ ramddr2_wr[] = { | |||
| 61 | int | 60 | int |
| 62 | nouveau_sddr2_calc(struct nouveau_ram *ram) | 61 | nouveau_sddr2_calc(struct nouveau_ram *ram) |
| 63 | { | 62 | { |
| 64 | struct nouveau_bios *bios = nouveau_bios(ram); | ||
| 65 | int CL, WR, DLL = 0, ODT = 0; | 63 | int CL, WR, DLL = 0, ODT = 0; |
| 66 | 64 | ||
| 67 | switch (!!ram->timing.data * ram->timing.version) { | 65 | switch (ram->next->bios.timing_ver) { |
| 68 | case 0x10: | 66 | case 0x10: |
| 69 | CL = nv_ro08(bios, ram->timing.data + 0x02); | 67 | CL = ram->next->bios.timing_10_CL; |
| 70 | WR = nv_ro08(bios, ram->timing.data + 0x00); | 68 | WR = ram->next->bios.timing_10_WR; |
| 71 | DLL = !(nv_ro08(bios, ram->ramcfg.data + 0x02) & 0x40); | 69 | DLL = !ram->next->bios.ramcfg_10_02_40; |
| 72 | ODT = nv_ro08(bios, ram->timing.data + 0x0e) & 0x03; | 70 | ODT = ram->next->bios.timing_10_ODT & 3; |
| 73 | break; | 71 | break; |
| 74 | case 0x20: | 72 | case 0x20: |
| 75 | CL = nv_ro08(bios, ram->timing.data + 0x04) & 0x1f; | 73 | CL = (ram->next->bios.timing[1] & 0x0000001f); |
| 76 | WR = nv_ro08(bios, ram->timing.data + 0x0a) & 0x7f; | 74 | WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; |
| 77 | break; | 75 | break; |
| 78 | default: | 76 | default: |
| 79 | return -ENOSYS; | 77 | return -ENOSYS; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/sddr3.c b/drivers/gpu/drm/nouveau/core/subdev/fb/sddr3.c index 3d77fc5add77..83949b11833a 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/fb/sddr3.c +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/sddr3.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | * Roy Spliet <rspliet@eclipso.eu> | 23 | * Roy Spliet <rspliet@eclipso.eu> |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include <subdev/bios.h> | ||
| 27 | #include "priv.h" | 26 | #include "priv.h" |
| 28 | 27 | ||
| 29 | struct ramxlat { | 28 | struct ramxlat { |
| @@ -70,25 +69,19 @@ ramddr3_cwl[] = { | |||
| 70 | int | 69 | int |
| 71 | nouveau_sddr3_calc(struct nouveau_ram *ram) | 70 | nouveau_sddr3_calc(struct nouveau_ram *ram) |
| 72 | { | 71 | { |
| 73 | struct nouveau_bios *bios = nouveau_bios(ram); | ||
| 74 | int CWL, CL, WR, DLL = 0, ODT = 0; | 72 | int CWL, CL, WR, DLL = 0, ODT = 0; |
| 75 | u8 ver; | ||
| 76 | 73 | ||
| 77 | ver = !!ram->timing.data * ram->timing.version; | 74 | switch (ram->next->bios.timing_ver) { |
| 78 | if (ram->next) | ||
| 79 | ver = ram->next->bios.timing_ver; | ||
| 80 | |||
| 81 | switch (ver) { | ||
| 82 | case 0x10: | 75 | case 0x10: |
| 83 | if (ram->timing.size < 0x17) { | 76 | if (ram->next->bios.timing_hdr < 0x17) { |
| 84 | /* XXX: NV50: Get CWL from the timing register */ | 77 | /* XXX: NV50: Get CWL from the timing register */ |
| 85 | return -ENOSYS; | 78 | return -ENOSYS; |
| 86 | } | 79 | } |
| 87 | CWL = nv_ro08(bios, ram->timing.data + 0x13); | 80 | CWL = ram->next->bios.timing_10_CWL; |
| 88 | CL = nv_ro08(bios, ram->timing.data + 0x02); | 81 | CL = ram->next->bios.timing_10_CL; |
| 89 | WR = nv_ro08(bios, ram->timing.data + 0x00); | 82 | WR = ram->next->bios.timing_10_WR; |
| 90 | DLL = !(nv_ro08(bios, ram->ramcfg.data + 0x02) & 0x40); | 83 | DLL = !ram->next->bios.ramcfg_10_02_40; |
| 91 | ODT = nv_ro08(bios, ram->timing.data + 0x0e) & 0x07; | 84 | ODT = ram->next->bios.timing_10_ODT; |
| 92 | break; | 85 | break; |
| 93 | case 0x20: | 86 | case 0x20: |
| 94 | CWL = (ram->next->bios.timing[1] & 0x00000f80) >> 7; | 87 | CWL = (ram->next->bios.timing[1] & 0x00000f80) >> 7; |
