diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-06-09 03:27:47 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-09-20 02:01:21 -0400 |
commit | 93dccbedeb2280ca2c234530236b950b232afa65 (patch) | |
tree | 2f736e5581e4f6267da9669ed01ea90dbf41b25e /drivers/gpu/drm/nouveau/nouveau_pm.c | |
parent | 3b5565ddfd8fe71f6470a5d240a6bb50ba90d4ff (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/drm/nouveau/nouveau_pm.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_pm.c | 48 |
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) | |||
158 | static void | 157 | static void |
159 | nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len) | 158 | nouveau_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 | ||
193 | static ssize_t | 195 | static 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 */ |