this will be later used for dynamic reclocking on gt215 and newer

Signed-off-by: Karol Herbst <nouv...@karolherbst.de>
---
 drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h | 401 +++++++++------
 drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h | 735 +++++++++++++++------------
 drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h | 735 +++++++++++++++------------
 drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h | 713 ++++++++++++++------------
 drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h | 730 +++++++++++++++-----------
 drm/nouveau/nvkm/subdev/pmu/fuc/os.h         |   4 +
 drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc     | 137 +++++
 7 files changed, 2012 insertions(+), 1443 deletions(-)

diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h
index 7702944..0ad7782 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h
@@ -68,7 +68,7 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x46524550,
-       0x00000757,
+       0x00000863,
        0x00000755,
        0x00000000,
        0x00000000,
@@ -90,8 +90,8 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x5f433249,
-       0x00000b87,
-       0x00000a2a,
+       0x00000d3f,
+       0x00000be2,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -112,8 +112,8 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x54534554,
-       0x00000bb0,
-       0x00000b89,
+       0x00000d68,
+       0x00000d41,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -134,8 +134,8 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x454c4449,
-       0x00000bbc,
-       0x00000bba,
+       0x00000d74,
+       0x00000d72,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -834,7 +834,15 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
 /* 0x0ccc: memx_train_tail */
-/* 0x0ccc: i2c_scl_map */
+/* 0x0ccc: perf_attr_start */
+/* 0x0ccc: perf_polling_period_us */
+       0x000186a0,
+/* 0x0cd0: perf_eng_gr */
+/* 0x0cd1: perf_eng_vdec */
+/* 0x0cd2: perf_eng_mc */
+/* 0x0cd3: perf_eng_pcie */
+       0x00000000,
+/* 0x0cd4: i2c_scl_map */
        0x00001000,
        0x00004000,
        0x00010000,
