[Nouveau] [PATCH 3/4] subdev/pmu/fuc: implement perf

Karol Herbst
Mon, 26 Oct 2015 18:13:08 -0000

From: Karol Herbst <git at karolherbst.de>

---
 drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h | 788 +++++++++++++++------------
 drm/nouveau/nvkm/subdev/pmu/fuc/gf119.fuc4.h | 740 ++++++++++++++-----------
 drm/nouveau/nvkm/subdev/pmu/fuc/gk104.fuc4.h | 740 ++++++++++++++-----------
 drm/nouveau/nvkm/subdev/pmu/fuc/gk208.fuc5.h | 710 ++++++++++++++----------
 drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h | 755 ++++++++++++++-----------
 drm/nouveau/nvkm/subdev/pmu/fuc/os.h         |   4 +
 drm/nouveau/nvkm/subdev/pmu/fuc/perf.fuc     | 148 +++++
 7 files changed, 2267 insertions(+), 1618 deletions(-)

diff --git a/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h
b/drm/nouveau/nvkm/subdev/pmu/fuc/gf100.fuc3.h
index 302557c..cd1c8e5 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,
-	0x00000762,
+	0x00000875,
 	0x00000760,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@ uint32_t gf100_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000b92,
-	0x00000a35,
+	0x00000d51,
+	0x00000bf4,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@ uint32_t gf100_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000bbb,
-	0x00000b94,
+	0x00000d7a,
+	0x00000d53,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@ uint32_t gf100_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x00000bc7,
-	0x00000bc5,
+	0x00000d86,
+	0x00000d84,
 	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[] = {
@@ -1456,400 +1462,468 @@ uint32_t gf100_pmu_code[] = {
 /* 0x075e: memx_init */
 	0x00f800f8,
 /* 0x0760: perf_recv */
-/* 0x0762: perf_init */
-	0x00f800f8,
-/* 0x0764: i2c_drive_scl */
-	0xf40036b0,
-	0x07f1110b,
-	0x04b607e0,
-	0x0001d006,
-	0x00f804bd,
-/* 0x0778: i2c_drive_scl_lo */
-	0x07e407f1,
+	0xa7f110f9,
+	0xa3f14f48,
+	0xeab85453,
+	0x441bf406,
+	0xf401d6b0,
+	0x0ef4060b,
+/* 0x0779: perf_load */
+	0xbdb4bd50,
+	0xd307f1c4,
+	0x000c180c,
+	0xc4b604bd,
+	0xd207f108,
+	0x000c180c,
+	0xc4b604bd,
+	0xd107f108,
+	0x000c180c,
+	0xc4b604bd,
+	0xd007f108,
+	0x000c180c,
+	0x21f504bd,
+	0x0ef40342,
+/* 0x07b1: perf_recv_not_host */
+	0xca21f518,
+	0xcc07f107,
+	0x000e980c,
+	0x21f504bd,
+	0x21f50236,
+/* 0x07c6: perf_recv_exit */
+	0x10fc0262,
+/* 0x07ca: perf_counter_readout */
+	0xe7f100f8,
+	0xe4b60508,
+	0x00eecf06,
+	0xf1ffeecc,
+	0xb60518d7,
+	0xddcf06d4,
+	0xdcdeff00,
+	0x0cd007f1,
+	0xbd000d00,
+	0x28d7f104,
+	0x06d4b605,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d000cd1,
+	0xf104bd00,
+	0xb60538d7,
+	0xddcf06d4,
+	0xdcdeff00,
+	0x0cd207f1,
+	0xbd000d00,
+	0x48d7f104,
+	0x06d4b605,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d000cd3,
+	0xf104bd00,
+	0xf10000e7,
+	0xf18000e3,
+	0xb6050807,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6051807,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6052807,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6053807,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6054807,
+	0x0ed00604,
+	0xf804bd00,
+/* 0x0875: perf_init */
+	0x03e7f100,
+	0x00e3f000,
+	0x050c07f1,
 	0xd00604b6,
-	0x04bd0001,
-/* 0x0786: i2c_drive_sda */
-	0x36b000f8,
-	0x110bf400,
-	0x07e007f1,
+	0x04bd000e,
+	0x0002e7f1,
+	0xf100e3f0,
+	0xb6051c07,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6052c07,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6053c07,
+	0x0ed00604,
+	0xf104bd00,
+	0xb6054c07,
+	0x0ed00604,
+	0xf104bd00,
+	0xf0000fe7,
+	0x07f118e3,
+	0x04b60514,
+	0x000ed006,
+	0xe7f104bd,
+	0xe3f00070,
+	0x2407f100,
+	0x0604b605,
+	0xbd000ed0,
+	0x80e7f104,
+	0x00e3f000,
+	0x053407f1,
 	0xd00604b6,
-	0x04bd0002,
-/* 0x079a: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x04b607e4,
-	0x0002d006,
-	0x00f804bd,
-/* 0x07a8: i2c_sense_scl */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0431fd00,
-	0xf4060bf4,
-/* 0x07be: i2c_sense_scl_done */
-	0x00f80131,
-/* 0x07c0: i2c_sense_sda */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0432fd00,
-	0xf4060bf4,
-/* 0x07d6: i2c_sense_sda_done */
-	0x00f80131,
-/* 0x07d8: i2c_raise_scl */
-	0x47f140f9,
-	0x37f00898,
-	0x6421f501,
-/* 0x07e5: i2c_raise_scl_wait */
-	0xe8e7f107,
-	0x7f21f403,
-	0x07a821f5,
-	0xb60901f4,
-	0x1bf40142,
-/* 0x07f9: i2c_raise_scl_done */
-	0xf840fcef,
-/* 0x07fd: i2c_start */
-	0xa821f500,
-	0x0d11f407,
-	0x07c021f5,
-	0xf40611f4,
-/* 0x080e: i2c_start_rep */
-	0x37f0300e,
-	0x6421f500,
-	0x0137f007,
-	0x078621f5,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xd821f550,
-	0x0464b607,
-/* 0x083b: i2c_start_send */
-	0xf01f11f4,
-	0x21f50037,
-	0xe7f10786,
-	0x21f41388,
-	0x0037f07f,
-	0x076421f5,
-	0x1388e7f1,
-/* 0x0857: i2c_start_out */
-	0xf87f21f4,
-/* 0x0859: i2c_stop */
-	0x0037f000,
-	0x076421f5,
-	0xf50037f0,
-	0xf1078621,
-	0xf403e8e7,
-	0x37f07f21,
-	0x6421f501,
-	0x88e7f107,
-	0x7f21f413,
-	0xf50137f0,
-	0xf1078621,
-	0xf41388e7,
-	0x00f87f21,
-/* 0x088c: i2c_bitw */
-	0x078621f5,
+	0x04bd000e,
+	0x0000e7f1,
+	0x2000e3f1,
+	0x054407f1,
+	0xd00604b6,
+	0x04bd000e,
+	0x07ca21f5,
+	0x0ccc07f1,
+	0xbd000e98,
+	0x3621f504,
+	0x6221f502,
+/* 0x0923: i2c_drive_scl */
+	0xb000f802,
+	0x0bf40036,
+	0xe007f111,
+	0x0604b607,
+	0xbd0001d0,
+/* 0x0937: i2c_drive_scl_lo */
+	0xf100f804,
+	0xb607e407,
+	0x01d00604,
+	0xf804bd00,
+/* 0x0945: i2c_drive_sda */
+	0x0036b000,
+	0xf1110bf4,
+	0xb607e007,
+	0x02d00604,
+	0xf804bd00,
+/* 0x0959: i2c_drive_sda_lo */
+	0xe407f100,
+	0x0604b607,
+	0xbd0002d0,
+/* 0x0967: i2c_sense_scl */
+	0xf400f804,
+	0x37f10132,
+	0x34b607c4,
+	0x0033cf06,
+	0xf40431fd,
+	0x31f4060b,
+/* 0x097d: i2c_sense_scl_done */
+/* 0x097f: i2c_sense_sda */
+	0xf400f801,
+	0x37f10132,
+	0x34b607c4,
+	0x0033cf06,
+	0xf40432fd,
+	0x31f4060b,
+/* 0x0995: i2c_sense_sda_done */
+/* 0x0997: i2c_raise_scl */
+	0xf900f801,
+	0x9847f140,
+	0x0137f008,
+	0x092321f5,
+/* 0x09a4: i2c_raise_scl_wait */
 	0x03e8e7f1,
-	0xbb7f21f4,
+	0xf57f21f4,
+	0xf4096721,
+	0x42b60901,
+	0xef1bf401,
+/* 0x09b8: i2c_raise_scl_done */
+	0x00f840fc,
+/* 0x09bc: i2c_start */
+	0x096721f5,
+	0xf50d11f4,
+	0xf4097f21,
+	0x0ef40611,
+/* 0x09cd: i2c_start_rep */
+	0x0037f030,
+	0x092321f5,
+	0xf50137f0,
+	0xbb094521,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x07d821f5,
+	0x099721f5,
 	0xf40464b6,
-	0xe7f11811,
-	0x21f41388,
-	0x0037f07f,
-	0x076421f5,
+/* 0x09fa: i2c_start_send */
+	0x37f01f11,
+	0x4521f500,
+	0x88e7f109,
+	0x7f21f413,
+	0xf50037f0,
+	0xf1092321,
+	0xf41388e7,
+/* 0x0a16: i2c_start_out */
+	0x00f87f21,
+/* 0x0a18: i2c_stop */
+	0xf50037f0,
+	0xf0092321,
+	0x21f50037,
+	0xe7f10945,
+	0x21f403e8,
+	0x0137f07f,
+	0x092321f5,
 	0x1388e7f1,
-/* 0x08cb: i2c_bitw_out */
-	0xf87f21f4,
-/* 0x08cd: i2c_bitr */
-	0x0137f000,
-	0x078621f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07d821f5,
-	0xf40464b6,
-	0x21f51b11,
-	0x37f007c0,
-	0x6421f500,
-	0x88e7f107,
+	0xf07f21f4,
+	0x21f50137,
+	0xe7f10945,
+	0x21f41388,
+/* 0x0a4b: i2c_bitw */
+	0xf500f87f,
+	0xf1094521,
+	0xf403e8e7,
+	0x76bb7f21,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6099721,
+	0x11f40464,
+	0x88e7f118,
 	0x7f21f413,
-	0xf4013cf0,
-/* 0x0912: i2c_bitr_done */
-	0x00f80131,
-/* 0x0914: i2c_get_byte */
-	0xf00057f0,
-/* 0x091a: i2c_get_byte_next */
-	0x54b60847,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b608cd,
-	0x2b11f404,
-	0xb60553fd,
-	0x1bf40142,
-	0x0137f0d8,
+	0xf50037f0,
+	0xf1092321,
+	0xf41388e7,
+/* 0x0a8a: i2c_bitw_out */
+	0x00f87f21,
+/* 0x0a8c: i2c_bitr */
+	0xf50137f0,
+	0xf1094521,
+	0xf403e8e7,
+	0x76bb7f21,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6099721,
+	0x11f40464,
+	0x7f21f51b,
+	0x0037f009,
+	0x092321f5,
+	0x1388e7f1,
+	0xf07f21f4,
+	0x31f4013c,
+/* 0x0ad1: i2c_bitr_done */
+/* 0x0ad3: i2c_get_byte */
+	0xf000f801,
+	0x47f00057,
+/* 0x0ad9: i2c_get_byte_next */
+	0x0154b608,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
 	0x8c21f550,
-	0x0464b608,
-/* 0x0964: i2c_get_byte_done */
-/* 0x0966: i2c_put_byte */
-	0x47f000f8,
-/* 0x0969: i2c_put_byte_next */
-	0x0142b608,
-	0xbb3854ff,
+	0x0464b60a,
+	0xfd2b11f4,
+	0x42b60553,
+	0xd81bf401,
+	0xbb0137f0,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x0a4b21f5,
+/* 0x0b23: i2c_get_byte_done */
+	0xf80464b6,
+/* 0x0b25: i2c_put_byte */
+	0x0847f000,
+/* 0x0b28: i2c_put_byte_next */
+	0xff0142b6,
+	0x76bb3854,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb60a4b21,
+	0x11f40464,
+	0x0046b034,
+	0xbbd81bf4,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x088c21f5,
+	0x0a8c21f5,
 	0xf40464b6,
-	0x46b03411,
-	0xd81bf400,
+	0x76bb0f11,
+	0x0136b000,
+	0xf4061bf4,
+/* 0x0b7e: i2c_put_byte_done */
+	0x00f80132,
+/* 0x0b80: i2c_addr */
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0xcd21f550,
-	0x0464b608,
-	0xbb0f11f4,
-	0x36b00076,
-	0x061bf401,
-/* 0x09bf: i2c_put_byte_done */
-	0xf80132f4,
-/* 0x09c1: i2c_addr */
-	0x0076bb00,
+	0xbc21f550,
+	0x0464b609,
+	0xe72911f4,
+	0xb6012ec3,
+	0x53fd0134,
+	0x0076bb05,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b607fd,
-	0x2911f404,
-	0x012ec3e7,
-	0xfd0134b6,
-	0x76bb0553,
+	0x64b60b25,
+/* 0x0bc5: i2c_addr_done */
+/* 0x0bc7: i2c_acquire_addr */
+	0xc700f804,
+	0xe4b6f8ce,
+	0x24e0b702,
+	0x00ee980d,
+/* 0x0bd6: i2c_acquire */
+	0x21f500f8,
+	0x21f40bc7,
+	0x03d9f004,
+	0xf83f21f4,
+/* 0x0be5: i2c_release */
+	0xc721f500,
+	0x0421f40b,
+	0xf403daf0,
+	0x00f83f21,
+/* 0x0bf4: i2c_recv */
+	0xc70132f4,
+	0x14b6f8c1,
+	0x2816b002,
+	0x013a1ff5,
+	0x0cfc13a0,
+	0xa0003298,
+	0x980cd413,
+	0x31f40031,
+	0xf9d0f902,
+	0xf1d0f9e0,
+	0xf1000067,
+	0x92100063,
+	0x76bb0167,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6096621,
-/* 0x0a06: i2c_addr_done */
-	0x00f80464,
-/* 0x0a08: i2c_acquire_addr */
-	0xb6f8cec7,
-	0xe0b702e4,
-	0xee980d1c,
-/* 0x0a17: i2c_acquire */
-	0xf500f800,
-	0xf40a0821,
-	0xd9f00421,
-	0x3f21f403,
-/* 0x0a26: i2c_release */
-	0x21f500f8,
-	0x21f40a08,
-	0x03daf004,
-	0xf83f21f4,
-/* 0x0a35: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xf413a001,
-	0x0032980c,
-	0x0ccc13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x0a1721f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x09c121f5,
-	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0xb60bd621,
+	0xd0fc0464,
+	0xf500d6b0,
+	0xf000b31b,
+	0x76bb0057,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6096621,
+	0xb60b8021,
 	0x11f50464,
-	0x57f000ad,
-	0x0076bb01,
+	0xc5c700d0,
+	0x0076bbe0,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b609c1,
-	0x8a11f504,
-	0x0076bb00,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60914,
-	0x6a11f404,
-	0xbbe05bcb,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x085921f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x0b3b: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x09c121f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40966,
-	0x0057f029,
-	0x09c121f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40966,
-	0x5921f515,
-	0xc774bd08,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x0b7b: i2c_recv_not_wr08 */
-/* 0x0b7b: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc0a26,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x034221f5,
-/* 0x0b90: i2c_recv_exit */
-/* 0x0b92: i2c_init */
-	0x00f800f8,
-/* 0x0b94: test_recv */
-	0x05d817f1,
-	0xcf0614b6,
-	0x10b60011,
-	0xd807f101,
-	0x0604b605,
-	0xbd0001d0,
-	0x00e7f104,
-	0x4fe3f1d9,
-	0x6221f513,
-/* 0x0bbb: test_init */
-	0xf100f802,
-	0xf50800e7,
-	0xf8026221,
-/* 0x0bc5: idle_recv */
-/* 0x0bc7: idle */
-	0xf400f800,
-	0x17f10031,
-	0x14b605d4,
-	0x0011cf06,
-	0xf10110b6,
-	0xb605d407,
-	0x01d00604,
-/* 0x0be3: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x0be9: idle_proc */
-/* 0x0be9: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc034b,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x0bfd: idle_proc_next */
-	0x5810b6ef,
-	0xf4061fb8,
-	0x02f4e61b,
-	0x0028f4dd,
-	0x00bb0ef4,
-	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,
+	0x64b60b25,
+	0xad11f504,
+	0x0157f000,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x8021f550,
+	0x0464b60b,
+	0x008a11f5,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0xd321f550,
+	0x0464b60a,
+	0xcb6a11f4,
+	0x76bbe05b,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb60a1821,
+	0x5bb90464,
+	0xf474bd02,
+/* 0x0cfa: i2c_recv_not_rd08 */
+	0xd6b0430e,
+	0x3d1bf401,
+	0xf50057f0,
+	0xf40b8021,
+	0xc5c73311,
+	0x2521f5e0,
+	0x2911f40b,
+	0xf50057f0,
+	0xf40b8021,
+	0xb5c71f11,
+	0x2521f5e0,
+	0x1511f40b,
+	0x0a1821f5,
+	0xc5c774bd,
+	0x091bf408,
+	0xf40232f4,
+/* 0x0d3a: i2c_recv_not_wr08 */
+/* 0x0d3a: i2c_recv_done */
+	0xcec7030e,
+	0xe521f5f8,
+	0xfce0fc0b,
+	0x0a12f4d0,
+	0xf5027cb9,
+/* 0x0d4f: i2c_recv_exit */
+	0xf8034221,
+/* 0x0d51: i2c_init */
+/* 0x0d53: test_recv */
+	0xf100f800,
+	0xb605d817,
+	0x11cf0614,
+	0x0110b600,
+	0x05d807f1,
+	0xd00604b6,
+	0x04bd0001,
+	0xd900e7f1,
+	0x134fe3f1,
+	0x026221f5,
+/* 0x0d7a: test_init */
+	0xe7f100f8,
+	0x21f50800,
+	0x00f80262,
+/* 0x0d84: idle_recv */
+/* 0x0d86: idle */
+	0x31f400f8,
+	0xd417f100,
+	0x0614b605,
+	0xb60011cf,
+	0x07f10110,
+	0x04b605d4,
+	0x0001d006,
+/* 0x0da2: idle_loop */
+	0x17f004bd,
+	0x0232f458,
+/* 0x0da8: idle_proc */
+/* 0x0da8: idle_proc_exec */
+	0x1eb910f9,
+	0x4b21f502,
+	0xf410fc03,
+	0x31f40911,
+	0xef0ef402,
+/* 0x0dbc: idle_proc_next */
+	0xb85810b6,
+	0x1bf4061f,
+	0xdd02f4e6,
+	0xf40028f4,
+	0x0000bb0e,
 	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 31552af..6fc2290 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,
-	0x0000068f,
+	0x00000784,
 	0x0000068d,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@ uint32_t gf119_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000aaa,
-	0x0000094d,
+	0x00000c30,
+	0x00000ad3,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@ uint32_t gf119_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000acd,
-	0x00000aac,
+	0x00000c53,
+	0x00000c32,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@ uint32_t gf119_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x00000ad9,
-	0x00000ad7,
+	0x00000c5f,
+	0x00000c5d,
 	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[] = {
@@ -1397,378 +1403,446 @@ uint32_t gf119_pmu_code[] = {
 /* 0x068b: memx_init */
 	0xf800f8d8,
 /* 0x068d: perf_recv */
-/* 0x068f: perf_init */
-	0xf800f800,
-/* 0x0691: i2c_drive_scl */
-	0x0036b000,
-	0xf10e0bf4,
-	0xd007e007,
-	0x04bd0001,
-/* 0x06a2: i2c_drive_scl_lo */
-	0x07f100f8,
-	0x01d007e4,
-	0xf804bd00,
-/* 0x06ad: i2c_drive_sda */
-	0x0036b000,
-	0xf10e0bf4,
-	0xd007e007,
-	0x04bd0002,
-/* 0x06be: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x02d007e4,
-	0xf804bd00,
-/* 0x06c9: i2c_sense_scl */
-	0x0132f400,
-	0x07c437f1,
-	0xfd0033cf,
-	0x0bf40431,
-	0x0131f406,
-/* 0x06dc: i2c_sense_scl_done */
-/* 0x06de: i2c_sense_sda */
-	0x32f400f8,
-	0xc437f101,
-	0x0033cf07,
-	0xf40432fd,
-	0x31f4060b,
-/* 0x06f1: i2c_sense_sda_done */
-/* 0x06f3: i2c_raise_scl */
-	0xf900f801,
-	0x9847f140,
-	0x0137f008,
-	0x069121f5,
-/* 0x0700: i2c_raise_scl_wait */
-	0x03e8e7f1,
-	0xf56721f4,
-	0xf406c921,
-	0x42b60901,
-	0xef1bf401,
-/* 0x0714: i2c_raise_scl_done */
-	0x00f840fc,
-/* 0x0718: i2c_start */
-	0x06c921f5,
-	0xf50d11f4,
-	0xf406de21,
-	0x0ef40611,
-/* 0x0729: i2c_start_rep */
-	0x0037f030,
-	0x069121f5,
-	0xf50137f0,
-	0xbb06ad21,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x06f321f5,
-	0xf40464b6,
-/* 0x0756: i2c_start_send */
-	0x37f01f11,
-	0xad21f500,
-	0x88e7f106,
-	0x6721f413,
+	0xf110f900,
+	0xf14f48a7,
+	0xb85453a3,
+	0x1bf406ea,
+	0x01d6b044,
+	0xf4060bf4,
+/* 0x06a6: perf_load */
+	0xb4bd500e,
+	0x07f1c4bd,
+	0x0c180cd3,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd2,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd1,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd0,
+	0xf504bd00,
+	0xf402f121,
+/* 0x06de: perf_recv_not_host */
+	0x21f5180e,
+	0x07f106f7,
+	0x0e980ccc,
+	0xf504bd00,
+	0xf501f721,
+/* 0x06f3: perf_recv_exit */
+	0xfc022321,
+/* 0x06f7: perf_counter_readout */
+	0xf100f810,
+	0xcf0508e7,
+	0xeecc00ee,
+	0x18d7f1ff,
+	0x00ddcf05,
+	0xf1dcdeff,
+	0x000cd007,
+	0x04bd000d,
+	0x0528d7f1,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d000cd1,
+	0xf104bd00,
+	0xcf0538d7,
+	0xdeff00dd,
+	0xd207f1dc,
+	0x000d000c,
+	0xd7f104bd,
+	0xddcf0548,
+	0xdcdeff00,
+	0x0cd307f1,
+	0xbd000d00,
+	0x00e7f104,
+	0x00e3f100,
+	0x0807f180,
+	0x000ed005,
+	0x07f104bd,
+	0x0ed00518,
+	0xf104bd00,
+	0xd0052807,
+	0x04bd000e,
+	0x053807f1,
+	0xbd000ed0,
+	0x4807f104,
+	0x000ed005,
+	0x00f804bd,
+/* 0x0784: perf_init */
+	0x0003e7f1,
+	0xf100e3f0,
+	0xd0050c07,
+	0x04bd000e,
+	0x0002e7f1,
+	0xf100e3f0,
+	0xd0051c07,
+	0x04bd000e,
+	0x052c07f1,
+	0xbd000ed0,
+	0x3c07f104,
+	0x000ed005,
+	0x07f104bd,
+	0x0ed0054c,
+	0xf104bd00,
+	0xf0000fe7,
+	0x07f118e3,
+	0x0ed00514,
+	0xf104bd00,
+	0xf00070e7,
+	0x07f100e3,
+	0x0ed00524,
+	0xf104bd00,
+	0xf00080e7,
+	0x07f100e3,
+	0x0ed00534,
+	0xf104bd00,
+	0xf10000e7,
+	0xf12000e3,
+	0xd0054407,
+	0x04bd000e,
+	0x06f721f5,
+	0x0ccc07f1,
+	0xbd000e98,
+	0xf721f504,
+	0x2321f501,
+/* 0x0817: i2c_drive_scl */
+	0xb000f802,
+	0x0bf40036,
+	0xe007f10e,
+	0x0001d007,
+	0x00f804bd,
+/* 0x0828: i2c_drive_scl_lo */
+	0x07e407f1,
+	0xbd0001d0,
+/* 0x0833: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0xe007f10e,
+	0x0002d007,
+	0x00f804bd,
+/* 0x0844: i2c_drive_sda_lo */
+	0x07e407f1,
+	0xbd0002d0,
+/* 0x084f: i2c_sense_scl */
+	0xf400f804,
+	0x37f10132,
+	0x33cf07c4,
+	0x0431fd00,
+	0xf4060bf4,
+/* 0x0862: i2c_sense_scl_done */
+	0x00f80131,
+/* 0x0864: i2c_sense_sda */
+	0xf10132f4,
+	0xcf07c437,
+	0x32fd0033,
+	0x060bf404,
+/* 0x0877: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x0879: i2c_raise_scl */
+	0xf140f900,
+	0xf0089847,
+	0x21f50137,
+/* 0x0886: i2c_raise_scl_wait */
+	0xe7f10817,
+	0x21f403e8,
+	0x4f21f567,
+	0x0901f408,
+	0xf40142b6,
+/* 0x089a: i2c_raise_scl_done */
+	0x40fcef1b,
+/* 0x089e: i2c_start */
+	0x21f500f8,
+	0x11f4084f,
+	0x6421f50d,
+	0x0611f408,
+/* 0x08af: i2c_start_rep */
+	0xf0300ef4,
+	0x21f50037,
+	0x37f00817,
+	0x3321f501,
+	0x0076bb08,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b60879,
+	0x1f11f404,
+/* 0x08dc: i2c_start_send */
 	0xf50037f0,
-	0xf1069121,
+	0xf1083321,
 	0xf41388e7,
-/* 0x0772: i2c_start_out */
-	0x00f86721,
-/* 0x0774: i2c_stop */
-	0xf50037f0,
-	0xf0069121,
-	0x21f50037,
-	0xe7f106ad,
-	0x21f403e8,
-	0x0137f067,
-	0x069121f5,
-	0x1388e7f1,
+	0x37f06721,
+	0x1721f500,
+	0x88e7f108,
+	0x6721f413,
+/* 0x08f8: i2c_start_out */
+/* 0x08fa: i2c_stop */
+	0x37f000f8,
+	0x1721f500,
+	0x0037f008,
+	0x083321f5,
+	0x03e8e7f1,
 	0xf06721f4,
 	0x21f50137,
-	0xe7f106ad,
+	0xe7f10817,
 	0x21f41388,
-/* 0x07a7: i2c_bitw */
-	0xf500f867,
-	0xf106ad21,
-	0xf403e8e7,
-	0x76bb6721,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb606f321,
-	0x11f40464,
-	0x88e7f118,
-	0x6721f413,
-	0xf50037f0,
-	0xf1069121,
-	0xf41388e7,
-/* 0x07e6: i2c_bitw_out */
-	0x00f86721,
-/* 0x07e8: i2c_bitr */
-	0xf50137f0,
-	0xf106ad21,
-	0xf403e8e7,
-	0x76bb6721,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb606f321,
-	0x11f40464,
-	0xde21f51b,
-	0x0037f006,
-	0x069121f5,
+	0x0137f067,
+	0x083321f5,
 	0x1388e7f1,
-	0xf06721f4,
-	0x31f4013c,
-/* 0x082d: i2c_bitr_done */
-/* 0x082f: i2c_get_byte */
-	0xf000f801,
-	0x47f00057,
-/* 0x0835: i2c_get_byte_next */
-	0x0154b608,
+	0xf86721f4,
+/* 0x092d: i2c_bitw */
+	0x3321f500,
+	0xe8e7f108,
+	0x6721f403,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0xe821f550,
-	0x0464b607,
-	0xfd2b11f4,
-	0x42b60553,
-	0xd81bf401,
-	0xbb0137f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07a721f5,
-/* 0x087f: i2c_get_byte_done */
-	0xf80464b6,
-/* 0x0881: i2c_put_byte */
-	0x0847f000,
-/* 0x0884: i2c_put_byte_next */
-	0xff0142b6,
-	0x76bb3854,
+	0x7921f550,
+	0x0464b608,
+	0xf11811f4,
+	0xf41388e7,
+	0x37f06721,
+	0x1721f500,
+	0x88e7f108,
+	0x6721f413,
+/* 0x096c: i2c_bitw_out */
+/* 0x096e: i2c_bitr */
+	0x37f000f8,
+	0x3321f501,
+	0xe8e7f108,
+	0x6721f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x7921f550,
+	0x0464b608,
+	0xf51b11f4,
+	0xf0086421,
+	0x21f50037,
+	0xe7f10817,
+	0x21f41388,
+	0x013cf067,
+/* 0x09b3: i2c_bitr_done */
+	0xf80131f4,
+/* 0x09b5: i2c_get_byte */
+	0x0057f000,
+/* 0x09bb: i2c_get_byte_next */
+	0xb60847f0,
+	0x76bb0154,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb607a721,
+	0xb6096e21,
 	0x11f40464,
-	0x0046b034,
-	0xbbd81bf4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07e821f5,
-	0xf40464b6,
-	0x76bb0f11,
-	0x0136b000,
-	0xf4061bf4,
-/* 0x08da: i2c_put_byte_done */
-	0x00f80132,
-/* 0x08dc: i2c_addr */
+	0x0553fd2b,
+	0xf40142b6,
+	0x37f0d81b,
+	0x0076bb01,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b6092d,
+/* 0x0a05: i2c_get_byte_done */
+/* 0x0a07: i2c_put_byte */
+	0xf000f804,
+/* 0x0a0a: i2c_put_byte_next */
+	0x42b60847,
+	0x3854ff01,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x1821f550,
-	0x0464b607,
-	0xe72911f4,
-	0xb6012ec3,
-	0x53fd0134,
-	0x0076bb05,
+	0x2d21f550,
+	0x0464b609,
+	0xb03411f4,
+	0x1bf40046,
+	0x0076bbd8,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b60881,
-/* 0x0921: i2c_addr_done */
-/* 0x0923: i2c_acquire_addr */
-	0xc700f804,
-	0xe4b6f8ce,
-	0x14e0b705,
-/* 0x092f: i2c_acquire */
-	0xf500f8d0,
-	0xf4092321,
-	0xd9f00421,
-	0x3321f403,
-/* 0x093e: i2c_release */
-	0x21f500f8,
-	0x21f40923,
-	0x03daf004,
-	0xf83321f4,
-/* 0x094d: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xf413a001,
-	0x0032980c,
-	0x0ccc13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x092f21f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x08dc21f5,
-	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0x64b6096e,
+	0x0f11f404,
+	0xb00076bb,
+	0x1bf40136,
+	0x0132f406,
+/* 0x0a60: i2c_put_byte_done */
+/* 0x0a62: i2c_addr */
+	0x76bb00f8,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6088121,
-	0x11f50464,
-	0x57f000ad,
+	0xb6089e21,
+	0x11f40464,
+	0x2ec3e729,
+	0x0134b601,
+	0xbb0553fd,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x0a0721f5,
+/* 0x0aa7: i2c_addr_done */
+	0xf80464b6,
+/* 0x0aa9: i2c_acquire_addr */
+	0xf8cec700,
+	0xb705e4b6,
+	0xf8d014e0,
+/* 0x0ab5: i2c_acquire */
+	0xa921f500,
+	0x0421f40a,
+	0xf403d9f0,
+	0x00f83321,
+/* 0x0ac4: i2c_release */
+	0x0aa921f5,
+	0xf00421f4,
+	0x21f403da,
+/* 0x0ad3: i2c_recv */
+	0xf400f833,
+	0xc1c70132,
+	0x0214b6f8,
+	0xf52816b0,
+	0xa0013a1f,
+	0x980cfc13,
+	0x13a00032,
+	0x31980cd4,
+	0x0231f400,
+	0xe0f9d0f9,
+	0x67f1d0f9,
+	0x63f10000,
+	0x67921000,
 	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b608dc,
-	0x8a11f504,
+	0x64b60ab5,
+	0xb0d0fc04,
+	0x1bf500d6,
+	0x57f000b3,
 	0x0076bb00,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b6082f,
-	0x6a11f404,
-	0xbbe05bcb,
+	0x64b60a62,
+	0xd011f504,
+	0xe0c5c700,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x0721f550,
+	0x0464b60a,
+	0x00ad11f5,
+	0xbb0157f0,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x077421f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x0a53: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x08dc21f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40881,
-	0x0057f029,
-	0x08dc21f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40881,
-	0x7421f515,
-	0xc774bd07,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x0a93: i2c_recv_not_wr08 */
-/* 0x0a93: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc093e,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x02f121f5,
-/* 0x0aa8: i2c_recv_exit */
-/* 0x0aaa: i2c_init */
-	0x00f800f8,
-/* 0x0aac: test_recv */
-	0x05d817f1,
-	0xb60011cf,
-	0x07f10110,
-	0x01d005d8,
-	0xf104bd00,
-	0xf1d900e7,
-	0xf5134fe3,
+	0x0a6221f5,
+	0xf50464b6,
+	0xbb008a11,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x09b521f5,
+	0xf40464b6,
+	0x5bcb6a11,
+	0x0076bbe0,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b608fa,
+	0x025bb904,
+	0x0ef474bd,
+/* 0x0bd9: i2c_recv_not_rd08 */
+	0x01d6b043,
+	0xf03d1bf4,
+	0x21f50057,
+	0x11f40a62,
+	0xe0c5c733,
+	0x0a0721f5,
+	0xf02911f4,
+	0x21f50057,
+	0x11f40a62,
+	0xe0b5c71f,
+	0x0a0721f5,
+	0xf51511f4,
+	0xbd08fa21,
+	0x08c5c774,
+	0xf4091bf4,
+	0x0ef40232,
+/* 0x0c19: i2c_recv_not_wr08 */
+/* 0x0c19: i2c_recv_done */
+	0xf8cec703,
+	0x0ac421f5,
+	0xd0fce0fc,
+	0xb90a12f4,
+	0x21f5027c,
+/* 0x0c2e: i2c_recv_exit */
+	0x00f802f1,
+/* 0x0c30: i2c_init */
+/* 0x0c32: test_recv */
+	0x17f100f8,
+	0x11cf05d8,
+	0x0110b600,
+	0x05d807f1,
+	0xbd0001d0,
+	0x00e7f104,
+	0x4fe3f1d9,
+	0x2321f513,
+/* 0x0c53: test_init */
+	0xf100f802,
+	0xf50800e7,
 	0xf8022321,
-/* 0x0acd: test_init */
-	0x00e7f100,
-	0x2321f508,
-/* 0x0ad7: idle_recv */
-	0xf800f802,
-/* 0x0ad9: idle */
-	0x0031f400,
-	0x05d417f1,
-	0xb60011cf,
-	0x07f10110,
-	0x01d005d4,
-/* 0x0aef: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x0af5: idle_proc */
-/* 0x0af5: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc02fa,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x0b09: idle_proc_next */
-	0x5810b6ef,
-	0xf4061fb8,
-	0x02f4e61b,
-	0x0028f4dd,
-	0x00c10ef4,
-	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,
+/* 0x0c5d: idle_recv */
+/* 0x0c5f: idle */
+	0xf400f800,
+	0x17f10031,
+	0x11cf05d4,
+	0x0110b600,
+	0x05d407f1,
+	0xbd0001d0,
+/* 0x0c75: idle_loop */
+	0x5817f004,
+/* 0x0c7b: idle_proc */
+/* 0x0c7b: idle_proc_exec */
+	0xf90232f4,
+	0x021eb910,
+	0x02fa21f5,
+	0x11f410fc,
+	0x0231f409,
+/* 0x0c8f: idle_proc_next */
+	0xb6ef0ef4,
+	0x1fb85810,
+	0xe61bf406,
+	0xf4dd02f4,
+	0x0ef40028,
+	0x000000c1,
 	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 ca7f2b8..9a5bdc1 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,
-	0x0000068f,
+	0x00000784,
 	0x0000068d,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@ uint32_t gk104_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000aaa,
-	0x0000094d,
+	0x00000c30,
+	0x00000ad3,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@ uint32_t gk104_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000acd,
-	0x00000aac,
+	0x00000c53,
+	0x00000c32,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@ uint32_t gk104_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x00000ad9,
-	0x00000ad7,
+	0x00000c5f,
+	0x00000c5d,
 	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[] = {
@@ -1397,378 +1403,446 @@ uint32_t gk104_pmu_code[] = {
 /* 0x068b: memx_init */
 	0xf800f8d8,
 /* 0x068d: perf_recv */
-/* 0x068f: perf_init */
-	0xf800f800,
-/* 0x0691: i2c_drive_scl */
-	0x0036b000,
-	0xf10e0bf4,
-	0xd007e007,
-	0x04bd0001,
-/* 0x06a2: i2c_drive_scl_lo */
-	0x07f100f8,
-	0x01d007e4,
-	0xf804bd00,
-/* 0x06ad: i2c_drive_sda */
-	0x0036b000,
-	0xf10e0bf4,
-	0xd007e007,
-	0x04bd0002,
-/* 0x06be: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x02d007e4,
-	0xf804bd00,
-/* 0x06c9: i2c_sense_scl */
-	0x0132f400,
-	0x07c437f1,
-	0xfd0033cf,
-	0x0bf40431,
-	0x0131f406,
-/* 0x06dc: i2c_sense_scl_done */
-/* 0x06de: i2c_sense_sda */
-	0x32f400f8,
-	0xc437f101,
-	0x0033cf07,
-	0xf40432fd,
-	0x31f4060b,
-/* 0x06f1: i2c_sense_sda_done */
-/* 0x06f3: i2c_raise_scl */
-	0xf900f801,
-	0x9847f140,
-	0x0137f008,
-	0x069121f5,
-/* 0x0700: i2c_raise_scl_wait */
-	0x03e8e7f1,
-	0xf56721f4,
-	0xf406c921,
-	0x42b60901,
-	0xef1bf401,
-/* 0x0714: i2c_raise_scl_done */
-	0x00f840fc,
-/* 0x0718: i2c_start */
-	0x06c921f5,
-	0xf50d11f4,
-	0xf406de21,
-	0x0ef40611,
-/* 0x0729: i2c_start_rep */
-	0x0037f030,
-	0x069121f5,
-	0xf50137f0,
-	0xbb06ad21,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x06f321f5,
-	0xf40464b6,
-/* 0x0756: i2c_start_send */
-	0x37f01f11,
-	0xad21f500,
-	0x88e7f106,
-	0x6721f413,
+	0xf110f900,
+	0xf14f48a7,
+	0xb85453a3,
+	0x1bf406ea,
+	0x01d6b044,
+	0xf4060bf4,
+/* 0x06a6: perf_load */
+	0xb4bd500e,
+	0x07f1c4bd,
+	0x0c180cd3,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd2,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd1,
+	0xb604bd00,
+	0x07f108c4,
+	0x0c180cd0,
+	0xf504bd00,
+	0xf402f121,
+/* 0x06de: perf_recv_not_host */
+	0x21f5180e,
+	0x07f106f7,
+	0x0e980ccc,
+	0xf504bd00,
+	0xf501f721,
+/* 0x06f3: perf_recv_exit */
+	0xfc022321,
+/* 0x06f7: perf_counter_readout */
+	0xf100f810,
+	0xcf0508e7,
+	0xeecc00ee,
+	0x18d7f1ff,
+	0x00ddcf05,
+	0xf1dcdeff,
+	0x000cd007,
+	0x04bd000d,
+	0x0528d7f1,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d000cd1,
+	0xf104bd00,
+	0xcf0538d7,
+	0xdeff00dd,
+	0xd207f1dc,
+	0x000d000c,
+	0xd7f104bd,
+	0xddcf0548,
+	0xdcdeff00,
+	0x0cd307f1,
+	0xbd000d00,
+	0x00e7f104,
+	0x00e3f100,
+	0x0807f180,
+	0x000ed005,
+	0x07f104bd,
+	0x0ed00518,
+	0xf104bd00,
+	0xd0052807,
+	0x04bd000e,
+	0x053807f1,
+	0xbd000ed0,
+	0x4807f104,
+	0x000ed005,
+	0x00f804bd,
+/* 0x0784: perf_init */
+	0x0003e7f1,
+	0xf100e3f0,
+	0xd0050c07,
+	0x04bd000e,
+	0x0002e7f1,
+	0xf100e3f0,
+	0xd0051c07,
+	0x04bd000e,
+	0x052c07f1,
+	0xbd000ed0,
+	0x3c07f104,
+	0x000ed005,
+	0x07f104bd,
+	0x0ed0054c,
+	0xf104bd00,
+	0xf0000fe7,
+	0x07f138e3,
+	0x0ed00514,
+	0xf104bd00,
+	0xf00070e7,
+	0x07f102e3,
+	0x0ed00524,
+	0xf104bd00,
+	0xf00080e7,
+	0x07f100e3,
+	0x0ed00534,
+	0xf104bd00,
+	0xf10000e7,
+	0xf12000e3,
+	0xd0054407,
+	0x04bd000e,
+	0x06f721f5,
+	0x0ccc07f1,
+	0xbd000e98,
+	0xf721f504,
+	0x2321f501,
+/* 0x0817: i2c_drive_scl */
+	0xb000f802,
+	0x0bf40036,
+	0xe007f10e,
+	0x0001d007,
+	0x00f804bd,
+/* 0x0828: i2c_drive_scl_lo */
+	0x07e407f1,
+	0xbd0001d0,
+/* 0x0833: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0xe007f10e,
+	0x0002d007,
+	0x00f804bd,
+/* 0x0844: i2c_drive_sda_lo */
+	0x07e407f1,
+	0xbd0002d0,
+/* 0x084f: i2c_sense_scl */
+	0xf400f804,
+	0x37f10132,
+	0x33cf07c4,
+	0x0431fd00,
+	0xf4060bf4,
+/* 0x0862: i2c_sense_scl_done */
+	0x00f80131,
+/* 0x0864: i2c_sense_sda */
+	0xf10132f4,
+	0xcf07c437,
+	0x32fd0033,
+	0x060bf404,
+/* 0x0877: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x0879: i2c_raise_scl */
+	0xf140f900,
+	0xf0089847,
+	0x21f50137,
+/* 0x0886: i2c_raise_scl_wait */
+	0xe7f10817,
+	0x21f403e8,
+	0x4f21f567,
+	0x0901f408,
+	0xf40142b6,
+/* 0x089a: i2c_raise_scl_done */
+	0x40fcef1b,
+/* 0x089e: i2c_start */
+	0x21f500f8,
+	0x11f4084f,
+	0x6421f50d,
+	0x0611f408,
+/* 0x08af: i2c_start_rep */
+	0xf0300ef4,
+	0x21f50037,
+	0x37f00817,
+	0x3321f501,
+	0x0076bb08,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b60879,
+	0x1f11f404,
+/* 0x08dc: i2c_start_send */
 	0xf50037f0,
-	0xf1069121,
+	0xf1083321,
 	0xf41388e7,
-/* 0x0772: i2c_start_out */
-	0x00f86721,
-/* 0x0774: i2c_stop */
-	0xf50037f0,
-	0xf0069121,
-	0x21f50037,
-	0xe7f106ad,
-	0x21f403e8,
-	0x0137f067,
-	0x069121f5,
-	0x1388e7f1,
+	0x37f06721,
+	0x1721f500,
+	0x88e7f108,
+	0x6721f413,
+/* 0x08f8: i2c_start_out */
+/* 0x08fa: i2c_stop */
+	0x37f000f8,
+	0x1721f500,
+	0x0037f008,
+	0x083321f5,
+	0x03e8e7f1,
 	0xf06721f4,
 	0x21f50137,
-	0xe7f106ad,
+	0xe7f10817,
 	0x21f41388,
-/* 0x07a7: i2c_bitw */
-	0xf500f867,
-	0xf106ad21,
-	0xf403e8e7,
-	0x76bb6721,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb606f321,
-	0x11f40464,
-	0x88e7f118,
-	0x6721f413,
-	0xf50037f0,
-	0xf1069121,
-	0xf41388e7,
-/* 0x07e6: i2c_bitw_out */
-	0x00f86721,
-/* 0x07e8: i2c_bitr */
-	0xf50137f0,
-	0xf106ad21,
-	0xf403e8e7,
-	0x76bb6721,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb606f321,
-	0x11f40464,
-	0xde21f51b,
-	0x0037f006,
-	0x069121f5,
+	0x0137f067,
+	0x083321f5,
 	0x1388e7f1,
-	0xf06721f4,
-	0x31f4013c,
-/* 0x082d: i2c_bitr_done */
-/* 0x082f: i2c_get_byte */
-	0xf000f801,
-	0x47f00057,
-/* 0x0835: i2c_get_byte_next */
-	0x0154b608,
+	0xf86721f4,
+/* 0x092d: i2c_bitw */
+	0x3321f500,
+	0xe8e7f108,
+	0x6721f403,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0xe821f550,
-	0x0464b607,
-	0xfd2b11f4,
-	0x42b60553,
-	0xd81bf401,
-	0xbb0137f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07a721f5,
-/* 0x087f: i2c_get_byte_done */
-	0xf80464b6,
-/* 0x0881: i2c_put_byte */
-	0x0847f000,
-/* 0x0884: i2c_put_byte_next */
-	0xff0142b6,
-	0x76bb3854,
+	0x7921f550,
+	0x0464b608,
+	0xf11811f4,
+	0xf41388e7,
+	0x37f06721,
+	0x1721f500,
+	0x88e7f108,
+	0x6721f413,
+/* 0x096c: i2c_bitw_out */
+/* 0x096e: i2c_bitr */
+	0x37f000f8,
+	0x3321f501,
+	0xe8e7f108,
+	0x6721f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x7921f550,
+	0x0464b608,
+	0xf51b11f4,
+	0xf0086421,
+	0x21f50037,
+	0xe7f10817,
+	0x21f41388,
+	0x013cf067,
+/* 0x09b3: i2c_bitr_done */
+	0xf80131f4,
+/* 0x09b5: i2c_get_byte */
+	0x0057f000,
+/* 0x09bb: i2c_get_byte_next */
+	0xb60847f0,
+	0x76bb0154,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb607a721,
+	0xb6096e21,
 	0x11f40464,
-	0x0046b034,
-	0xbbd81bf4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07e821f5,
-	0xf40464b6,
-	0x76bb0f11,
-	0x0136b000,
-	0xf4061bf4,
-/* 0x08da: i2c_put_byte_done */
-	0x00f80132,
-/* 0x08dc: i2c_addr */
+	0x0553fd2b,
+	0xf40142b6,
+	0x37f0d81b,
+	0x0076bb01,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b6092d,
+/* 0x0a05: i2c_get_byte_done */
+/* 0x0a07: i2c_put_byte */
+	0xf000f804,
+/* 0x0a0a: i2c_put_byte_next */
+	0x42b60847,
+	0x3854ff01,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x1821f550,
-	0x0464b607,
-	0xe72911f4,
-	0xb6012ec3,
-	0x53fd0134,
-	0x0076bb05,
+	0x2d21f550,
+	0x0464b609,
+	0xb03411f4,
+	0x1bf40046,
+	0x0076bbd8,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b60881,
-/* 0x0921: i2c_addr_done */
-/* 0x0923: i2c_acquire_addr */
-	0xc700f804,
-	0xe4b6f8ce,
-	0x14e0b705,
-/* 0x092f: i2c_acquire */
-	0xf500f8d0,
-	0xf4092321,
-	0xd9f00421,
-	0x3321f403,
-/* 0x093e: i2c_release */
-	0x21f500f8,
-	0x21f40923,
-	0x03daf004,
-	0xf83321f4,
-/* 0x094d: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xf413a001,
-	0x0032980c,
-	0x0ccc13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x092f21f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x08dc21f5,
-	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0x64b6096e,
+	0x0f11f404,
+	0xb00076bb,
+	0x1bf40136,
+	0x0132f406,
+/* 0x0a60: i2c_put_byte_done */
+/* 0x0a62: i2c_addr */
+	0x76bb00f8,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6088121,
-	0x11f50464,
-	0x57f000ad,
+	0xb6089e21,
+	0x11f40464,
+	0x2ec3e729,
+	0x0134b601,
+	0xbb0553fd,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x0a0721f5,
+/* 0x0aa7: i2c_addr_done */
+	0xf80464b6,
+/* 0x0aa9: i2c_acquire_addr */
+	0xf8cec700,
+	0xb705e4b6,
+	0xf8d014e0,
+/* 0x0ab5: i2c_acquire */
+	0xa921f500,
+	0x0421f40a,
+	0xf403d9f0,
+	0x00f83321,
+/* 0x0ac4: i2c_release */
+	0x0aa921f5,
+	0xf00421f4,
+	0x21f403da,
+/* 0x0ad3: i2c_recv */
+	0xf400f833,
+	0xc1c70132,
+	0x0214b6f8,
+	0xf52816b0,
+	0xa0013a1f,
+	0x980cfc13,
+	0x13a00032,
+	0x31980cd4,
+	0x0231f400,
+	0xe0f9d0f9,
+	0x67f1d0f9,
+	0x63f10000,
+	0x67921000,
 	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b608dc,
-	0x8a11f504,
+	0x64b60ab5,
+	0xb0d0fc04,
+	0x1bf500d6,
+	0x57f000b3,
 	0x0076bb00,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b6082f,
-	0x6a11f404,
-	0xbbe05bcb,
+	0x64b60a62,
+	0xd011f504,
+	0xe0c5c700,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x0721f550,
+	0x0464b60a,
+	0x00ad11f5,
+	0xbb0157f0,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x077421f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x0a53: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x08dc21f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40881,
-	0x0057f029,
-	0x08dc21f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40881,
-	0x7421f515,
-	0xc774bd07,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x0a93: i2c_recv_not_wr08 */
-/* 0x0a93: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc093e,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x02f121f5,
-/* 0x0aa8: i2c_recv_exit */
-/* 0x0aaa: i2c_init */
-	0x00f800f8,
-/* 0x0aac: test_recv */
-	0x05d817f1,
-	0xb60011cf,
-	0x07f10110,
-	0x01d005d8,
-	0xf104bd00,
-	0xf1d900e7,
-	0xf5134fe3,
+	0x0a6221f5,
+	0xf50464b6,
+	0xbb008a11,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x09b521f5,
+	0xf40464b6,
+	0x5bcb6a11,
+	0x0076bbe0,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b608fa,
+	0x025bb904,
+	0x0ef474bd,
+/* 0x0bd9: i2c_recv_not_rd08 */
+	0x01d6b043,
+	0xf03d1bf4,
+	0x21f50057,
+	0x11f40a62,
+	0xe0c5c733,
+	0x0a0721f5,
+	0xf02911f4,
+	0x21f50057,
+	0x11f40a62,
+	0xe0b5c71f,
+	0x0a0721f5,
+	0xf51511f4,
+	0xbd08fa21,
+	0x08c5c774,
+	0xf4091bf4,
+	0x0ef40232,
+/* 0x0c19: i2c_recv_not_wr08 */
+/* 0x0c19: i2c_recv_done */
+	0xf8cec703,
+	0x0ac421f5,
+	0xd0fce0fc,
+	0xb90a12f4,
+	0x21f5027c,
+/* 0x0c2e: i2c_recv_exit */
+	0x00f802f1,
+/* 0x0c30: i2c_init */
+/* 0x0c32: test_recv */
+	0x17f100f8,
+	0x11cf05d8,
+	0x0110b600,
+	0x05d807f1,
+	0xbd0001d0,
+	0x00e7f104,
+	0x4fe3f1d9,
+	0x2321f513,
+/* 0x0c53: test_init */
+	0xf100f802,
+	0xf50800e7,
 	0xf8022321,
-/* 0x0acd: test_init */
-	0x00e7f100,
-	0x2321f508,
-/* 0x0ad7: idle_recv */
-	0xf800f802,
-/* 0x0ad9: idle */
-	0x0031f400,
-	0x05d417f1,
-	0xb60011cf,
-	0x07f10110,
-	0x01d005d4,
-/* 0x0aef: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x0af5: idle_proc */
-/* 0x0af5: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc02fa,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x0b09: idle_proc_next */
-	0x5810b6ef,
-	0xf4061fb8,
-	0x02f4e61b,
-	0x0028f4dd,
-	0x00c10ef4,
-	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,
+/* 0x0c5d: idle_recv */
+/* 0x0c5f: idle */
+	0xf400f800,
+	0x17f10031,
+	0x11cf05d4,
+	0x0110b600,
+	0x05d407f1,
+	0xbd0001d0,
+/* 0x0c75: idle_loop */
+	0x5817f004,
+/* 0x0c7b: idle_proc */
+/* 0x0c7b: idle_proc_exec */
+	0xf90232f4,
+	0x021eb910,
+	0x02fa21f5,
+	0x11f410fc,
+	0x0231f409,
+/* 0x0c8f: idle_proc_next */
+	0xb6ef0ef4,
+	0x1fb85810,
+	0xe61bf406,
+	0xf4dd02f4,
+	0x0ef40028,
+	0x000000c1,
 	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 fe4f63d..a619f74 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,
-	0x00000631,
+	0x00000717,
 	0x0000062f,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@ uint32_t gk208_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000a35,
-	0x000008dc,
+	0x00000ba3,
+	0x00000a4a,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@ uint32_t gk208_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000a56,
-	0x00000a37,
+	0x00000bc4,
+	0x00000ba5,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@ uint32_t gk208_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x00000a61,
-	0x00000a5f,
+	0x00000bcf,
+	0x00000bcd,
 	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[] = {
@@ -1373,111 +1379,188 @@ uint32_t gk208_pmu_code[] = {
 	0xf8dc0bf4,
 /* 0x062d: memx_init */
 /* 0x062f: perf_recv */
-	0xf800f800,
-/* 0x0631: perf_init */
-/* 0x0633: i2c_drive_scl */
-	0xb000f800,
-	0x0bf40036,
-	0x07e0400d,
-	0xbd0001f6,
-/* 0x0643: i2c_drive_scl_lo */
-	0x4000f804,
-	0x01f607e4,
-	0xf804bd00,
-/* 0x064d: i2c_drive_sda */
+	0xf900f800,
+	0x48a7f110,
+	0x53a3f14f,
+	0xf4eaa654,
+	0xd6b0441b,
+	0x060bf401,
+/* 0x0647: perf_load */
+	0xbd500ef4,
+	0xf1c4bdb4,
+	0x180cd307,
+	0x04bd000c,
+	0xf108c4b6,
+	0x180cd207,
+	0x04bd000c,
+	0xf108c4b6,
+	0x180cd107,
+	0x04bd000c,
+	0xf108c4b6,
+	0x180cd007,
+	0x04bd000c,
+	0x0002c27e,
+/* 0x067f: perf_recv_not_host */
+	0x7e180ef4,
+	0xf1000698,
+	0x980ccc07,
+	0x04bd000e,
+	0x01d621f5,
+	0x0002017e,
+/* 0x0694: perf_recv_exit */
+	0x00f810fc,
+/* 0x0698: perf_counter_readout */
+	0xcf05084e,
+	0xeecc00ee,
+	0x05184dff,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d200cd0,
+	0x284d04bd,
+	0x00ddcf05,
+	0xf1dcdeff,
+	0x200cd107,
+	0x4d04bd0d,
+	0xddcf0538,
+	0xdcdeff00,
+	0x0cd207f1,
+	0x04bd0d20,
+	0xcf05484d,
+	0xdeff00dd,
+	0xd307f1dc,
+	0xbd0d200c,
+	0x00e7f104,
+	0x00e3f100,
+	0x05084080,
+	0xbd000ef6,
+	0x05184004,
+	0xbd000ef6,
+	0x05284004,
+	0xbd000ef6,
+	0x05384004,
+	0xbd000ef6,
+	0x05484004,
+	0xbd000ef6,
+/* 0x0717: perf_init */
+	0xf100f804,
+	0xf00003e7,
+	0x0c4000e3,
+	0x000ef605,
+	0xe7f104bd,
+	0xe3f00002,
+	0x051c4000,
+	0xbd000ef6,
+	0x052c4004,
+	0xbd000ef6,
+	0x053c4004,
+	0xbd000ef6,
+	0x054c4004,
+	0xbd000ef6,
+	0x0fe7f104,
+	0x38e3f000,
+	0xf6051440,
+	0x04bd000e,
+	0x0070e7f1,
+	0x4002e3f0,
+	0x0ef60524,
+	0xf104bd00,
+	0xf00080e7,
+	0x344000e3,
+	0x000ef605,
+	0xe7f104bd,
+	0xe3f10000,
+	0x44402000,
+	0x000ef605,
+	0x987e04bd,
+	0x07f10006,
+	0x0e980ccc,
+	0xf504bd00,
+	0x7e01d621,
+	0xf8000201,
+/* 0x07a1: i2c_drive_scl */
 	0x0036b000,
 	0x400d0bf4,
-	0x02f607e0,
+	0x01f607e0,
 	0xf804bd00,
-/* 0x065d: i2c_drive_sda_lo */
+/* 0x07b1: i2c_drive_scl_lo */
 	0x07e44000,
+	0xbd0001f6,
+/* 0x07bb: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0x07e0400d,
 	0xbd0002f6,
-/* 0x0667: i2c_sense_scl */
-	0xf400f804,
-	0xc4430132,
-	0x0033cf07,
-	0xf40431fd,
-	0x31f4060b,
-/* 0x0679: i2c_sense_scl_done */
-/* 0x067b: i2c_sense_sda */
-	0xf400f801,
-	0xc4430132,
-	0x0033cf07,
-	0xf40432fd,
-	0x31f4060b,
-/* 0x068d: i2c_sense_sda_done */
-/* 0x068f: i2c_raise_scl */
-	0xf900f801,
-	0x08984440,
-	0x337e0103,
-/* 0x069a: i2c_raise_scl_wait */
-	0xe84e0006,
-	0x005d7e03,
-	0x06677e00,
-	0x0901f400,
-	0xf40142b6,
-/* 0x06ae: i2c_raise_scl_done */
-	0x40fcef1b,
-/* 0x06b2: i2c_start */
-	0x677e00f8,
-	0x11f40006,
-	0x067b7e0d,
-	0x0611f400,
-/* 0x06c3: i2c_start_rep */
-	0x032e0ef4,
-	0x06337e00,
-	0x7e010300,
-	0xbb00064d,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x00068f7e,
-	0xf40464b6,
-/* 0x06ee: i2c_start_send */
-	0x00031d11,
-	0x00064d7e,
-	0x7e13884e,
+/* 0x07cb: i2c_drive_sda_lo */
+	0x4000f804,
+	0x02f607e4,
+	0xf804bd00,
+/* 0x07d5: i2c_sense_scl */
+	0x0132f400,
+	0xcf07c443,
+	0x31fd0033,
+	0x060bf404,
+/* 0x07e7: i2c_sense_scl_done */
+	0xf80131f4,
+/* 0x07e9: i2c_sense_sda */
+	0x0132f400,
+	0xcf07c443,
+	0x32fd0033,
+	0x060bf404,
+/* 0x07fb: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x07fd: i2c_raise_scl */
+	0x4440f900,
+	0x01030898,
+	0x0007a17e,
+/* 0x0808: i2c_raise_scl_wait */
+	0x7e03e84e,
+	0x7e00005d,
+	0xf40007d5,
+	0x42b60901,
+	0xef1bf401,
+/* 0x081c: i2c_raise_scl_done */
+	0x00f840fc,
+/* 0x0820: i2c_start */
+	0x0007d57e,
+	0x7e0d11f4,
+	0xf40007e9,
+	0x0ef40611,
+/* 0x0831: i2c_start_rep */
+	0x7e00032e,
+	0x030007a1,
+	0x07bb7e01,
+	0x0076bb00,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0xfd7e50fc,
+	0x64b60007,
+	0x1d11f404,
+/* 0x085c: i2c_start_send */
+	0xbb7e0003,
+	0x884e0007,
+	0x005d7e13,
+	0x7e000300,
+	0x4e0007a1,
+	0x5d7e1388,
+/* 0x0876: i2c_start_out */
+	0x00f80000,
+/* 0x0878: i2c_stop */
+	0xa17e0003,
+	0x00030007,
+	0x0007bb7e,
+	0x7e03e84e,
 	0x0300005d,
-	0x06337e00,
+	0x07a17e01,
 	0x13884e00,
 	0x00005d7e,
-/* 0x0708: i2c_start_out */
-/* 0x070a: i2c_stop */
-	0x000300f8,
-	0x0006337e,
-	0x4d7e0003,
-	0xe84e0006,
-	0x005d7e03,
-	0x7e010300,
-	0x4e000633,
-	0x5d7e1388,
-	0x01030000,
-	0x00064d7e,
-	0x7e13884e,
-	0xf800005d,
-/* 0x0739: i2c_bitw */
-	0x064d7e00,
-	0x03e84e00,
-	0x00005d7e,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x068f7e50,
-	0x0464b600,
-	0x4e1711f4,
-	0x5d7e1388,
-	0x00030000,
-	0x0006337e,
-	0x7e13884e,
-/* 0x0777: i2c_bitw_out */
-	0xf800005d,
-/* 0x0779: i2c_bitr */
-	0x7e010300,
-	0x4e00064d,
+	0xbb7e0103,
+	0x884e0007,
+	0x005d7e13,
+/* 0x08a7: i2c_bitw */
+	0x7e00f800,
+	0x4e0007bb,
 	0x5d7e03e8,
 	0x76bb0000,
 	0x0465b600,
@@ -1485,225 +1568,280 @@ uint32_t gk208_pmu_code[] = {
 	0x0256bb04,
 	0x75fd50bd,
 	0x7e50fc04,
-	0xb600068f,
+	0xb60007fd,
 	0x11f40464,
-	0x067b7e1a,
-	0x7e000300,
-	0x4e000633,
-	0x5d7e1388,
-	0x3cf00000,
-	0x0131f401,
-/* 0x07bc: i2c_bitr_done */
-/* 0x07be: i2c_get_byte */
-	0x000500f8,
-/* 0x07c2: i2c_get_byte_next */
-	0x54b60804,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x797e50fc,
-	0x64b60007,
-	0x2a11f404,
-	0xb60553fd,
-	0x1bf40142,
-	0xbb0103d8,
+	0x13884e17,
+	0x00005d7e,
+	0xa17e0003,
+	0x884e0007,
+	0x005d7e13,
+/* 0x08e5: i2c_bitw_out */
+/* 0x08e7: i2c_bitr */
+	0x0300f800,
+	0x07bb7e01,
+	0x03e84e00,
+	0x00005d7e,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x07fd7e50,
+	0x0464b600,
+	0x7e1a11f4,
+	0x030007e9,
+	0x07a17e00,
+	0x13884e00,
+	0x00005d7e,
+	0xf4013cf0,
+/* 0x092a: i2c_bitr_done */
+	0x00f80131,
+/* 0x092c: i2c_get_byte */
+	0x08040005,
+/* 0x0930: i2c_get_byte_next */
+	0xbb0154b6,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x0007397e,
-/* 0x080b: i2c_get_byte_done */
-	0xf80464b6,
-/* 0x080d: i2c_put_byte */
-/* 0x080f: i2c_put_byte_next */
-	0xb6080400,
-	0x54ff0142,
-	0x0076bb38,
+	0x0008e77e,
+	0xf40464b6,
+	0x53fd2a11,
+	0x0142b605,
+	0x03d81bf4,
+	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
-	0x397e50fc,
-	0x64b60007,
-	0x3411f404,
-	0xf40046b0,
-	0x76bbd81b,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0x7e50fc04,
-	0xb6000779,
-	0x11f40464,
-	0x0076bb0f,
-	0xf40136b0,
-	0x32f4061b,
-/* 0x0865: i2c_put_byte_done */
-/* 0x0867: i2c_addr */
-	0xbb00f801,
+	0xa77e50fc,
+	0x64b60008,
+/* 0x0979: i2c_get_byte_done */
+/* 0x097b: i2c_put_byte */
+	0x0400f804,
+/* 0x097d: i2c_put_byte_next */
+	0x0142b608,
+	0xbb3854ff,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x0006b27e,
+	0x0008a77e,
 	0xf40464b6,
-	0xc3e72911,
-	0x34b6012e,
-	0x0553fd01,
+	0x46b03411,
+	0xd81bf400,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x080d7e50,
+	0x08e77e50,
 	0x0464b600,
-/* 0x08ac: i2c_addr_done */
-/* 0x08ae: i2c_acquire_addr */
-	0xcec700f8,
-	0x05e4b6f8,
-	0xd014e0b7,
-/* 0x08ba: i2c_acquire */
-	0xae7e00f8,
-	0x047e0008,
-	0xd9f00000,
-	0x002e7e03,
-/* 0x08cb: i2c_release */
-	0x7e00f800,
-	0x7e0008ae,
-	0xf0000004,
-	0x2e7e03da,
-	0x00f80000,
-/* 0x08dc: i2c_recv */
-	0xc70132f4,
-	0x14b6f8c1,
-	0x2816b002,
-	0x01371ff5,
-	0x0cf413b8,
-	0x00329800,
-	0x0ccc13b8,
-	0x00319800,
-	0xf90231f4,
-	0xf9e0f9d0,
-	0x0067f1d0,
-	0x0063f100,
-	0x01679210,
+	0xbb0f11f4,
+	0x36b00076,
+	0x061bf401,
+/* 0x09d3: i2c_put_byte_done */
+	0xf80132f4,
+/* 0x09d5: i2c_addr */
+	0x0076bb00,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x207e50fc,
+	0x64b60008,
+	0x2911f404,
+	0x012ec3e7,
+	0xfd0134b6,
+	0x76bb0553,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb600097b,
+/* 0x0a1a: i2c_addr_done */
+	0x00f80464,
+/* 0x0a1c: i2c_acquire_addr */
+	0xb6f8cec7,
+	0xe0b705e4,
+	0x00f8d014,
+/* 0x0a28: i2c_acquire */
+	0x000a1c7e,
+	0x0000047e,
+	0x7e03d9f0,
+	0xf800002e,
+/* 0x0a39: i2c_release */
+	0x0a1c7e00,
+	0x00047e00,
+	0x03daf000,
+	0x00002e7e,
+/* 0x0a4a: i2c_recv */
+	0x32f400f8,
+	0xf8c1c701,
+	0xb00214b6,
+	0x1ff52816,
+	0x13b80137,
+	0x98000cfc,
+	0x13b80032,
+	0x98000cd4,
+	0x31f40031,
+	0xf9d0f902,
+	0xf1d0f9e0,
+	0xf1000067,
+	0x92100063,
+	0x76bb0167,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb6000a28,
+	0xd0fc0464,
+	0xf500d6b0,
+	0x0500b01b,
+	0x0076bb00,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0xd57e50fc,
+	0x64b60009,
+	0xcc11f504,
+	0xe0c5c700,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x08ba7e50,
+	0x097b7e50,
 	0x0464b600,
-	0xd6b0d0fc,
-	0xb01bf500,
-	0xbb000500,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x0008677e,
-	0xf50464b6,
-	0xc700cc11,
-	0x76bbe0c5,
+	0x00a911f5,
+	0x76bb0105,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0x7e50fc04,
-	0xb600080d,
+	0xb60009d5,
 	0x11f50464,
-	0x010500a9,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x08677e50,
-	0x0464b600,
-	0x008711f5,
+	0x76bb0087,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb600092c,
+	0x11f40464,
+	0xe05bcb67,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x07be7e50,
+	0x08787e50,
 	0x0464b600,
-	0xcb6711f4,
-	0x76bbe05b,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0x7e50fc04,
-	0xb600070a,
-	0x5bb20464,
-	0x0ef474bd,
-/* 0x09e1: i2c_recv_not_rd08 */
-	0x01d6b041,
-	0x053b1bf4,
-	0x08677e00,
-	0x3211f400,
-	0x7ee0c5c7,
-	0xf400080d,
-	0x00052811,
-	0x0008677e,
-	0xc71f11f4,
-	0x0d7ee0b5,
-	0x11f40008,
-	0x070a7e15,
-	0xc774bd00,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x0a1f: i2c_recv_not_wr08 */
-/* 0x0a1f: i2c_recv_done */
-	0xc7030ef4,
-	0xcb7ef8ce,
-	0xe0fc0008,
-	0x12f4d0fc,
-	0x7e7cb209,
-/* 0x0a33: i2c_recv_exit */
-	0xf80002c2,
-/* 0x0a35: i2c_init */
-/* 0x0a37: test_recv */
-	0x4100f800,
-	0x11cf0458,
-	0x0110b600,
-	0xf6045840,
-	0x04bd0001,
-	0xd900e7f1,
-	0x134fe3f1,
-	0x0002017e,
-/* 0x0a56: test_init */
-	0x004e00f8,
-	0x02017e08,
-/* 0x0a5f: idle_recv */
+	0x74bd5bb2,
+/* 0x0b4f: i2c_recv_not_rd08 */
+	0xb0410ef4,
+	0x1bf401d6,
+	0x7e00053b,
+	0xf40009d5,
+	0xc5c73211,
+	0x097b7ee0,
+	0x2811f400,
+	0xd57e0005,
+	0x11f40009,
+	0xe0b5c71f,
+	0x00097b7e,
+	0x7e1511f4,
+	0xbd000878,
+	0x08c5c774,
+	0xf4091bf4,
+	0x0ef40232,
+/* 0x0b8d: i2c_recv_not_wr08 */
+/* 0x0b8d: i2c_recv_done */
+	0xf8cec703,
+	0x000a397e,
+	0xd0fce0fc,
+	0xb20912f4,
+	0x02c27e7c,
+/* 0x0ba1: i2c_recv_exit */
+/* 0x0ba3: i2c_init */
 	0xf800f800,
-/* 0x0a61: idle */
-	0x0031f400,
-	0xcf045441,
-	0x10b60011,
-	0x04544001,
-	0xbd0001f6,
-/* 0x0a75: idle_loop */
-	0xf4580104,
-/* 0x0a7a: idle_proc */
-/* 0x0a7a: idle_proc_exec */
-	0x10f90232,
-	0xcb7e1eb2,
-	0x10fc0002,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x0a8d: idle_proc_next */
-	0x5810b6f0,
-	0x1bf41fa6,
-	0xe002f4e8,
-	0xf40028f4,
-	0x0000c60e,
+/* 0x0ba5: test_recv */
+	0x04584100,
+	0xb60011cf,
+	0x58400110,
+	0x0001f604,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x017e134f,
+	0x00f80002,
+/* 0x0bc4: test_init */
+	0x7e08004e,
+	0xf8000201,
+/* 0x0bcd: idle_recv */
+/* 0x0bcf: idle */
+	0xf400f800,
+	0x54410031,
+	0x0011cf04,
+	0x400110b6,
+	0x01f60454,
+/* 0x0be3: idle_loop */
+	0x0104bd00,
+	0x0232f458,
+/* 0x0be8: idle_proc */
+/* 0x0be8: idle_proc_exec */
+	0x1eb210f9,
+	0x0002cb7e,
+	0x11f410fc,
+	0x0231f409,
+/* 0x0bfb: idle_proc_next */
+	0xb6f00ef4,
+	0x1fa65810,
+	0xf4e81bf4,
+	0x28f4e002,
+	0xc60ef400,
+	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/gt215.fuc3.h
b/drm/nouveau/nvkm/subdev/pmu/fuc/gt215.fuc3.h
index 2686f8f..7fb9a49 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,
-	0x00000846,
+	0x0000092b,
 	0x00000844,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@ uint32_t gt215_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000c76,
-	0x00000b19,
+	0x00000de7,
+	0x00000c8a,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@ uint32_t gt215_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000c9f,
-	0x00000c78,
+	0x00000e10,
+	0x00000de9,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@ uint32_t gt215_pmu_data[] = {
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x00000cab,
-	0x00000ca9,
+	0x00000e1c,
+	0x00000e1a,
 	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[] = {
@@ -1516,352 +1521,484 @@ uint32_t gt215_pmu_code[] = {
 /* 0x0842: memx_init */
 	0x00f800f8,
 /* 0x0844: perf_recv */
-/* 0x0846: perf_init */
-	0x00f800f8,
-/* 0x0848: i2c_drive_scl */
-	0xf40036b0,
-	0x07f1110b,
-	0x04b607e0,
-	0x0001d006,
-	0x00f804bd,
-/* 0x085c: i2c_drive_scl_lo */
-	0x07e407f1,
-	0xd00604b6,
-	0x04bd0001,
-/* 0x086a: i2c_drive_sda */
-	0x36b000f8,
-	0x110bf400,
-	0x07e007f1,
+	0xa7f110f9,
+	0xa3f14f48,
+	0xeab85453,
+	0x381bf406,
+	0xf401d6b0,
+	0x0ef4060b,
+/* 0x085d: perf_load */
+	0xbdb4bd44,
+	0xd207f1c4,
+	0x000c180c,
+	0xc4b604bd,
+	0xd107f108,
+	0x000c180c,
+	0xc4b604bd,
+	0xd007f108,
+	0x000c180c,
+	0x21f504bd,
+	0x0ef40342,
+/* 0x0889: perf_recv_not_host */
+	0xa221f518,
+	0xcc07f108,
+	0x000e980c,
+	0x21f504bd,
+	0x21f50236,
+/* 0x089e: perf_recv_exit */
+	0x10fc0262,
+/* 0x08a2: perf_counter_readout */
+	0xe7f100f8,
+	0xe4b60508,
+	0x00eecf06,
+	0xf1ffeecc,
+	0xb60518d7,
+	0xddcf06d4,
+	0xdcdeff00,
+	0x0cd007f1,
+	0xbd000d00,
+	0x28d7f104,
+	0x06d4b605,
+	0xff00ddcf,
+	0x07f1dcde,
+	0x0d000cd1,
+	0xf104bd00,
+	0xb60538d7,
+	0xddcf06d4,
+	0xdcdeff00,
+	0x0cd207f1,
+	0xbd000d00,
+	0x00e7f104,
+	0x00e3f100,
+	0x0807f180,
+	0x0604b605,
+	0xbd000ed0,
+	0x1807f104,
+	0x0604b605,
+	0xbd000ed0,
+	0x2807f104,
+	0x0604b605,
+	0xbd000ed0,
+	0x3807f104,
+	0x0604b605,
+	0xbd000ed0,
+/* 0x092b: perf_init */
+	0xf100f804,
+	0xf00003e7,
+	0x07f100e3,
+	0x04b6050c,
+	0x000ed006,
+	0xe7f104bd,
+	0xe3f00002,
+	0x1c07f100,
+	0x0604b605,
+	0xbd000ed0,
+	0x2c07f104,
+	0x0604b605,
+	0xbd000ed0,
+	0x3c07f104,
+	0x0604b605,
+	0xbd000ed0,
+	0x0de7f104,
+	0x00e3f000,
+	0x051407f1,
 	0xd00604b6,
-	0x04bd0002,
-/* 0x087e: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x04b607e4,
-	0x0002d006,
-	0x00f804bd,
-/* 0x088c: i2c_sense_scl */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0431fd00,
-	0xf4060bf4,
-/* 0x08a2: i2c_sense_scl_done */
-	0x00f80131,
-/* 0x08a4: i2c_sense_sda */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0432fd00,
-	0xf4060bf4,
-/* 0x08ba: i2c_sense_sda_done */
-	0x00f80131,
-/* 0x08bc: i2c_raise_scl */
-	0x47f140f9,
-	0x37f00898,
-	0x4821f501,
-/* 0x08c9: i2c_raise_scl_wait */
-	0xe8e7f108,
-	0x7f21f403,
-	0x088c21f5,
-	0xb60901f4,
-	0x1bf40142,
-/* 0x08dd: i2c_raise_scl_done */
-	0xf840fcef,
-/* 0x08e1: i2c_start */
-	0x8c21f500,
-	0x0d11f408,
-	0x08a421f5,
-	0xf40611f4,
-/* 0x08f2: i2c_start_rep */
-	0x37f0300e,
-	0x4821f500,
-	0x0137f008,
-	0x086a21f5,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xbc21f550,
-	0x0464b608,
-/* 0x091f: i2c_start_send */
-	0xf01f11f4,
+	0x04bd000e,
+	0x0070e7f1,
+	0xf100e3f0,
+	0xb6052407,
+	0x0ed00604,
+	0xf104bd00,
+	0xf00100e7,
+	0x07f100e3,
+	0x04b60534,
+	0x000ed006,
+	0x21f504bd,
+	0x07f108a2,
+	0x0e980ccc,
+	0xf504bd00,
+	0xf5023621,
+	0xf8026221,
+/* 0x09b9: i2c_drive_scl */
+	0x0036b000,
+	0xf1110bf4,
+	0xb607e007,
+	0x01d00604,
+	0xf804bd00,
+/* 0x09cd: i2c_drive_scl_lo */
+	0xe407f100,
+	0x0604b607,
+	0xbd0001d0,
+/* 0x09db: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0xe007f111,
+	0x0604b607,
+	0xbd0002d0,
+/* 0x09ef: i2c_drive_sda_lo */
+	0xf100f804,
+	0xb607e407,
+	0x02d00604,
+	0xf804bd00,
+/* 0x09fd: i2c_sense_scl */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x31fd0033,
+	0x060bf404,
+/* 0x0a13: i2c_sense_scl_done */
+	0xf80131f4,
+/* 0x0a15: i2c_sense_sda */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x32fd0033,
+	0x060bf404,
+/* 0x0a2b: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x0a2d: i2c_raise_scl */
+	0xf140f900,
+	0xf0089847,
+	0x21f50137,
+/* 0x0a3a: i2c_raise_scl_wait */
+	0xe7f109b9,
+	0x21f403e8,
+	0xfd21f57f,
+	0x0901f409,
+	0xf40142b6,
+/* 0x0a4e: i2c_raise_scl_done */
+	0x40fcef1b,
+/* 0x0a52: i2c_start */
+	0x21f500f8,
+	0x11f409fd,
+	0x1521f50d,
+	0x0611f40a,
+/* 0x0a63: i2c_start_rep */
+	0xf0300ef4,
 	0x21f50037,
-	0xe7f1086a,
-	0x21f41388,
-	0x0037f07f,
-	0x084821f5,
-	0x1388e7f1,
-/* 0x093b: i2c_start_out */
-	0xf87f21f4,
-/* 0x093d: i2c_stop */
-	0x0037f000,
-	0x084821f5,
+	0x37f009b9,
+	0xdb21f501,
+	0x0076bb09,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b60a2d,
+	0x1f11f404,
+/* 0x0a90: i2c_start_send */
 	0xf50037f0,
-	0xf1086a21,
-	0xf403e8e7,
+	0xf109db21,
+	0xf41388e7,
 	0x37f07f21,
-	0x4821f501,
-	0x88e7f108,
+	0xb921f500,
+	0x88e7f109,
 	0x7f21f413,
-	0xf50137f0,
-	0xf1086a21,
-	0xf41388e7,
-	0x00f87f21,
-/* 0x0970: i2c_bitw */
-	0x086a21f5,
+/* 0x0aac: i2c_start_out */
+/* 0x0aae: i2c_stop */
+	0x37f000f8,
+	0xb921f500,
+	0x0037f009,
+	0x09db21f5,
 	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x08bc21f5,
-	0xf40464b6,
-	0xe7f11811,
+	0xf07f21f4,
+	0x21f50137,
+	0xe7f109b9,
 	0x21f41388,
-	0x0037f07f,
-	0x084821f5,
+	0x0137f07f,
+	0x09db21f5,
 	0x1388e7f1,
-/* 0x09af: i2c_bitw_out */
 	0xf87f21f4,
-/* 0x09b1: i2c_bitr */
-	0x0137f000,
-	0x086a21f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x08bc21f5,
-	0xf40464b6,
-	0x21f51b11,
-	0x37f008a4,
-	0x4821f500,
-	0x88e7f108,
+/* 0x0ae1: i2c_bitw */
+	0xdb21f500,
+	0xe8e7f109,
+	0x7f21f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x2d21f550,
+	0x0464b60a,
+	0xf11811f4,
+	0xf41388e7,
+	0x37f07f21,
+	0xb921f500,
+	0x88e7f109,
 	0x7f21f413,
-	0xf4013cf0,
-/* 0x09f6: i2c_bitr_done */
-	0x00f80131,
-/* 0x09f8: i2c_get_byte */
-	0xf00057f0,
-/* 0x09fe: i2c_get_byte_next */
-	0x54b60847,
+/* 0x0b20: i2c_bitw_out */
+/* 0x0b22: i2c_bitr */
+	0x37f000f8,
+	0xdb21f501,
+	0xe8e7f109,
+	0x7f21f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x2d21f550,
+	0x0464b60a,
+	0xf51b11f4,
+	0xf00a1521,
+	0x21f50037,
+	0xe7f109b9,
+	0x21f41388,
+	0x013cf07f,
+/* 0x0b67: i2c_bitr_done */
+	0xf80131f4,
+/* 0x0b69: i2c_get_byte */
+	0x0057f000,
+/* 0x0b6f: i2c_get_byte_next */
+	0xb60847f0,
+	0x76bb0154,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb60b2221,
+	0x11f40464,
+	0x0553fd2b,
+	0xf40142b6,
+	0x37f0d81b,
 	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b609b1,
-	0x2b11f404,
-	0xb60553fd,
-	0x1bf40142,
-	0x0137f0d8,
+	0x64b60ae1,
+/* 0x0bb9: i2c_get_byte_done */
+/* 0x0bbb: i2c_put_byte */
+	0xf000f804,
+/* 0x0bbe: i2c_put_byte_next */
+	0x42b60847,
+	0x3854ff01,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x7021f550,
-	0x0464b609,
-/* 0x0a48: i2c_get_byte_done */
-/* 0x0a4a: i2c_put_byte */
-	0x47f000f8,
-/* 0x0a4d: i2c_put_byte_next */
-	0x0142b608,
-	0xbb3854ff,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x097021f5,
-	0xf40464b6,
-	0x46b03411,
-	0xd81bf400,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xb121f550,
-	0x0464b609,
-	0xbb0f11f4,
-	0x36b00076,
-	0x061bf401,
-/* 0x0aa3: i2c_put_byte_done */
-	0xf80132f4,
-/* 0x0aa5: i2c_addr */
-	0x0076bb00,
+	0xe121f550,
+	0x0464b60a,
+	0xb03411f4,
+	0x1bf40046,
+	0x0076bbd8,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b608e1,
-	0x2911f404,
-	0x012ec3e7,
-	0xfd0134b6,
-	0x76bb0553,
+	0x64b60b22,
+	0x0f11f404,
+	0xb00076bb,
+	0x1bf40136,
+	0x0132f406,
+/* 0x0c14: i2c_put_byte_done */
+/* 0x0c16: i2c_addr */
+	0x76bb00f8,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb60a4a21,
-/* 0x0aea: i2c_addr_done */
-	0x00f80464,
-/* 0x0aec: i2c_acquire_addr */
-	0xb6f8cec7,
-	0xe0b702e4,
-	0xee980d1c,
-/* 0x0afb: i2c_acquire */
-	0xf500f800,
-	0xf40aec21,
-	0xd9f00421,
-	0x3f21f403,
-/* 0x0b0a: i2c_release */
-	0x21f500f8,
-	0x21f40aec,
-	0x03daf004,
-	0xf83f21f4,
-/* 0x0b19: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xf413a001,
-	0x0032980c,
-	0x0ccc13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
+	0xb60a5221,
+	0x11f40464,
+	0x2ec3e729,
+	0x0134b601,
+	0xbb0553fd,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x0afb21f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
+	0x0bbb21f5,
+/* 0x0c5b: i2c_addr_done */
+	0xf80464b6,
+/* 0x0c5d: i2c_acquire_addr */
+	0xf8cec700,
+	0xb702e4b6,
+	0x980d24e0,
+	0x00f800ee,
+/* 0x0c6c: i2c_acquire */
+	0x0c5d21f5,
+	0xf00421f4,
+	0x21f403d9,
+/* 0x0c7b: i2c_release */
+	0xf500f83f,
+	0xf40c5d21,
+	0xdaf00421,
+	0x3f21f403,
+/* 0x0c8a: i2c_recv */
+	0x32f400f8,
+	0xf8c1c701,
+	0xb00214b6,
+	0x1ff52816,
+	0x13a0013a,
+	0x32980cfc,
+	0xd413a000,
+	0x0031980c,
+	0xf90231f4,
+	0xf9e0f9d0,
+	0x0067f1d0,
+	0x0063f100,
+	0x01679210,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x6c21f550,
+	0x0464b60c,
+	0xd6b0d0fc,
+	0xb31bf500,
+	0x0057f000,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x1621f550,
+	0x0464b60c,
+	0x00d011f5,
+	0xbbe0c5c7,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x0aa521f5,
+	0x0bbb21f5,
 	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0xf000ad11,
+	0x76bb0157,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb60a4a21,
+	0xb60c1621,
 	0x11f50464,
-	0x57f000ad,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60aa5,
-	0x8a11f504,
-	0x0076bb00,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b609f8,
-	0x6a11f404,
-	0xbbe05bcb,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x093d21f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x0c1f: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x0aa521f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40a4a,
-	0x0057f029,
-	0x0aa521f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40a4a,
-	0x3d21f515,
-	0xc774bd09,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x0c5f: i2c_recv_not_wr08 */
-/* 0x0c5f: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc0b0a,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x034221f5,
-/* 0x0c74: i2c_recv_exit */
-/* 0x0c76: i2c_init */
+	0x76bb008a,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb60b6921,
+	0x11f40464,
+	0xe05bcb6a,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0xae21f550,
+	0x0464b60a,
+	0xbd025bb9,
+	0x430ef474,
+/* 0x0d90: i2c_recv_not_rd08 */
+	0xf401d6b0,
+	0x57f03d1b,
+	0x1621f500,
+	0x3311f40c,
+	0xf5e0c5c7,
+	0xf40bbb21,
+	0x57f02911,
+	0x1621f500,
+	0x1f11f40c,
+	0xf5e0b5c7,
+	0xf40bbb21,
+	0x21f51511,
+	0x74bd0aae,
+	0xf408c5c7,
+	0x32f4091b,
+	0x030ef402,
+/* 0x0dd0: i2c_recv_not_wr08 */
+/* 0x0dd0: i2c_recv_done */
+	0xf5f8cec7,
+	0xfc0c7b21,
+	0xf4d0fce0,
+	0x7cb90a12,
+	0x4221f502,
+/* 0x0de5: i2c_recv_exit */
+/* 0x0de7: i2c_init */
+	0xf800f803,
+/* 0x0de9: test_recv */
+	0xd817f100,
+	0x0614b605,
+	0xb60011cf,
+	0x07f10110,
+	0x04b605d8,
+	0x0001d006,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x21f5134f,
+	0x00f80262,
+/* 0x0e10: test_init */
+	0x0800e7f1,
+	0x026221f5,
+/* 0x0e1a: idle_recv */
 	0x00f800f8,
-/* 0x0c78: test_recv */
-	0x05d817f1,
-	0xcf0614b6,
-	0x10b60011,
-	0xd807f101,
-	0x0604b605,
-	0xbd0001d0,
-	0x00e7f104,
-	0x4fe3f1d9,
-	0x6221f513,
-/* 0x0c9f: test_init */
-	0xf100f802,
-	0xf50800e7,
-	0xf8026221,
-/* 0x0ca9: idle_recv */
-/* 0x0cab: idle */
-	0xf400f800,
-	0x17f10031,
-	0x14b605d4,
-	0x0011cf06,
-	0xf10110b6,
-	0xb605d407,
-	0x01d00604,
-/* 0x0cc7: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x0ccd: idle_proc */
-/* 0x0ccd: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc034b,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x0ce1: idle_proc_next */
-	0x5810b6ef,
-	0xf4061fb8,
-	0x02f4e61b,
-	0x0028f4dd,
-	0x00bb0ef4,
+/* 0x0e1c: idle */
+	0xf10031f4,
+	0xb605d417,
+	0x11cf0614,
+	0x0110b600,
+	0x05d407f1,
+	0xd00604b6,
+	0x04bd0001,
+/* 0x0e38: idle_loop */
+	0xf45817f0,
+/* 0x0e3e: idle_proc */
+/* 0x0e3e: idle_proc_exec */
+	0x10f90232,
+	0xf5021eb9,
+	0xfc034b21,
+	0x0911f410,
+	0xf40231f4,
+/* 0x0e52: idle_proc_next */
+	0x10b6ef0e,
+	0x061fb858,
+	0xf4e61bf4,
+	0x28f4dd02,
+	0xbb0ef400,
+	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..69a8f8d 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,78 @@ process(PROC_PERF, #perf_init, #perf_recv)
 // $r11 - data1
 // $r0  - zero
 perf_recv:
+	push $r1
+
+	imm32($r10, PROC_HOST)
+	cmp b32 $r14 $r10
+	bra ne #perf_recv_not_host
+		cmp b32 $r13 PERF_MSG_LOAD
+		bra e #perf_load
+		bra #perf_recv_exit
+
+perf_load:
+			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:
+	pop $r1
+	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 +137,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_IDLE
+		| NV_PPWR_COUNTER_SIG_GR_GPC_IDLE
+		| NV_PPWR_COUNTER_SIG_GR_ROP_IDLE
+#if NVKM_PPWR_CHIPSET >= GF100
+		| NV_PPWR_COUNTER_SIG_GR_HUB_IDLE
+		| NV_PPWR_COUNTER_SIG_PCOPY0_IDLE
+		| NV_PPWR_COUNTER_SIG_PCOPY1_IDLE
+#if NVKM_PPWR_CHIPSET >= GK104
+		| NV_PPWR_COUNTER_SIG_PCOPY2_IDLE
+#endif
+#endif
+	)
+	nv_iowr(NV_PPWR_COUNTER_MASK(1), $r14)
+
+	// video load counter
+	imm32($r14,
+		  NV_PPWR_COUNTER_SIG_PVLD_IDLE
+		| NV_PPWR_COUNTER_SIG_PPDEC_IDLE
+		| NV_PPWR_COUNTER_SIG_PPPP_IDLE
+#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.6.2