* RESEND Preparations for Fermi DRAM clock changes
@ 2017-04-10 19:50 Roy Spliet
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
0 siblings, 1 reply; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Two patches went missing as a result of PEBCAK. No v2 marks as nothing
changed really. Just resending for easier enforcement of patch order
in other people's trees. Sorry for the noise.
Original message:
No, no, these will not implement Fermi reclocking. This set of patches
contains some of the preparatory work that I deem stable enough to
move upstream. Notable changes
- Training pattern upload routines from GK104+ now shared with GT215+
- Timing calculation for Fermi
- GDDR5 MR calculation from VBIOS timing table v1.0. Also useful for that
pesky GT 240.
- A routine to translate a VBIOS init script to a set of memx writes.
Used by both "that GT 240" and Fermi.
- Misc clean-up
Testers should expect no changes in behaviour before/after. Keen eyes
can double-check on their Tesla and Fermi GDDR5 graphics cards that
training patterns are uploaded on boot.
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 01/13] nvkm/bios: Give timings a name
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 02/13] nvkm/ramnv50: Split up various ramcfg bytes in nibbles Roy Spliet
` (11 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
tFAW, tCKE, tXPDLL, derived from datasheets. Merge skeggsb's:
"bios/rammap: make unknown timing 1.0 fields match 2.0's naming"
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
.../drm/nouveau/include/nvkm/subdev/bios/ramcfg.h | 12 +++----
drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c | 42 +++++++++++-----------
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c | 14 ++++----
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c | 6 ++--
4 files changed, 37 insertions(+), 37 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
index dca6c06..d8a7c04 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
@@ -127,17 +127,17 @@ struct nvbios_ramcfg {
unsigned timing_10_RCDRD:8;
unsigned timing_10_RCDWR:8;
unsigned timing_10_RRD:8;
- unsigned timing_10_13:8;
+ unsigned timing_10_XPDLL:8;
unsigned timing_10_ODT:3;
/* empty: 15 */
- unsigned timing_10_16:8;
+ unsigned timing_10_10:8;
/* empty: 17 */
- unsigned timing_10_18:8;
+ unsigned timing_10_12:8;
unsigned timing_10_CWL:8;
- unsigned timing_10_20:8;
- unsigned timing_10_21:8;
+ unsigned timing_10_FAW:8;
+ unsigned timing_10_CKE:8;
/* empty: 22, 23 */
- unsigned timing_10_24:8;
+ unsigned timing_10_18:8;
};
struct {
unsigned timing_20_2e_03:2;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
index 7e83c39..c36be13 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
@@ -100,34 +100,34 @@ nvbios_timingEp(struct nvkm_bios *bios, int idx,
p->timing_10_RCDRD = nvbios_rd08(bios, data + 0x0a);
p->timing_10_RCDWR = nvbios_rd08(bios, data + 0x0b);
p->timing_10_RRD = nvbios_rd08(bios, data + 0x0c);
- p->timing_10_13 = nvbios_rd08(bios, data + 0x0d);
+ p->timing_10_XPDLL = nvbios_rd08(bios, data + 0x0d);
p->timing_10_ODT = nvbios_rd08(bios, data + 0x0e) & 0x07;
if (p->ramcfg_ver >= 0x10)
p->ramcfg_RON = nvbios_rd08(bios, data + 0x0e) & 0x07;
- p->timing_10_24 = 0xff;
- p->timing_10_21 = 0;
- p->timing_10_20 = 0;
+ p->timing_10_18 = 0xff;
+ p->timing_10_CKE = 0;
+ p->timing_10_FAW = 0;
p->timing_10_CWL = 0;
- p->timing_10_18 = 0;
- p->timing_10_16 = 0;
+ p->timing_10_12 = 0;
+ p->timing_10_10 = 0;
- switch (min_t(u8, *hdr, 25)) {
- case 25:
- p->timing_10_24 = nvbios_rd08(bios, data + 0x18);
- case 24:
- case 23:
- case 22:
- p->timing_10_21 = nvbios_rd08(bios, data + 0x15);
- case 21:
- p->timing_10_20 = nvbios_rd08(bios, data + 0x14);
- case 20:
+ switch (min_t(u8, *hdr, 0x19)) {
+ case 0x19:
+ p->timing_10_18 = nvbios_rd08(bios, data + 0x18);
+ case 0x18:
+ case 0x17:
+ case 0x16:
+ p->timing_10_CKE = nvbios_rd08(bios, data + 0x15);
+ case 0x15:
+ p->timing_10_FAW = nvbios_rd08(bios, data + 0x14);
+ case 0x14:
p->timing_10_CWL = nvbios_rd08(bios, data + 0x13);
- case 19:
- p->timing_10_18 = nvbios_rd08(bios, data + 0x12);
- case 18:
- case 17:
- p->timing_10_16 = nvbios_rd08(bios, data + 0x10);
+ case 0x13:
+ p->timing_10_12 = nvbios_rd08(bios, data + 0x12);
+ case 0x12:
+ case 0x11:
+ p->timing_10_10 = nvbios_rd08(bios, data + 0x10);
}
break;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
index f106643..dd80de1 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
@@ -373,7 +373,7 @@ gt215_ram_timing_calc(struct gt215_ram *ram, u32 *timing)
timing[0] = (T(RP) << 24 | T(RAS) << 16 | T(RFC) << 8 | T(RC));
timing[1] = (T(WR) + 1 + T(CWL)) << 24 |
- max_t(u8,T(18), 1) << 16 |
+ max_t(u8,T(12), 1) << 16 |
(T(WTR) + 1 + T(CWL)) << 8 |
(5 + T(CL) - T(CWL));
timing[2] = (T(CWL) - 1) << 24 |
@@ -384,10 +384,10 @@ gt215_ram_timing_calc(struct gt215_ram *ram, u32 *timing)
(0x30 + T(CL)) << 24 |
(0xb + T(CL)) << 8 |
(T(CL) - 1);
- timing[4] = T(20) << 24 |
- T(21) << 16 |
- T(13) << 8 |
- T(13);
+ timing[4] = T(FAW) << 24 |
+ T(CKE) << 16 |
+ T(XPDLL) << 8 |
+ T(XPDLL);
timing[5] = T(RFC) << 24 |
max_t(u8,T(RCDRD), T(RCDWR)) << 16 |
max_t(u8, (T(CWL) + 6), (T(CL) + 2)) << 8 |
@@ -819,9 +819,9 @@ gt215_ram_calc(struct nvkm_ram *base, u32 freq)
unk718 |= 0x00000100;
if (next->bios.ramcfg_10_02_01)
unk71c |= 0x00000100;
- if (next->bios.timing_10_24 != 0xff) {
+ if (next->bios.timing_10_18 != 0xff) {
unk718 &= ~0xf0000000;
- unk718 |= next->bios.timing_10_24 << 28;
+ unk718 |= next->bios.timing_10_18 << 28;
}
if (next->bios.ramcfg_10_02_10)
r111100 &= ~0x04020000;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c
index 87bde8f..54d37f3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c
@@ -108,7 +108,7 @@ nv50_ram_timing_calc(struct nv50_ram *ram, u32 *timing)
timing[0] = (T(RP) << 24 | T(RAS) << 16 | T(RFC) << 8 | T(RC));
timing[1] = (T(WR) + 1 + T(CWL)) << 24 |
- max_t(u8, T(18), 1) << 16 |
+ max_t(u8, T(12), 1) << 16 |
(T(WTR) + 1 + T(CWL)) << 8 |
(3 + T(CL) - T(CWL));
timing[2] = (T(CWL) - 1) << 24 |
@@ -120,8 +120,8 @@ nv50_ram_timing_calc(struct nv50_ram *ram, u32 *timing)
(T(CL) - 1) << 8 |
(T(CL) - 1);
timing[4] = (cur4 & 0xffff0000) |
- T(13) << 8 |
- T(13);
+ T(XPDLL) << 8 |
+ T(XPDLL);
timing[5] = T(RFC) << 24 |
max_t(u8, T(RCDRD), T(RCDWR)) << 16 |
T(RP);
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 02/13] nvkm/ramnv50: Split up various ramcfg bytes in nibbles
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
2017-04-10 19:50 ` [PATCH 01/13] nvkm/bios: Give timings a name Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 03/13] nvkm/ramgf100: Get rid of (size, data) pairs for rammap, ramcfg, timing Roy Spliet
` (10 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
In preparation for Fermi
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h | 9 ++++++---
drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c | 9 ++++++---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c | 12 ++++++++----
3 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
index d8a7c04..4560a52 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
@@ -66,9 +66,12 @@ struct nvbios_ramcfg {
unsigned ramcfg_10_02_20:1;
unsigned ramcfg_10_03_0f:4;
unsigned ramcfg_10_04_01:1;
- unsigned ramcfg_10_05:8;
- unsigned ramcfg_10_06:8;
- unsigned ramcfg_10_07:8;
+ unsigned ramcfg_10_05_0f:4;
+ unsigned ramcfg_10_05_f0:8;
+ unsigned ramcfg_10_06_0f:4;
+ unsigned ramcfg_10_06_f0:4;
+ unsigned ramcfg_10_07_0f:4;
+ unsigned ramcfg_10_07_f0:4;
unsigned ramcfg_10_08:8;
unsigned ramcfg_10_09_0f:4;
unsigned ramcfg_10_09_f0:4;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
index b57c370..131d967 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
@@ -207,9 +207,12 @@ nvbios_rammapSp(struct nvkm_bios *bios, u32 data,
p->ramcfg_10_03_0f = (nvbios_rd08(bios, data + 0x03) & 0x0f) >> 0;
p->ramcfg_10_04_01 = (nvbios_rd08(bios, data + 0x04) & 0x01) >> 0;
p->ramcfg_FBVDDQ = (nvbios_rd08(bios, data + 0x04) & 0x08) >> 3;
- p->ramcfg_10_05 = (nvbios_rd08(bios, data + 0x05) & 0xff) >> 0;
- p->ramcfg_10_06 = (nvbios_rd08(bios, data + 0x06) & 0xff) >> 0;
- p->ramcfg_10_07 = (nvbios_rd08(bios, data + 0x07) & 0xff) >> 0;
+ p->ramcfg_10_05_0f = (nvbios_rd08(bios, data + 0x05) & 0x0f) >> 0;
+ p->ramcfg_10_05_f0 = (nvbios_rd08(bios, data + 0x05) & 0xf0) >> 4;
+ p->ramcfg_10_06_0f = (nvbios_rd08(bios, data + 0x06) & 0x0f) >> 0;
+ p->ramcfg_10_06_f0 = (nvbios_rd08(bios, data + 0x06) & 0xf0) >> 4;
+ p->ramcfg_10_07_0f = (nvbios_rd08(bios, data + 0x07) & 0x0f) >> 0;
+ p->ramcfg_10_07_f0 = (nvbios_rd08(bios, data + 0x07) & 0xf0) >> 4;
p->ramcfg_10_08 = (nvbios_rd08(bios, data + 0x08) & 0xff) >> 0;
p->ramcfg_10_09_0f = (nvbios_rd08(bios, data + 0x09) & 0x0f) >> 0;
p->ramcfg_10_09_f0 = (nvbios_rd08(bios, data + 0x09) & 0xf0) >> 4;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
index dd80de1..8454899 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
@@ -705,11 +705,15 @@ gt215_ram_calc(struct nvkm_ram *base, u32 freq)
ram_nsec(fuc, 20000);
if (next->bios.rammap_10_04_08) {
- ram_wr32(fuc, 0x1005a0, next->bios.ramcfg_10_06 << 16 |
- next->bios.ramcfg_10_05 << 8 |
- next->bios.ramcfg_10_05);
+ ram_wr32(fuc, 0x1005a0, next->bios.ramcfg_10_06_f0 << 20 |
+ next->bios.ramcfg_10_06_0f << 16 |
+ next->bios.ramcfg_10_05_f0 << 12 |
+ next->bios.ramcfg_10_05_0f << 8 |
+ next->bios.ramcfg_10_05_f0 << 4 |
+ next->bios.ramcfg_10_05_0f);
ram_wr32(fuc, 0x1005a4, next->bios.ramcfg_10_08 << 8 |
- next->bios.ramcfg_10_07);
+ next->bios.ramcfg_10_07_f0 << 4 |
+ next->bios.ramcfg_10_07_0f);
ram_wr32(fuc, 0x10f804, next->bios.ramcfg_10_09_f0 << 20 |
next->bios.ramcfg_10_03_0f << 16 |
next->bios.ramcfg_10_09_0f |
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 03/13] nvkm/ramgf100: Get rid of (size, data) pairs for rammap, ramcfg, timing
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
2017-04-10 19:50 ` [PATCH 01/13] nvkm/bios: Give timings a name Roy Spliet
2017-04-10 19:50 ` [PATCH 02/13] nvkm/ramnv50: Split up various ramcfg bytes in nibbles Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 04/13] nvkm/ramgf100: Calculate timings Roy Spliet
` (9 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
In correspondence with the other ram_calc implementations.
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 37 ++++++++++++-----------
1 file changed, 19 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index 093223d..fffd01a 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -133,21 +133,22 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
struct nvkm_device *device = subdev->device;
struct nvkm_clk *clk = device->clk;
struct nvkm_bios *bios = device->bios;
- struct nvbios_ramcfg cfg;
- u8 ver, cnt, len, strap;
- struct {
- u32 data;
- u8 size;
- } rammap, ramcfg, timing;
+ struct nvkm_ram_data *next;
+ u8 ver, hdr, cnt, len, strap;
+ u32 data;
int ref, div, out;
int from, mode;
int N1, M1, P;
int ret;
+ next = &ram->base.target;
+ next->freq = freq;
+ ram->base.next = next;
+
/* lookup memory config data relevant to the target frequency */
- rammap.data = nvbios_rammapEm(bios, freq / 1000, &ver, &rammap.size,
- &cnt, &ramcfg.size, &cfg);
- if (!rammap.data || ver != 0x10 || rammap.size < 0x0e) {
+ data = nvbios_rammapEm(bios, freq / 1000, &ver, &hdr,
+ &cnt, &len, &next->bios);
+ if (!data || ver != 0x10 || len < 0x0e) {
nvkm_error(subdev, "invalid/missing rammap entry\n");
return -EINVAL;
}
@@ -159,23 +160,23 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
return -EINVAL;
}
- ramcfg.data = rammap.data + rammap.size + (strap * ramcfg.size);
- if (!ramcfg.data || ver != 0x10 || ramcfg.size < 0x0e) {
+ data = nvbios_rammapSp(bios, data, ver, hdr, cnt, len, strap,
+ &ver, &hdr, &next->bios);
+ if (!data || ver != 0x10 || hdr < 0x0e) {
nvkm_error(subdev, "invalid/missing ramcfg entry\n");
return -EINVAL;
}
/* lookup memory timings, if bios says they're present */
- strap = nvbios_rd08(bios, ramcfg.data + 0x01);
- if (strap != 0xff) {
- timing.data = nvbios_timingEe(bios, strap, &ver, &timing.size,
- &cnt, &len);
- if (!timing.data || ver != 0x10 || timing.size < 0x19) {
+ strap = nvbios_rd08(bios, data + 0x01);
+ if (next->bios.ramcfg_timing != 0xff) {
+ data = nvbios_timingEp(bios, next->bios.ramcfg_timing,
+ &ver, &hdr, &cnt, &len,
+ &next->bios);
+ if (!data || ver != 0x10 || hdr < 0x17) {
nvkm_error(subdev, "invalid/missing timing entry\n");
return -EINVAL;
}
- } else {
- timing.data = 0;
}
ret = ram_init(fuc, ram->base.fb);
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/13] nvkm/ramgf100: Calculate timings
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (2 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 03/13] nvkm/ramgf100: Get rid of (size, data) pairs for rammap, ramcfg, timing Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 05/13] nvkm/gddr5: MR calculation for timing table v1.0 Roy Spliet
` (8 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Todo:
- Determine source of R[10f298] & 0x11
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 115 ++++++++++++++--------
1 file changed, 76 insertions(+), 39 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index fffd01a..6ebdc4c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -48,11 +48,7 @@ struct gf100_ramfuc {
struct ramfuc_reg r_0x137390;
- struct ramfuc_reg r_0x10f290;
- struct ramfuc_reg r_0x10f294;
- struct ramfuc_reg r_0x10f298;
- struct ramfuc_reg r_0x10f29c;
- struct ramfuc_reg r_0x10f2a0;
+ struct ramfuc_reg r_0x10f290[5];
struct ramfuc_reg r_0x10f300;
struct ramfuc_reg r_0x10f338;
@@ -104,6 +100,50 @@ struct gf100_ram {
struct nvbios_pll mempll;
};
+#define T(t) cfg->timing_10_##t
+static int
+gf100_ram_timing_calc(struct gf100_ram *ram, u32 *timing)
+{
+ struct nvbios_ramcfg *cfg = &ram->base.target.bios;
+ struct nvkm_subdev *subdev = &ram->base.fb->subdev;
+ struct nvkm_device *device = subdev->device;
+ u32 cur1, cur2, cur4;
+
+ cur1 = nvkm_rd32(device, 0x10f294);
+ cur2 = nvkm_rd32(device, 0x10f298);
+ cur4 = nvkm_rd32(device, 0x10f2a0);
+
+ /* XXX: (G)DDR3? */
+ switch ((!T(CWL)) * ram->base.type) {
+ case NVKM_RAM_TYPE_GDDR5:
+ T(CWL) = (cur1 & 0x00000380) >> 7;
+ break;
+ }
+
+ timing[0] = (T(RP) << 24 | T(RAS) << 17 | T(RFC) << 8 | T(RC));
+ timing[1] = (cur1 & ~0x03ffc07f) |
+ (T(RCDWR) << 20) |
+ (T(RCDRD) << 14) |
+ (T(CWL) << 7) |
+ (T(CL));
+ /* XXX: lower 8 bytes are two bits indicating "feature(s) X" */
+ timing[2] = (cur2 & ~0x00ffffff) |
+ (T(WR) << 16) |
+ (T(WTR) << 8);
+ timing[3] = (T(FAW)) << 9 |
+ (T(CKE)) << 5 |
+ (T(XPDLL));
+ timing[4] = (cur4 & ~0x001f8000) |
+ (T(RRD) << 15);
+
+ nvkm_debug(subdev, "Entry: 290: %08x %08x %08x %08x\n",
+ timing[0], timing[1], timing[2], timing[3]);
+ nvkm_debug(subdev, " 2a0: %08x\n",
+ timing[4]);
+ return 0;
+}
+#undef T
+
static void
gf100_ram_train(struct gf100_ramfuc *fuc, u32 magic)
{
@@ -136,10 +176,11 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
struct nvkm_ram_data *next;
u8 ver, hdr, cnt, len, strap;
u32 data;
+ u32 timing[5];
int ref, div, out;
int from, mode;
int N1, M1, P;
- int ret;
+ int i, ret;
next = &ram->base.target;
next->freq = freq;
@@ -179,6 +220,8 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
}
}
+ gf100_ram_timing_calc(ram, timing);
+
ret = ram_init(fuc, ram->base.fb);
if (ret)
return ret;
@@ -314,28 +357,6 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
ram_wr32(fuc, 0x10f338, 0x00300220);
ram_wr32(fuc, 0x10f300, 0x0000011d);
ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f290, 0x02060505);
- ram_wr32(fuc, 0x10f294, 0x34208288);
- ram_wr32(fuc, 0x10f298, 0x44050411);
- ram_wr32(fuc, 0x10f29c, 0x0000114c);
- ram_wr32(fuc, 0x10f2a0, 0x42e10069);
- ram_wr32(fuc, 0x10f614, 0x40044f77);
- ram_wr32(fuc, 0x10f610, 0x40044f77);
- ram_wr32(fuc, 0x10f344, 0x00600009);
- ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f348, 0x00700008);
- ram_wr32(fuc, 0x61c140, 0x19240000);
- ram_wr32(fuc, 0x10f830, 0x00300017);
- gf100_ram_train(fuc, 0x80021001);
- gf100_ram_train(fuc, 0x80081001);
- ram_wr32(fuc, 0x10f340, 0x00500004);
- ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f830, 0x01300017);
- ram_wr32(fuc, 0x10f830, 0x00300017);
-// 0x00030020 // 0x00000000 // 0x00000000
-// 0x00020034 // 0x0000000b
- ram_wr32(fuc, 0x100b0c, 0x00080028);
- ram_wr32(fuc, 0x611200, 0x00003330);
} else {
ram_wr32(fuc, 0x10f800, 0x00001800);
ram_wr32(fuc, 0x13d8f4, 0x00000000);
@@ -364,11 +385,30 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
ram_wr32(fuc, 0x10f338, 0x00300200);
ram_wr32(fuc, 0x10f300, 0x0000084d);
ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f290, 0x0b343825);
- ram_wr32(fuc, 0x10f294, 0x3483028e);
- ram_wr32(fuc, 0x10f298, 0x440c0600);
- ram_wr32(fuc, 0x10f29c, 0x0000214c);
- ram_wr32(fuc, 0x10f2a0, 0x42e20069);
+ }
+
+ for (i = 0; i < 5; i++)
+ ram_wr32(fuc, 0x10f290[i], timing[i]);
+
+ if (mode == 0) {
+ ram_wr32(fuc, 0x10f614, 0x40044f77);
+ ram_wr32(fuc, 0x10f610, 0x40044f77);
+ ram_wr32(fuc, 0x10f344, 0x00600009);
+ ram_nsec(fuc, 1000);
+ ram_wr32(fuc, 0x10f348, 0x00700008);
+ ram_wr32(fuc, 0x61c140, 0x19240000);
+ ram_wr32(fuc, 0x10f830, 0x00300017);
+ gf100_ram_train(fuc, 0x80021001);
+ gf100_ram_train(fuc, 0x80081001);
+ ram_wr32(fuc, 0x10f340, 0x00500004);
+ ram_nsec(fuc, 1000);
+ ram_wr32(fuc, 0x10f830, 0x01300017);
+ ram_wr32(fuc, 0x10f830, 0x00300017);
+// 0x00030020 // 0x00000000 // 0x00000000
+// 0x00020034 // 0x0000000b
+ ram_wr32(fuc, 0x100b0c, 0x00080028);
+ ram_wr32(fuc, 0x611200, 0x00003330);
+ } else {
ram_wr32(fuc, 0x10f200, 0x00ce0000);
ram_wr32(fuc, 0x10f614, 0x60044e77);
ram_wr32(fuc, 0x10f610, 0x60044e77);
@@ -630,7 +670,7 @@ gf100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
struct nvkm_subdev *subdev = &fb->subdev;
struct nvkm_bios *bios = subdev->device->bios;
struct gf100_ram *ram;
- int ret;
+ int i, ret;
if (!(ram = kzalloc(sizeof(*ram), GFP_KERNEL)))
return -ENOMEM;
@@ -663,11 +703,8 @@ gf100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
ram->fuc.r_0x137390 = ramfuc_reg(0x137390);
- ram->fuc.r_0x10f290 = ramfuc_reg(0x10f290);
- ram->fuc.r_0x10f294 = ramfuc_reg(0x10f294);
- ram->fuc.r_0x10f298 = ramfuc_reg(0x10f298);
- ram->fuc.r_0x10f29c = ramfuc_reg(0x10f29c);
- ram->fuc.r_0x10f2a0 = ramfuc_reg(0x10f2a0);
+ for (i = 0; i < 5; i++)
+ ram->fuc.r_0x10f290[i] = ramfuc_reg(0x10f290 + (i * 4));
ram->fuc.r_0x10f300 = ramfuc_reg(0x10f300);
ram->fuc.r_0x10f338 = ramfuc_reg(0x10f338);
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/13] nvkm/gddr5: MR calculation for timing table v1.0
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (3 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 04/13] nvkm/ramgf100: Calculate timings Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 06/13] nvkm/ramgt215: Move ram training up the chain Roy Spliet
` (7 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Merges in skeggsb's:
"fb/ram/gf10x: timing_10_0e_30"
Todo:
- find l3, rq
- triple-check
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
.../drm/nouveau/include/nvkm/subdev/bios/ramcfg.h | 12 +++---
drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c | 22 ++++++++--
drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c | 2 +
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c | 21 ++++++++--
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 49 ++++++++++++----------
5 files changed, 71 insertions(+), 35 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
index 4560a52..44e4ca2 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/ramcfg.h
@@ -40,6 +40,10 @@ struct nvbios_ramcfg {
unsigned ramcfg_DLLoff;
unsigned ramcfg_RON;
unsigned ramcfg_FBVDDQ;
+ unsigned ramcfg_LowFreq;
+ unsigned ramcfg_WCKPin;
+ unsigned ramcfg_Hf_VREF;
+ unsigned ramcfg_VREFD_off;
union {
struct {
unsigned ramcfg_00_03_01:1;
@@ -82,12 +86,9 @@ struct nvbios_ramcfg {
unsigned ramcfg_11_01_04:1;
unsigned ramcfg_11_01_08:1;
unsigned ramcfg_11_01_10:1;
- unsigned ramcfg_11_01_40:1;
- unsigned ramcfg_11_01_80:1;
unsigned ramcfg_11_02_03:2;
unsigned ramcfg_11_02_04:1;
unsigned ramcfg_11_02_08:1;
- unsigned ramcfg_11_02_10:1;
unsigned ramcfg_11_02_40:1;
unsigned ramcfg_11_02_80:1;
unsigned ramcfg_11_03_0f:4;
@@ -95,7 +96,6 @@ struct nvbios_ramcfg {
unsigned ramcfg_11_03_c0:2;
unsigned ramcfg_11_03_f0:4;
unsigned ramcfg_11_04:8;
- unsigned ramcfg_11_06:8;
unsigned ramcfg_11_07_02:1;
unsigned ramcfg_11_07_04:1;
unsigned ramcfg_11_07_08:1;
@@ -132,6 +132,7 @@ struct nvbios_ramcfg {
unsigned timing_10_RRD:8;
unsigned timing_10_XPDLL:8;
unsigned timing_10_ODT:3;
+ unsigned timing_10_DS:2;
/* empty: 15 */
unsigned timing_10_10:8;
/* empty: 17 */
@@ -139,7 +140,8 @@ struct nvbios_ramcfg {
unsigned timing_10_CWL:8;
unsigned timing_10_FAW:8;
unsigned timing_10_CKE:8;
- /* empty: 22, 23 */
+ unsigned timing_10_ADRCMD_T:8; /* XXX: [3:2]? */
+ /* empty: 23 */
unsigned timing_10_18:8;
};
struct {
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
index 131d967..0d517a0 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.c
@@ -205,8 +205,11 @@ nvbios_rammapSp(struct nvkm_bios *bios, u32 data,
p->ramcfg_10_02_20 = (nvbios_rd08(bios, data + 0x02) & 0x20) >> 5;
p->ramcfg_DLLoff = (nvbios_rd08(bios, data + 0x02) & 0x40) >> 6;
p->ramcfg_10_03_0f = (nvbios_rd08(bios, data + 0x03) & 0x0f) >> 0;
+ p->ramcfg_LowFreq = (nvbios_rd08(bios, data + 0x03) & 0x20) >> 5;
+ p->ramcfg_WCKPin = (nvbios_rd08(bios, data + 0x03) & 0x40) >> 6;
p->ramcfg_10_04_01 = (nvbios_rd08(bios, data + 0x04) & 0x01) >> 0;
p->ramcfg_FBVDDQ = (nvbios_rd08(bios, data + 0x04) & 0x08) >> 3;
+ p->ramcfg_Hf_VREF = (nvbios_rd08(bios, data + 0x04) & 0x20) >> 5;
p->ramcfg_10_05_0f = (nvbios_rd08(bios, data + 0x05) & 0x0f) >> 0;
p->ramcfg_10_05_f0 = (nvbios_rd08(bios, data + 0x05) & 0xf0) >> 4;
p->ramcfg_10_06_0f = (nvbios_rd08(bios, data + 0x06) & 0x0f) >> 0;
@@ -216,6 +219,17 @@ nvbios_rammapSp(struct nvkm_bios *bios, u32 data,
p->ramcfg_10_08 = (nvbios_rd08(bios, data + 0x08) & 0xff) >> 0;
p->ramcfg_10_09_0f = (nvbios_rd08(bios, data + 0x09) & 0x0f) >> 0;
p->ramcfg_10_09_f0 = (nvbios_rd08(bios, data + 0x09) & 0xf0) >> 4;
+
+ switch (elen) {
+ case 0xe:
+ case 0xd:
+ p->ramcfg_VREFD_off = nvbios_rd08(bios, data + 0x0c);
+ case 0xc:
+ case 0xb:
+ default:
+ break;
+ }
+
break;
case 0x11:
p->ramcfg_timing = nvbios_rd08(bios, data + 0x00);
@@ -225,12 +239,12 @@ nvbios_rammapSp(struct nvkm_bios *bios, u32 data,
p->ramcfg_11_01_08 = (nvbios_rd08(bios, data + 0x01) & 0x08) >> 3;
p->ramcfg_11_01_10 = (nvbios_rd08(bios, data + 0x01) & 0x10) >> 4;
p->ramcfg_DLLoff = (nvbios_rd08(bios, data + 0x01) & 0x20) >> 5;
- p->ramcfg_11_01_40 = (nvbios_rd08(bios, data + 0x01) & 0x40) >> 6;
- p->ramcfg_11_01_80 = (nvbios_rd08(bios, data + 0x01) & 0x80) >> 7;
+ p->ramcfg_LowFreq = (nvbios_rd08(bios, data + 0x01) & 0x40) >> 6;
+ p->ramcfg_WCKPin = (nvbios_rd08(bios, data + 0x01) & 0x80) >> 7;
p->ramcfg_11_02_03 = (nvbios_rd08(bios, data + 0x02) & 0x03) >> 0;
p->ramcfg_11_02_04 = (nvbios_rd08(bios, data + 0x02) & 0x04) >> 2;
p->ramcfg_11_02_08 = (nvbios_rd08(bios, data + 0x02) & 0x08) >> 3;
- p->ramcfg_11_02_10 = (nvbios_rd08(bios, data + 0x02) & 0x10) >> 4;
+ p->ramcfg_Hf_VREF = (nvbios_rd08(bios, data + 0x02) & 0x10) >> 4;
p->ramcfg_11_02_40 = (nvbios_rd08(bios, data + 0x02) & 0x40) >> 6;
p->ramcfg_11_02_80 = (nvbios_rd08(bios, data + 0x02) & 0x80) >> 7;
p->ramcfg_11_03_0f = (nvbios_rd08(bios, data + 0x03) & 0x0f) >> 0;
@@ -238,7 +252,7 @@ nvbios_rammapSp(struct nvkm_bios *bios, u32 data,
p->ramcfg_11_03_c0 = (nvbios_rd08(bios, data + 0x03) & 0xc0) >> 6;
p->ramcfg_11_03_f0 = (nvbios_rd08(bios, data + 0x03) & 0xf0) >> 4;
p->ramcfg_11_04 = (nvbios_rd08(bios, data + 0x04) & 0xff) >> 0;
- p->ramcfg_11_06 = (nvbios_rd08(bios, data + 0x06) & 0xff) >> 0;
+ p->ramcfg_VREFD_off = (nvbios_rd08(bios, data + 0x06) & 0xff) >> 0;
p->ramcfg_11_07_02 = (nvbios_rd08(bios, data + 0x07) & 0x02) >> 1;
p->ramcfg_11_07_04 = (nvbios_rd08(bios, data + 0x07) & 0x04) >> 2;
p->ramcfg_11_07_08 = (nvbios_rd08(bios, data + 0x07) & 0x08) >> 3;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
index c36be13..f1999e3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.c
@@ -104,6 +104,7 @@ nvbios_timingEp(struct nvkm_bios *bios, int idx,
p->timing_10_ODT = nvbios_rd08(bios, data + 0x0e) & 0x07;
if (p->ramcfg_ver >= 0x10)
p->ramcfg_RON = nvbios_rd08(bios, data + 0x0e) & 0x07;
+ p->timing_10_DS = nvbios_rd08(bios, data + 0xe) & 0x30 >> 4;
p->timing_10_18 = 0xff;
p->timing_10_CKE = 0;
@@ -117,6 +118,7 @@ nvbios_timingEp(struct nvkm_bios *bios, int idx,
p->timing_10_18 = nvbios_rd08(bios, data + 0x18);
case 0x18:
case 0x17:
+ p->timing_10_ADRCMD_T = nvbios_rd08(bios, data + 0x16);
case 0x16:
p->timing_10_CKE = nvbios_rd08(bios, data + 0x15);
case 0x15:
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c
index 2cc074d..22e1e0b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.c
@@ -39,14 +39,18 @@ nvkm_gddr5_calc(struct nvkm_ram *ram, bool nuts)
int rq = ram->freq < 1000000; /* XXX */
xd = !ram->next->bios.ramcfg_DLLoff;
+ lf = ram->next->bios.ramcfg_LowFreq;
+ pd = ram->next->bios.ramcfg_WCKPin;
+ vh = ram->next->bios.ramcfg_Hf_VREF;
+ vo = ram->next->bios.ramcfg_VREFD_off;
switch (ram->next->bios.ramcfg_ver) {
+ case 0x10:
+ vr = 0;
+ l3 = (ram->mr[5] & 0x4) >> 2;
+ break;
case 0x11:
- pd = ram->next->bios.ramcfg_11_01_80;
- lf = ram->next->bios.ramcfg_11_01_40;
- vh = ram->next->bios.ramcfg_11_02_10;
vr = ram->next->bios.ramcfg_11_02_04;
- vo = ram->next->bios.ramcfg_11_06;
l3 = !ram->next->bios.ramcfg_11_07_02;
break;
default:
@@ -54,6 +58,15 @@ nvkm_gddr5_calc(struct nvkm_ram *ram, bool nuts)
}
switch (ram->next->bios.timing_ver) {
+ case 0x10:
+ WL = ram->next->bios.timing_10_CWL;
+ CL = ram->next->bios.timing_10_CL;
+ WR = ram->next->bios.timing_10_WR;
+ at[0] = ram->next->bios.timing_10_ADRCMD_T & 0x3;
+ at[1] = 0;
+ dt = ram->next->bios.timing_10_ODT;
+ ds = ram->next->bios.timing_10_DS;
+ break;
case 0x20:
WL = (ram->next->bios.timing[1] & 0x00000f80) >> 7;
CL = (ram->next->bios.timing[1] & 0x0000001f);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index 6ebdc4c..b4fe3bb 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -50,11 +50,7 @@ struct gf100_ramfuc {
struct ramfuc_reg r_0x10f290[5];
- struct ramfuc_reg r_0x10f300;
- struct ramfuc_reg r_0x10f338;
- struct ramfuc_reg r_0x10f340;
- struct ramfuc_reg r_0x10f344;
- struct ramfuc_reg r_0x10f348;
+ struct ramfuc_reg r_mr[9];
struct ramfuc_reg r_0x10f910;
struct ramfuc_reg r_0x10f914;
@@ -226,6 +222,19 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
if (ret)
return ret;
+ /* Determine ram-specific MR values */
+ for (i = 0; i < 9; i++)
+ ram->base.mr[i] = ram_rd32(fuc, mr[i]);
+
+ switch (ram->base.type) {
+ case NVKM_RAM_TYPE_GDDR5:
+ ret = nvkm_gddr5_calc(&ram->base, false);
+ break;
+ default:
+ ret = -ENOSYS;
+ break;
+ }
+
/* determine current mclk configuration */
from = !!(ram_rd32(fuc, 0x1373f0) & 0x00000002); /*XXX: ok? */
@@ -354,9 +363,6 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
ram_nsec(fuc, 2000);
ram_wr32(fuc, 0x10f314, 0x00000001);
ram_wr32(fuc, 0x10f210, 0x80000000);
- ram_wr32(fuc, 0x10f338, 0x00300220);
- ram_wr32(fuc, 0x10f300, 0x0000011d);
- ram_nsec(fuc, 1000);
} else {
ram_wr32(fuc, 0x10f800, 0x00001800);
ram_wr32(fuc, 0x13d8f4, 0x00000000);
@@ -382,25 +388,26 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
ram_nsec(fuc, 2000);
ram_wr32(fuc, 0x10f314, 0x00000001);
ram_wr32(fuc, 0x10f210, 0x80000000);
- ram_wr32(fuc, 0x10f338, 0x00300200);
- ram_wr32(fuc, 0x10f300, 0x0000084d);
- ram_nsec(fuc, 1000);
}
+ ram_wr32(fuc, mr[3], ram->base.mr[3]);
+ ram_wr32(fuc, mr[0], ram->base.mr[0]);
+ ram_nsec(fuc, 1000);
+
for (i = 0; i < 5; i++)
ram_wr32(fuc, 0x10f290[i], timing[i]);
if (mode == 0) {
ram_wr32(fuc, 0x10f614, 0x40044f77);
ram_wr32(fuc, 0x10f610, 0x40044f77);
- ram_wr32(fuc, 0x10f344, 0x00600009);
+ ram_wr32(fuc, mr[6], 0x00600009);
ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f348, 0x00700008);
+ ram_wr32(fuc, mr[7], 0x00700008);
ram_wr32(fuc, 0x61c140, 0x19240000);
ram_wr32(fuc, 0x10f830, 0x00300017);
gf100_ram_train(fuc, 0x80021001);
gf100_ram_train(fuc, 0x80081001);
- ram_wr32(fuc, 0x10f340, 0x00500004);
+ ram_wr32(fuc, mr[5], 0x00500004);
ram_nsec(fuc, 1000);
ram_wr32(fuc, 0x10f830, 0x01300017);
ram_wr32(fuc, 0x10f830, 0x00300017);
@@ -412,11 +419,11 @@ gf100_ram_calc(struct nvkm_ram *base, u32 freq)
ram_wr32(fuc, 0x10f200, 0x00ce0000);
ram_wr32(fuc, 0x10f614, 0x60044e77);
ram_wr32(fuc, 0x10f610, 0x60044e77);
- ram_wr32(fuc, 0x10f340, 0x00500000);
+ ram_wr32(fuc, mr[5], 0x00500000);
ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f344, 0x00600228);
+ ram_wr32(fuc, mr[6], 0x00600228);
ram_nsec(fuc, 1000);
- ram_wr32(fuc, 0x10f348, 0x00700000);
+ ram_wr32(fuc, mr[7], 0x00700000);
ram_wr32(fuc, 0x13d8f4, 0x00000000);
ram_wr32(fuc, 0x61c140, 0x09a40000);
@@ -706,11 +713,9 @@ gf100_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
for (i = 0; i < 5; i++)
ram->fuc.r_0x10f290[i] = ramfuc_reg(0x10f290 + (i * 4));
- ram->fuc.r_0x10f300 = ramfuc_reg(0x10f300);
- ram->fuc.r_0x10f338 = ramfuc_reg(0x10f338);
- ram->fuc.r_0x10f340 = ramfuc_reg(0x10f340);
- ram->fuc.r_0x10f344 = ramfuc_reg(0x10f344);
- ram->fuc.r_0x10f348 = ramfuc_reg(0x10f348);
+ ram->fuc.r_mr[0] = ramfuc_reg(0x10f300);
+ for (i = 1; i < 9; i++)
+ ram->fuc.r_mr[i] = ramfuc_reg(0x10f330 + ((i - 1) * 4));
ram->fuc.r_0x10f910 = ramfuc_reg(0x10f910);
ram->fuc.r_0x10f914 = ramfuc_reg(0x10f914);
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/13] nvkm/ramgt215: Move ram training up the chain
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (4 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 05/13] nvkm/gddr5: MR calculation for timing table v1.0 Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 07/13] nvkm/ramgf100: Don't mandate training pattern 4 Roy Spliet
` (6 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Parts are re-used even on NVA3, others from GF100 on
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h | 17 +++
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 92 +++++++++-----
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c | 140 +---------------------
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c | 61 ++++++++++
4 files changed, 140 insertions(+), 170 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
index b60068b..ce8a98e 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
@@ -1,6 +1,7 @@
#ifndef __NVKM_FB_RAM_PRIV_H__
#define __NVKM_FB_RAM_PRIV_H__
#include "priv.h"
+#include <subdev/bios/M0209.h>
int nvkm_ram_ctor(const struct nvkm_ram_func *, struct nvkm_fb *,
enum nvkm_ram_type, u64 size, u32 tags,
@@ -24,6 +25,22 @@ int gf100_ram_ctor(const struct nvkm_ram_func *, struct nvkm_fb *,
int gf100_ram_get(struct nvkm_ram *, u64, u32, u32, u32, struct nvkm_mem **);
void gf100_ram_put(struct nvkm_ram *, struct nvkm_mem **);
+/* Training */
+struct gt215_ram_train {
+ u16 mask;
+ struct nvbios_M0209S remap;
+ struct nvbios_M0209S type00;
+ struct nvbios_M0209S type01;
+ struct nvbios_M0209S type04;
+ struct nvbios_M0209S type06;
+ struct nvbios_M0209S type07;
+ struct nvbios_M0209S type08;
+ struct nvbios_M0209S type09;
+};
+int gt215_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
+ struct gt215_ram_train *train);
+int gf100_ram_train_init(struct nvkm_ram *ram);
+
int gk104_ram_ctor(struct nvkm_fb *, struct nvkm_ram **, u32);
int gk104_ram_init(struct nvkm_ram *ram);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index b4fe3bb..38a7e2b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -28,6 +28,7 @@
#include <core/option.h>
#include <subdev/bios.h>
#include <subdev/bios/pll.h>
+#include <subdev/bios/M0205.h>
#include <subdev/bios/rammap.h>
#include <subdev/bios/timing.h>
#include <subdev/clk.h>
@@ -549,45 +550,74 @@ gf100_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
}
static int
-gf100_ram_init(struct nvkm_ram *base)
+gf100_ram_train_init_0(struct nvkm_ram *ram, struct gt215_ram_train *train)
{
- static const u8 train0[] = {
- 0x00, 0xff, 0x55, 0xaa, 0x33, 0xcc,
- 0x00, 0xff, 0xff, 0x00, 0xff, 0x00,
- };
- static const u32 train1[] = {
- 0x00000000, 0xffffffff,
- 0x55555555, 0xaaaaaaaa,
- 0x33333333, 0xcccccccc,
- 0xf0f0f0f0, 0x0f0f0f0f,
- 0x00ff00ff, 0xff00ff00,
- 0x0000ffff, 0xffff0000,
- };
- struct gf100_ram *ram = gf100_ram(base);
- struct nvkm_device *device = ram->base.fb->subdev.device;
- int i;
+ struct nvkm_subdev *subdev = &ram->fb->subdev;
+ struct nvkm_device *device = subdev->device;
+ int i, j;
- switch (ram->base.type) {
+ if ((train->mask & 0x03d3) != 0x03d3) {
+ nvkm_warn(subdev, "missing link training data\n");
+ return -EINVAL;
+ }
+
+ for (i = 0; i < 0x30; i++) {
+ for (j = 0; j < 8; j += 4) {
+ nvkm_wr32(device, 0x10f968 + j, 0x00000000 | (i << 8));
+ nvkm_wr32(device, 0x10f920 + j, 0x00000000 |
+ train->type08.data[i] << 4 |
+ train->type06.data[i]);
+ nvkm_wr32(device, 0x10f918 + j, train->type00.data[i]);
+ nvkm_wr32(device, 0x10f920 + j, 0x00000100 |
+ train->type09.data[i] << 4 |
+ train->type07.data[i]);
+ nvkm_wr32(device, 0x10f918 + j, train->type01.data[i]);
+ }
+ }
+
+ for (j = 0; j < 8; j += 4) {
+ for (i = 0; i < 0x100; i++) {
+ nvkm_wr32(device, 0x10f968 + j, i);
+ nvkm_wr32(device, 0x10f900 + j, train->type04.data[i]);
+ }
+ }
+
+ return 0;
+}
+
+int
+gf100_ram_train_init(struct nvkm_ram *ram)
+{
+ u8 ramcfg = nvbios_ramcfg_index(&ram->fb->subdev);
+ struct gt215_ram_train *train;
+ int ret, i;
+
+ if (!(train = kzalloc(sizeof(*train), GFP_KERNEL)))
+ return -ENOMEM;
+
+ for (i = 0; i < 0x100; i++) {
+ ret = gt215_ram_train_type(ram, i, ramcfg, train);
+ if (ret && ret != -ENOENT)
+ break;
+ }
+
+ switch (ram->type) {
case NVKM_RAM_TYPE_GDDR5:
+ ret = gf100_ram_train_init_0(ram, train);
break;
default:
- return 0;
+ ret = 0;
+ break;
}
- /* prepare for ddr link training, and load training patterns */
- for (i = 0; i < 0x30; i++) {
- nvkm_wr32(device, 0x10f968, 0x00000000 | (i << 8));
- nvkm_wr32(device, 0x10f96c, 0x00000000 | (i << 8));
- nvkm_wr32(device, 0x10f920, 0x00000100 | train0[i % 12]);
- nvkm_wr32(device, 0x10f924, 0x00000100 | train0[i % 12]);
- nvkm_wr32(device, 0x10f918, train1[i % 12]);
- nvkm_wr32(device, 0x10f91c, train1[i % 12]);
- nvkm_wr32(device, 0x10f920, 0x00000000 | train0[i % 12]);
- nvkm_wr32(device, 0x10f924, 0x00000000 | train0[i % 12]);
- nvkm_wr32(device, 0x10f918, train1[i % 12]);
- nvkm_wr32(device, 0x10f91c, train1[i % 12]);
- }
+ kfree(train);
+ return ret;
+}
+static int
+gf100_ram_init(struct nvkm_ram *base)
+{
+ /* XXX: Don't hook up yet for bisectability */
return 0;
}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c
index 7904fa4..8bf4638 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.c
@@ -1257,144 +1257,6 @@ gk104_ram_tidy(struct nvkm_ram *base)
ram_exec(&ram->fuc, false);
}
-struct gk104_ram_train {
- u16 mask;
- struct nvbios_M0209S remap;
- struct nvbios_M0209S type00;
- struct nvbios_M0209S type01;
- struct nvbios_M0209S type04;
- struct nvbios_M0209S type06;
- struct nvbios_M0209S type07;
- struct nvbios_M0209S type08;
- struct nvbios_M0209S type09;
-};
-
-static int
-gk104_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
- struct gk104_ram_train *train)
-{
- struct nvkm_bios *bios = ram->fb->subdev.device->bios;
- struct nvbios_M0205E M0205E;
- struct nvbios_M0205S M0205S;
- struct nvbios_M0209E M0209E;
- struct nvbios_M0209S *remap = &train->remap;
- struct nvbios_M0209S *value;
- u8 ver, hdr, cnt, len;
- u32 data;
-
- /* determine type of data for this index */
- if (!(data = nvbios_M0205Ep(bios, i, &ver, &hdr, &cnt, &len, &M0205E)))
- return -ENOENT;
-
- switch (M0205E.type) {
- case 0x00: value = &train->type00; break;
- case 0x01: value = &train->type01; break;
- case 0x04: value = &train->type04; break;
- case 0x06: value = &train->type06; break;
- case 0x07: value = &train->type07; break;
- case 0x08: value = &train->type08; break;
- case 0x09: value = &train->type09; break;
- default:
- return 0;
- }
-
- /* training data index determined by ramcfg strap */
- if (!(data = nvbios_M0205Sp(bios, i, ramcfg, &ver, &hdr, &M0205S)))
- return -EINVAL;
- i = M0205S.data;
-
- /* training data format information */
- if (!(data = nvbios_M0209Ep(bios, i, &ver, &hdr, &cnt, &len, &M0209E)))
- return -EINVAL;
-
- /* ... and the raw data */
- if (!(data = nvbios_M0209Sp(bios, i, 0, &ver, &hdr, value)))
- return -EINVAL;
-
- if (M0209E.v02_07 == 2) {
- /* of course! why wouldn't we have a pointer to another entry
- * in the same table, and use the first one as an array of
- * remap indices...
- */
- if (!(data = nvbios_M0209Sp(bios, M0209E.v03, 0, &ver, &hdr,
- remap)))
- return -EINVAL;
-
- for (i = 0; i < ARRAY_SIZE(value->data); i++)
- value->data[i] = remap->data[value->data[i]];
- } else
- if (M0209E.v02_07 != 1)
- return -EINVAL;
-
- train->mask |= 1 << M0205E.type;
- return 0;
-}
-
-static int
-gk104_ram_train_init_0(struct nvkm_ram *ram, struct gk104_ram_train *train)
-{
- struct nvkm_subdev *subdev = &ram->fb->subdev;
- struct nvkm_device *device = subdev->device;
- int i, j;
-
- if ((train->mask & 0x03d3) != 0x03d3) {
- nvkm_warn(subdev, "missing link training data\n");
- return -EINVAL;
- }
-
- for (i = 0; i < 0x30; i++) {
- for (j = 0; j < 8; j += 4) {
- nvkm_wr32(device, 0x10f968 + j, 0x00000000 | (i << 8));
- nvkm_wr32(device, 0x10f920 + j, 0x00000000 |
- train->type08.data[i] << 4 |
- train->type06.data[i]);
- nvkm_wr32(device, 0x10f918 + j, train->type00.data[i]);
- nvkm_wr32(device, 0x10f920 + j, 0x00000100 |
- train->type09.data[i] << 4 |
- train->type07.data[i]);
- nvkm_wr32(device, 0x10f918 + j, train->type01.data[i]);
- }
- }
-
- for (j = 0; j < 8; j += 4) {
- for (i = 0; i < 0x100; i++) {
- nvkm_wr32(device, 0x10f968 + j, i);
- nvkm_wr32(device, 0x10f900 + j, train->type04.data[i]);
- }
- }
-
- return 0;
-}
-
-static int
-gk104_ram_train_init(struct nvkm_ram *ram)
-{
- u8 ramcfg = nvbios_ramcfg_index(&ram->fb->subdev);
- struct gk104_ram_train *train;
- int ret, i;
-
- if (!(train = kzalloc(sizeof(*train), GFP_KERNEL)))
- return -ENOMEM;
-
- for (i = 0; i < 0x100; i++) {
- ret = gk104_ram_train_type(ram, i, ramcfg, train);
- if (ret && ret != -ENOENT)
- break;
- }
-
- switch (ram->type) {
- case NVKM_RAM_TYPE_GDDR5:
- ret = gk104_ram_train_init_0(ram, train);
- break;
- default:
- ret = 0;
- break;
- }
-
- kfree(train);
- return ret;
-}
-
int
gk104_ram_init(struct nvkm_ram *ram)
{
@@ -1439,7 +1301,7 @@ gk104_ram_init(struct nvkm_ram *ram)
nvkm_wr32(device, 0x10ecc0, 0xffffffff);
nvkm_mask(device, 0x10f160, 0x00000010, 0x00000010);
- return gk104_ram_train_init(ram);
+ return gf100_ram_train_init(ram);
}
static int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
index 8454899..6abd0e3 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
@@ -267,6 +267,67 @@ gt215_link_train(struct gt215_ram *ram)
return ret;
}
+int
+gt215_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
+ struct gt215_ram_train *train)
+{
+ struct nvkm_bios *bios = ram->fb->subdev.device->bios;
+ struct nvbios_M0205E M0205E;
+ struct nvbios_M0205S M0205S;
+ struct nvbios_M0209E M0209E;
+ struct nvbios_M0209S *remap = &train->remap;
+ struct nvbios_M0209S *value;
+ u8 ver, hdr, cnt, len;
+ u32 data;
+
+ /* determine type of data for this index */
+ if (!(data = nvbios_M0205Ep(bios, i, &ver, &hdr, &cnt, &len, &M0205E)))
+ return -ENOENT;
+
+ switch (M0205E.type) {
+ case 0x00: value = &train->type00; break;
+ case 0x01: value = &train->type01; break;
+ case 0x04: value = &train->type04; break;
+ case 0x06: value = &train->type06; break;
+ case 0x07: value = &train->type07; break;
+ case 0x08: value = &train->type08; break;
+ case 0x09: value = &train->type09; break;
+ default:
+ return 0;
+ }
+
+ /* training data index determined by ramcfg strap */
+ if (!(data = nvbios_M0205Sp(bios, i, ramcfg, &ver, &hdr, &M0205S)))
+ return -EINVAL;
+ i = M0205S.data;
+
+ /* training data format information */
+ if (!(data = nvbios_M0209Ep(bios, i, &ver, &hdr, &cnt, &len, &M0209E)))
+ return -EINVAL;
+
+ /* ... and the raw data */
+ if (!(data = nvbios_M0209Sp(bios, i, 0, &ver, &hdr, value)))
+ return -EINVAL;
+
+ if (M0209E.v02_07 == 2) {
+ /* of course! why wouldn't we have a pointer to another entry
+ * in the same table, and use the first one as an array of
+ * remap indices...
+ */
+ if (!(data = nvbios_M0209Sp(bios, M0209E.v03, 0, &ver, &hdr,
+ remap)))
+ return -EINVAL;
+
+ for (i = 0; i < ARRAY_SIZE(value->data); i++)
+ value->data[i] = remap->data[value->data[i]];
+ } else
+ if (M0209E.v02_07 != 1)
+ return -EINVAL;
+
+ train->mask |= 1 << M0205E.type;
+ return 0;
+}
+
static int
gt215_link_train_init(struct gt215_ram *ram)
{
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/13] nvkm/ramgf100: Don't mandate training pattern 4
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (5 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 06/13] nvkm/ramgt215: Move ram training up the chain Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 08/13] nvkm/ramgf100: Unset bit before uploading train values Roy Spliet
` (5 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
It's not found on Fermi.
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index 38a7e2b..eef09bf 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -556,7 +556,7 @@ gf100_ram_train_init_0(struct nvkm_ram *ram, struct gt215_ram_train *train)
struct nvkm_device *device = subdev->device;
int i, j;
- if ((train->mask & 0x03d3) != 0x03d3) {
+ if ((train->mask & 0x03c3) != 0x03c3) {
nvkm_warn(subdev, "missing link training data\n");
return -EINVAL;
}
@@ -575,10 +575,13 @@ gf100_ram_train_init_0(struct nvkm_ram *ram, struct gt215_ram_train *train)
}
}
- for (j = 0; j < 8; j += 4) {
- for (i = 0; i < 0x100; i++) {
- nvkm_wr32(device, 0x10f968 + j, i);
- nvkm_wr32(device, 0x10f900 + j, train->type04.data[i]);
+ if (train->mask & 0x10) {
+ for (j = 0; j < 8; j += 4) {
+ for (i = 0; i < 0x100; i++) {
+ nvkm_wr32(device, 0x10f968 + j, i);
+ nvkm_wr32(device, 0x10f900 + j,
+ train->type04.data[i]);
+ }
}
}
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/13] nvkm/ramgf100: Unset bit before uploading train values
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (6 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 07/13] nvkm/ramgf100: Don't mandate training pattern 4 Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 09/13] nvkm/ramgf100: Reinstate default ram train pattern Roy Spliet
` (4 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Just because the blob does it too...
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index eef09bf..62359c2 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -620,6 +620,12 @@ gf100_ram_train_init(struct nvkm_ram *ram)
static int
gf100_ram_init(struct nvkm_ram *base)
{
+ struct nvkm_subdev *subdev = &base->fb->subdev;
+ struct nvkm_device *device = subdev->device;
+
+ /* XXX Why does the blob do this? */
+ nvkm_mask(device, 0x137360, 0x00000002, 0x00000000);
+
/* XXX: Don't hook up yet for bisectability */
return 0;
}
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/13] nvkm/ramgf100: Reinstate default ram train pattern
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (7 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 08/13] nvkm/ramgf100: Unset bit before uploading train values Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 10/13] nvkm/ramgt215: Add train ptrn upload for GDDR5 Roy Spliet
` (3 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 59 +++++++++++++++++------
1 file changed, 43 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index 62359c2..a469719 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -556,22 +556,49 @@ gf100_ram_train_init_0(struct nvkm_ram *ram, struct gt215_ram_train *train)
struct nvkm_device *device = subdev->device;
int i, j;
- if ((train->mask & 0x03c3) != 0x03c3) {
- nvkm_warn(subdev, "missing link training data\n");
- return -EINVAL;
- }
-
- for (i = 0; i < 0x30; i++) {
- for (j = 0; j < 8; j += 4) {
- nvkm_wr32(device, 0x10f968 + j, 0x00000000 | (i << 8));
- nvkm_wr32(device, 0x10f920 + j, 0x00000000 |
- train->type08.data[i] << 4 |
- train->type06.data[i]);
- nvkm_wr32(device, 0x10f918 + j, train->type00.data[i]);
- nvkm_wr32(device, 0x10f920 + j, 0x00000100 |
- train->type09.data[i] << 4 |
- train->type07.data[i]);
- nvkm_wr32(device, 0x10f918 + j, train->type01.data[i]);
+ static const u8 train0[] = {
+ 0x00, 0xff, 0x55, 0xaa, 0x33, 0xcc,
+ 0x00, 0xff, 0xff, 0x00, 0xff, 0x00,
+ };
+
+ static const u32 train1[] = {
+ 0x00000000, 0xffffffff,
+ 0x55555555, 0xaaaaaaaa,
+ 0x33333333, 0xcccccccc,
+ 0xf0f0f0f0, 0x0f0f0f0f,
+ 0x00ff00ff, 0xff00ff00,
+ 0x0000ffff, 0xffff0000,
+ };
+
+ if ((train->mask & 0x03c3) == 0x03c3) {
+ for (i = 0; i < 0x30; i++) {
+ for (j = 0; j < 8; j += 4) {
+ nvkm_wr32(device, 0x10f968 + j, (i << 8));
+ nvkm_wr32(device, 0x10f920 + j, 0x00000000 |
+ train->type08.data[i] << 4 |
+ train->type06.data[i]);
+ nvkm_wr32(device, 0x10f918 + j,
+ train->type00.data[i]);
+ nvkm_wr32(device, 0x10f920 + j, 0x00000100 |
+ train->type09.data[i] << 4 |
+ train->type07.data[i]);
+ nvkm_wr32(device, 0x10f918 + j,
+ train->type01.data[i]);
+ }
+ }
+ } else {
+ nvkm_info(subdev, "missing link training data, using defaults\n");
+
+ for (i = 0; i < 0x30; i++) {
+ for (j = 0; j < 8; j += 4) {
+ nvkm_wr32(device, 0x10f968 + j, (i << 8));
+ nvkm_wr32(device, 0x10f920 + j, 0x00000100 |
+ train0[i % 12]);
+ nvkm_wr32(device, 0x10f918 + j, train1[i % 12]);
+ nvkm_wr32(device, 0x10f920 + j, 0x00000000 |
+ train0[i % 12]);
+ nvkm_wr32(device, 0x10f918 + j, train1[i % 12]);
+ }
}
}
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/13] nvkm/ramgt215: Add train ptrn upload for GDDR5
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (8 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 09/13] nvkm/ramgf100: Reinstate default ram train pattern Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 11/13] nvkm/ramgf100: Hook up ram training pattern init for NVC0+ Roy Spliet
` (2 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Signed-off-by: Roy Spliet <nouveau@spliet.org>
Tested-by: Ilia Mirkin <imirkin@alum.mit.edu>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h | 1 +
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c | 128 +++++++++++++++++-----
2 files changed, 99 insertions(+), 30 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
index ce8a98e..ef9edc5 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
@@ -32,6 +32,7 @@ struct gt215_ram_train {
struct nvbios_M0209S type00;
struct nvbios_M0209S type01;
struct nvbios_M0209S type04;
+ struct nvbios_M0209S type05;
struct nvbios_M0209S type06;
struct nvbios_M0209S type07;
struct nvbios_M0209S type08;
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
index 6abd0e3..fa85942 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.c
@@ -75,7 +75,7 @@ struct gt215_ramfuc {
struct ramfuc_reg r_gpio[4];
};
-struct gt215_ltrain {
+struct gt215_ram_train_ddr3 {
enum {
NVA3_TRAIN_UNKNOWN,
NVA3_TRAIN_UNSUPPORTED,
@@ -92,11 +92,11 @@ struct gt215_ltrain {
struct gt215_ram {
struct nvkm_ram base;
struct gt215_ramfuc fuc;
- struct gt215_ltrain ltrain;
+ struct gt215_ram_train_ddr3 ltrain;
};
static void
-gt215_link_train_calc(u32 *vals, struct gt215_ltrain *train)
+gt215_link_train_calc(u32 *vals, struct gt215_ram_train_ddr3 *train)
{
int i, lo, hi;
u8 median[8], bins[4] = {0, 0, 0, 0}, bin = 0, qty = 0;
@@ -152,7 +152,7 @@ gt215_link_train_calc(u32 *vals, struct gt215_ltrain *train)
static int
gt215_link_train(struct gt215_ram *ram)
{
- struct gt215_ltrain *train = &ram->ltrain;
+ struct gt215_ram_train_ddr3 *train = &ram->ltrain;
struct gt215_ramfuc *fuc = &ram->fuc;
struct nvkm_subdev *subdev = &ram->base.fb->subdev;
struct nvkm_device *device = subdev->device;
@@ -288,6 +288,7 @@ gt215_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
case 0x00: value = &train->type00; break;
case 0x01: value = &train->type01; break;
case 0x04: value = &train->type04; break;
+ case 0x05: value = &train->type05; break;
case 0x06: value = &train->type06; break;
case 0x07: value = &train->type07; break;
case 0x08: value = &train->type08; break;
@@ -321,7 +322,7 @@ gt215_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
for (i = 0; i < ARRAY_SIZE(value->data); i++)
value->data[i] = remap->data[value->data[i]];
} else
- if (M0209E.v02_07 != 1)
+ if (M0209E.v02_07 > 2)
return -EINVAL;
train->mask |= 1 << M0205E.type;
@@ -329,7 +330,47 @@ gt215_ram_train_type(struct nvkm_ram *ram, int i, u8 ramcfg,
}
static int
-gt215_link_train_init(struct gt215_ram *ram)
+gt215_ram_train_upload_gddr5(struct nvkm_ram *ram,
+ struct gt215_ram_train *train)
+{
+ struct nvkm_subdev *subdev = &ram->fb->subdev;
+ struct nvkm_device *device = subdev->device;
+ int i, j;
+
+ static const u32 off[] = {0x00, 0x20, 0x04, 0x24};
+
+ if ((train->mask & 0x03c3) != 0x03c3) {
+ nvkm_info(subdev,
+ "missing link training data, not uploading patterns\n");
+ return 0;
+ }
+
+ for (j = 0; j < 4; j++) {
+ for (i = 0; i < 0x80; i++) {
+ nvkm_wr32(device, 0x10f8c0 + off[j], (i << 8) | i);
+ if (i < 0x30) {
+ nvkm_wr32(device, 0x10f940 + off[j], 0x00000000 |
+ train->type08.data[i] << 4 |
+ train->type06.data[i]);
+ nvkm_wr32(device, 0x10f900 + off[j],
+ train->type00.data[i]);
+ nvkm_wr32(device, 0x10f940 + off[j], 0x00000100 |
+ train->type09.data[i] << 4 |
+ train->type07.data[i]);
+ nvkm_wr32(device, 0x10f900 + off[j],
+ train->type01.data[i]);
+ }
+ nvkm_wr32(device, 0x10f840 + off[j], 0x00000000 | i);
+ nvkm_wr32(device, 0x10f840 + off[j], 0x01000000 | i);
+ }
+ }
+
+ return 0;
+}
+
+static int
+gt215_ram_train_upload_ddr3(struct nvkm_ram *ram,
+ struct gt215_ram_train *train)
{
static const u32 pattern[16] = {
0xaaaaaaaa, 0xcccccccc, 0xdddddddd, 0xeeeeeeee,
@@ -337,33 +378,28 @@ gt215_link_train_init(struct gt215_ram *ram)
0x33333333, 0x55555555, 0x77777777, 0x66666666,
0x99999999, 0x88888888, 0xeeeeeeee, 0xbbbbbbbb,
};
- struct gt215_ltrain *train = &ram->ltrain;
- struct nvkm_device *device = ram->base.fb->subdev.device;
- struct nvkm_bios *bios = device->bios;
+ struct gt215_ram *gt215 = gt215_ram(ram);
+ struct gt215_ram_train_ddr3 *train_ddr3 = >215->ltrain;
+ struct nvkm_device *device = ram->fb->subdev.device;
struct nvkm_mem *mem;
- struct nvbios_M0205E M0205E;
- u8 ver, hdr, cnt, len;
u32 r001700;
int ret, i = 0;
- train->state = NVA3_TRAIN_UNSUPPORTED;
+ train_ddr3->state = NVA3_TRAIN_UNSUPPORTED;
/* We support type "5"
* XXX: training pattern table appears to be unused for this routine */
- if (!nvbios_M0205Ep(bios, i, &ver, &hdr, &cnt, &len, &M0205E))
- return -ENOENT;
-
- if (M0205E.type != 5)
+ if ((train->mask & 0x0020) != 0x0020)
return 0;
- train->state = NVA3_TRAIN_ONCE;
+ train_ddr3->state = NVA3_TRAIN_ONCE;
- ret = ram->base.func->get(&ram->base, 0x8000, 0x10000, 0, 0x800,
- &ram->ltrain.mem);
+ ret = ram->func->get(ram, 0x8000, 0x10000, 0, 0x800,
+ &train_ddr3->mem);
if (ret)
return ret;
- mem = ram->ltrain.mem;
+ mem = train_ddr3->mem;
nvkm_wr32(device, 0x100538, 0x10000000 | (mem->offset >> 16));
nvkm_wr32(device, 0x1005a8, 0x0000ffff);
@@ -388,17 +424,50 @@ gt215_link_train_init(struct gt215_ram *ram)
nvkm_wr32(device, 0x700100 + (i << 2), pattern[i]);
nvkm_wr32(device, 0x1700, r001700);
- train->r_100720 = nvkm_rd32(device, 0x100720);
- train->r_1111e0 = nvkm_rd32(device, 0x1111e0);
- train->r_111400 = nvkm_rd32(device, 0x111400);
+ train_ddr3->r_100720 = nvkm_rd32(device, 0x100720);
+ train_ddr3->r_1111e0 = nvkm_rd32(device, 0x1111e0);
+ train_ddr3->r_111400 = nvkm_rd32(device, 0x111400);
return 0;
}
+int
+gt215_ram_train_init(struct nvkm_ram *ram)
+{
+ u8 ramcfg = nvbios_ramcfg_index(&ram->fb->subdev);
+ struct gt215_ram_train *train;
+ int ret, i;
+
+ if (!(train = kzalloc(sizeof(*train), GFP_KERNEL)))
+ return -ENOMEM;
+
+ for (i = 0; i < 0x100; i++) {
+ ret = gt215_ram_train_type(ram, i, ramcfg, train);
+ if (ret && ret != -ENOENT)
+ break;
+ }
+
+ switch (ram->type) {
+ case NVKM_RAM_TYPE_GDDR5:
+ ret = gt215_ram_train_upload_gddr5(ram, train);
+ break;
+ case NVKM_RAM_TYPE_DDR3:
+ ret = gt215_ram_train_upload_ddr3(ram, train);
+ break;
+ default:
+ ret = 0;
+ break;
+ }
+
+ kfree(train);
+ return ret;
+}
+
static void
-gt215_link_train_fini(struct gt215_ram *ram)
+gt215_ram_train_fini(struct nvkm_ram *ram)
{
- if (ram->ltrain.mem)
- ram->base.func->put(&ram->base, &ram->ltrain.mem);
+ struct gt215_ram *gt215 = gt215_ram(ram);
+ if (gt215->ltrain.mem)
+ ram->func->put(ram, >215->ltrain.mem);
}
/*
@@ -554,7 +623,7 @@ gt215_ram_calc(struct nvkm_ram *base, u32 freq)
{
struct gt215_ram *ram = gt215_ram(base);
struct gt215_ramfuc *fuc = &ram->fuc;
- struct gt215_ltrain *train = &ram->ltrain;
+ struct gt215_ram_train_ddr3 *train = &ram->ltrain;
struct nvkm_subdev *subdev = &ram->base.fb->subdev;
struct nvkm_device *device = subdev->device;
struct nvkm_bios *bios = device->bios;
@@ -979,8 +1048,7 @@ gt215_ram_tidy(struct nvkm_ram *base)
static int
gt215_ram_init(struct nvkm_ram *base)
{
- struct gt215_ram *ram = gt215_ram(base);
- gt215_link_train_init(ram);
+ gt215_ram_train_init(base);
return 0;
}
@@ -988,7 +1056,7 @@ static void *
gt215_ram_dtor(struct nvkm_ram *base)
{
struct gt215_ram *ram = gt215_ram(base);
- gt215_link_train_fini(ram);
+ gt215_ram_train_fini(base);
return ram;
}
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 11/13] nvkm/ramgf100: Hook up ram training pattern init for NVC0+
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (9 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 10/13] nvkm/ramgt215: Add train ptrn upload for GDDR5 Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 12/13] nvkm/pmu/memx: init script -> memx translation Roy Spliet
2017-04-10 19:50 ` [PATCH 13/13] nvkm/bios/perf: Retreive pointer to unk1c script Roy Spliet
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index a469719..eebd20b 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -653,8 +653,7 @@ gf100_ram_init(struct nvkm_ram *base)
/* XXX Why does the blob do this? */
nvkm_mask(device, 0x137360, 0x00000002, 0x00000000);
- /* XXX: Don't hook up yet for bisectability */
- return 0;
+ return gf100_ram_train_init(base);
}
static const struct nvkm_ram_func
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 12/13] nvkm/pmu/memx: init script -> memx translation
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (10 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 11/13] nvkm/ramgf100: Hook up ram training pattern init for NVC0+ Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
2017-04-10 19:50 ` [PATCH 13/13] nvkm/bios/perf: Retreive pointer to unk1c script Roy Spliet
12 siblings, 0 replies; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h | 2 +
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h | 8 +++
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c | 66 +++++++++++++++++++++++
3 files changed, 76 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
index f37538eb..b9c46ef 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/pmu.h
@@ -50,4 +50,6 @@ void nvkm_memx_train(struct nvkm_memx *);
int nvkm_memx_train_result(struct nvkm_pmu *, u32 *, int);
void nvkm_memx_block(struct nvkm_memx *);
void nvkm_memx_unblock(struct nvkm_memx *);
+void nvkm_memx_init_run(struct nvkm_memx *memx, struct nvkm_bios *bios,
+ u16 offset, u8 ramcfg);
#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h
index 9ef9d6a..614e716 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramfuc.h
@@ -160,6 +160,13 @@ ramfuc_unblock(struct ramfuc *ram)
nvkm_memx_unblock(ram->memx);
}
+static inline void
+ramfuc_init_run(struct ramfuc *ram, struct nvkm_bios *bios, u16 offset,
+ u8 ramcfg)
+{
+ nvkm_memx_init_run(ram->memx, bios, offset, ramcfg);
+}
+
#define ram_init(s,p) ramfuc_init(&(s)->base, (p))
#define ram_exec(s,e) ramfuc_exec(&(s)->base, (e))
#define ram_have(s,r) ((s)->r_##r.addr != 0x000000)
@@ -174,4 +181,5 @@ ramfuc_unblock(struct ramfuc *ram)
#define ram_train_result(s,r,l) ramfuc_train_result((s), (r), (l))
#define ram_block(s) ramfuc_block(&(s)->base)
#define ram_unblock(s) ramfuc_unblock(&(s)->base)
+#define ram_init_run(s,b,o,r) ramfuc_init_run(&(s)->base, (b), (o), (r))
#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c
index e6f7416..c58a51d 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c
@@ -1,6 +1,9 @@
#ifndef __NVKM_PMU_MEMX_H__
#define __NVKM_PMU_MEMX_H__
#include "priv.h"
+#include <subdev/bios.h>
+#include <subdev/bios/init.h>
+#include <subdev/bios/ramcfg.h>
struct nvkm_memx {
struct nvkm_pmu *pmu;
@@ -200,4 +203,67 @@ nvkm_memx_unblock(struct nvkm_memx *memx)
nvkm_debug(&memx->pmu->subdev, " HOST UNBLOCKED\n");
memx_cmd(memx, MEMX_LEAVE, 0, NULL);
}
+
+/******************************************************************************
+ * Turn VBIOS init script into memx command stream. Not-quite as feature rich
+ * as subdev/bios/init.c
+ *****************************************************************************/
+
+static void
+nvkm_memx_init_ram_restrict(struct nvkm_memx *memx, struct nvbios_init *init)
+{
+ struct nvkm_bios *bios = init->bios;
+ struct nvkm_subdev *subdev = &memx->pmu->subdev;
+ struct nvkm_device *device = subdev->device;
+ u32 addr = nvbios_rd32(bios, init->offset + 1);
+ u8 incr = nvbios_rd08(bios, init->offset + 5);
+ u8 num = nvbios_rd08(bios, init->offset + 6);
+ u8 count = nvbios_ramcfg_count(init->bios);
+ u8 index = init->ramcfg;
+ u8 i;
+ u32 oldval, newval;
+
+ init->offset += 7;
+
+ for (i = 0; i < num; i++) {
+ oldval = nvkm_rd32(device, addr);
+ newval = nvbios_rd32(bios, init->offset + (4 * index));
+
+ if (oldval != newval) {
+ nvkm_memx_wr32(memx, addr, newval);
+ }
+ init->offset += 4 * count;
+ addr += incr;
+ }
+}
+
+void
+nvkm_memx_init_run(struct nvkm_memx *memx, struct nvkm_bios *bios, u16 offset,
+ u8 ramcfg)
+{
+ struct nvbios_init init = {
+ .subdev = &bios->subdev,
+ .bios = bios,
+ .offset = offset,
+ .outp = NULL,
+ .execute = 1,
+ .ramcfg = ramcfg,
+ };
+ u8 op;
+
+ while (init.offset)
+ {
+ op = nvbios_rd08(bios, init.offset);
+ switch (op)
+ {
+ case 0x8f:
+ nvkm_memx_init_ram_restrict(memx, &init);
+ break;
+ case 0x71:
+ default:
+ return;
+ }
+ }
+}
+
#endif
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 13/13] nvkm/bios/perf: Retreive pointer to unk1c script
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
` (11 preceding siblings ...)
2017-04-10 19:50 ` [PATCH 12/13] nvkm/pmu/memx: init script -> memx translation Roy Spliet
@ 2017-04-10 19:50 ` Roy Spliet
[not found] ` <20170410195050.29638-14-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
12 siblings, 1 reply; 15+ messages in thread
From: Roy Spliet @ 2017-04-10 19:50 UTC (permalink / raw)
To: Nouveau Mailinglist; +Cc: Ben Skeggs
Signed-off-by: Roy Spliet <nouveau@spliet.org>
---
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h | 1 +
drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c | 14 ++++++++++++++
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 1 +
3 files changed, 16 insertions(+)
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
index 478b1c0..28555d6 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
@@ -40,4 +40,5 @@ struct nvbios_perf_fan {
};
int nvbios_perf_fan_parse(struct nvkm_bios *, struct nvbios_perf_fan *);
+u16 nvbios_perf_script_unk1c(struct nvkm_bios *bios);
#endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
index c306835..55c1f36 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
@@ -213,3 +213,17 @@ nvbios_perf_fan_parse(struct nvkm_bios *bios,
return 0;
}
+
+u16
+nvbios_perf_script_unk1c(struct nvkm_bios *bios)
+{
+ struct bit_entry bit_P;
+
+ if (!bit_entry(bios, 'P', &bit_P)) {
+ if (bit_P.version == 2) {
+ return nvbios_rd16(bios, bit_P.offset + 0x1c);
+ }
+ }
+
+ return 0x0000;
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
index eebd20b..def119c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
@@ -31,6 +31,7 @@
#include <subdev/bios/M0205.h>
#include <subdev/bios/rammap.h>
#include <subdev/bios/timing.h>
+#include <subdev/bios/perf.h>
#include <subdev/clk.h>
#include <subdev/clk/pll.h>
#include <subdev/ltc.h>
--
2.9.3
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 13/13] nvkm/bios/perf: Retreive pointer to unk1c script
[not found] ` <20170410195050.29638-14-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
@ 2017-04-11 17:35 ` William Lewis
0 siblings, 0 replies; 15+ messages in thread
From: William Lewis @ 2017-04-11 17:35 UTC (permalink / raw)
To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Minor nitpick in the patch title: s/Retreive/Retrieve/.
On 04/10/2017 02:50 PM, Roy Spliet wrote:
> Signed-off-by: Roy Spliet <nouveau@spliet.org>
> ---
> drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h | 1 +
> drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c | 14 ++++++++++++++
> drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c | 1 +
> 3 files changed, 16 insertions(+)
>
> diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
> index 478b1c0..28555d6 100644
> --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
> +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
> @@ -40,4 +40,5 @@ struct nvbios_perf_fan {
> };
>
> int nvbios_perf_fan_parse(struct nvkm_bios *, struct nvbios_perf_fan *);
> +u16 nvbios_perf_script_unk1c(struct nvkm_bios *bios);
> #endif
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
> index c306835..55c1f36 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c
> @@ -213,3 +213,17 @@ nvbios_perf_fan_parse(struct nvkm_bios *bios,
>
> return 0;
> }
> +
> +u16
> +nvbios_perf_script_unk1c(struct nvkm_bios *bios)
> +{
> + struct bit_entry bit_P;
> +
> + if (!bit_entry(bios, 'P', &bit_P)) {
> + if (bit_P.version == 2) {
> + return nvbios_rd16(bios, bit_P.offset + 0x1c);
> + }
> + }
> +
> + return 0x0000;
> +}
> diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
> index eebd20b..def119c 100644
> --- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
> +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
> @@ -31,6 +31,7 @@
> #include <subdev/bios/M0205.h>
> #include <subdev/bios/rammap.h>
> #include <subdev/bios/timing.h>
> +#include <subdev/bios/perf.h>
> #include <subdev/clk.h>
> #include <subdev/clk/pll.h>
> #include <subdev/ltc.h>
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2017-04-11 17:35 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-10 19:50 RESEND Preparations for Fermi DRAM clock changes Roy Spliet
[not found] ` <20170410195050.29638-1-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
2017-04-10 19:50 ` [PATCH 01/13] nvkm/bios: Give timings a name Roy Spliet
2017-04-10 19:50 ` [PATCH 02/13] nvkm/ramnv50: Split up various ramcfg bytes in nibbles Roy Spliet
2017-04-10 19:50 ` [PATCH 03/13] nvkm/ramgf100: Get rid of (size, data) pairs for rammap, ramcfg, timing Roy Spliet
2017-04-10 19:50 ` [PATCH 04/13] nvkm/ramgf100: Calculate timings Roy Spliet
2017-04-10 19:50 ` [PATCH 05/13] nvkm/gddr5: MR calculation for timing table v1.0 Roy Spliet
2017-04-10 19:50 ` [PATCH 06/13] nvkm/ramgt215: Move ram training up the chain Roy Spliet
2017-04-10 19:50 ` [PATCH 07/13] nvkm/ramgf100: Don't mandate training pattern 4 Roy Spliet
2017-04-10 19:50 ` [PATCH 08/13] nvkm/ramgf100: Unset bit before uploading train values Roy Spliet
2017-04-10 19:50 ` [PATCH 09/13] nvkm/ramgf100: Reinstate default ram train pattern Roy Spliet
2017-04-10 19:50 ` [PATCH 10/13] nvkm/ramgt215: Add train ptrn upload for GDDR5 Roy Spliet
2017-04-10 19:50 ` [PATCH 11/13] nvkm/ramgf100: Hook up ram training pattern init for NVC0+ Roy Spliet
2017-04-10 19:50 ` [PATCH 12/13] nvkm/pmu/memx: init script -> memx translation Roy Spliet
2017-04-10 19:50 ` [PATCH 13/13] nvkm/bios/perf: Retreive pointer to unk1c script Roy Spliet
[not found] ` <20170410195050.29638-14-nouveau-NQbd8FSOZ1kdnm+yROfE0A@public.gmane.org>
2017-04-11 17:35 ` William Lewis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.