@@ -845,7 +853,7 @@ uint32_t gf100_pmu_data[] = {
        0x01000000,
        0x04000000,
        0x10000000,
-/* 0x0cf4: i2c_sda_map */
+/* 0x0cfc: i2c_sda_map */
        0x00002000,
        0x00008000,
        0x00020000,
@@ -856,7 +864,7 @@ uint32_t gf100_pmu_data[] = {
        0x02000000,
        0x08000000,
        0x20000000,
-/* 0x0d1c: i2c_ctrl */
+/* 0x0d24: i2c_ctrl */
        0x0000e138,
        0x0000e150,
        0x0000e168,
@@ -912,8 +920,6 @@ uint32_t gf100_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
 };
 
 uint32_t gf100_pmu_code[] = {
@@ -1451,139 +1457,252 @@ uint32_t gf100_pmu_code[] = {
 /* 0x0753: memx_init */
        0xf800f8d8,
 /* 0x0755: perf_recv */
-/* 0x0757: perf_init */
-       0xf800f800,
-/* 0x0759: i2c_drive_scl */
+       0x48a7f100,
+       0x53a3f14f,
+       0x06eab854,
+       0xb0411bf4,
+       0x1bf401d6,
+       0xbdb4bd50,
+       0xd307f1c4,
+       0x000c180c,
+       0xc4b604bd,
+       0xd207f108,
+       0x000c180c,
+       0xc4b604bd,
+       0xd107f108,
+       0x000c180c,
+       0xc4b604bd,
+       0xd007f108,
+       0x000c180c,
+       0x21f504bd,
+       0x0ef40337,
+/* 0x07a1: perf_recv_not_host */
+       0xb821f518,
+       0xcc07f107,
+       0x000e980c,
+       0x21f504bd,
+       0x21f5022b,
+/* 0x07b6: perf_recv_exit */
+       0x00f80257,
+/* 0x07b8: perf_counter_readout */
+       0x0508e7f1,
+       0xcf06e4b6,
+       0xeecc00ee,
+       0x18d7f1ff,
+       0x06d4b605,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd0,
+       0xf104bd00,
+       0xb60528d7,
+       0xddcf06d4,
+       0xdcdeff00,
+       0x0cd107f1,
+       0xbd000d00,
+       0x38d7f104,
+       0x06d4b605,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd2,
+       0xf104bd00,
+       0xb60548d7,
+       0xddcf06d4,
+       0xdcdeff00,
+       0x0cd307f1,
+       0xbd000d00,
+       0x00e7f104,
+       0x00e3f100,
+       0x0807f180,
+       0x0604b605,
+       0xbd000ed0,
+       0x1807f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x2807f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x3807f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x4807f104,
+       0x0604b605,
+       0xbd000ed0,
+/* 0x0863: perf_init */
+       0xf100f804,
+       0xf00003e7,
+       0x07f100e3,
+       0x04b6050c,
+       0x000ed006,
+       0xe7f104bd,
+       0xe3f00002,
+       0x1c07f100,
+       0x0604b605,
+       0xbd000ed0,
+       0x2c07f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x3c07f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x4c07f104,
+       0x0604b605,
+       0xbd000ed0,
+       0x0fe7f104,
+       0x18e3f000,
+       0x051407f1,
+       0xd00604b6,
+       0x04bd000e,
+       0x0070e7f1,
+       0xf100e3f0,
+       0xb6052407,
+       0x0ed00604,
+       0xf104bd00,
+       0xf00080e7,
+       0x07f100e3,
+       0x04b60534,
+       0x000ed006,
+       0xe7f104bd,
+       0xe3f10000,
+       0x07f12000,
+       0x04b60544,
+       0x000ed006,
+       0x21f504bd,
+       0x07f107b8,
+       0x0e980ccc,
+       0xf504bd00,
+       0xf5022b21,
+       0xf8025721,
+/* 0x0911: i2c_drive_scl */
        0x0036b000,
        0xf1110bf4,
        0xb607e007,
        0x01d00604,
        0xf804bd00,
-/* 0x076d: i2c_drive_scl_lo */
+/* 0x0925: i2c_drive_scl_lo */
        0xe407f100,
        0x0604b607,
        0xbd0001d0,
-/* 0x077b: i2c_drive_sda */
+/* 0x0933: i2c_drive_sda */
        0xb000f804,
        0x0bf40036,
        0xe007f111,
        0x0604b607,
        0xbd0002d0,
-/* 0x078f: i2c_drive_sda_lo */
+/* 0x0947: i2c_drive_sda_lo */
        0xf100f804,
        0xb607e407,
        0x02d00604,
        0xf804bd00,
-/* 0x079d: i2c_sense_scl */
+/* 0x0955: i2c_sense_scl */
        0x0132f400,
        0x07c437f1,
        0xcf0634b6,
        0x31fd0033,
        0x060bf404,
-/* 0x07b3: i2c_sense_scl_done */
+/* 0x096b: i2c_sense_scl_done */
        0xf80131f4,
-/* 0x07b5: i2c_sense_sda */
+/* 0x096d: i2c_sense_sda */
        0x0132f400,
        0x07c437f1,
        0xcf0634b6,
        0x32fd0033,
        0x060bf404,
-/* 0x07cb: i2c_sense_sda_done */
+/* 0x0983: i2c_sense_sda_done */
        0xf80131f4,
-/* 0x07cd: i2c_raise_scl */
+/* 0x0985: i2c_raise_scl */
        0xf140f900,
        0xf0089847,
        0x21f50137,
-/* 0x07da: i2c_raise_scl_wait */
-       0xe7f10759,
+/* 0x0992: i2c_raise_scl_wait */
+       0xe7f10911,
        0x21f403e8,
-       0x9d21f57f,
-       0x0901f407,
+       0x5521f57f,
+       0x0901f409,
        0xf40142b6,
-/* 0x07ee: i2c_raise_scl_done */
+/* 0x09a6: i2c_raise_scl_done */
        0x40fcef1b,
-/* 0x07f2: i2c_start */
+/* 0x09aa: i2c_start */
        0x21f500f8,
-       0x11f4079d,
-       0xb521f50d,
-       0x0611f407,
-/* 0x0803: i2c_start_rep */
+       0x11f40955,
+       0x6d21f50d,
+       0x0611f409,
+/* 0x09bb: i2c_start_rep */
        0xf0300ef4,
        0x21f50037,
-       0x37f00759,
-       0x7b21f501,
-       0x0076bb07,
+       0x37f00911,
+       0x3321f501,
+       0x0076bb09,
        0xf90465b6,
        0x04659450,
        0xbd0256bb,
        0x0475fd50,
        0x21f550fc,
-       0x64b607cd,
+       0x64b60985,
        0x1f11f404,
-/* 0x0830: i2c_start_send */
+/* 0x09e8: i2c_start_send */
        0xf50037f0,
-       0xf1077b21,
+       0xf1093321,
        0xf41388e7,
        0x37f07f21,
-       0x5921f500,
-       0x88e7f107,
+       0x1121f500,
+       0x88e7f109,
        0x7f21f413,
-/* 0x084c: i2c_start_out */
-/* 0x084e: i2c_stop */
+/* 0x0a04: i2c_start_out */
+/* 0x0a06: i2c_stop */
        0x37f000f8,
-       0x5921f500,
-       0x0037f007,
-       0x077b21f5,
+       0x1121f500,
+       0x0037f009,
+       0x093321f5,
        0x03e8e7f1,
        0xf07f21f4,
        0x21f50137,
-       0xe7f10759,
+       0xe7f10911,
        0x21f41388,
        0x0137f07f,
-       0x077b21f5,
+       0x093321f5,
        0x1388e7f1,
        0xf87f21f4,
-/* 0x0881: i2c_bitw */
-       0x7b21f500,
-       0xe8e7f107,
+/* 0x0a39: i2c_bitw */
+       0x3321f500,
+       0xe8e7f109,
        0x7f21f403,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xcd21f550,
-       0x0464b607,
+       0x8521f550,
+       0x0464b609,
        0xf11811f4,
        0xf41388e7,
        0x37f07f21,
-       0x5921f500,
-       0x88e7f107,
+       0x1121f500,
+       0x88e7f109,
        0x7f21f413,
-/* 0x08c0: i2c_bitw_out */
-/* 0x08c2: i2c_bitr */
+/* 0x0a78: i2c_bitw_out */
+/* 0x0a7a: i2c_bitr */
        0x37f000f8,
-       0x7b21f501,
-       0xe8e7f107,
+       0x3321f501,
+       0xe8e7f109,
        0x7f21f403,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xcd21f550,
-       0x0464b607,
+       0x8521f550,
+       0x0464b609,
        0xf51b11f4,
-       0xf007b521,
+       0xf0096d21,
        0x21f50037,
-       0xe7f10759,
+       0xe7f10911,
        0x21f41388,
        0x013cf07f,
-/* 0x0907: i2c_bitr_done */
+/* 0x0abf: i2c_bitr_done */
        0xf80131f4,
-/* 0x0909: i2c_get_byte */
+/* 0x0ac1: i2c_get_byte */
        0x0057f000,
-/* 0x090f: i2c_get_byte_next */
+/* 0x0ac7: i2c_get_byte_next */
        0xb60847f0,
        0x76bb0154,
        0x0465b600,
@@ -1591,7 +1710,7 @@ uint32_t gf100_pmu_code[] = {
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb608c221,
+       0xb60a7a21,
        0x11f40464,
        0x0553fd2b,
        0xf40142b6,
@@ -1602,11 +1721,11 @@ uint32_t gf100_pmu_code[] = {
        0xbd0256bb,
        0x0475fd50,
        0x21f550fc,
-       0x64b60881,
-/* 0x0959: i2c_get_byte_done */
-/* 0x095b: i2c_put_byte */
+       0x64b60a39,
+/* 0x0b11: i2c_get_byte_done */
+/* 0x0b13: i2c_put_byte */
        0xf000f804,
-/* 0x095e: i2c_put_byte_next */
+/* 0x0b16: i2c_put_byte_next */
        0x42b60847,
        0x3854ff01,
        0xb60076bb,
@@ -1614,8 +1733,8 @@ uint32_t gf100_pmu_code[] = {
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x8121f550,
-       0x0464b608,
+       0x3921f550,
+       0x0464b60a,
        0xb03411f4,
        0x1bf40046,
        0x0076bbd8,
@@ -1624,20 +1743,20 @@ uint32_t gf100_pmu_code[] = {
        0xbd0256bb,
        0x0475fd50,
        0x21f550fc,
-       0x64b608c2,
+       0x64b60a7a,
        0x0f11f404,
        0xb00076bb,
        0x1bf40136,
        0x0132f406,
-/* 0x09b4: i2c_put_byte_done */
-/* 0x09b6: i2c_addr */
+/* 0x0b6c: i2c_put_byte_done */
+/* 0x0b6e: i2c_addr */
        0x76bb00f8,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb607f221,
+       0xb609aa21,
        0x11f40464,
        0x2ec3e729,
        0x0134b601,
@@ -1647,31 +1766,31 @@ uint32_t gf100_pmu_code[] = {
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x095b21f5,
-/* 0x09fb: i2c_addr_done */
+       0x0b1321f5,
+/* 0x0bb3: i2c_addr_done */
        0xf80464b6,
-/* 0x09fd: i2c_acquire_addr */
+/* 0x0bb5: i2c_acquire_addr */
        0xf8cec700,
        0xb702e4b6,
-       0x980d1ce0,
+       0x980d24e0,
        0x00f800ee,
-/* 0x0a0c: i2c_acquire */
-       0x09fd21f5,
+/* 0x0bc4: i2c_acquire */
+       0x0bb521f5,
        0xf00421f4,
        0x21f403d9,
-/* 0x0a1b: i2c_release */
+/* 0x0bd3: i2c_release */
        0xf500f83f,
-       0xf409fd21,
+       0xf40bb521,
        0xdaf00421,
        0x3f21f403,
-/* 0x0a2a: i2c_recv */
+/* 0x0be2: i2c_recv */
        0x32f400f8,
        0xf8c1c701,
        0xb00214b6,
        0x1ff52816,
        0x13a0013a,
-       0x32980cf4,
-       0xcc13a000,
+       0x32980cfc,
+       0xd413a000,
        0x0031980c,
        0xf90231f4,
        0xf9e0f9d0,
@@ -1683,8 +1802,8 @@ uint32_t gf100_pmu_code[] = {
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x0c21f550,
-       0x0464b60a,
+       0xc421f550,
+       0x0464b60b,
        0xd6b0d0fc,
        0xb31bf500,
        0x0057f000,
@@ -1693,8 +1812,8 @@ uint32_t gf100_pmu_code[] = {
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xb621f550,
-       0x0464b609,
+       0x6e21f550,
+       0x0464b60b,
        0x00d011f5,
        0xbbe0c5c7,
        0x65b60076,
@@ -1702,7 +1821,7 @@ uint32_t gf100_pmu_code[] = {
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x095b21f5,
+       0x0b1321f5,
        0xf50464b6,
        0xf000ad11,
        0x76bb0157,
@@ -1711,7 +1830,7 @@ uint32_t gf100_pmu_code[] = {
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb609b621,
+       0xb60b6e21,
        0x11f50464,
        0x76bb008a,
        0x0465b600,
@@ -1719,7 +1838,7 @@ uint32_t gf100_pmu_code[] = {
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb6090921,
+       0xb60ac121,
        0x11f40464,
        0xe05bcb6a,
        0xb60076bb,
@@ -1727,38 +1846,38 @@ uint32_t gf100_pmu_code[] = {
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x4e21f550,
-       0x0464b608,
+       0x0621f550,
+       0x0464b60a,
        0xbd025bb9,
        0x430ef474,
-/* 0x0b30: i2c_recv_not_rd08 */
+/* 0x0ce8: i2c_recv_not_rd08 */
        0xf401d6b0,
        0x57f03d1b,
-       0xb621f500,
-       0x3311f409,
+       0x6e21f500,
+       0x3311f40b,
        0xf5e0c5c7,
-       0xf4095b21,
+       0xf40b1321,
        0x57f02911,
-       0xb621f500,
-       0x1f11f409,
+       0x6e21f500,
+       0x1f11f40b,
        0xf5e0b5c7,
-       0xf4095b21,
+       0xf40b1321,
        0x21f51511,
-       0x74bd084e,
+       0x74bd0a06,
        0xf408c5c7,
        0x32f4091b,
        0x030ef402,
-/* 0x0b70: i2c_recv_not_wr08 */
-/* 0x0b70: i2c_recv_done */
+/* 0x0d28: i2c_recv_not_wr08 */
+/* 0x0d28: i2c_recv_done */
        0xf5f8cec7,
-       0xfc0a1b21,
+       0xfc0bd321,
        0xf4d0fce0,
        0x7cb90a12,
        0x3721f502,
-/* 0x0b85: i2c_recv_exit */
-/* 0x0b87: i2c_init */
+/* 0x0d3d: i2c_recv_exit */
+/* 0x0d3f: i2c_init */
        0xf800f803,
-/* 0x0b89: test_recv */
+/* 0x0d41: test_recv */
        0xd817f100,
        0x0614b605,
        0xb60011cf,
@@ -1769,12 +1888,12 @@ uint32_t gf100_pmu_code[] = {
        0xe3f1d900,
        0x21f5134f,
        0x00f80257,
-/* 0x0bb0: test_init */
+/* 0x0d68: test_init */
        0x0800e7f1,
        0x025721f5,
-/* 0x0bba: idle_recv */
+/* 0x0d72: idle_recv */
        0x00f800f8,
-/* 0x0bbc: idle */
+/* 0x0d74: idle */
        0xf10031f4,
        0xb605d417,
        0x11cf0614,
@@ -1782,16 +1901,16 @@ uint32_t gf100_pmu_code[] = {
        0x05d407f1,
        0xd00604b6,
        0x04bd0001,
-/* 0x0bd8: idle_loop */
+/* 0x0d90: idle_loop */
        0xf45817f0,
-/* 0x0bde: idle_proc */
-/* 0x0bde: idle_proc_exec */
+/* 0x0d96: idle_proc */
+/* 0x0d96: idle_proc_exec */
        0x10f90232,
        0xf5021eb9,
        0xfc034021,
        0x0911f410,
        0xf40231f4,
-/* 0x0bf2: idle_proc_next */
+/* 0x0daa: idle_proc_next */
        0x10b6ef0e,
        0x061fb858,
        0xf4e61bf4,
@@ -1814,50 +1933,4 @@ uint32_t gf100_pmu_code[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
 };
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h
index 7bf6b39..6ddcd80 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h
@@ -68,7 +68,7 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x46524550,
-       0x00000684,
+       0x00000772,
        0x00000682,
        0x00000000,
        0x00000000,
@@ -90,8 +90,8 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x5f433249,
-       0x00000a9f,
-       0x00000942,
+       0x00000c1e,
+       0x00000ac1,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -112,8 +112,8 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x54534554,
-       0x00000ac2,
-       0x00000aa1,
+       0x00000c41,
+       0x00000c20,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -134,8 +134,8 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x454c4449,
-       0x00000ace,
-       0x00000acc,
+       0x00000c4d,
+       0x00000c4b,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -834,7 +834,15 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
 /* 0x0ccc: memx_train_tail */
-/* 0x0ccc: i2c_scl_map */
+/* 0x0ccc: perf_attr_start */
+/* 0x0ccc: perf_polling_period_us */
+       0x000186a0,
+/* 0x0cd0: perf_eng_gr */
+/* 0x0cd1: perf_eng_vdec */
+/* 0x0cd2: perf_eng_mc */
+/* 0x0cd3: perf_eng_pcie */
+       0x00000000,
+/* 0x0cd4: i2c_scl_map */
        0x00000400,
        0x00000800,
        0x00001000,
@@ -845,7 +853,7 @@ uint32_t gf119_pmu_data[] = {
        0x00020000,
        0x00040000,
        0x00080000,
-/* 0x0cf4: i2c_sda_map */
+/* 0x0cfc: i2c_sda_map */
        0x00100000,
        0x00200000,
        0x00400000,
@@ -911,8 +919,6 @@ uint32_t gf119_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
 };
 
 uint32_t gf119_pmu_code[] = {
@@ -1392,376 +1398,443 @@ uint32_t gf119_pmu_code[] = {
        0x00f8d80b,
 /* 0x0680: memx_init */
 /* 0x0682: perf_recv */
-       0x00f800f8,
-/* 0x0684: perf_init */
-/* 0x0686: i2c_drive_scl */
-       0x36b000f8,
-       0x0e0bf400,
-       0x07e007f1,
-       0xbd0001d0,
-/* 0x0697: i2c_drive_scl_lo */
-       0xf100f804,
-       0xd007e407,
+       0xa7f100f8,
+       0xa3f14f48,
+       0xeab85453,
+       0x411bf406,
+       0xf401d6b0,
+       0xb4bd501b,
+       0x07f1c4bd,
+       0x0c180cd3,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd2,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd1,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd0,
+       0xf504bd00,
+       0xf402e621,
+/* 0x06ce: perf_recv_not_host */
+       0x21f5180e,
+       0x07f106e5,
+       0x0e980ccc,
+       0xf504bd00,
+       0xf501ec21,
+/* 0x06e3: perf_recv_exit */
+       0xf8021821,
+/* 0x06e5: perf_counter_readout */
+       0x08e7f100,
+       0x00eecf05,
+       0xf1ffeecc,
+       0xcf0518d7,
+       0xdeff00dd,
+       0xd007f1dc,
+       0x000d000c,
+       0xd7f104bd,
+       0xddcf0528,
+       0xdcdeff00,
+       0x0cd107f1,
+       0xbd000d00,
+       0x38d7f104,
+       0x00ddcf05,
+       0xf1dcdeff,
+       0x000cd207,
+       0x04bd000d,
+       0x0548d7f1,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd3,
+       0xf104bd00,
+       0xf10000e7,
+       0xf18000e3,
+       0xd0050807,
+       0x04bd000e,
+       0x051807f1,
+       0xbd000ed0,
+       0x2807f104,
+       0x000ed005,
+       0x07f104bd,
+       0x0ed00538,
+       0xf104bd00,
+       0xd0054807,
+       0x04bd000e,
+/* 0x0772: perf_init */
+       0xe7f100f8,
+       0xe3f00003,
+       0x0c07f100,
+       0x000ed005,
+       0xe7f104bd,
+       0xe3f00002,
+       0x1c07f100,
+       0x000ed005,
+       0x07f104bd,
+       0x0ed0052c,
+       0xf104bd00,
+       0xd0053c07,
+       0x04bd000e,
+       0x054c07f1,
+       0xbd000ed0,
+       0x0fe7f104,
+       0x18e3f000,
+       0x051407f1,
+       0xbd000ed0,
+       0x70e7f104,
+       0x00e3f000,
+       0x052407f1,
+       0xbd000ed0,
+       0x80e7f104,
+       0x00e3f000,
+       0x053407f1,
+       0xbd000ed0,
+       0x00e7f104,
+       0x00e3f100,
+       0x4407f120,
+       0x000ed005,
+       0x21f504bd,
+       0x07f106e5,
+       0x0e980ccc,
+       0xf504bd00,
+       0xf501ec21,
+       0xf8021821,
+/* 0x0805: i2c_drive_scl */
+       0x0036b000,
+       0xf10e0bf4,
+       0xd007e007,
        0x04bd0001,
-/* 0x06a2: i2c_drive_sda */
-       0x36b000f8,
-       0x0e0bf400,
-       0x07e007f1,
-       0xbd0002d0,
-/* 0x06b3: i2c_drive_sda_lo */
-       0xf100f804,
-       0xd007e407,
+/* 0x0816: i2c_drive_scl_lo */
+       0x07f100f8,
+       0x01d007e4,
+       0xf804bd00,
+/* 0x0821: i2c_drive_sda */
+       0x0036b000,
+       0xf10e0bf4,
+       0xd007e007,
        0x04bd0002,
-/* 0x06be: i2c_sense_scl */
+/* 0x0832: i2c_drive_sda_lo */
+       0x07f100f8,
+       0x02d007e4,
+       0xf804bd00,
+/* 0x083d: i2c_sense_scl */
+       0x0132f400,
+       0x07c437f1,
+       0xfd0033cf,
+       0x0bf40431,
+       0x0131f406,
+/* 0x0850: i2c_sense_scl_done */
+/* 0x0852: i2c_sense_sda */
        0x32f400f8,
        0xc437f101,
        0x0033cf07,
-       0xf40431fd,
+       0xf40432fd,
        0x31f4060b,
-/* 0x06d1: i2c_sense_scl_done */
-/* 0x06d3: i2c_sense_sda */
-       0xf400f801,
-       0x37f10132,
-       0x33cf07c4,
-       0x0432fd00,
-       0xf4060bf4,
-/* 0x06e6: i2c_sense_sda_done */
-       0x00f80131,
-/* 0x06e8: i2c_raise_scl */
-       0x47f140f9,
-       0x37f00898,
-       0x8621f501,
-/* 0x06f5: i2c_raise_scl_wait */
-       0xe8e7f106,
-       0x6721f403,
-       0x06be21f5,
-       0xb60901f4,
-       0x1bf40142,
-/* 0x0709: i2c_raise_scl_done */
-       0xf840fcef,
-/* 0x070d: i2c_start */
-       0xbe21f500,
-       0x0d11f406,
-       0x06d321f5,
-       0xf40611f4,
-/* 0x071e: i2c_start_rep */
-       0x37f0300e,
-       0x8621f500,
-       0x0137f006,
-       0x06a221f5,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xe821f550,
-       0x0464b606,
-/* 0x074b: i2c_start_send */
-       0xf01f11f4,
-       0x21f50037,
-       0xe7f106a2,
-       0x21f41388,
-       0x0037f067,
-       0x068621f5,
-       0x1388e7f1,
-/* 0x0767: i2c_start_out */
-       0xf86721f4,
-/* 0x0769: i2c_stop */
-       0x0037f000,
-       0x068621f5,
-       0xf50037f0,
-       0xf106a221,
-       0xf403e8e7,
-       0x37f06721,
-       0x8621f501,
-       0x88e7f106,
-       0x6721f413,
-       0xf50137f0,
-       0xf106a221,
-       0xf41388e7,
-       0x00f86721,
-/* 0x079c: i2c_bitw */
-       0x06a221f5,
+/* 0x0865: i2c_sense_sda_done */
+/* 0x0867: i2c_raise_scl */
+       0xf900f801,
+       0x9847f140,
+       0x0137f008,
+       0x080521f5,
+/* 0x0874: i2c_raise_scl_wait */
        0x03e8e7f1,
-       0xbb6721f4,
+       0xf56721f4,
+       0xf4083d21,
+       0x42b60901,
+       0xef1bf401,
+/* 0x0888: i2c_raise_scl_done */
+       0x00f840fc,
+/* 0x088c: i2c_start */
+       0x083d21f5,
+       0xf50d11f4,
+       0xf4085221,
+       0x0ef40611,
+/* 0x089d: i2c_start_rep */
+       0x0037f030,
+       0x080521f5,
+       0xf50137f0,
+       0xbb082121,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x06e821f5,
+       0x086721f5,
        0xf40464b6,
-       0xe7f11811,
-       0x21f41388,
-       0x0037f067,
-       0x068621f5,
+/* 0x08ca: i2c_start_send */
+       0x37f01f11,
+       0x2121f500,
+       0x88e7f108,
+       0x6721f413,
+       0xf50037f0,
+       0xf1080521,
+       0xf41388e7,
+/* 0x08e6: i2c_start_out */
+       0x00f86721,
+/* 0x08e8: i2c_stop */
+       0xf50037f0,
+       0xf0080521,
+       0x21f50037,
+       0xe7f10821,
+       0x21f403e8,
+       0x0137f067,
+       0x080521f5,
        0x1388e7f1,
-/* 0x07db: i2c_bitw_out */
-       0xf86721f4,
-/* 0x07dd: i2c_bitr */
-       0x0137f000,
-       0x06a221f5,
-       0x03e8e7f1,
-       0xbb6721f4,
-       0x65b60076,
-       0x9450f904,
-       0x56bb0465,
-       0xfd50bd02,
-       0x50fc0475,
-       0x06e821f5,
-       0xf40464b6,
-       0x21f51b11,
-       0x37f006d3,
-       0x8621f500,
-       0x88e7f106,
+       0xf06721f4,
+       0x21f50137,
+       0xe7f10821,
+       0x21f41388,
+/* 0x091b: i2c_bitw */
+       0xf500f867,
+       0xf1082121,
+       0xf403e8e7,
+       0x76bb6721,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6086721,
+       0x11f40464,
+       0x88e7f118,
        0x6721f413,
-       0xf4013cf0,
-/* 0x0822: i2c_bitr_done */
-       0x00f80131,
-/* 0x0824: i2c_get_byte */
-       0xf00057f0,
-/* 0x082a: i2c_get_byte_next */
-       0x54b60847,
-       0x0076bb01,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x21f550fc,
-       0x64b607dd,
-       0x2b11f404,
-       0xb60553fd,
-       0x1bf40142,
-       0x0137f0d8,
+       0xf50037f0,
+       0xf1080521,
+       0xf41388e7,
+/* 0x095a: i2c_bitw_out */
+       0x00f86721,
+/* 0x095c: i2c_bitr */
+       0xf50137f0,
+       0xf1082121,
+       0xf403e8e7,
+       0x76bb6721,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6086721,
+       0x11f40464,
+       0x5221f51b,
+       0x0037f008,
+       0x080521f5,
+       0x1388e7f1,
+       0xf06721f4,
+       0x31f4013c,
+/* 0x09a1: i2c_bitr_done */
+/* 0x09a3: i2c_get_byte */
+       0xf000f801,
+       0x47f00057,
+/* 0x09a9: i2c_get_byte_next */
+       0x0154b608,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x9c21f550,
-       0x0464b607,
-/* 0x0874: i2c_get_byte_done */
-/* 0x0876: i2c_put_byte */
-       0x47f000f8,
-/* 0x0879: i2c_put_byte_next */
-       0x0142b608,
-       0xbb3854ff,
+       0x5c21f550,
+       0x0464b609,
+       0xfd2b11f4,
+       0x42b60553,
+       0xd81bf401,
+       0xbb0137f0,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x091b21f5,
+/* 0x09f3: i2c_get_byte_done */
+       0xf80464b6,
+/* 0x09f5: i2c_put_byte */
+       0x0847f000,
+/* 0x09f8: i2c_put_byte_next */
+       0xff0142b6,
+       0x76bb3854,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6091b21,
+       0x11f40464,
+       0x0046b034,
+       0xbbd81bf4,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x079c21f5,
+       0x095c21f5,
        0xf40464b6,
-       0x46b03411,
-       0xd81bf400,
+       0x76bb0f11,
+       0x0136b000,
+       0xf4061bf4,
+/* 0x0a4e: i2c_put_byte_done */
+       0x00f80132,
+/* 0x0a50: i2c_addr */
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xdd21f550,
-       0x0464b607,
-       0xbb0f11f4,
-       0x36b00076,
-       0x061bf401,
-/* 0x08cf: i2c_put_byte_done */
-       0xf80132f4,
-/* 0x08d1: i2c_addr */
-       0x0076bb00,
+       0x8c21f550,
+       0x0464b608,
+       0xe72911f4,
+       0xb6012ec3,
+       0x53fd0134,
+       0x0076bb05,
        0xf90465b6,
        0x04659450,
        0xbd0256bb,
        0x0475fd50,
        0x21f550fc,
-       0x64b6070d,
-       0x2911f404,
-       0x012ec3e7,
-       0xfd0134b6,
-       0x76bb0553,
-       0x0465b600,
-       0x659450f9,
-       0x0256bb04,
-       0x75fd50bd,
-       0xf550fc04,
-       0xb6087621,
-/* 0x0916: i2c_addr_done */
-       0x00f80464,
-/* 0x0918: i2c_acquire_addr */
-       0xb6f8cec7,
-       0xe0b705e4,
-       0x00f8d014,
-/* 0x0924: i2c_acquire */
-       0x091821f5,
-       0xf00421f4,
-       0x21f403d9,
-/* 0x0933: i2c_release */
-       0xf500f833,
-       0xf4091821,
-       0xdaf00421,
+       0x64b609f5,
+/* 0x0a95: i2c_addr_done */
+/* 0x0a97: i2c_acquire_addr */
+       0xc700f804,
+       0xe4b6f8ce,
+       0x14e0b705,
+/* 0x0aa3: i2c_acquire */
+       0xf500f8d0,
+       0xf40a9721,
+       0xd9f00421,
        0x3321f403,
-/* 0x0942: i2c_recv */
-       0x32f400f8,
-       0xf8c1c701,
-       0xb00214b6,
-       0x1ff52816,
-       0x13a0013a,
-       0x32980cf4,
-       0xcc13a000,
-       0x0031980c,
-       0xf90231f4,
-       0xf9e0f9d0,
-       0x0067f1d0,
-       0x0063f100,
-       0x01679210,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x2421f550,
-       0x0464b609,
-       0xd6b0d0fc,
-       0xb31bf500,
-       0x0057f000,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xd121f550,
-       0x0464b608,
-       0x00d011f5,
-       0xbbe0c5c7,
+/* 0x0ab2: i2c_release */
+       0x21f500f8,
+       0x21f40a97,
+       0x03daf004,
+       0xf83321f4,
+/* 0x0ac1: i2c_recv */
+       0x0132f400,
+       0xb6f8c1c7,
+       0x16b00214,
+       0x3a1ff528,
+       0xfc13a001,
+       0x0032980c,
+       0x0cd413a0,
+       0xf4003198,
+       0xd0f90231,
+       0xd0f9e0f9,
+       0x000067f1,
+       0x100063f1,
+       0xbb016792,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0aa321f5,
+       0xfc0464b6,
+       0x00d6b0d0,
+       0x00b31bf5,
+       0xbb0057f0,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x087621f5,
+       0x0a5021f5,
        0xf50464b6,
-       0xf000ad11,
-       0x76bb0157,
+       0xc700d011,
+       0x76bbe0c5,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb608d121,
+       0xb609f521,
        0x11f50464,
-       0x76bb008a,
-       0x0465b600,
-       0x659450f9,
-       0x0256bb04,
-       0x75fd50bd,
-       0xf550fc04,
-       0xb6082421,
-       0x11f40464,
-       0xe05bcb6a,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x6921f550,
-       0x0464b607,
-       0xbd025bb9,
-       0x430ef474,
-/* 0x0a48: i2c_recv_not_rd08 */
-       0xf401d6b0,
-       0x57f03d1b,
-       0xd121f500,
-       0x3311f408,
-       0xf5e0c5c7,
-       0xf4087621,
-       0x57f02911,
-       0xd121f500,
-       0x1f11f408,
-       0xf5e0b5c7,
-       0xf4087621,
-       0x21f51511,
-       0x74bd0769,
-       0xf408c5c7,
-       0x32f4091b,
-       0x030ef402,
-/* 0x0a88: i2c_recv_not_wr08 */
-/* 0x0a88: i2c_recv_done */
-       0xf5f8cec7,
-       0xfc093321,
-       0xf4d0fce0,
-       0x7cb90a12,
-       0xe621f502,
-/* 0x0a9d: i2c_recv_exit */
-/* 0x0a9f: i2c_init */
+       0x57f000ad,
+       0x0076bb01,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b60a50,
+       0x8a11f504,
+       0x0076bb00,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b609a3,
+       0x6a11f404,
+       0xbbe05bcb,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x08e821f5,
+       0xb90464b6,
+       0x74bd025b,
+/* 0x0bc7: i2c_recv_not_rd08 */
+       0xb0430ef4,
+       0x1bf401d6,
+       0x0057f03d,
+       0x0a5021f5,
+       0xc73311f4,
+       0x21f5e0c5,
+       0x11f409f5,
+       0x0057f029,
+       0x0a5021f5,
+       0xc71f11f4,
+       0x21f5e0b5,
+       0x11f409f5,
+       0xe821f515,
+       0xc774bd08,
+       0x1bf408c5,
+       0x0232f409,
+/* 0x0c07: i2c_recv_not_wr08 */
+/* 0x0c07: i2c_recv_done */
+       0xc7030ef4,
+       0x21f5f8ce,
+       0xe0fc0ab2,
+       0x12f4d0fc,
+       0x027cb90a,
+       0x02e621f5,
+/* 0x0c1c: i2c_recv_exit */
+/* 0x0c1e: i2c_init */
+       0x00f800f8,
+/* 0x0c20: test_recv */
+       0x05d817f1,
+       0xb60011cf,
+       0x07f10110,
+       0x01d005d8,
+       0xf104bd00,
+       0xf1d900e7,
+       0xf5134fe3,
+       0xf8021821,
+/* 0x0c41: test_init */
+       0x00e7f100,
+       0x1821f508,
+/* 0x0c4b: idle_recv */
        0xf800f802,
-/* 0x0aa1: test_recv */
-       0xd817f100,
-       0x0011cf05,
-       0xf10110b6,
-       0xd005d807,
-       0x04bd0001,
-       0xd900e7f1,
-       0x134fe3f1,
-       0x021821f5,
-/* 0x0ac2: test_init */
-       0xe7f100f8,
-       0x21f50800,
-       0x00f80218,
-/* 0x0acc: idle_recv */
-/* 0x0ace: idle */
-       0x31f400f8,
-       0xd417f100,
-       0x0011cf05,
-       0xf10110b6,
-       0xd005d407,
-       0x04bd0001,
-/* 0x0ae4: idle_loop */
-       0xf45817f0,
-/* 0x0aea: idle_proc */
-/* 0x0aea: idle_proc_exec */
-       0x10f90232,
-       0xf5021eb9,
-       0xfc02ef21,
-       0x0911f410,
-       0xf40231f4,
-/* 0x0afe: idle_proc_next */
-       0x10b6ef0e,
-       0x061fb858,
-       0xf4e61bf4,
-       0x28f4dd02,
-       0xc10ef400,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
+/* 0x0c4d: idle */
+       0x0031f400,
+       0x05d417f1,
+       0xb60011cf,
+       0x07f10110,
+       0x01d005d4,
+/* 0x0c63: idle_loop */
+       0xf004bd00,
+       0x32f45817,
+/* 0x0c69: idle_proc */
+/* 0x0c69: idle_proc_exec */
+       0xb910f902,
+       0x21f5021e,
+       0x10fc02ef,
+       0xf40911f4,
+       0x0ef40231,
+/* 0x0c7d: idle_proc_next */
+       0x5810b6ef,
+       0xf4061fb8,
+       0x02f4e61b,
+       0x0028f4dd,
+       0x00c10ef4,
        0x00000000,
        0x00000000,
        0x00000000,
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h
index 61893b1..825b187 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h
@@ -68,7 +68,7 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x46524550,
-       0x00000684,
+       0x00000772,
        0x00000682,
        0x00000000,
        0x00000000,
@@ -90,8 +90,8 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x5f433249,
-       0x00000a9f,
-       0x00000942,
+       0x00000c1e,
+       0x00000ac1,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -112,8 +112,8 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x54534554,
-       0x00000ac2,
-       0x00000aa1,
+       0x00000c41,
+       0x00000c20,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -134,8 +134,8 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x454c4449,
-       0x00000ace,
-       0x00000acc,
+       0x00000c4d,
+       0x00000c4b,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -834,7 +834,15 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
 /* 0x0ccc: memx_train_tail */
-/* 0x0ccc: i2c_scl_map */
+/* 0x0ccc: perf_attr_start */
+/* 0x0ccc: perf_polling_period_us */
+       0x000186a0,
+/* 0x0cd0: perf_eng_gr */
+/* 0x0cd1: perf_eng_vdec */
+/* 0x0cd2: perf_eng_mc */
+/* 0x0cd3: perf_eng_pcie */
+       0x00000000,
+/* 0x0cd4: i2c_scl_map */
        0x00000400,
        0x00000800,
        0x00001000,
@@ -845,7 +853,7 @@ uint32_t gk104_pmu_data[] = {
        0x00020000,
        0x00040000,
        0x00080000,
-/* 0x0cf4: i2c_sda_map */
+/* 0x0cfc: i2c_sda_map */
        0x00100000,
        0x00200000,
        0x00400000,
@@ -911,8 +919,6 @@ uint32_t gk104_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
 };
 
 uint32_t gk104_pmu_code[] = {
@@ -1392,376 +1398,443 @@ uint32_t gk104_pmu_code[] = {
        0x00f8d80b,
 /* 0x0680: memx_init */
 /* 0x0682: perf_recv */
-       0x00f800f8,
-/* 0x0684: perf_init */
-/* 0x0686: i2c_drive_scl */
-       0x36b000f8,
-       0x0e0bf400,
-       0x07e007f1,
-       0xbd0001d0,
-/* 0x0697: i2c_drive_scl_lo */
-       0xf100f804,
-       0xd007e407,
+       0xa7f100f8,
+       0xa3f14f48,
+       0xeab85453,
+       0x411bf406,
+       0xf401d6b0,
+       0xb4bd501b,
+       0x07f1c4bd,
+       0x0c180cd3,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd2,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd1,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd0,
+       0xf504bd00,
+       0xf402e621,
+/* 0x06ce: perf_recv_not_host */
+       0x21f5180e,
+       0x07f106e5,
+       0x0e980ccc,
+       0xf504bd00,
+       0xf501ec21,
+/* 0x06e3: perf_recv_exit */
+       0xf8021821,
+/* 0x06e5: perf_counter_readout */
+       0x08e7f100,
+       0x00eecf05,
+       0xf1ffeecc,
+       0xcf0518d7,
+       0xdeff00dd,
+       0xd007f1dc,
+       0x000d000c,
+       0xd7f104bd,
+       0xddcf0528,
+       0xdcdeff00,
+       0x0cd107f1,
+       0xbd000d00,
+       0x38d7f104,
+       0x00ddcf05,
+       0xf1dcdeff,
+       0x000cd207,
+       0x04bd000d,
+       0x0548d7f1,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd3,
+       0xf104bd00,
+       0xf10000e7,
+       0xf18000e3,
+       0xd0050807,
+       0x04bd000e,
+       0x051807f1,
+       0xbd000ed0,
+       0x2807f104,
+       0x000ed005,
+       0x07f104bd,
+       0x0ed00538,
+       0xf104bd00,
+       0xd0054807,
+       0x04bd000e,
+/* 0x0772: perf_init */
+       0xe7f100f8,
+       0xe3f00003,
+       0x0c07f100,
+       0x000ed005,
+       0xe7f104bd,
+       0xe3f00002,
+       0x1c07f100,
+       0x000ed005,
+       0x07f104bd,
+       0x0ed0052c,
+       0xf104bd00,
+       0xd0053c07,
+       0x04bd000e,
+       0x054c07f1,
+       0xbd000ed0,
+       0x0fe7f104,
+       0x38e3f000,
+       0x051407f1,
+       0xbd000ed0,
+       0x70e7f104,
+       0x02e3f000,
+       0x052407f1,
+       0xbd000ed0,
+       0x80e7f104,
+       0x00e3f000,
+       0x053407f1,
+       0xbd000ed0,
+       0x00e7f104,
+       0x00e3f100,
+       0x4407f120,
+       0x000ed005,
+       0x21f504bd,
+       0x07f106e5,
+       0x0e980ccc,
+       0xf504bd00,
+       0xf501ec21,
+       0xf8021821,
+/* 0x0805: i2c_drive_scl */
+       0x0036b000,
+       0xf10e0bf4,
+       0xd007e007,
        0x04bd0001,
-/* 0x06a2: i2c_drive_sda */
-       0x36b000f8,
-       0x0e0bf400,
-       0x07e007f1,
-       0xbd0002d0,
-/* 0x06b3: i2c_drive_sda_lo */
-       0xf100f804,
-       0xd007e407,
+/* 0x0816: i2c_drive_scl_lo */
+       0x07f100f8,
+       0x01d007e4,
+       0xf804bd00,
+/* 0x0821: i2c_drive_sda */
+       0x0036b000,
+       0xf10e0bf4,
+       0xd007e007,
        0x04bd0002,
-/* 0x06be: i2c_sense_scl */
+/* 0x0832: i2c_drive_sda_lo */
+       0x07f100f8,
+       0x02d007e4,
+       0xf804bd00,
+/* 0x083d: i2c_sense_scl */
+       0x0132f400,
+       0x07c437f1,
+       0xfd0033cf,
+       0x0bf40431,
+       0x0131f406,
+/* 0x0850: i2c_sense_scl_done */
+/* 0x0852: i2c_sense_sda */
        0x32f400f8,
        0xc437f101,
        0x0033cf07,
-       0xf40431fd,
+       0xf40432fd,
        0x31f4060b,
-/* 0x06d1: i2c_sense_scl_done */
-/* 0x06d3: i2c_sense_sda */
-       0xf400f801,
-       0x37f10132,
-       0x33cf07c4,
-       0x0432fd00,
-       0xf4060bf4,
-/* 0x06e6: i2c_sense_sda_done */
-       0x00f80131,
-/* 0x06e8: i2c_raise_scl */
-       0x47f140f9,
-       0x37f00898,
-       0x8621f501,
-/* 0x06f5: i2c_raise_scl_wait */
-       0xe8e7f106,
-       0x6721f403,
-       0x06be21f5,
-       0xb60901f4,
-       0x1bf40142,
-/* 0x0709: i2c_raise_scl_done */
-       0xf840fcef,
-/* 0x070d: i2c_start */
-       0xbe21f500,
-       0x0d11f406,
-       0x06d321f5,
-       0xf40611f4,
-/* 0x071e: i2c_start_rep */
-       0x37f0300e,
-       0x8621f500,
-       0x0137f006,
-       0x06a221f5,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xe821f550,
-       0x0464b606,
-/* 0x074b: i2c_start_send */
-       0xf01f11f4,
-       0x21f50037,
-       0xe7f106a2,
-       0x21f41388,
-       0x0037f067,
-       0x068621f5,
-       0x1388e7f1,
-/* 0x0767: i2c_start_out */
-       0xf86721f4,
-/* 0x0769: i2c_stop */
-       0x0037f000,
-       0x068621f5,
-       0xf50037f0,
-       0xf106a221,
-       0xf403e8e7,
-       0x37f06721,
-       0x8621f501,
-       0x88e7f106,
-       0x6721f413,
-       0xf50137f0,
-       0xf106a221,
-       0xf41388e7,
-       0x00f86721,
-/* 0x079c: i2c_bitw */
-       0x06a221f5,
+/* 0x0865: i2c_sense_sda_done */
+/* 0x0867: i2c_raise_scl */
+       0xf900f801,
+       0x9847f140,
+       0x0137f008,
+       0x080521f5,
+/* 0x0874: i2c_raise_scl_wait */
        0x03e8e7f1,
-       0xbb6721f4,
+       0xf56721f4,
+       0xf4083d21,
+       0x42b60901,
+       0xef1bf401,
+/* 0x0888: i2c_raise_scl_done */
+       0x00f840fc,
+/* 0x088c: i2c_start */
+       0x083d21f5,
+       0xf50d11f4,
+       0xf4085221,
+       0x0ef40611,
+/* 0x089d: i2c_start_rep */
+       0x0037f030,
+       0x080521f5,
+       0xf50137f0,
+       0xbb082121,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x06e821f5,
+       0x086721f5,
        0xf40464b6,
-       0xe7f11811,
-       0x21f41388,
-       0x0037f067,
-       0x068621f5,
+/* 0x08ca: i2c_start_send */
+       0x37f01f11,
+       0x2121f500,
+       0x88e7f108,
+       0x6721f413,
+       0xf50037f0,
+       0xf1080521,
+       0xf41388e7,
+/* 0x08e6: i2c_start_out */
+       0x00f86721,
+/* 0x08e8: i2c_stop */
+       0xf50037f0,
+       0xf0080521,
+       0x21f50037,
+       0xe7f10821,
+       0x21f403e8,
+       0x0137f067,
+       0x080521f5,
        0x1388e7f1,
-/* 0x07db: i2c_bitw_out */
-       0xf86721f4,
-/* 0x07dd: i2c_bitr */
-       0x0137f000,
-       0x06a221f5,
-       0x03e8e7f1,
-       0xbb6721f4,
-       0x65b60076,
-       0x9450f904,
-       0x56bb0465,
-       0xfd50bd02,
-       0x50fc0475,
-       0x06e821f5,
-       0xf40464b6,
-       0x21f51b11,
-       0x37f006d3,
-       0x8621f500,
-       0x88e7f106,
+       0xf06721f4,
+       0x21f50137,
+       0xe7f10821,
+       0x21f41388,
+/* 0x091b: i2c_bitw */
+       0xf500f867,
+       0xf1082121,
+       0xf403e8e7,
+       0x76bb6721,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6086721,
+       0x11f40464,
+       0x88e7f118,
        0x6721f413,
-       0xf4013cf0,
-/* 0x0822: i2c_bitr_done */
-       0x00f80131,
-/* 0x0824: i2c_get_byte */
-       0xf00057f0,
-/* 0x082a: i2c_get_byte_next */
-       0x54b60847,
-       0x0076bb01,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x21f550fc,
-       0x64b607dd,
-       0x2b11f404,
-       0xb60553fd,
-       0x1bf40142,
-       0x0137f0d8,
+       0xf50037f0,
+       0xf1080521,
+       0xf41388e7,
+/* 0x095a: i2c_bitw_out */
+       0x00f86721,
+/* 0x095c: i2c_bitr */
+       0xf50137f0,
+       0xf1082121,
+       0xf403e8e7,
+       0x76bb6721,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6086721,
+       0x11f40464,
+       0x5221f51b,
+       0x0037f008,
+       0x080521f5,
+       0x1388e7f1,
+       0xf06721f4,
+       0x31f4013c,
+/* 0x09a1: i2c_bitr_done */
+/* 0x09a3: i2c_get_byte */
+       0xf000f801,
+       0x47f00057,
+/* 0x09a9: i2c_get_byte_next */
+       0x0154b608,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x9c21f550,
-       0x0464b607,
-/* 0x0874: i2c_get_byte_done */
-/* 0x0876: i2c_put_byte */
-       0x47f000f8,
-/* 0x0879: i2c_put_byte_next */
-       0x0142b608,
-       0xbb3854ff,
+       0x5c21f550,
+       0x0464b609,
+       0xfd2b11f4,
+       0x42b60553,
+       0xd81bf401,
+       0xbb0137f0,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x091b21f5,
+/* 0x09f3: i2c_get_byte_done */
+       0xf80464b6,
+/* 0x09f5: i2c_put_byte */
+       0x0847f000,
+/* 0x09f8: i2c_put_byte_next */
+       0xff0142b6,
+       0x76bb3854,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb6091b21,
+       0x11f40464,
+       0x0046b034,
+       0xbbd81bf4,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x079c21f5,
+       0x095c21f5,
        0xf40464b6,
-       0x46b03411,
-       0xd81bf400,
+       0x76bb0f11,
+       0x0136b000,
+       0xf4061bf4,
+/* 0x0a4e: i2c_put_byte_done */
+       0x00f80132,
+/* 0x0a50: i2c_addr */
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xdd21f550,
-       0x0464b607,
-       0xbb0f11f4,
-       0x36b00076,
-       0x061bf401,
-/* 0x08cf: i2c_put_byte_done */
-       0xf80132f4,
-/* 0x08d1: i2c_addr */
-       0x0076bb00,
+       0x8c21f550,
+       0x0464b608,
+       0xe72911f4,
+       0xb6012ec3,
+       0x53fd0134,
+       0x0076bb05,
        0xf90465b6,
        0x04659450,
        0xbd0256bb,
        0x0475fd50,
        0x21f550fc,
-       0x64b6070d,
-       0x2911f404,
-       0x012ec3e7,
-       0xfd0134b6,
-       0x76bb0553,
-       0x0465b600,
-       0x659450f9,
-       0x0256bb04,
-       0x75fd50bd,
-       0xf550fc04,
-       0xb6087621,
-/* 0x0916: i2c_addr_done */
-       0x00f80464,
-/* 0x0918: i2c_acquire_addr */
-       0xb6f8cec7,
-       0xe0b705e4,
-       0x00f8d014,
-/* 0x0924: i2c_acquire */
-       0x091821f5,
-       0xf00421f4,
-       0x21f403d9,
-/* 0x0933: i2c_release */
-       0xf500f833,
-       0xf4091821,
-       0xdaf00421,
+       0x64b609f5,
+/* 0x0a95: i2c_addr_done */
+/* 0x0a97: i2c_acquire_addr */
+       0xc700f804,
+       0xe4b6f8ce,
+       0x14e0b705,
+/* 0x0aa3: i2c_acquire */
+       0xf500f8d0,
+       0xf40a9721,
+       0xd9f00421,
        0x3321f403,
-/* 0x0942: i2c_recv */
-       0x32f400f8,
-       0xf8c1c701,
-       0xb00214b6,
-       0x1ff52816,
-       0x13a0013a,
-       0x32980cf4,
-       0xcc13a000,
-       0x0031980c,
-       0xf90231f4,
-       0xf9e0f9d0,
-       0x0067f1d0,
-       0x0063f100,
-       0x01679210,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x2421f550,
-       0x0464b609,
-       0xd6b0d0fc,
-       0xb31bf500,
-       0x0057f000,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xd121f550,
-       0x0464b608,
-       0x00d011f5,
-       0xbbe0c5c7,
+/* 0x0ab2: i2c_release */
+       0x21f500f8,
+       0x21f40a97,
+       0x03daf004,
+       0xf83321f4,
+/* 0x0ac1: i2c_recv */
+       0x0132f400,
+       0xb6f8c1c7,
+       0x16b00214,
+       0x3a1ff528,
+       0xfc13a001,
+       0x0032980c,
+       0x0cd413a0,
+       0xf4003198,
+       0xd0f90231,
+       0xd0f9e0f9,
+       0x000067f1,
+       0x100063f1,
+       0xbb016792,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0aa321f5,
+       0xfc0464b6,
+       0x00d6b0d0,
+       0x00b31bf5,
+       0xbb0057f0,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x087621f5,
+       0x0a5021f5,
        0xf50464b6,
-       0xf000ad11,
-       0x76bb0157,
+       0xc700d011,
+       0x76bbe0c5,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb608d121,
+       0xb609f521,
        0x11f50464,
-       0x76bb008a,
-       0x0465b600,
-       0x659450f9,
-       0x0256bb04,
-       0x75fd50bd,
-       0xf550fc04,
-       0xb6082421,
-       0x11f40464,
-       0xe05bcb6a,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x6921f550,
-       0x0464b607,
-       0xbd025bb9,
-       0x430ef474,
-/* 0x0a48: i2c_recv_not_rd08 */
-       0xf401d6b0,
-       0x57f03d1b,
-       0xd121f500,
-       0x3311f408,
-       0xf5e0c5c7,
-       0xf4087621,
-       0x57f02911,
-       0xd121f500,
-       0x1f11f408,
-       0xf5e0b5c7,
-       0xf4087621,
-       0x21f51511,
-       0x74bd0769,
-       0xf408c5c7,
-       0x32f4091b,
-       0x030ef402,
-/* 0x0a88: i2c_recv_not_wr08 */
-/* 0x0a88: i2c_recv_done */
-       0xf5f8cec7,
-       0xfc093321,
-       0xf4d0fce0,
-       0x7cb90a12,
-       0xe621f502,
-/* 0x0a9d: i2c_recv_exit */
-/* 0x0a9f: i2c_init */
+       0x57f000ad,
+       0x0076bb01,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b60a50,
+       0x8a11f504,
+       0x0076bb00,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b609a3,
+       0x6a11f404,
+       0xbbe05bcb,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x08e821f5,
+       0xb90464b6,
+       0x74bd025b,
+/* 0x0bc7: i2c_recv_not_rd08 */
+       0xb0430ef4,
+       0x1bf401d6,
+       0x0057f03d,
+       0x0a5021f5,
+       0xc73311f4,
+       0x21f5e0c5,
+       0x11f409f5,
+       0x0057f029,
+       0x0a5021f5,
+       0xc71f11f4,
+       0x21f5e0b5,
+       0x11f409f5,
+       0xe821f515,
+       0xc774bd08,
+       0x1bf408c5,
+       0x0232f409,
+/* 0x0c07: i2c_recv_not_wr08 */
+/* 0x0c07: i2c_recv_done */
+       0xc7030ef4,
+       0x21f5f8ce,
+       0xe0fc0ab2,
+       0x12f4d0fc,
+       0x027cb90a,
+       0x02e621f5,
+/* 0x0c1c: i2c_recv_exit */
+/* 0x0c1e: i2c_init */
+       0x00f800f8,
+/* 0x0c20: test_recv */
+       0x05d817f1,
+       0xb60011cf,
+       0x07f10110,
+       0x01d005d8,
+       0xf104bd00,
+       0xf1d900e7,
+       0xf5134fe3,
+       0xf8021821,
+/* 0x0c41: test_init */
+       0x00e7f100,
+       0x1821f508,
+/* 0x0c4b: idle_recv */
        0xf800f802,
-/* 0x0aa1: test_recv */
-       0xd817f100,
-       0x0011cf05,
-       0xf10110b6,
-       0xd005d807,
-       0x04bd0001,
-       0xd900e7f1,
-       0x134fe3f1,
-       0x021821f5,
-/* 0x0ac2: test_init */
-       0xe7f100f8,
-       0x21f50800,
-       0x00f80218,
-/* 0x0acc: idle_recv */
-/* 0x0ace: idle */
-       0x31f400f8,
-       0xd417f100,
-       0x0011cf05,
-       0xf10110b6,
-       0xd005d407,
-       0x04bd0001,
-/* 0x0ae4: idle_loop */
-       0xf45817f0,
-/* 0x0aea: idle_proc */
-/* 0x0aea: idle_proc_exec */
-       0x10f90232,
-       0xf5021eb9,
-       0xfc02ef21,
-       0x0911f410,
-       0xf40231f4,
-/* 0x0afe: idle_proc_next */
-       0x10b6ef0e,
-       0x061fb858,
-       0xf4e61bf4,
-       0x28f4dd02,
-       0xc10ef400,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
+/* 0x0c4d: idle */
+       0x0031f400,
+       0x05d417f1,
+       0xb60011cf,
+       0x07f10110,
+       0x01d005d4,
+/* 0x0c63: idle_loop */
+       0xf004bd00,
+       0x32f45817,
+/* 0x0c69: idle_proc */
+/* 0x0c69: idle_proc_exec */
+       0xb910f902,
+       0x21f5021e,
+       0x10fc02ef,
+       0xf40911f4,
+       0x0ef40231,
+/* 0x0c7d: idle_proc_next */
+       0x5810b6ef,
+       0xf4061fb8,
+       0x02f4e61b,
+       0x0028f4dd,
+       0x00c10ef4,
        0x00000000,
        0x00000000,
        0x00000000,
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h
index 8a2b628..2bd55ae 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h
@@ -68,7 +68,7 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x46524550,
-       0x00000625,
+       0x00000704,
        0x00000623,
        0x00000000,
        0x00000000,
@@ -90,8 +90,8 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x5f433249,
-       0x00000a29,
-       0x000008d0,
+       0x00000b90,
+       0x00000a37,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -112,8 +112,8 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x54534554,
-       0x00000a4a,
-       0x00000a2b,
+       0x00000bb1,
+       0x00000b92,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -134,8 +134,8 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x454c4449,
-       0x00000a55,
-       0x00000a53,
+       0x00000bbc,
+       0x00000bba,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -834,7 +834,15 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
 /* 0x0ccc: memx_train_tail */
-/* 0x0ccc: i2c_scl_map */
+/* 0x0ccc: perf_attr_start */
+/* 0x0ccc: perf_polling_period_us */
+       0x000186a0,
+/* 0x0cd0: perf_eng_gr */
+/* 0x0cd1: perf_eng_vdec */
+/* 0x0cd2: perf_eng_mc */
+/* 0x0cd3: perf_eng_pcie */
+       0x00000000,
+/* 0x0cd4: i2c_scl_map */
        0x00000400,
        0x00000800,
        0x00001000,
@@ -845,7 +853,7 @@ uint32_t gk208_pmu_data[] = {
        0x00020000,
        0x00040000,
        0x00080000,
-/* 0x0cf4: i2c_sda_map */
+/* 0x0cfc: i2c_sda_map */
        0x00100000,
        0x00200000,
        0x00400000,
@@ -911,8 +919,6 @@ uint32_t gk208_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
 };
 
 uint32_t gk208_pmu_code[] = {
@@ -1368,362 +1374,429 @@ uint32_t gk208_pmu_code[] = {
        0xf8dc0bf4,
 /* 0x0621: memx_init */
 /* 0x0623: perf_recv */
-       0xf800f800,
-/* 0x0625: perf_init */
-/* 0x0627: i2c_drive_scl */
-       0xb000f800,
-       0x0bf40036,
-       0x07e0400d,
-       0xbd0001f6,
-/* 0x0637: i2c_drive_scl_lo */
-       0x4000f804,
-       0x01f607e4,
-       0xf804bd00,
-/* 0x0641: i2c_drive_sda */
-       0x0036b000,
-       0x400d0bf4,
-       0x02f607e0,
-       0xf804bd00,
-/* 0x0651: i2c_drive_sda_lo */
-       0x07e44000,
-       0xbd0002f6,
-/* 0x065b: i2c_sense_scl */
-       0xf400f804,
-       0xc4430132,
-       0x0033cf07,
-       0xf40431fd,
-       0x31f4060b,
-/* 0x066d: i2c_sense_scl_done */
-/* 0x066f: i2c_sense_sda */
-       0xf400f801,
-       0xc4430132,
-       0x0033cf07,
-       0xf40432fd,
-       0x31f4060b,
-/* 0x0681: i2c_sense_sda_done */
-/* 0x0683: i2c_raise_scl */
-       0xf900f801,
-       0x08984440,
-       0x277e0103,
-/* 0x068e: i2c_raise_scl_wait */
-       0xe84e0006,
-       0x005d7e03,
-       0x065b7e00,
-       0x0901f400,
-       0xf40142b6,
-/* 0x06a2: i2c_raise_scl_done */
-       0x40fcef1b,
-/* 0x06a6: i2c_start */
-       0x5b7e00f8,
-       0x11f40006,
-       0x066f7e0d,
-       0x0611f400,
-/* 0x06b7: i2c_start_rep */
-       0x032e0ef4,
-       0x06277e00,
+       0xf100f800,
+       0xf14f48a7,
+       0xa65453a3,
+       0x411bf4ea,
+       0xf401d6b0,
+       0xb4bd501b,
+       0x07f1c4bd,
+       0x0c180cd3,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd2,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd1,
+       0xb604bd00,
+       0x07f108c4,
+       0x0c180cd0,
+       0x7e04bd00,
+       0xf40002b6,
+/* 0x066e: perf_recv_not_host */
+       0x857e180e,
+       0x07f10006,
+       0x0e980ccc,
+       0xf504bd00,
+       0x7e01ca21,
+/* 0x0683: perf_recv_exit */
+       0xf80001f5,
+/* 0x0685: perf_counter_readout */
+       0x05084e00,
+       0xcc00eecf,
+       0x184dffee,
+       0x00ddcf05,
+       0xf1dcdeff,
+       0x200cd007,
+       0x4d04bd0d,
+       0xddcf0528,
+       0xdcdeff00,
+       0x0cd107f1,
+       0x04bd0d20,
+       0xcf05384d,
+       0xdeff00dd,
+       0xd207f1dc,
+       0xbd0d200c,
+       0x05484d04,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d200cd3,
+       0xe7f104bd,
+       0xe3f10000,
+       0x08408000,
+       0x000ef605,
+       0x184004bd,
+       0x000ef605,
+       0x284004bd,
+       0x000ef605,
+       0x384004bd,
+       0x000ef605,
+       0x484004bd,
+       0x000ef605,
+       0x00f804bd,
+/* 0x0704: perf_init */
+       0x0003e7f1,
+       0x4000e3f0,
+       0x0ef6050c,
+       0xf104bd00,
+       0xf00002e7,
+       0x1c4000e3,
+       0x000ef605,
+       0x2c4004bd,
+       0x000ef605,
+       0x3c4004bd,
+       0x000ef605,
+       0x4c4004bd,
+       0x000ef605,
+       0xe7f104bd,
+       0xe3f0000f,
+       0x05144038,
+       0xbd000ef6,
+       0x70e7f104,
+       0x02e3f000,
+       0xf6052440,
+       0x04bd000e,
+       0x0080e7f1,
+       0x4000e3f0,
+       0x0ef60534,
+       0xf104bd00,
+       0xf10000e7,
+       0x402000e3,
+       0x0ef60544,
+       0x7e04bd00,
+       0xf1000685,
+       0x980ccc07,
+       0x04bd000e,
+       0x01ca21f5,
+       0x0001f57e,
+/* 0x078e: i2c_drive_scl */
+       0x36b000f8,
+       0x0d0bf400,
+       0xf607e040,
+       0x04bd0001,
+/* 0x079e: i2c_drive_scl_lo */
+       0xe44000f8,
+       0x0001f607,
+       0x00f804bd,
+/* 0x07a8: i2c_drive_sda */
+       0xf40036b0,
+       0xe0400d0b,
+       0x0002f607,
+       0x00f804bd,
+/* 0x07b8: i2c_drive_sda_lo */
+       0xf607e440,
+       0x04bd0002,
+/* 0x07c2: i2c_sense_scl */
+       0x32f400f8,
+       0x07c44301,
+       0xfd0033cf,
+       0x0bf40431,
+       0x0131f406,
+/* 0x07d4: i2c_sense_scl_done */
+/* 0x07d6: i2c_sense_sda */
+       0x32f400f8,
+       0x07c44301,
+       0xfd0033cf,
+       0x0bf40432,
+       0x0131f406,
+/* 0x07e8: i2c_sense_sda_done */
+/* 0x07ea: i2c_raise_scl */
+       0x40f900f8,
+       0x03089844,
+       0x078e7e01,
+/* 0x07f5: i2c_raise_scl_wait */
+       0x03e84e00,
+       0x00005d7e,
+       0x0007c27e,
+       0xb60901f4,
+       0x1bf40142,
+/* 0x0809: i2c_raise_scl_done */
+       0xf840fcef,
+/* 0x080d: i2c_start */
+       0x07c27e00,
+       0x0d11f400,
+       0x0007d67e,
+       0xf40611f4,
+/* 0x081e: i2c_start_rep */
+       0x00032e0e,
+       0x00078e7e,
+       0xa87e0103,
+       0x76bb0007,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0x7e50fc04,
+       0xb60007ea,
+       0x11f40464,
+/* 0x0849: i2c_start_send */
+       0x7e00031d,
+       0x4e0007a8,
+       0x5d7e1388,
+       0x00030000,
+       0x00078e7e,
+       0x7e13884e,
+/* 0x0863: i2c_start_out */
+       0xf800005d,
+/* 0x0865: i2c_stop */
+       0x7e000300,
+       0x0300078e,
+       0x07a87e00,
+       0x03e84e00,
+       0x00005d7e,
+       0x8e7e0103,
+       0x884e0007,
+       0x005d7e13,
        0x7e010300,
-       0xbb000641,
+       0x4e0007a8,
+       0x5d7e1388,
+       0x00f80000,
+/* 0x0894: i2c_bitw */
+       0x0007a87e,
+       0x7e03e84e,
+       0xbb00005d,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x0006837e,
+       0x0007ea7e,
        0xf40464b6,
-/* 0x06e2: i2c_start_send */
-       0x00031d11,
-       0x0006417e,
-       0x7e13884e,
-       0x0300005d,
-       0x06277e00,
-       0x13884e00,
-       0x00005d7e,
-/* 0x06fc: i2c_start_out */
-/* 0x06fe: i2c_stop */
-       0x000300f8,
-       0x0006277e,
-       0x417e0003,
-       0xe84e0006,
-       0x005d7e03,
-       0x7e010300,
-       0x4e000627,
+       0x884e1711,
+       0x005d7e13,
+       0x7e000300,
+       0x4e00078e,
        0x5d7e1388,
-       0x01030000,
-       0x0006417e,
-       0x7e13884e,
-       0xf800005d,
-/* 0x072d: i2c_bitw */
-       0x06417e00,
-       0x03e84e00,
-       0x00005d7e,
+/* 0x08d2: i2c_bitw_out */
+       0x00f80000,
+/* 0x08d4: i2c_bitr */
+       0xa87e0103,
+       0xe84e0007,
+       0x005d7e03,
+       0x0076bb00,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0xea7e50fc,
+       0x64b60007,
+       0x1a11f404,
+       0x0007d67e,
+       0x8e7e0003,
+       0x884e0007,
+       0x005d7e13,
+       0x013cf000,
+/* 0x0917: i2c_bitr_done */
+       0xf80131f4,
+/* 0x0919: i2c_get_byte */
+       0x04000500,
+/* 0x091d: i2c_get_byte_next */
+       0x0154b608,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x06837e50,
+       0x08d47e50,
        0x0464b600,
-       0x4e1711f4,
-       0x5d7e1388,
-       0x00030000,
-       0x0006277e,
-       0x7e13884e,
-/* 0x076b: i2c_bitw_out */
-       0xf800005d,
-/* 0x076d: i2c_bitr */
-       0x7e010300,
-       0x4e000641,
-       0x5d7e03e8,
-       0x76bb0000,
+       0xfd2a11f4,
+       0x42b60553,
+       0xd81bf401,
+       0x76bb0103,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0x7e50fc04,
-       0xb6000683,
-       0x11f40464,
-       0x066f7e1a,
-       0x7e000300,
-       0x4e000627,
-       0x5d7e1388,
-       0x3cf00000,
-       0x0131f401,
-/* 0x07b0: i2c_bitr_done */
-/* 0x07b2: i2c_get_byte */
-       0x000500f8,
-/* 0x07b6: i2c_get_byte_next */
-       0x54b60804,
-       0x0076bb01,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x6d7e50fc,
-       0x64b60007,
-       0x2a11f404,
-       0xb60553fd,
-       0x1bf40142,
-       0xbb0103d8,
-       0x65b60076,
-       0x9450f904,
-       0x56bb0465,
-       0xfd50bd02,
-       0x50fc0475,
-       0x00072d7e,
-/* 0x07ff: i2c_get_byte_done */
-       0xf80464b6,
-/* 0x0801: i2c_put_byte */
-/* 0x0803: i2c_put_byte_next */
-       0xb6080400,
-       0x54ff0142,
-       0x0076bb38,
+       0xb6000894,
+/* 0x0966: i2c_get_byte_done */
+       0x00f80464,
+/* 0x0968: i2c_put_byte */
+/* 0x096a: i2c_put_byte_next */
+       0x42b60804,
+       0x3854ff01,
+       0xb60076bb,
+       0x50f90465,
+       0xbb046594,
+       0x50bd0256,
+       0xfc0475fd,
+       0x08947e50,
+       0x0464b600,
+       0xb03411f4,
+       0x1bf40046,
+       0x0076bbd8,
        0xf90465b6,
        0x04659450,
        0xbd0256bb,
        0x0475fd50,
-       0x2d7e50fc,
-       0x64b60007,
-       0x3411f404,
-       0xf40046b0,
-       0x76bbd81b,
+       0xd47e50fc,
+       0x64b60008,
+       0x0f11f404,
+       0xb00076bb,
+       0x1bf40136,
+       0x0132f406,
+/* 0x09c0: i2c_put_byte_done */
+/* 0x09c2: i2c_addr */
+       0x76bb00f8,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0x7e50fc04,
-       0xb600076d,
+       0xb600080d,
        0x11f40464,
-       0x0076bb0f,
-       0xf40136b0,
-       0x32f4061b,
-/* 0x0859: i2c_put_byte_done */
-/* 0x085b: i2c_addr */
-       0xbb00f801,
+       0x2ec3e729,
+       0x0134b601,
+       0xbb0553fd,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x0006a67e,
-       0xf40464b6,
-       0xc3e72911,
-       0x34b6012e,
-       0x0553fd01,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x08017e50,
-       0x0464b600,
-/* 0x08a0: i2c_addr_done */
-/* 0x08a2: i2c_acquire_addr */
-       0xcec700f8,
-       0x05e4b6f8,
-       0xd014e0b7,
-/* 0x08ae: i2c_acquire */
-       0xa27e00f8,
-       0x047e0008,
-       0xd9f00000,
+       0x0009687e,
+/* 0x0a07: i2c_addr_done */
+       0xf80464b6,
+/* 0x0a09: i2c_acquire_addr */
+       0xf8cec700,
+       0xb705e4b6,
+       0xf8d014e0,
+/* 0x0a15: i2c_acquire */
+       0x0a097e00,
+       0x00047e00,
+       0x03d9f000,
+       0x00002e7e,
+/* 0x0a26: i2c_release */
+       0x097e00f8,
+       0x047e000a,
+       0xdaf00000,
        0x002e7e03,
-/* 0x08bf: i2c_release */
-       0x7e00f800,
-       0x7e0008a2,
-       0xf0000004,
-       0x2e7e03da,
-       0x00f80000,
-/* 0x08d0: i2c_recv */
-       0xc70132f4,
-       0x14b6f8c1,
-       0x2816b002,
-       0x01371ff5,
-       0x0cf413b8,
-       0x00329800,
-       0x0ccc13b8,
-       0x00319800,
-       0xf90231f4,
-       0xf9e0f9d0,
-       0x0067f1d0,
-       0x0063f100,
-       0x01679210,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x08ae7e50,
-       0x0464b600,
-       0xd6b0d0fc,
-       0xb01bf500,
-       0xbb000500,
+/* 0x0a37: i2c_recv */
+       0xf400f800,
+       0xc1c70132,
+       0x0214b6f8,
+       0xf52816b0,
+       0xb801371f,
+       0x000cfc13,
+       0xb8003298,
+       0x000cd413,
+       0xf4003198,
+       0xd0f90231,
+       0xd0f9e0f9,
+       0x000067f1,
+       0x100063f1,
+       0xbb016792,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x00085b7e,
-       0xf50464b6,
-       0xc700cc11,
-       0x76bbe0c5,
+       0x000a157e,
+       0xfc0464b6,
+       0x00d6b0d0,
+       0x00b01bf5,
+       0x76bb0005,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0x7e50fc04,
-       0xb6000801,
+       0xb60009c2,
        0x11f50464,
-       0x010500a9,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x085b7e50,
-       0x0464b600,
-       0x008711f5,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x07b27e50,
-       0x0464b600,
-       0xcb6711f4,
-       0x76bbe05b,
-       0x0465b600,
-       0x659450f9,
-       0x0256bb04,
-       0x75fd50bd,
-       0x7e50fc04,
-       0xb60006fe,
-       0x5bb20464,
-       0x0ef474bd,
-/* 0x09d5: i2c_recv_not_rd08 */
-       0x01d6b041,
-       0x053b1bf4,
-       0x085b7e00,
-       0x3211f400,
-       0x7ee0c5c7,
-       0xf4000801,
-       0x00052811,
-       0x00085b7e,
-       0xc71f11f4,
-       0x017ee0b5,
-       0x11f40008,
-       0x06fe7e15,
-       0xc774bd00,
-       0x1bf408c5,
-       0x0232f409,
-/* 0x0a13: i2c_recv_not_wr08 */
-/* 0x0a13: i2c_recv_done */
-       0xc7030ef4,
-       0xbf7ef8ce,
-       0xe0fc0008,
-       0x12f4d0fc,
-       0x7e7cb209,
-/* 0x0a27: i2c_recv_exit */
-       0xf80002b6,
-/* 0x0a29: i2c_init */
-/* 0x0a2b: test_recv */
-       0x4100f800,
-       0x11cf0458,
+       0xc5c700cc,
+       0x0076bbe0,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x687e50fc,
+       0x64b60009,
+       0xa911f504,
+       0xbb010500,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0009c27e,
+       0xf50464b6,
+       0xbb008711,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0009197e,
+       0xf40464b6,
+       0x5bcb6711,
+       0x0076bbe0,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x657e50fc,
+       0x64b60008,
+       0xbd5bb204,
+       0x410ef474,
+/* 0x0b3c: i2c_recv_not_rd08 */
+       0xf401d6b0,
+       0x00053b1b,
+       0x0009c27e,
+       0xc73211f4,
+       0x687ee0c5,
+       0x11f40009,
+       0x7e000528,
+       0xf40009c2,
+       0xb5c71f11,
+       0x09687ee0,
+       0x1511f400,
+       0x0008657e,
+       0xc5c774bd,
+       0x091bf408,
+       0xf40232f4,
+/* 0x0b7a: i2c_recv_not_wr08 */
+/* 0x0b7a: i2c_recv_done */
+       0xcec7030e,
+       0x0a267ef8,
+       0xfce0fc00,
+       0x0912f4d0,
+       0xb67e7cb2,
+/* 0x0b8e: i2c_recv_exit */
+       0x00f80002,
+/* 0x0b90: i2c_init */
+/* 0x0b92: test_recv */
+       0x584100f8,
+       0x0011cf04,
+       0x400110b6,
+       0x01f60458,
+       0xf104bd00,
+       0xf1d900e7,
+       0x7e134fe3,
+       0xf80001f5,
+/* 0x0bb1: test_init */
+       0x08004e00,
+       0x0001f57e,
+/* 0x0bba: idle_recv */
+       0x00f800f8,
+/* 0x0bbc: idle */
+       0x410031f4,
+       0x11cf0454,
        0x0110b600,
-       0xf6045840,
+       0xf6045440,
        0x04bd0001,
-       0xd900e7f1,
-       0x134fe3f1,
-       0x0001f57e,
-/* 0x0a4a: test_init */
-       0x004e00f8,
-       0x01f57e08,
-/* 0x0a53: idle_recv */
-       0xf800f800,
-/* 0x0a55: idle */
-       0x0031f400,
-       0xcf045441,
-       0x10b60011,
-       0x04544001,
-       0xbd0001f6,
-/* 0x0a69: idle_loop */
-       0xf4580104,
-/* 0x0a6e: idle_proc */
-/* 0x0a6e: idle_proc_exec */
-       0x10f90232,
-       0xbf7e1eb2,
-       0x10fc0002,
-       0xf40911f4,
-       0x0ef40231,
-/* 0x0a81: idle_proc_next */
-       0x5810b6f0,
-       0x1bf41fa6,
-       0xe002f4e8,
-       0xf40028f4,
-       0x0000c60e,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
-       0x00000000,
+/* 0x0bd0: idle_loop */
+       0x32f45801,
+/* 0x0bd5: idle_proc */
+/* 0x0bd5: idle_proc_exec */
+       0xb210f902,
+       0x02bf7e1e,
+       0xf410fc00,
+       0x31f40911,
+       0xf00ef402,
+/* 0x0be8: idle_proc_next */
+       0xa65810b6,
+       0xe81bf41f,
+       0xf4e002f4,
+       0x0ef40028,
+       0x000000c6,
        0x00000000,
 };
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h
index 5165692..e57511f 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h
@@ -68,7 +68,7 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x46524550,
-       0x0000083b,
+       0x00000919,
        0x00000839,
        0x00000000,
        0x00000000,
@@ -90,8 +90,8 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x5f433249,
-       0x00000c6b,
-       0x00000b0e,
+       0x00000dd5,
+       0x00000c78,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -112,8 +112,8 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x54534554,
-       0x00000c94,
-       0x00000c6d,
+       0x00000dfe,
+       0x00000dd7,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -134,8 +134,8 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x454c4449,
-       0x00000ca0,
-       0x00000c9e,
+       0x00000e0a,
+       0x00000e08,
        0x00000000,
        0x00000000,
        0x00000000,
@@ -834,7 +834,14 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
 /* 0x0ccc: memx_train_tail */
-/* 0x0ccc: i2c_scl_map */
+/* 0x0ccc: perf_attr_start */
+/* 0x0ccc: perf_polling_period_us */
+       0x000186a0,
+/* 0x0cd0: perf_eng_gr */
+/* 0x0cd1: perf_eng_vdec */
+/* 0x0cd2: perf_eng_mc */
+       0x00000000,
+/* 0x0cd4: i2c_scl_map */
        0x00001000,
        0x00004000,
        0x00010000,
@@ -845,7 +852,7 @@ uint32_t gt215_pmu_data[] = {
        0x01000000,
        0x04000000,
        0x10000000,
-/* 0x0cf4: i2c_sda_map */
+/* 0x0cfc: i2c_sda_map */
        0x00002000,
        0x00008000,
        0x00020000,
@@ -856,7 +863,7 @@ uint32_t gt215_pmu_data[] = {
        0x02000000,
        0x08000000,
        0x20000000,
-/* 0x0d1c: i2c_ctrl */
+/* 0x0d24: i2c_ctrl */
        0x0000e138,
        0x0000e150,
        0x0000e168,
@@ -912,8 +919,6 @@ uint32_t gt215_pmu_data[] = {
        0x00000000,
        0x00000000,
        0x00000000,
-       0x00000000,
-       0x00000000,
 };
 
 uint32_t gt215_pmu_code[] = {
@@ -1511,352 +1516,483 @@ uint32_t gt215_pmu_code[] = {
 /* 0x0837: memx_init */
        0xf800f8d8,
 /* 0x0839: perf_recv */
-/* 0x083b: perf_init */
-       0xf800f800,
-/* 0x083d: i2c_drive_scl */
-       0x0036b000,
-       0xf1110bf4,
-       0xb607e007,
-       0x01d00604,
+       0x48a7f100,
+       0x53a3f14f,
+       0x06eab854,
+       0xb0351bf4,
+       0x1bf401d6,
+       0xbdb4bd44,
+       0xd207f1c4,
+       0x000c180c,
+       0xc4b604bd,
+       0xd107f108,
+       0x000c180c,
+       0xc4b604bd,
+       0xd007f108,
+       0x000c180c,
+       0x21f504bd,
+       0x0ef40337,
+/* 0x0879: perf_recv_not_host */
+       0x9021f518,
+       0xcc07f108,
+       0x000e980c,
+       0x21f504bd,
+       0x21f5022b,
+/* 0x088e: perf_recv_exit */
+       0x00f80257,
+/* 0x0890: perf_counter_readout */
+       0x0508e7f1,
+       0xcf06e4b6,
+       0xeecc00ee,
+       0x18d7f1ff,
+       0x06d4b605,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd0,
+       0xf104bd00,
+       0xb60528d7,
+       0xddcf06d4,
+       0xdcdeff00,
+       0x0cd107f1,
+       0xbd000d00,
+       0x38d7f104,
+       0x06d4b605,
+       0xff00ddcf,
+       0x07f1dcde,
+       0x0d000cd2,
+       0xf104bd00,
+       0xf10000e7,
+       0xf18000e3,
+       0xb6050807,
+       0x0ed00604,
+       0xf104bd00,
+       0xb6051807,
+       0x0ed00604,
+       0xf104bd00,
+       0xb6052807,
+       0x0ed00604,
+       0xf104bd00,
+       0xb6053807,
+       0x0ed00604,
        0xf804bd00,
-/* 0x0851: i2c_drive_scl_lo */
-       0xe407f100,
-       0x0604b607,
-       0xbd0001d0,
-/* 0x085f: i2c_drive_sda */
-       0xb000f804,
+/* 0x0919: perf_init */
+       0x03e7f100,
+       0x00e3f000,
+       0x050c07f1,
+       0xd00604b6,
+       0x04bd000e,
+       0x0002e7f1,
+       0xf100e3f0,
+       0xb6051c07,
+       0x0ed00604,
+       0xf104bd00,
+       0xb6052c07,
+       0x0ed00604,
+       0xf104bd00,
+       0xb6053c07,
+       0x0ed00604,
+       0xf104bd00,
+       0xf0000de7,
+       0x07f100e3,
+       0x04b60514,
+       0x000ed006,
+       0xe7f104bd,
+       0xe3f00070,
+       0x2407f100,
+       0x0604b605,
+       0xbd000ed0,
+       0x00e7f104,
+       0x00e3f001,
+       0x053407f1,
+       0xd00604b6,
+       0x04bd000e,
+       0x089021f5,
+       0x0ccc07f1,
+       0xbd000e98,
+       0x2b21f504,
+       0x5721f502,
+/* 0x09a7: i2c_drive_scl */
+       0xb000f802,
        0x0bf40036,
        0xe007f111,
        0x0604b607,
-       0xbd0002d0,
-/* 0x0873: i2c_drive_sda_lo */
+       0xbd0001d0,
+/* 0x09bb: i2c_drive_scl_lo */
        0xf100f804,
        0xb607e407,
+       0x01d00604,
+       0xf804bd00,
+/* 0x09c9: i2c_drive_sda */
+       0x0036b000,
+       0xf1110bf4,
+       0xb607e007,
        0x02d00604,
        0xf804bd00,
-/* 0x0881: i2c_sense_scl */
-       0x0132f400,
-       0x07c437f1,
-       0xcf0634b6,
-       0x31fd0033,
-       0x060bf404,
-/* 0x0897: i2c_sense_scl_done */
-       0xf80131f4,
-/* 0x0899: i2c_sense_sda */
-       0x0132f400,
-       0x07c437f1,
-       0xcf0634b6,
-       0x32fd0033,
-       0x060bf404,
-/* 0x08af: i2c_sense_sda_done */
-       0xf80131f4,
-/* 0x08b1: i2c_raise_scl */
-       0xf140f900,
-       0xf0089847,
-       0x21f50137,
-/* 0x08be: i2c_raise_scl_wait */
-       0xe7f1083d,
-       0x21f403e8,
-       0x8121f57f,
-       0x0901f408,
-       0xf40142b6,
-/* 0x08d2: i2c_raise_scl_done */
-       0x40fcef1b,
-/* 0x08d6: i2c_start */
-       0x21f500f8,
-       0x11f40881,
-       0x9921f50d,
-       0x0611f408,
-/* 0x08e7: i2c_start_rep */
-       0xf0300ef4,
-       0x21f50037,
-       0x37f0083d,
-       0x5f21f501,
-       0x0076bb08,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x21f550fc,
-       0x64b608b1,
-       0x1f11f404,
-/* 0x0914: i2c_start_send */
+/* 0x09dd: i2c_drive_sda_lo */
+       0xe407f100,
+       0x0604b607,
+       0xbd0002d0,
+/* 0x09eb: i2c_sense_scl */
+       0xf400f804,
+       0x37f10132,
+       0x34b607c4,
+       0x0033cf06,
+       0xf40431fd,
+       0x31f4060b,
+/* 0x0a01: i2c_sense_scl_done */
+/* 0x0a03: i2c_sense_sda */
+       0xf400f801,
+       0x37f10132,
+       0x34b607c4,
+       0x0033cf06,
+       0xf40432fd,
+       0x31f4060b,
+/* 0x0a19: i2c_sense_sda_done */
+/* 0x0a1b: i2c_raise_scl */
+       0xf900f801,
+       0x9847f140,
+       0x0137f008,
+       0x09a721f5,
+/* 0x0a28: i2c_raise_scl_wait */
+       0x03e8e7f1,
+       0xf57f21f4,
+       0xf409eb21,
+       0x42b60901,
+       0xef1bf401,
+/* 0x0a3c: i2c_raise_scl_done */
+       0x00f840fc,
+/* 0x0a40: i2c_start */
+       0x09eb21f5,
+       0xf50d11f4,
+       0xf40a0321,
+       0x0ef40611,
+/* 0x0a51: i2c_start_rep */
+       0x0037f030,
+       0x09a721f5,
+       0xf50137f0,
+       0xbb09c921,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0a1b21f5,
+       0xf40464b6,
+/* 0x0a7e: i2c_start_send */
+       0x37f01f11,
+       0xc921f500,
+       0x88e7f109,
+       0x7f21f413,
        0xf50037f0,
-       0xf1085f21,
+       0xf109a721,
        0xf41388e7,
-       0x37f07f21,
-       0x3d21f500,
-       0x88e7f108,
-       0x7f21f413,
-/* 0x0930: i2c_start_out */
-/* 0x0932: i2c_stop */
-       0x37f000f8,
-       0x3d21f500,
-       0x0037f008,
-       0x085f21f5,
-       0x03e8e7f1,
+/* 0x0a9a: i2c_start_out */
+       0x00f87f21,
+/* 0x0a9c: i2c_stop */
+       0xf50037f0,
+       0xf009a721,
+       0x21f50037,
+       0xe7f109c9,
+       0x21f403e8,
+       0x0137f07f,
+       0x09a721f5,
+       0x1388e7f1,
        0xf07f21f4,
        0x21f50137,
-       0xe7f1083d,
+       0xe7f109c9,
        0x21f41388,
-       0x0137f07f,
-       0x085f21f5,
-       0x1388e7f1,
-       0xf87f21f4,
-/* 0x0965: i2c_bitw */
-       0x5f21f500,
-       0xe8e7f108,
-       0x7f21f403,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xb121f550,
-       0x0464b608,
-       0xf11811f4,
-       0xf41388e7,
-       0x37f07f21,
-       0x3d21f500,
-       0x88e7f108,
+/* 0x0acf: i2c_bitw */
+       0xf500f87f,
+       0xf109c921,
+       0xf403e8e7,
+       0x76bb7f21,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb60a1b21,
+       0x11f40464,
+       0x88e7f118,
        0x7f21f413,
-/* 0x09a4: i2c_bitw_out */
-/* 0x09a6: i2c_bitr */
-       0x37f000f8,
-       0x5f21f501,
-       0xe8e7f108,
-       0x7f21f403,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0xb121f550,
-       0x0464b608,
-       0xf51b11f4,
-       0xf0089921,
-       0x21f50037,
-       0xe7f1083d,
-       0x21f41388,
-       0x013cf07f,
-/* 0x09eb: i2c_bitr_done */
-       0xf80131f4,
-/* 0x09ed: i2c_get_byte */
-       0x0057f000,
-/* 0x09f3: i2c_get_byte_next */
-       0xb60847f0,
-       0x76bb0154,
+       0xf50037f0,
+       0xf109a721,
+       0xf41388e7,
+/* 0x0b0e: i2c_bitw_out */
+       0x00f87f21,
+/* 0x0b10: i2c_bitr */
+       0xf50137f0,
+       0xf109c921,
+       0xf403e8e7,
+       0x76bb7f21,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb609a621,
+       0xb60a1b21,
        0x11f40464,
-       0x0553fd2b,
-       0xf40142b6,
-       0x37f0d81b,
-       0x0076bb01,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x21f550fc,
-       0x64b60965,
-/* 0x0a3d: i2c_get_byte_done */
-/* 0x0a3f: i2c_put_byte */
-       0xf000f804,
-/* 0x0a42: i2c_put_byte_next */
-       0x42b60847,
-       0x3854ff01,
+       0x0321f51b,
+       0x0037f00a,
+       0x09a721f5,
+       0x1388e7f1,
+       0xf07f21f4,
+       0x31f4013c,
+/* 0x0b55: i2c_bitr_done */
+/* 0x0b57: i2c_get_byte */
+       0xf000f801,
+       0x47f00057,
+/* 0x0b5d: i2c_get_byte_next */
+       0x0154b608,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x6521f550,
-       0x0464b609,
-       0xb03411f4,
-       0x1bf40046,
-       0x0076bbd8,
-       0xf90465b6,
-       0x04659450,
-       0xbd0256bb,
-       0x0475fd50,
-       0x21f550fc,
-       0x64b609a6,
-       0x0f11f404,
-       0xb00076bb,
-       0x1bf40136,
-       0x0132f406,
-/* 0x0a98: i2c_put_byte_done */
-/* 0x0a9a: i2c_addr */
-       0x76bb00f8,
+       0x1021f550,
+       0x0464b60b,
+       0xfd2b11f4,
+       0x42b60553,
+       0xd81bf401,
+       0xbb0137f0,
+       0x65b60076,
+       0x9450f904,
+       0x56bb0465,
+       0xfd50bd02,
+       0x50fc0475,
+       0x0acf21f5,
+/* 0x0ba7: i2c_get_byte_done */
+       0xf80464b6,
+/* 0x0ba9: i2c_put_byte */
+       0x0847f000,
+/* 0x0bac: i2c_put_byte_next */
+       0xff0142b6,
+       0x76bb3854,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb608d621,
+       0xb60acf21,
        0x11f40464,
-       0x2ec3e729,
-       0x0134b601,
-       0xbb0553fd,
+       0x0046b034,
+       0xbbd81bf4,
        0x65b60076,
        0x9450f904,
        0x56bb0465,
        0xfd50bd02,
        0x50fc0475,
-       0x0a3f21f5,
-/* 0x0adf: i2c_addr_done */
-       0xf80464b6,
-/* 0x0ae1: i2c_acquire_addr */
-       0xf8cec700,
-       0xb702e4b6,
-       0x980d1ce0,
-       0x00f800ee,
-/* 0x0af0: i2c_acquire */
-       0x0ae121f5,
-       0xf00421f4,
-       0x21f403d9,
-/* 0x0aff: i2c_release */
-       0xf500f83f,
-       0xf40ae121,
-       0xdaf00421,
-       0x3f21f403,
-/* 0x0b0e: i2c_recv */
-       0x32f400f8,
-       0xf8c1c701,
-       0xb00214b6,
-       0x1ff52816,
-       0x13a0013a,
-       0x32980cf4,
-       0xcc13a000,
-       0x0031980c,
-       0xf90231f4,
-       0xf9e0f9d0,
-       0x0067f1d0,
-       0x0063f100,
-       0x01679210,
+       0x0b1021f5,
+       0xf40464b6,
+       0x76bb0f11,
+       0x0136b000,
+       0xf4061bf4,
+/* 0x0c02: i2c_put_byte_done */
+       0x00f80132,
+/* 0x0c04: i2c_addr */
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0xf021f550,
+       0x4021f550,
        0x0464b60a,
-       0xd6b0d0fc,
-       0xb31bf500,
-       0x0057f000,
-       0xb60076bb,
-       0x50f90465,
-       0xbb046594,
-       0x50bd0256,
-       0xfc0475fd,
-       0x9a21f550,
-       0x0464b60a,
-       0x00d011f5,
-       0xbbe0c5c7,
-       0x65b60076,
-       0x9450f904,
-       0x56bb0465,
-       0xfd50bd02,
-       0x50fc0475,
-       0x0a3f21f5,
-       0xf50464b6,
-       0xf000ad11,
-       0x76bb0157,
+       0xe72911f4,
+       0xb6012ec3,
+       0x53fd0134,
+       0x0076bb05,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b60ba9,
+/* 0x0c49: i2c_addr_done */
+/* 0x0c4b: i2c_acquire_addr */
+       0xc700f804,
+       0xe4b6f8ce,
+       0x24e0b702,
+       0x00ee980d,
+/* 0x0c5a: i2c_acquire */
+       0x21f500f8,
+       0x21f40c4b,
+       0x03d9f004,
+       0xf83f21f4,
+/* 0x0c69: i2c_release */
+       0x4b21f500,
+       0x0421f40c,
+       0xf403daf0,
+       0x00f83f21,
+/* 0x0c78: i2c_recv */
+       0xc70132f4,
+       0x14b6f8c1,
+       0x2816b002,
+       0x013a1ff5,
+       0x0cfc13a0,
+       0xa0003298,
+       0x980cd413,
+       0x31f40031,
+       0xf9d0f902,
+       0xf1d0f9e0,
+       0xf1000067,
+       0x92100063,
+       0x76bb0167,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb60a9a21,
-       0x11f50464,
-       0x76bb008a,
+       0xb60c5a21,
+       0xd0fc0464,
+       0xf500d6b0,
+       0xf000b31b,
+       0x76bb0057,
        0x0465b600,
        0x659450f9,
        0x0256bb04,
        0x75fd50bd,
        0xf550fc04,
-       0xb609ed21,
-       0x11f40464,
-       0xe05bcb6a,
+       0xb60c0421,
+       0x11f50464,
+       0xc5c700d0,
+       0x0076bbe0,
+       0xf90465b6,
+       0x04659450,
+       0xbd0256bb,
+       0x0475fd50,
+       0x21f550fc,
+       0x64b60ba9,
+       0xad11f504,
+       0x0157f000,
        0xb60076bb,
        0x50f90465,
        0xbb046594,
        0x50bd0256,
        0xfc0475fd,
-       0x3221f550,
-       0x0464b609,
-       0xbd025bb9,
-       0x430ef474,
-/* 0x0c14: i2c_recv_not_rd08 */
-       0xf401d6b0,
-       0x57f03d1b,
-       0x9a21f500,
-       0x3311f40a,
-       0xf5e0c5c7,
-       0xf40a3f21,
-       0x57f02911,
-       0x9a21f500,
-       0x1f11f40a,
-       0xf5e0b5c7,
-       0xf40a3f21,
-       0x21f51511,
-       0x74bd0932,
-       0xf408c5c7,
-       0x32f4091b,
-       0x030ef402,
-/* 0x0c54: i2c_recv_not_wr08 */
-/* 0x0c54: i2c_recv_done */
-       0xf5f8cec7,
-       0xfc0aff21,
-       0xf4d0fce0,
-       0x7cb90a12,
-       0x3721f502,
-/* 0x0c69: i2c_recv_exit */
-/* 0x0c6b: i2c_init */
-       0xf800f803,
-/* 0x0c6d: test_recv */
-       0xd817f100,
-       0x0614b605,
-       0xb60011cf,
-       0x07f10110,
-       0x04b605d8,
-       0x0001d006,
-       0xe7f104bd,
-       0xe3f1d900,
-       0x21f5134f,
-       0x00f80257,
-/* 0x0c94: test_init */
-       0x0800e7f1,
-       0x025721f5,
-/* 0x0c9e: idle_recv */
-       0x00f800f8,
-/* 0x0ca0: idle */
-       0xf10031f4,
-       0xb605d417,
+       0x0421f550,
+       0x0464b60c,
+       0x008a11f5,
+       0xb60076bb,
+       0x50f90465,
+       0xbb046594,
+       0x50bd0256,
+       0xfc0475fd,
+       0x5721f550,
+       0x0464b60b,
+       0xcb6a11f4,
+       0x76bbe05b,
+       0x0465b600,
+       0x659450f9,
+       0x0256bb04,
+       0x75fd50bd,
+       0xf550fc04,
+       0xb60a9c21,
+       0x5bb90464,
+       0xf474bd02,
+/* 0x0d7e: i2c_recv_not_rd08 */
+       0xd6b0430e,
+       0x3d1bf401,
+       0xf50057f0,
+       0xf40c0421,
+       0xc5c73311,
+       0xa921f5e0,
+       0x2911f40b,
+       0xf50057f0,
+       0xf40c0421,
+       0xb5c71f11,
+       0xa921f5e0,
+       0x1511f40b,
+       0x0a9c21f5,
+       0xc5c774bd,
+       0x091bf408,
+       0xf40232f4,
+/* 0x0dbe: i2c_recv_not_wr08 */
+/* 0x0dbe: i2c_recv_done */
+       0xcec7030e,
+       0x6921f5f8,
+       0xfce0fc0c,
+       0x0a12f4d0,
+       0xf5027cb9,
+/* 0x0dd3: i2c_recv_exit */
+       0xf8033721,
+/* 0x0dd5: i2c_init */
+/* 0x0dd7: test_recv */
+       0xf100f800,
+       0xb605d817,
        0x11cf0614,
        0x0110b600,
-       0x05d407f1,
+       0x05d807f1,
        0xd00604b6,
        0x04bd0001,
-/* 0x0cbc: idle_loop */
-       0xf45817f0,
-/* 0x0cc2: idle_proc */
-/* 0x0cc2: idle_proc_exec */
-       0x10f90232,
-       0xf5021eb9,
-       0xfc034021,
-       0x0911f410,
-       0xf40231f4,
-/* 0x0cd6: idle_proc_next */
-       0x10b6ef0e,
-       0x061fb858,
-       0xf4e61bf4,
-       0x28f4dd02,
-       0xbb0ef400,
+       0xd900e7f1,
+       0x134fe3f1,
+       0x025721f5,
+/* 0x0dfe: test_init */
+       0xe7f100f8,
+       0x21f50800,
+       0x00f80257,
+/* 0x0e08: idle_recv */
+/* 0x0e0a: idle */
+       0x31f400f8,
+       0xd417f100,
+       0x0614b605,
+       0xb60011cf,
+       0x07f10110,
+       0x04b605d4,
+       0x0001d006,
+/* 0x0e26: idle_loop */
+       0x17f004bd,
+       0x0232f458,
+/* 0x0e2c: idle_proc */
+/* 0x0e2c: idle_proc_exec */
+       0x1eb910f9,
+       0x4021f502,
+       0xf410fc03,
+       0x31f40911,
+       0xef0ef402,
+/* 0x0e40: idle_proc_next */
+       0xb85810b6,
+       0x1bf4061f,
+       0xdd02f4e6,
+       0xf40028f4,
+       0x0000bb0e,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
+       0x00000000,
        0x00000000,
        0x00000000,
        0x00000000,
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/os.h 
b/drm/nouveau/nvkm/subdev/pmu/fuc/os.h
index c8b06cb..53508d9 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/os.h
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/os.h
@@ -49,4 +49,8 @@
 #define I2C__MSG_DATA0_WR08_REG 0:7
 #define I2C__MSG_DATA1_WR08_VAL 0:7
 
+
+/* PERF: message identifiers */
+#define PERF_MSG_LOAD 1
+
 #endif
diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc 
b/drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc
index 38eadf7..901557d 100644
--- a/drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc
+++ b/drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc
@@ -30,6 +30,18 @@ process(PROC_PERF, #perf_init, #perf_recv)
  * PERF data segment
  *****************************************************************************/
 #ifdef INCLUDE_DATA
+perf_attr_start:
+// parameters
+perf_polling_period_us: .b32 100000
+
+// engine usage percentage
+perf_eng_gr:   .b8 0
+perf_eng_vdec: .b8 0
+perf_eng_mc:   .b8 0
+#if NVKM_PPWR_CHIPSET >= GF100
+perf_eng_pcie: .b8 0
+#endif
+.align 4
 #endif
 
 /******************************************************************************
@@ -46,6 +58,67 @@ process(PROC_PERF, #perf_init, #perf_recv)
 // $r11 - data1
 // $r0  - zero
 perf_recv:
+       imm32($r10, PROC_HOST)
+       cmp b32 $r14 $r10
+       bra ne #perf_recv_not_host
+               cmp b32 $r13 PERF_MSG_LOAD
+               bra ne #perf_recv_exit
+                       clear b32 $r11
+                       clear b32 $r12
+#if NVKM_PPWR_CHIPSET >= GF100
+                       ld(b8, $r12, #perf_eng_pcie)
+                       shl b32 $r12 8
+#endif
+                       ld(b8, $r12, #perf_eng_mc)
+                       shl b32 $r12 8
+                       ld(b8, $r12, #perf_eng_vdec)
+                       shl b32 $r12 8
+                       ld(b8, $r12, #perf_eng_gr)
+                       call(send)
+                       bra #perf_recv_exit
+perf_recv_not_host:
+       call(perf_counter_readout)
+       ld(b32, $r14, #perf_polling_period_us)
+       call #ticks_from_us
+       call(timer)
+perf_recv_exit:
+       ret
+
+// description
+//
+// $r15 - current (perf)
+// $r0  - zero
+perf_counter_readout:
+       nv_iord($r14, NV_PPWR_COUNTER_COUNT(0))
+       div $r14 $r14 0xff
+
+       nv_iord($r13, NV_PPWR_COUNTER_COUNT(1))
+       div $r13 $r13 $r14
+       st(b8, #perf_eng_gr, $r13)
+
+       nv_iord($r13, NV_PPWR_COUNTER_COUNT(2))
+       div $r13 $r13 $r14
+       st(b8, #perf_eng_vdec, $r13)
+
+       nv_iord($r13, NV_PPWR_COUNTER_COUNT(3))
+       div $r13 $r13 $r14
+       st(b8, #perf_eng_mc, $r13)
+
+#if NVKM_PPWR_CHIPSET >= GF100
+       nv_iord($r13, NV_PPWR_COUNTER_COUNT(4))
+       div $r13 $r13 $r14
+       st(b8, #perf_eng_pcie, $r13)
+#endif
+
+       // reset the counters
+       imm32($r14, NV_PPWR_COUNTER_COUNT_RESET)
+       nv_iowr(NV_PPWR_COUNTER_COUNT(0), $r14)
+       nv_iowr(NV_PPWR_COUNTER_COUNT(1), $r14)
+       nv_iowr(NV_PPWR_COUNTER_COUNT(2), $r14)
+       nv_iowr(NV_PPWR_COUNTER_COUNT(3), $r14)
+#if NVKM_PPWR_CHIPSET >= GF100
+       nv_iowr(NV_PPWR_COUNTER_COUNT(4), $r14)
+#endif
        ret
 
 // description
@@ -53,5 +126,69 @@ perf_recv:
 // $r15 - current (perf)
 // $r0  - zero
 perf_init:
+       // set up the total ticks counter first
+       imm32($r14, NV_PPWR_COUNTER_MODE_ALWAYS)
+       nv_iowr(NV_PPWR_COUNTER_MODE(0), $r14)
+
+       // set up the other counters, with fermi there are more
+       imm32($r14, NV_PPWR_COUNTER_MODE_IF_NOT_ALL)
+       nv_iowr(NV_PPWR_COUNTER_MODE(1), $r14)
+       nv_iowr(NV_PPWR_COUNTER_MODE(2), $r14)
+       nv_iowr(NV_PPWR_COUNTER_MODE(3), $r14)
+#if NVKM_PPWR_CHIPSET >= GF100
+       nv_iowr(NV_PPWR_COUNTER_MODE(4), $r14)
+#endif
+
+       // core load counter
+       imm32($r14,
+                 NV_PPWR_COUNTER_SIG_GR
+               | NV_PPWR_COUNTER_SIG_GR_GPC
+               | NV_PPWR_COUNTER_SIG_GR_ROP
+#if NVKM_PPWR_CHIPSET >= GF100
+               | NV_PPWR_COUNTER_SIG_GR_HUB
+               | NV_PPWR_COUNTER_SIG_PCOPY0
+               | NV_PPWR_COUNTER_SIG_PCOPY1
+#endif
+#if NVKM_PPWR_CHIPSET >= GK104
+               | NV_PPWR_COUNTER_SIG_PCOPY2
+#endif
+       )
+       nv_iowr(NV_PPWR_COUNTER_MASK(1), $r14)
+
+       // video load counter
+       imm32($r14,
+                 NV_PPWR_COUNTER_SIG_PVLD
+               | NV_PPWR_COUNTER_SIG_PPDEC
+               | NV_PPWR_COUNTER_SIG_PPPP
+#if NVKM_PPWR_CHIPSET >= GK104
+               | NV_PPWR_COUNTER_SIG_PVENC
+#endif
+       )
+       nv_iowr(NV_PPWR_COUNTER_MASK(2), $r14)
+
+       // memory load counter
+       imm32($r14,
+#if NVKM_PPWR_CHIPSET >= GF100
+                 NV_PPWR_COUNTER_SIG_BFB_PART0_REQ
+#else
+                 NV_PPWR_COUNTER_SIG_FB_PART0_REQ
+#endif
+       )
+       nv_iowr(NV_PPWR_COUNTER_MASK(3), $r14)
+
+       // pcie load counter
+#if NVKM_PPWR_CHIPSET >= GF100
+       imm32($r14, NV_PPWR_COUNTER_SIG_PCIE)
+       nv_iowr(NV_PPWR_COUNTER_MASK(4), $r14)
+#endif
+
+       // initial read out
+       call(perf_counter_readout)
+
+       // schedule the next read out
+       ld(b32, $r14, #perf_polling_period_us)
+       call #ticks_from_us
+       call(timer)
+
        ret
 #endif
-- 
2.7.1

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to