OSDN Git Service

drm/nouveau/pm: store voltage in microvolts
authorBen Skeggs <bskeggs@redhat.com>
Thu, 9 Jun 2011 03:45:31 +0000 (13:45 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 20 Sep 2011 06:01:02 +0000 (16:01 +1000)
Instead of 10s of millivolts, to match fermi vbios.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_perf.c
drivers/gpu/drm/nouveau/nouveau_pm.c
drivers/gpu/drm/nouveau/nouveau_volt.c

index d7d51de..39d6bb3 100644 (file)
@@ -414,8 +414,8 @@ struct nouveau_gpio_engine {
 };
 
 struct nouveau_pm_voltage_level {
-       u8 voltage;
-       u8 vid;
+       u32 voltage; /* microvolts */
+       u8  vid;
 };
 
 struct nouveau_pm_voltage {
@@ -451,8 +451,8 @@ struct nouveau_pm_level {
        u32 unk05;
        u32 unk0a;
 
-       u8 voltage;
-       u8 fanspeed;
+       u32 voltage; /* microvolts */
+       u8  fanspeed;
 
        u16 memscript;
        struct nouveau_pm_memtiming *timing;
index ef9dec0..117ce16 100644 (file)
@@ -203,7 +203,8 @@ nouveau_perf_init(struct drm_device *dev)
                case 0x13:
                case 0x15:
                        perflvl->fanspeed = entry[55];
-                       perflvl->voltage = (recordlen > 56) ? entry[56] : 0;
+                       if (recordlen > 56)
+                               perflvl->voltage = entry[56] * 10000;
                        perflvl->core = ROM32(entry[1]) * 10;
                        perflvl->memory = ROM32(entry[5]) * 20;
                        break;
@@ -211,7 +212,7 @@ nouveau_perf_init(struct drm_device *dev)
                case 0x23:
                case 0x24:
                        perflvl->fanspeed = entry[4];
-                       perflvl->voltage = entry[5];
+                       perflvl->voltage = entry[5] * 10000;
                        perflvl->core = ROM16(entry[6]) * 1000;
 
                        if (dev_priv->chipset == 0x49 ||
@@ -223,7 +224,7 @@ nouveau_perf_init(struct drm_device *dev)
                        break;
                case 0x25:
                        perflvl->fanspeed = entry[4];
-                       perflvl->voltage = entry[5];
+                       perflvl->voltage = entry[5] * 10000;
                        perflvl->core = ROM16(entry[6]) * 1000;
                        perflvl->shader = ROM16(entry[10]) * 1000;
                        perflvl->memory = ROM16(entry[12]) * 1000;
@@ -232,7 +233,7 @@ nouveau_perf_init(struct drm_device *dev)
                        perflvl->memscript = ROM16(entry[2]);
                case 0x35:
                        perflvl->fanspeed = entry[6];
-                       perflvl->voltage = entry[7];
+                       perflvl->voltage = entry[7] * 10000;
                        perflvl->core = ROM16(entry[8]) * 1000;
                        perflvl->shader = ROM16(entry[10]) * 1000;
                        perflvl->memory = ROM16(entry[12]) * 1000;
@@ -242,7 +243,7 @@ nouveau_perf_init(struct drm_device *dev)
                case 0x40:
 #define subent(n) entry[perf[2] + ((n) * perf[3])]
                        perflvl->fanspeed = 0; /*XXX*/
-                       perflvl->voltage = entry[2];
+                       perflvl->voltage = entry[2] * 10000;
                        if (dev_priv->card_type == NV_50) {
                                perflvl->core = ROM16(subent(0)) & 0xfff;
                                perflvl->shader = ROM16(subent(1)) & 0xfff;
index da8d994..f5703ef 100644 (file)
@@ -168,7 +168,7 @@ nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
 
        v[0] = '\0';
        if (perflvl->voltage)
-               snprintf(v, sizeof(v), " voltage %dmV", perflvl->voltage * 10);
+               snprintf(v, sizeof(v), " voltage %dmV", perflvl->voltage / 1000);
 
        f[0] = '\0';
        if (perflvl->fanspeed)
index 75e8727..9eec275 100644 (file)
@@ -203,7 +203,7 @@ nouveau_volt_init(struct drm_device *dev)
 
        entry = volt + headerlen;
        for (i = 0; i < entries; i++, entry += recordlen) {
-               voltage->level[i].voltage = entry[0];
+               voltage->level[i].voltage = entry[0] * 10000;
                voltage->level[i].vid     = entry[1] >> vidshift;
        }
        voltage->nr_level  = entries;