Commit 9698b9a6 authored by Ben Skeggs's avatar Ben Skeggs

drm/nvc0/pm: more complete parsing of clock domains

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 354d0781
...@@ -449,10 +449,15 @@ struct nouveau_pm_level { ...@@ -449,10 +449,15 @@ struct nouveau_pm_level {
u32 core; u32 core;
u32 memory; u32 memory;
u32 shader; u32 shader;
u32 rop;
u32 copy;
u32 daemon;
u32 vdec; u32 vdec;
u32 unk05; u32 unk05; /* nv50:nva3, roughly.. */
u32 unk0a; u32 unka0; /* nva3:nvc0 */
u32 unka0; u32 hub01; /* nvc0- */
u32 hub06; /* nvc0- */
u32 hub07; /* nvc0- */
u32 volt_min; /* microvolts */ u32 volt_min; /* microvolts */
u32 volt_max; u32 volt_max;
......
...@@ -284,28 +284,27 @@ nouveau_perf_init(struct drm_device *dev) ...@@ -284,28 +284,27 @@ nouveau_perf_init(struct drm_device *dev)
perflvl->unk05 = ROM16(entry[16]) * 1000; perflvl->unk05 = ROM16(entry[16]) * 1000;
break; break;
case 0x40: case 0x40:
#define subent(n) entry[perf[2] + ((n) * perf[3])] #define subent(n) (ROM16(entry[perf[2] + ((n) * perf[3])]) & 0xfff) * 1000
perflvl->fanspeed = 0; /*XXX*/ perflvl->fanspeed = 0; /*XXX*/
perflvl->volt_min = entry[2]; perflvl->volt_min = entry[2];
if (dev_priv->card_type == NV_50) { if (dev_priv->card_type == NV_50) {
perflvl->core = ROM16(subent(0)) & 0xfff; perflvl->core = subent(0);
perflvl->shader = ROM16(subent(1)) & 0xfff; perflvl->shader = subent(1);
perflvl->memory = ROM16(subent(2)) & 0xfff; perflvl->memory = subent(2);
perflvl->vdec = ROM16(subent(3)) & 0xfff; perflvl->vdec = subent(3);
perflvl->unka0 = ROM16(subent(4)) & 0xfff; perflvl->unka0 = subent(4);
} else { } else {
perflvl->shader = ROM16(subent(3)) & 0xfff; perflvl->hub06 = subent(0);
perflvl->hub01 = subent(1);
perflvl->copy = subent(2);
perflvl->shader = subent(3);
perflvl->rop = subent(4);
perflvl->memory = subent(5);
perflvl->vdec = subent(6);
perflvl->daemon = subent(10);
perflvl->hub07 = subent(11);
perflvl->core = perflvl->shader / 2; perflvl->core = perflvl->shader / 2;
perflvl->unk0a = ROM16(subent(4)) & 0xfff;
perflvl->memory = ROM16(subent(5)) & 0xfff;
} }
perflvl->core *= 1000;
perflvl->shader *= 1000;
perflvl->memory *= 1000;
perflvl->unk0a *= 1000;
perflvl->vdec *= 1000;
perflvl->unka0 *= 1000;
break; break;
} }
......
...@@ -215,6 +215,8 @@ nva3_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl) ...@@ -215,6 +215,8 @@ nva3_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
perflvl->memory = read_pll(dev, 0x02, 0x4000); perflvl->memory = read_pll(dev, 0x02, 0x4000);
perflvl->unka0 = read_clk(dev, 0x20, false); perflvl->unka0 = read_clk(dev, 0x20, false);
perflvl->vdec = read_clk(dev, 0x21, false); perflvl->vdec = read_clk(dev, 0x21, false);
perflvl->daemon = read_clk(dev, 0x25, false);
perflvl->copy = perflvl->core;
return 0; return 0;
} }
......
...@@ -140,6 +140,12 @@ nvc0_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl) ...@@ -140,6 +140,12 @@ nvc0_pm_clocks_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
perflvl->shader = read_clk(dev, 0x00); perflvl->shader = read_clk(dev, 0x00);
perflvl->core = perflvl->shader / 2; perflvl->core = perflvl->shader / 2;
perflvl->memory = read_mem(dev); perflvl->memory = read_mem(dev);
perflvl->rop = read_clk(dev, 0x01);
perflvl->hub07 = read_clk(dev, 0x02);
perflvl->hub06 = read_clk(dev, 0x07);
perflvl->hub01 = read_clk(dev, 0x08);
perflvl->copy = read_clk(dev, 0x09);
perflvl->daemon = read_clk(dev, 0x0c);
perflvl->vdec = read_clk(dev, 0x0e); perflvl->vdec = read_clk(dev, 0x0e);
return 0; return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment