These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / nouveau / nvkm / subdev / bios / volt.c
index 8454ab7..6e0a336 100644 (file)
@@ -33,30 +33,30 @@ nvbios_volt_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
 
        if (!bit_entry(bios, 'P', &bit_P)) {
                if (bit_P.version == 2)
-                       volt = nv_ro16(bios, bit_P.offset + 0x0c);
+                       volt = nvbios_rd16(bios, bit_P.offset + 0x0c);
                else
                if (bit_P.version == 1)
-                       volt = nv_ro16(bios, bit_P.offset + 0x10);
+                       volt = nvbios_rd16(bios, bit_P.offset + 0x10);
 
                if (volt) {
-                       *ver = nv_ro08(bios, volt + 0);
+                       *ver = nvbios_rd08(bios, volt + 0);
                        switch (*ver) {
                        case 0x12:
                                *hdr = 5;
-                               *cnt = nv_ro08(bios, volt + 2);
-                               *len = nv_ro08(bios, volt + 1);
+                               *cnt = nvbios_rd08(bios, volt + 2);
+                               *len = nvbios_rd08(bios, volt + 1);
                                return volt;
                        case 0x20:
-                               *hdr = nv_ro08(bios, volt + 1);
-                               *cnt = nv_ro08(bios, volt + 2);
-                               *len = nv_ro08(bios, volt + 3);
+                               *hdr = nvbios_rd08(bios, volt + 1);
+                               *cnt = nvbios_rd08(bios, volt + 2);
+                               *len = nvbios_rd08(bios, volt + 3);
                                return volt;
                        case 0x30:
                        case 0x40:
                        case 0x50:
-                               *hdr = nv_ro08(bios, volt + 1);
-                               *cnt = nv_ro08(bios, volt + 3);
-                               *len = nv_ro08(bios, volt + 2);
+                               *hdr = nvbios_rd08(bios, volt + 1);
+                               *cnt = nvbios_rd08(bios, volt + 3);
+                               *len = nvbios_rd08(bios, volt + 2);
                                return volt;
                        }
                }
@@ -73,28 +73,41 @@ nvbios_volt_parse(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len,
        memset(info, 0x00, sizeof(*info));
        switch (!!volt * *ver) {
        case 0x12:
-               info->vidmask = nv_ro08(bios, volt + 0x04);
+               info->type    = NVBIOS_VOLT_GPIO;
+               info->vidmask = nvbios_rd08(bios, volt + 0x04);
                break;
        case 0x20:
-               info->vidmask = nv_ro08(bios, volt + 0x05);
+               info->type    = NVBIOS_VOLT_GPIO;
+               info->vidmask = nvbios_rd08(bios, volt + 0x05);
                break;
        case 0x30:
-               info->vidmask = nv_ro08(bios, volt + 0x04);
+               info->type    = NVBIOS_VOLT_GPIO;
+               info->vidmask = nvbios_rd08(bios, volt + 0x04);
                break;
        case 0x40:
-               info->base    = nv_ro32(bios, volt + 0x04);
-               info->step    = nv_ro16(bios, volt + 0x08);
-               info->vidmask = nv_ro08(bios, volt + 0x0b);
+               info->type    = NVBIOS_VOLT_GPIO;
+               info->base    = nvbios_rd32(bios, volt + 0x04);
+               info->step    = nvbios_rd16(bios, volt + 0x08);
+               info->vidmask = nvbios_rd08(bios, volt + 0x0b);
                /*XXX*/
                info->min     = 0;
                info->max     = info->base;
                break;
        case 0x50:
-               info->vidmask = nv_ro08(bios, volt + 0x06);
-               info->min     = nv_ro32(bios, volt + 0x0a);
-               info->max     = nv_ro32(bios, volt + 0x0e);
-               info->base    = nv_ro32(bios, volt + 0x12) & 0x00ffffff;
-               info->step    = nv_ro16(bios, volt + 0x16);
+               info->min     = nvbios_rd32(bios, volt + 0x0a);
+               info->max     = nvbios_rd32(bios, volt + 0x0e);
+               info->base    = nvbios_rd32(bios, volt + 0x12) & 0x00ffffff;
+
+               /* offset 4 seems to be a flag byte */
+               if (nvbios_rd32(bios, volt + 0x4) & 1) {
+                       info->type      = NVBIOS_VOLT_PWM;
+                       info->pwm_freq  = nvbios_rd32(bios, volt + 0x5) / 1000;
+                       info->pwm_range = nvbios_rd32(bios, volt + 0x16);
+               } else {
+                       info->type      = NVBIOS_VOLT_GPIO;
+                       info->vidmask   = nvbios_rd08(bios, volt + 0x06);
+                       info->step      = nvbios_rd16(bios, volt + 0x16);
+               }
                break;
        }
        return volt;
@@ -121,12 +134,12 @@ nvbios_volt_entry_parse(struct nvkm_bios *bios, int idx, u8 *ver, u8 *len,
        switch (!!volt * *ver) {
        case 0x12:
        case 0x20:
-               info->voltage = nv_ro08(bios, volt + 0x00) * 10000;
-               info->vid     = nv_ro08(bios, volt + 0x01);
+               info->voltage = nvbios_rd08(bios, volt + 0x00) * 10000;
+               info->vid     = nvbios_rd08(bios, volt + 0x01);
                break;
        case 0x30:
-               info->voltage = nv_ro08(bios, volt + 0x00) * 10000;
-               info->vid     = nv_ro08(bios, volt + 0x01) >> 2;
+               info->voltage = nvbios_rd08(bios, volt + 0x00) * 10000;
+               info->vid     = nvbios_rd08(bios, volt + 0x01) >> 2;
                break;
        case 0x40:
        case 0x50: