aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-06-09 03:27:47 -0400
committerBen Skeggs <bskeggs@redhat.com>2011-09-20 02:01:21 -0400
commit93dccbedeb2280ca2c234530236b950b232afa65 (patch)
tree2f736e5581e4f6267da9669ed01ea90dbf41b25e /drivers/gpu
parent3b5565ddfd8fe71f6470a5d240a6bb50ba90d4ff (diff)
drm/nouveau/pm: show any info we can manage to glean on current perflvl
Previously wouldn't show detected voltage if we couldn't figure out the clock frequencies.. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_pm.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
index cab576b2f15e..53d2ad8a0496 100644
--- a/drivers/gpu/drm/nouveau/nouveau_pm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
@@ -123,26 +123,25 @@ nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
123 struct nouveau_pm_engine *pm = &dev_priv->engine.pm; 123 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
124 int ret; 124 int ret;
125 125
126 if (!pm->clock_get)
127 return -EINVAL;
128
129 memset(perflvl, 0, sizeof(*perflvl)); 126 memset(perflvl, 0, sizeof(*perflvl));
130 127
131 ret = pm->clock_get(dev, PLL_CORE); 128 if (pm->clock_get) {
132 if (ret > 0) 129 ret = pm->clock_get(dev, PLL_CORE);
133 perflvl->core = ret; 130 if (ret > 0)
131 perflvl->core = ret;
134 132
135 ret = pm->clock_get(dev, PLL_MEMORY); 133 ret = pm->clock_get(dev, PLL_MEMORY);
136 if (ret > 0) 134 if (ret > 0)
137 perflvl->memory = ret; 135 perflvl->memory = ret;
138 136
139 ret = pm->clock_get(dev, PLL_SHADER); 137 ret = pm->clock_get(dev, PLL_SHADER);
140 if (ret > 0) 138 if (ret > 0)
141 perflvl->shader = ret; 139 perflvl->shader = ret;
142 140
143 ret = pm->clock_get(dev, PLL_UNK05); 141 ret = pm->clock_get(dev, PLL_UNK05);
144 if (ret > 0) 142 if (ret > 0)
145 perflvl->unk05 = ret; 143 perflvl->unk05 = ret;
144 }
146 145
147 if (pm->voltage.supported && pm->voltage_get) { 146 if (pm->voltage.supported && pm->voltage_get) {
148 ret = pm->voltage_get(dev); 147 ret = pm->voltage_get(dev);
@@ -158,7 +157,7 @@ nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
158static void 157static void
159nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len) 158nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
160{ 159{
161 char c[16], s[16], v[32], f[16], t[16]; 160 char c[16], s[16], v[32], f[16], t[16], m[16];
162 161
163 c[0] = '\0'; 162 c[0] = '\0';
164 if (perflvl->core) 163 if (perflvl->core)
@@ -168,6 +167,10 @@ nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
168 if (perflvl->shader) 167 if (perflvl->shader)
169 snprintf(s, sizeof(s), " shader %dMHz", perflvl->shader / 1000); 168 snprintf(s, sizeof(s), " shader %dMHz", perflvl->shader / 1000);
170 169
170 m[0] = '\0';
171 if (perflvl->memory)
172 snprintf(m, sizeof(m), " memory %dMHz", perflvl->memory / 1000);
173
171 v[0] = '\0'; 174 v[0] = '\0';
172 if (perflvl->volt_min && perflvl->volt_min != perflvl->volt_max) { 175 if (perflvl->volt_min && perflvl->volt_min != perflvl->volt_max) {
173 snprintf(v, sizeof(v), " voltage %dmV-%dmV", 176 snprintf(v, sizeof(v), " voltage %dmV-%dmV",
@@ -186,8 +189,7 @@ nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
186 if (perflvl->timing) 189 if (perflvl->timing)
187 snprintf(t, sizeof(t), " timing %d", perflvl->timing->id); 190 snprintf(t, sizeof(t), " timing %d", perflvl->timing->id);
188 191
189 snprintf(ptr, len, "memory %dMHz%s%s%s%s%s\n", perflvl->memory / 1000, 192 snprintf(ptr, len, "%s%s%s%s%s%s\n", c, s, m, t, v, f);
190 c, s, v, f, t);
191} 193}
192 194
193static ssize_t 195static ssize_t
@@ -198,7 +200,7 @@ nouveau_pm_get_perflvl_info(struct device *d,
198 char *ptr = buf; 200 char *ptr = buf;
199 int len = PAGE_SIZE; 201 int len = PAGE_SIZE;
200 202
201 snprintf(ptr, len, "%d: ", perflvl->id); 203 snprintf(ptr, len, "%d:", perflvl->id);
202 ptr += strlen(buf); 204 ptr += strlen(buf);
203 len -= strlen(buf); 205 len -= strlen(buf);
204 206
@@ -219,9 +221,9 @@ nouveau_pm_get_perflvl(struct device *d, struct device_attribute *a, char *buf)
219 if (!pm->cur) 221 if (!pm->cur)
220 snprintf(ptr, len, "setting: boot\n"); 222 snprintf(ptr, len, "setting: boot\n");
221 else if (pm->cur == &pm->boot) 223 else if (pm->cur == &pm->boot)
222 snprintf(ptr, len, "setting: boot\nc: "); 224 snprintf(ptr, len, "setting: boot\nc:");
223 else 225 else
224 snprintf(ptr, len, "setting: static %d\nc: ", pm->cur->id); 226 snprintf(ptr, len, "setting: static %d\nc:", pm->cur->id);
225 ptr += strlen(buf); 227 ptr += strlen(buf);
226 len -= strlen(buf); 228 len -= strlen(buf);
227 229
@@ -496,7 +498,7 @@ nouveau_pm_init(struct drm_device *dev)
496 NV_INFO(dev, "%d available performance level(s)\n", pm->nr_perflvl); 498 NV_INFO(dev, "%d available performance level(s)\n", pm->nr_perflvl);
497 for (i = 0; i < pm->nr_perflvl; i++) { 499 for (i = 0; i < pm->nr_perflvl; i++) {
498 nouveau_pm_perflvl_info(&pm->perflvl[i], info, sizeof(info)); 500 nouveau_pm_perflvl_info(&pm->perflvl[i], info, sizeof(info));
499 NV_INFO(dev, "%d: %s", pm->perflvl[i].id, info); 501 NV_INFO(dev, "%d:%s", pm->perflvl[i].id, info);
500 } 502 }
501 503
502 /* determine current ("boot") performance level */ 504 /* determine current ("boot") performance level */
@@ -506,7 +508,7 @@ nouveau_pm_init(struct drm_device *dev)
506 pm->cur = &pm->boot; 508 pm->cur = &pm->boot;
507 509
508 nouveau_pm_perflvl_info(&pm->boot, info, sizeof(info)); 510 nouveau_pm_perflvl_info(&pm->boot, info, sizeof(info));
509 NV_INFO(dev, "c: %s", info); 511 NV_INFO(dev, "c:%s", info);
510 } 512 }
511 513
512 /* switch performance levels now if requested */ 514 /* switch performance levels now if requested */