drm/nouveau/pm: some fermi chipsets still use volt 0x30
authorBen Skeggs <bskeggs@redhat.com>
Fri, 10 Jun 2011 05:33:11 +0000 (15:33 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 20 Sep 2011 06:01:37 +0000 (16:01 +1000)
Fun, fun.

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_volt.c

index 84a19a5fc553d0f4d696dc0b33101bd6bae720b1..491158d730467828d1c97b7a74a428004839e2d4 100644 (file)
@@ -420,6 +420,7 @@ struct nouveau_pm_voltage_level {
 
 struct nouveau_pm_voltage {
        bool supported;
+       u8 version;
        u8 vid_mask;
 
        struct nouveau_pm_voltage_level *level;
index 18d1d995b53a35da6c56a62c411b1c1f761ae61a..b0e995fdcbadc7a059dfaa9a0009b54abb38066d 100644 (file)
@@ -146,16 +146,16 @@ nouveau_perf_voltage(struct drm_device *dev, struct bit_entry *P,
        id = perflvl->volt_min;
        perflvl->volt_min = 0;
 
-       /* pre-fermi vbios stores the voltage level directly in the
-        * perflvl entry as a multiple of 10mV
+       /* boards using voltage table version <0x40 store the voltage
+        * level directly in the perflvl entry as a multiple of 10mV
         */
-       if (dev_priv->card_type < NV_C0) {
+       if (dev_priv->engine.pm.voltage.version < 0x40) {
                perflvl->volt_min = id * 10000;
                perflvl->volt_max = perflvl->volt_min;
                return;
        }
 
-       /* from fermi onwards, the perflvl stores an index into yet another
+       /* on newer ones, the perflvl stores an index into yet another
         * vbios table containing a min/max voltage value for the perflvl
         */
        if (P->version != 2 || P->length < 34) {
index 5389aba46d692219ea166dcde672d1342343782d..86d03e15735d8143b94ac61d665ecee7f422fcc4 100644 (file)
@@ -204,7 +204,8 @@ nouveau_volt_init(struct drm_device *dev)
        }
 
        /* parse vbios entries into common format */
-       if (volt[0] < 0x40) {
+       voltage->version = volt[0];
+       if (voltage->version < 0x40) {
                voltage->nr_level = entries;
                voltage->level =
                        kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL);