drm/nouveau/bios/perf: parse the pci speed from the bios for tesla and newer cards
authorKarol Herbst <nouveau@karolherbst.de>
Tue, 15 Sep 2015 16:47:12 +0000 (18:47 +0200)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 11 Jan 2016 01:30:22 +0000 (11:30 +1000)
Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
drivers/gpu/drm/nouveau/include/nvkm/subdev/bios/perf.h
drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.c

index 7cc2becabc69811bb5028de58a8b22012b717c0a..d3bd250103d51a9e74f24c427f4d2bb163782463 100644 (file)
@@ -13,6 +13,8 @@ struct nvbios_perfE {
        u32 vdec;
        u32 disp;
        u32 script;
+       u8  pcie_speed;
+       u8  pcie_width;
 };
 
 u16 nvbios_perf_entry(struct nvkm_bios *, int idx,
index aa7e33b42b30c1c52eb845b5a6135e03d85e63fc..636bfb665bb924d293657b9d97e32d60db0afd6b 100644 (file)
@@ -24,6 +24,7 @@
 #include <subdev/bios.h>
 #include <subdev/bios/bit.h>
 #include <subdev/bios/perf.h>
+#include <subdev/pci.h>
 
 u16
 nvbios_perf_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr,
@@ -145,6 +146,21 @@ nvbios_perfEp(struct nvkm_bios *bios, int idx,
                break;
        case 0x40:
                info->voltage  = nvbios_rd08(bios, perf + 0x02);
+               switch (nvbios_rd08(bios, perf + 0xb) & 0x3) {
+               case 0:
+                       info->pcie_speed = NVKM_PCIE_SPEED_5_0;
+                       break;
+               case 3:
+               case 1:
+                       info->pcie_speed = NVKM_PCIE_SPEED_2_5;
+                       break;
+               case 2:
+                       info->pcie_speed = NVKM_PCIE_SPEED_8_0;
+                       break;
+               default:
+                       break;
+               }
+               info->pcie_width = 0xff;
                break;
        default:
                return 0x0000;