drm/nouveau/pwr: add some arith functions (mul32_32_64, subu64 and addu64)

Signed-off-by: Martin Peres <martin.peres@free.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/arith.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/arith.fuc
new file mode 100644
index 0000000..214a6d9
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/arith.fuc
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2014 Martin Peres <martin.peres@free.fr>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the folloing conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Martin Peres
+ */
+
+/******************************************************************************
+ * arith data segment
+ *****************************************************************************/
+#ifdef INCLUDE_PROC
+#endif
+
+#ifdef INCLUDE_DATA
+#endif
+
+/******************************************************************************
+ * arith code segment
+ *****************************************************************************/
+#ifdef INCLUDE_CODE
+
+// does a 32x32 -> 64 multiplication
+//
+// A * B = A_lo * B_lo
+//        + ( A_hi * B_lo ) << 16
+//        + ( A_lo * B_hi ) << 16
+//        + ( A_hi * B_hi ) << 32
+//
+// $r15 - current
+// $r14 - A
+// $r13 - B
+// $r12 - mul_lo (return)
+// $r11 - mul_hi (return)
+// $r0  - zero
+mulu32_32_64:
+	push $r1 // A_hi
+	push $r2 // B_hi
+	push $r3 // tmp0
+	push $r4 // tmp1
+
+	shr b32 $r1 $r14 16
+	shr b32 $r2 $r13 16
+
+	clear b32 $r12
+	clear b32 $r11
+
+	// A_lo * B_lo
+	mulu $r12 $r14 $r13
+
+	// ( A_hi * B_lo ) << 16
+	mulu $r3 $r1 $r13 // tmp0 = A_hi * B_lo
+	mov b32 $r4 $r3
+	and $r3 0xffff // tmp0 = tmp0_lo
+	shl b32 $r3 16
+	shr b32 $r4 16 // tmp1 = tmp0_hi
+	add b32 $r12 $r3
+	adc b32 $r11 $r4
+
+	// ( A_lo * B_hi ) << 16
+	mulu $r3 $r14 $r2 // tmp0 = A_lo * B_hi
+	mov b32 $r4 $r3
+	and $r3 0xffff // tmp0 = tmp0_lo
+	shl b32 $r3 16
+	shr b32 $r4 16 // tmp1 = tmp0_hi
+	add b32 $r12 $r3
+	adc b32 $r11 $r4
+
+	// ( A_hi * B_hi ) << 32
+	mulu $r3 $r1 $r2 // tmp0 = A_hi * B_hi
+	add b32 $r11 $r3
+
+	pop $r4
+	pop $r3
+	pop $r2
+	pop $r1
+	ret
+#endif
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/macros.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/macros.fuc
index 5668e04..9707e3f 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/macros.fuc
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/macros.fuc
@@ -250,3 +250,13 @@
 */	st b32 D[$r0] reg /*
 */	clear b32 $r0
 #endif
+
+// does a 64+64 -> 64 unsigned addition (C = A + B)
+#define addu64(reg_a_c_hi, reg_a_c_lo, b_hi, b_lo) /*
+*/    add b32 reg_a_c_lo b_lo /*
+*/    adc b32 reg_a_c_hi b_hi
+
+// does a 64+64 -> 64 substraction (C = A - B)
+#define subu64(reg_a_c_hi, reg_a_c_lo, b_hi, b_lo) /*
+*/    sub b32 reg_a_c_lo b_lo /*
+*/    sbb b32 reg_a_c_hi b_hi
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc
index 17a8a38..cdff6f6 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc
@@ -34,6 +34,7 @@
 .section #nv108_pwr_data
 #define INCLUDE_PROC
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -44,6 +45,7 @@
 
 #define INCLUDE_DATA
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -56,6 +58,7 @@
 .section #nv108_pwr_code
 #define INCLUDE_CODE
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc.h b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc.h
index 38b8ed4..ae8850c 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc.h
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nv108.fuc.h
@@ -24,8 +24,8 @@
 	0x00000000,
 /* 0x0058: proc_list_head */
 	0x54534f48,
+	0x000003e0,
 	0x00000391,
-	0x00000342,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -46,8 +46,8 @@
 	0x00000000,
 	0x00000000,
 	0x584d454d,
-	0x0000047c,
-	0x0000046e,
+	0x000004cb,
+	0x000004bd,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -68,8 +68,8 @@
 	0x00000000,
 	0x00000000,
 	0x46524550,
-	0x00000480,
-	0x0000047e,
+	0x000004cf,
+	0x000004cd,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000884,
-	0x0000072b,
+	0x000008d3,
+	0x0000077a,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x000008a5,
-	0x00000886,
+	0x000008f4,
+	0x000008d5,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x000008b0,
-	0x000008ae,
+	0x000008ff,
+	0x000008fd,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -229,20 +229,20 @@
 /* 0x0370: memx_func_head */
 	0x00010000,
 	0x00000000,
-	0x000003c1,
+	0x00000410,
 /* 0x037c: memx_func_next */
 	0x00000001,
 	0x00000000,
-	0x000003df,
+	0x0000042e,
 	0x00000002,
 	0x00000002,
-	0x000003f7,
+	0x00000446,
 	0x00040003,
 	0x00000000,
-	0x00000414,
+	0x00000463,
 	0x00010004,
 	0x00000000,
-	0x0000042e,
+	0x0000047d,
 /* 0x03ac: memx_func_tail */
 /* 0x03ac: memx_data_head */
 	0x00000000,
@@ -1010,449 +1010,514 @@
 	0xfa0bf400,
 	0xf0b615f9,
 	0xf20ef458,
-/* 0x0304: host_send */
-	0xcf04b041,
-	0xa0420011,
-	0x0022cf04,
+/* 0x0304: mulu32_32_64 */
+	0x20f910f9,
+	0x40f930f9,
+	0x9510e195,
+	0xc4bd10d2,
+	0xedffb4bd,
+	0x301dffc0,
+	0x34f134b2,
+	0x34b6ffff,
+	0x1045b610,
+	0xbb00c3bb,
+	0xe2ff01b4,
+	0xf134b230,
+	0xb6ffff34,
+	0x45b61034,
+	0x00c3bb10,
+	0xff01b4bb,
+	0xb3bb3012,
+	0xfc40fc00,
+	0xfc20fc30,
+/* 0x0353: host_send */
+	0x4100f810,
+	0x11cf04b0,
+	0x04a04200,
+	0xa60022cf,
+	0x2e0bf412,
+	0x94071ec4,
+	0xe0b704ee,
+	0xeb980270,
+	0x02ec9803,
+	0x9801ed98,
+	0x577e00ee,
+	0x10b60002,
+	0x0f1ec401,
+	0xf604b040,
+	0x04bd000e,
+/* 0x038f: host_send_done */
+	0xf8c70ef4,
+/* 0x0391: host_recv */
+	0x4e494100,
+	0x525413f1,
+	0x0bf4e1a6,
+/* 0x039d: host_recv_wait */
+	0x04cc41b9,
+	0x420011cf,
+	0x22cf04c8,
+	0x0816f000,
 	0x0bf412a6,
-	0x071ec42e,
-	0xb704ee94,
-	0x980270e0,
-	0xec9803eb,
-	0x01ed9802,
-	0x7e00ee98,
-	0xb6000257,
-	0x1ec40110,
-	0x04b0400f,
-	0xbd000ef6,
-	0xc70ef404,
-/* 0x0340: host_send_done */
-/* 0x0342: host_recv */
-	0x494100f8,
-	0x5413f14e,
-	0xf4e1a652,
-/* 0x034e: host_recv_wait */
-	0xcc41b90b,
-	0x0011cf04,
-	0xcf04c842,
-	0x16f00022,
-	0xf412a608,
-	0x23c4ef0b,
-	0x0434b607,
-	0x02f030b7,
-	0xb5033bb5,
-	0x3db5023c,
-	0x003eb501,
-	0xf00120b6,
-	0xc8400f24,
-	0x0002f604,
-	0x400204bd,
-	0x02f60000,
-	0xf804bd00,
-/* 0x0391: host_init */
-	0x00804100,
-	0xf11014b6,
-	0x40027015,
-	0x01f604d0,
-	0x4104bd00,
-	0x14b60080,
-	0xf015f110,
-	0x04dc4002,
-	0xbd0001f6,
-	0x40010104,
-	0x01f604c4,
-	0xf804bd00,
-/* 0x03c1: memx_func_enter */
-	0x40040600,
-	0x06f607e0,
-/* 0x03cb: memx_func_enter_wait */
-	0x4604bd00,
-	0x66cf07c0,
-	0x0464f000,
-	0x98f70bf4,
-	0x10b60016,
-/* 0x03df: memx_func_leave */
-	0x0600f804,
-	0x07e44004,
-	0xbd0006f6,
-/* 0x03e9: memx_func_leave_wait */
-	0x07c04604,
-	0xf00066cf,
-	0x1bf40464,
-/* 0x03f7: memx_func_wr32 */
-	0x9800f8f7,
-	0x15980016,
-	0x0810b601,
-	0x50f960f9,
-	0xe0fcd0fc,
-	0x00002e7e,
-	0xf40242b6,
-	0x00f8e81b,
-/* 0x0414: memx_func_wait */
-	0x88cf2c08,
-	0x001e9800,
-	0x98011d98,
-	0x1b98021c,
-	0x1010b603,
-	0x0000717e,
-/* 0x042e: memx_func_delay */
-	0x1e9800f8,
-	0x0410b600,
-	0x00005d7e,
-/* 0x043a: memx_exec */
-	0xe0f900f8,
-	0xc1b2d0f9,
-/* 0x0442: memx_exec_next */
-	0x1398b2b2,
-	0x0410b600,
-	0xf0103495,
-	0x35980c30,
-	0xa655f9de,
-	0xed1ef412,
-	0xe0fcd0fc,
-	0x0002577e,
-/* 0x0462: memx_info */
-	0xac4c00f8,
-	0x08004b03,
-	0x0002577e,
-/* 0x046e: memx_recv */
-	0xd6b000f8,
-	0xc90bf401,
-	0xf400d6b0,
-	0x00f8eb0b,
-/* 0x047c: memx_init */
-/* 0x047e: perf_recv */
-	0x00f800f8,
-/* 0x0480: perf_init */
-/* 0x0482: i2c_drive_scl */
-	0x36b000f8,
-	0x0d0bf400,
-	0xf607e040,
+	0x0723c4ef,
+	0xb70434b6,
+	0xb502f030,
+	0x3cb5033b,
+	0x013db502,
+	0xb6003eb5,
+	0x24f00120,
+	0x04c8400f,
+	0xbd0002f6,
+	0x00400204,
+	0x0002f600,
+	0x00f804bd,
+/* 0x03e0: host_init */
+	0xb6008041,
+	0x15f11014,
+	0xd0400270,
+	0x0001f604,
+	0x804104bd,
+	0x1014b600,
+	0x02f015f1,
+	0xf604dc40,
 	0x04bd0001,
-/* 0x0492: i2c_drive_scl_lo */
-	0xe44000f8,
-	0x0001f607,
+	0xc4400101,
+	0x0001f604,
 	0x00f804bd,
-/* 0x049c: i2c_drive_sda */
-	0xf40036b0,
-	0xe0400d0b,
-	0x0002f607,
-	0x00f804bd,
-/* 0x04ac: i2c_drive_sda_lo */
+/* 0x0410: memx_func_enter */
+	0xe0400406,
+	0x0006f607,
+/* 0x041a: memx_func_enter_wait */
+	0xc04604bd,
+	0x0066cf07,
+	0xf40464f0,
+	0x1698f70b,
+	0x0410b600,
+/* 0x042e: memx_func_leave */
+	0x040600f8,
 	0xf607e440,
-	0x04bd0002,
-/* 0x04b6: i2c_sense_scl */
-	0x32f400f8,
-	0x07c44301,
-	0xfd0033cf,
-	0x0bf40431,
-	0x0131f406,
-/* 0x04c8: i2c_sense_scl_done */
-/* 0x04ca: i2c_sense_sda */
-	0x32f400f8,
-	0x07c44301,
-	0xfd0033cf,
-	0x0bf40432,
-	0x0131f406,
-/* 0x04dc: i2c_sense_sda_done */
-/* 0x04de: i2c_raise_scl */
-	0x40f900f8,
-	0x03089844,
-	0x04827e01,
-/* 0x04e9: i2c_raise_scl_wait */
-	0x03e84e00,
-	0x00005d7e,
-	0x0004b67e,
-	0xb60901f4,
-	0x1bf40142,
-/* 0x04fd: i2c_raise_scl_done */
-	0xf840fcef,
-/* 0x0501: i2c_start */
-	0x04b67e00,
-	0x0d11f400,
-	0x0004ca7e,
-	0xf40611f4,
-/* 0x0512: i2c_start_rep */
-	0x00032e0e,
-	0x0004827e,
-	0x9c7e0103,
-	0x76bb0004,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0x7e50fc04,
-	0xb60004de,
-	0x11f40464,
-/* 0x053d: i2c_start_send */
-	0x7e00031d,
-	0x4e00049c,
-	0x5d7e1388,
-	0x00030000,
-	0x0004827e,
-	0x7e13884e,
-/* 0x0557: i2c_start_out */
+	0x04bd0006,
+/* 0x0438: memx_func_leave_wait */
+	0xcf07c046,
+	0x64f00066,
+	0xf71bf404,
+/* 0x0446: memx_func_wr32 */
+	0x169800f8,
+	0x01159800,
+	0xf90810b6,
+	0xfc50f960,
+	0x7ee0fcd0,
+	0xb600002e,
+	0x1bf40242,
+/* 0x0463: memx_func_wait */
+	0x0800f8e8,
+	0x0088cf2c,
+	0x98001e98,
+	0x1c98011d,
+	0x031b9802,
+	0x7e1010b6,
+	0xf8000071,
+/* 0x047d: memx_func_delay */
+	0x001e9800,
+	0x7e0410b6,
 	0xf800005d,
-/* 0x0559: i2c_stop */
-	0x7e000300,
-	0x03000482,
-	0x049c7e00,
-	0x03e84e00,
-	0x00005d7e,
-	0x827e0103,
-	0x884e0004,
-	0x005d7e13,
-	0x7e010300,
-	0x4e00049c,
-	0x5d7e1388,
-	0x00f80000,
-/* 0x0588: i2c_bitw */
-	0x00049c7e,
+/* 0x0489: memx_exec */
+	0xf9e0f900,
+	0xb2c1b2d0,
+/* 0x0491: memx_exec_next */
+	0x001398b2,
+	0x950410b6,
+	0x30f01034,
+	0xde35980c,
+	0x12a655f9,
+	0xfced1ef4,
+	0x7ee0fcd0,
+	0xf8000257,
+/* 0x04b1: memx_info */
+	0x03ac4c00,
+	0x7e08004b,
+	0xf8000257,
+/* 0x04bd: memx_recv */
+	0x01d6b000,
+	0xb0c90bf4,
+	0x0bf400d6,
+/* 0x04cb: memx_init */
+	0xf800f8eb,
+/* 0x04cd: perf_recv */
+/* 0x04cf: perf_init */
+	0xf800f800,
+/* 0x04d1: i2c_drive_scl */
+	0x0036b000,
+	0x400d0bf4,
+	0x01f607e0,
+	0xf804bd00,
+/* 0x04e1: i2c_drive_scl_lo */
+	0x07e44000,
+	0xbd0001f6,
+/* 0x04eb: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0x07e0400d,
+	0xbd0002f6,
+/* 0x04fb: i2c_drive_sda_lo */
+	0x4000f804,
+	0x02f607e4,
+	0xf804bd00,
+/* 0x0505: i2c_sense_scl */
+	0x0132f400,
+	0xcf07c443,
+	0x31fd0033,
+	0x060bf404,
+/* 0x0517: i2c_sense_scl_done */
+	0xf80131f4,
+/* 0x0519: i2c_sense_sda */
+	0x0132f400,
+	0xcf07c443,
+	0x32fd0033,
+	0x060bf404,
+/* 0x052b: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x052d: i2c_raise_scl */
+	0x4440f900,
+	0x01030898,
+	0x0004d17e,
+/* 0x0538: i2c_raise_scl_wait */
 	0x7e03e84e,
-	0xbb00005d,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x0004de7e,
-	0xf40464b6,
-	0x884e1711,
-	0x005d7e13,
-	0x7e000300,
-	0x4e000482,
-	0x5d7e1388,
-/* 0x05c6: i2c_bitw_out */
-	0x00f80000,
-/* 0x05c8: i2c_bitr */
-	0x9c7e0103,
-	0xe84e0004,
-	0x005d7e03,
+	0x7e00005d,
+	0xf4000505,
+	0x42b60901,
+	0xef1bf401,
+/* 0x054c: i2c_raise_scl_done */
+	0x00f840fc,
+/* 0x0550: i2c_start */
+	0x0005057e,
+	0x7e0d11f4,
+	0xf4000519,
+	0x0ef40611,
+/* 0x0561: i2c_start_rep */
+	0x7e00032e,
+	0x030004d1,
+	0x04eb7e01,
 	0x0076bb00,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
-	0xde7e50fc,
-	0x64b60004,
-	0x1a11f404,
-	0x0004ca7e,
-	0x827e0003,
+	0x2d7e50fc,
+	0x64b60005,
+	0x1d11f404,
+/* 0x058c: i2c_start_send */
+	0xeb7e0003,
 	0x884e0004,
 	0x005d7e13,
-	0x013cf000,
-/* 0x060b: i2c_bitr_done */
-	0xf80131f4,
-/* 0x060d: i2c_get_byte */
-	0x04000500,
-/* 0x0611: i2c_get_byte_next */
-	0x0154b608,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x05c87e50,
-	0x0464b600,
-	0xfd2a11f4,
-	0x42b60553,
-	0xd81bf401,
-	0x76bb0103,
+	0x7e000300,
+	0x4e0004d1,
+	0x5d7e1388,
+/* 0x05a6: i2c_start_out */
+	0x00f80000,
+/* 0x05a8: i2c_stop */
+	0xd17e0003,
+	0x00030004,
+	0x0004eb7e,
+	0x7e03e84e,
+	0x0300005d,
+	0x04d17e01,
+	0x13884e00,
+	0x00005d7e,
+	0xeb7e0103,
+	0x884e0004,
+	0x005d7e13,
+/* 0x05d7: i2c_bitw */
+	0x7e00f800,
+	0x4e0004eb,
+	0x5d7e03e8,
+	0x76bb0000,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0x7e50fc04,
-	0xb6000588,
-/* 0x065a: i2c_get_byte_done */
-	0x00f80464,
-/* 0x065c: i2c_put_byte */
-/* 0x065e: i2c_put_byte_next */
-	0x42b60804,
-	0x3854ff01,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x05887e50,
-	0x0464b600,
-	0xb03411f4,
-	0x1bf40046,
-	0x0076bbd8,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0xc87e50fc,
-	0x64b60005,
-	0x0f11f404,
-	0xb00076bb,
-	0x1bf40136,
-	0x0132f406,
-/* 0x06b4: i2c_put_byte_done */
-/* 0x06b6: i2c_addr */
-	0x76bb00f8,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0x7e50fc04,
-	0xb6000501,
+	0xb600052d,
 	0x11f40464,
-	0x2ec3e729,
-	0x0134b601,
-	0xbb0553fd,
+	0x13884e17,
+	0x00005d7e,
+	0xd17e0003,
+	0x884e0004,
+	0x005d7e13,
+/* 0x0615: i2c_bitw_out */
+/* 0x0617: i2c_bitr */
+	0x0300f800,
+	0x04eb7e01,
+	0x03e84e00,
+	0x00005d7e,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x052d7e50,
+	0x0464b600,
+	0x7e1a11f4,
+	0x03000519,
+	0x04d17e00,
+	0x13884e00,
+	0x00005d7e,
+	0xf4013cf0,
+/* 0x065a: i2c_bitr_done */
+	0x00f80131,
+/* 0x065c: i2c_get_byte */
+	0x08040005,
+/* 0x0660: i2c_get_byte_next */
+	0xbb0154b6,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x00065c7e,
-/* 0x06fb: i2c_addr_done */
-	0xf80464b6,
-/* 0x06fd: i2c_acquire_addr */
-	0xf8cec700,
-	0xb705e4b6,
-	0xf8d014e0,
-/* 0x0709: i2c_acquire */
-	0x06fd7e00,
-	0x00047e00,
-	0x03d9f000,
-	0x00002e7e,
-/* 0x071a: i2c_release */
-	0xfd7e00f8,
-	0x047e0006,
-	0xdaf00000,
-	0x002e7e03,
-/* 0x072b: i2c_recv */
-	0xf400f800,
-	0xc1c70132,
-	0x0214b6f8,
-	0xf52816b0,
-	0xb801371f,
-	0x000bd413,
-	0xb8003298,
-	0x000bac13,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
+	0x0006177e,
+	0xf40464b6,
+	0x53fd2a11,
+	0x0142b605,
+	0x03d81bf4,
+	0x0076bb01,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0xd77e50fc,
+	0x64b60005,
+/* 0x06a9: i2c_get_byte_done */
+/* 0x06ab: i2c_put_byte */
+	0x0400f804,
+/* 0x06ad: i2c_put_byte_next */
+	0x0142b608,
+	0xbb3854ff,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x0007097e,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b01bf5,
-	0x76bb0005,
+	0x0005d77e,
+	0xf40464b6,
+	0x46b03411,
+	0xd81bf400,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x06177e50,
+	0x0464b600,
+	0xbb0f11f4,
+	0x36b00076,
+	0x061bf401,
+/* 0x0703: i2c_put_byte_done */
+	0xf80132f4,
+/* 0x0705: i2c_addr */
+	0x0076bb00,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x507e50fc,
+	0x64b60005,
+	0x2911f404,
+	0x012ec3e7,
+	0xfd0134b6,
+	0x76bb0553,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0x7e50fc04,
-	0xb60006b6,
+	0xb60006ab,
+/* 0x074a: i2c_addr_done */
+	0x00f80464,
+/* 0x074c: i2c_acquire_addr */
+	0xb6f8cec7,
+	0xe0b705e4,
+	0x00f8d014,
+/* 0x0758: i2c_acquire */
+	0x00074c7e,
+	0x0000047e,
+	0x7e03d9f0,
+	0xf800002e,
+/* 0x0769: i2c_release */
+	0x074c7e00,
+	0x00047e00,
+	0x03daf000,
+	0x00002e7e,
+/* 0x077a: i2c_recv */
+	0x32f400f8,
+	0xf8c1c701,
+	0xb00214b6,
+	0x1ff52816,
+	0x13b80137,
+	0x98000bd4,
+	0x13b80032,
+	0x98000bac,
+	0x31f40031,
+	0xf9d0f902,
+	0xf1d0f9e0,
+	0xf1000067,
+	0x92100063,
+	0x76bb0167,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb6000758,
+	0xd0fc0464,
+	0xf500d6b0,
+	0x0500b01b,
+	0x0076bb00,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x057e50fc,
+	0x64b60007,
+	0xcc11f504,
+	0xe0c5c700,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x06ab7e50,
+	0x0464b600,
+	0x00a911f5,
+	0x76bb0105,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb6000705,
 	0x11f50464,
-	0xc5c700cc,
-	0x0076bbe0,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x5c7e50fc,
-	0x64b60006,
-	0xa911f504,
-	0xbb010500,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x0006b67e,
-	0xf50464b6,
-	0xbb008711,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x00060d7e,
-	0xf40464b6,
-	0x5bcb6711,
-	0x0076bbe0,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x597e50fc,
-	0x64b60005,
-	0xbd5bb204,
-	0x410ef474,
-/* 0x0830: i2c_recv_not_rd08 */
-	0xf401d6b0,
-	0x00053b1b,
-	0x0006b67e,
-	0xc73211f4,
-	0x5c7ee0c5,
-	0x11f40006,
-	0x7e000528,
-	0xf40006b6,
-	0xb5c71f11,
-	0x065c7ee0,
-	0x1511f400,
-	0x0005597e,
-	0xc5c774bd,
-	0x091bf408,
-	0xf40232f4,
-/* 0x086e: i2c_recv_not_wr08 */
-/* 0x086e: i2c_recv_done */
-	0xcec7030e,
-	0x071a7ef8,
-	0xfce0fc00,
-	0x0912f4d0,
-	0x577e7cb2,
-/* 0x0882: i2c_recv_exit */
-	0x00f80002,
-/* 0x0884: i2c_init */
-/* 0x0886: test_recv */
-	0x584100f8,
+	0x76bb0087,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0x7e50fc04,
+	0xb600065c,
+	0x11f40464,
+	0xe05bcb67,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x05a87e50,
+	0x0464b600,
+	0x74bd5bb2,
+/* 0x087f: i2c_recv_not_rd08 */
+	0xb0410ef4,
+	0x1bf401d6,
+	0x7e00053b,
+	0xf4000705,
+	0xc5c73211,
+	0x06ab7ee0,
+	0x2811f400,
+	0x057e0005,
+	0x11f40007,
+	0xe0b5c71f,
+	0x0006ab7e,
+	0x7e1511f4,
+	0xbd0005a8,
+	0x08c5c774,
+	0xf4091bf4,
+	0x0ef40232,
+/* 0x08bd: i2c_recv_not_wr08 */
+/* 0x08bd: i2c_recv_done */
+	0xf8cec703,
+	0x0007697e,
+	0xd0fce0fc,
+	0xb20912f4,
+	0x02577e7c,
+/* 0x08d1: i2c_recv_exit */
+/* 0x08d3: i2c_init */
+	0xf800f800,
+/* 0x08d5: test_recv */
+	0x04584100,
+	0xb60011cf,
+	0x58400110,
+	0x0001f604,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x967e134f,
+	0x00f80001,
+/* 0x08f4: test_init */
+	0x7e08004e,
+	0xf8000196,
+/* 0x08fd: idle_recv */
+/* 0x08ff: idle */
+	0xf400f800,
+	0x54410031,
 	0x0011cf04,
 	0x400110b6,
-	0x01f60458,
-	0xf104bd00,
-	0xf1d900e7,
-	0x7e134fe3,
-	0xf8000196,
-/* 0x08a5: test_init */
-	0x08004e00,
-	0x0001967e,
-/* 0x08ae: idle_recv */
-	0x00f800f8,
-/* 0x08b0: idle */
-	0x410031f4,
-	0x11cf0454,
-	0x0110b600,
-	0xf6045440,
-	0x04bd0001,
-/* 0x08c4: idle_loop */
-	0x32f45801,
-/* 0x08c9: idle_proc */
-/* 0x08c9: idle_proc_exec */
-	0xb210f902,
-	0x02607e1e,
-	0xf410fc00,
-	0x31f40911,
-	0xf00ef402,
-/* 0x08dc: idle_proc_next */
-	0xa65810b6,
-	0xe81bf41f,
-	0xf4e002f4,
-	0x0ef40028,
-	0x000000c6,
+	0x01f60454,
+/* 0x0913: idle_loop */
+	0x0104bd00,
+	0x0232f458,
+/* 0x0918: idle_proc */
+/* 0x0918: idle_proc_exec */
+	0x1eb210f9,
+	0x0002607e,
+	0x11f410fc,
+	0x0231f409,
+/* 0x092b: 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,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
+	0x00000000,
 	0x00000000,
 	0x00000000,
 	0x00000000,
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc
index 6744fcc..86a3dda 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc
@@ -34,6 +34,7 @@
 .section #nva3_pwr_data
 #define INCLUDE_PROC
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -44,6 +45,7 @@
 
 #define INCLUDE_DATA
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -56,6 +58,7 @@
 .section #nva3_pwr_code
 #define INCLUDE_CODE
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc.h b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc.h
index 2f152b5..d0d82c2 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc.h
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nva3.fuc.h
@@ -24,8 +24,8 @@
 	0x00000000,
 /* 0x0058: proc_list_head */
 	0x54534f48,
-	0x0000044c,
-	0x000003e9,
+	0x0000049d,
+	0x0000043a,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -46,8 +46,8 @@
 	0x00000000,
 	0x00000000,
 	0x584d454d,
-	0x0000055e,
-	0x00000550,
+	0x000005af,
+	0x000005a1,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -68,8 +68,8 @@
 	0x00000000,
 	0x00000000,
 	0x46524550,
-	0x00000562,
-	0x00000560,
+	0x000005b3,
+	0x000005b1,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000992,
-	0x00000835,
+	0x000009e3,
+	0x00000886,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x000009bb,
-	0x00000994,
+	0x00000a0c,
+	0x000009e5,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x000009c7,
-	0x000009c5,
+	0x00000a18,
+	0x00000a16,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -229,20 +229,20 @@
 /* 0x0370: memx_func_head */
 	0x00010000,
 	0x00000000,
-	0x0000048b,
+	0x000004dc,
 /* 0x037c: memx_func_next */
 	0x00000001,
 	0x00000000,
-	0x000004b2,
+	0x00000503,
 	0x00000002,
 	0x00000002,
-	0x000004d3,
+	0x00000524,
 	0x00040003,
 	0x00000000,
-	0x000004ef,
+	0x00000540,
 	0x00010004,
 	0x00000000,
-	0x0000050c,
+	0x0000055d,
 /* 0x03ac: memx_func_tail */
 /* 0x03ac: memx_data_head */
 	0x00000000,
@@ -1113,503 +1113,504 @@
 	0xf40016b0,
 	0x15f9fa0b,
 	0xf458f0b6,
-/* 0x039e: host_send */
-	0x17f1f20e,
-	0x14b604b0,
-	0x0011cf06,
-	0x04a027f1,
-	0xcf0624b6,
-	0x12b80022,
-	0x320bf406,
-	0x94071ec4,
-	0xe0b704ee,
-	0xeb980270,
-	0x02ec9803,
-	0x9801ed98,
-	0x21f500ee,
-	0x10b602d5,
-	0x0f1ec401,
-	0x04b007f1,
-	0xd00604b6,
-	0x04bd000e,
-/* 0x03e7: host_send_done */
-	0xf8ba0ef4,
-/* 0x03e9: host_recv */
-	0x4917f100,
-	0x5413f14e,
-	0x06e1b852,
-/* 0x03f7: host_recv_wait */
-	0xf1aa0bf4,
-	0xb604cc17,
+/* 0x039e: mulu32_32_64 */
+	0x10f9f20e,
+	0x30f920f9,
+	0xe19540f9,
+	0x10d29510,
+	0xb4bdc4bd,
+	0xffc0edff,
+	0x34b9301d,
+	0xff34f102,
+	0x1034b6ff,
+	0xbb1045b6,
+	0xb4bb00c3,
+	0x30e2ff01,
+	0xf10234b9,
+	0xb6ffff34,
+	0x45b61034,
+	0x00c3bb10,
+	0xff01b4bb,
+	0xb3bb3012,
+	0xfc40fc00,
+	0xfc20fc30,
+/* 0x03ef: host_send */
+	0xf100f810,
+	0xb604b017,
 	0x11cf0614,
-	0xc827f100,
+	0xa027f100,
 	0x0624b604,
-	0xf00022cf,
-	0x12b80816,
-	0xe60bf406,
-	0xb60723c4,
-	0x30b70434,
-	0x3b8002f0,
-	0x023c8003,
-	0x80013d80,
-	0x20b6003e,
-	0x0f24f001,
-	0x04c807f1,
+	0xb80022cf,
+	0x0bf40612,
+	0x071ec432,
+	0xb704ee94,
+	0x980270e0,
+	0xec9803eb,
+	0x01ed9802,
+	0xf500ee98,
+	0xb602d521,
+	0x1ec40110,
+	0xb007f10f,
+	0x0604b604,
+	0xbd000ed0,
+	0xba0ef404,
+/* 0x0438: host_send_done */
+/* 0x043a: host_recv */
+	0x17f100f8,
+	0x13f14e49,
+	0xe1b85254,
+	0xaa0bf406,
+/* 0x0448: host_recv_wait */
+	0x04cc17f1,
+	0xcf0614b6,
+	0x27f10011,
+	0x24b604c8,
+	0x0022cf06,
+	0xb80816f0,
+	0x0bf40612,
+	0x0723c4e6,
+	0xb70434b6,
+	0x8002f030,
+	0x3c80033b,
+	0x013d8002,
+	0xb6003e80,
+	0x24f00120,
+	0xc807f10f,
+	0x0604b604,
+	0xbd0002d0,
+	0x4027f004,
+	0xb60007f0,
+	0x02d00604,
+	0xf804bd00,
+/* 0x049d: host_init */
+	0x8017f100,
+	0x1014b600,
+	0x027015f1,
+	0x04d007f1,
 	0xd00604b6,
-	0x04bd0002,
-	0xf04027f0,
-	0x04b60007,
-	0x0002d006,
-	0x00f804bd,
-/* 0x044c: host_init */
+	0x04bd0001,
 	0x008017f1,
 	0xf11014b6,
-	0xf1027015,
-	0xb604d007,
+	0xf102f015,
+	0xb604dc07,
 	0x01d00604,
-	0xf104bd00,
-	0xb6008017,
-	0x15f11014,
-	0x07f102f0,
-	0x04b604dc,
+	0xf004bd00,
+	0x07f10117,
+	0x04b604c4,
 	0x0001d006,
-	0x17f004bd,
-	0xc407f101,
-	0x0604b604,
-	0xbd0001d0,
-/* 0x048b: memx_func_enter */
+	0x00f804bd,
+/* 0x04dc: memx_func_enter */
+	0xf10467f0,
+	0xb607e007,
+	0x06d00604,
+/* 0x04eb: memx_func_enter_wait */
+	0xf104bd00,
+	0xb607c067,
+	0x66cf0664,
+	0x0464f000,
+	0x98f30bf4,
+	0x10b60016,
+/* 0x0503: memx_func_leave */
 	0xf000f804,
 	0x07f10467,
-	0x04b607e0,
+	0x04b607e4,
 	0x0006d006,
-/* 0x049a: memx_func_enter_wait */
+/* 0x0512: memx_func_leave_wait */
 	0x67f104bd,
 	0x64b607c0,
 	0x0066cf06,
 	0xf40464f0,
-	0x1698f30b,
+	0x00f8f31b,
+/* 0x0524: memx_func_wr32 */
+	0x98001698,
+	0x10b60115,
+	0xf960f908,
+	0xfcd0fc50,
+	0x3f21f4e0,
+	0xf40242b6,
+	0x00f8e91b,
+/* 0x0540: memx_func_wait */
+	0xb62c87f0,
+	0x88cf0684,
+	0x001e9800,
+	0x98011d98,
+	0x1b98021c,
+	0x1010b603,
+	0xf89c21f4,
+/* 0x055d: memx_func_delay */
+	0x001e9800,
+	0xf40410b6,
+	0x00f87f21,
+/* 0x0568: memx_exec */
+	0xd0f9e0f9,
+	0xb902c1b9,
+/* 0x0572: memx_exec_next */
+	0x139802b2,
 	0x0410b600,
-/* 0x04b2: memx_func_leave */
-	0x67f000f8,
-	0xe407f104,
+	0xf0103495,
+	0x35980c30,
+	0xb855f9de,
+	0x1ef40612,
+	0xfcd0fcec,
+	0xd521f5e0,
+/* 0x0593: memx_info */
+	0xf100f802,
+	0xf103acc7,
+	0xf50800b7,
+	0xf802d521,
+/* 0x05a1: memx_recv */
+	0x01d6b000,
+	0xb0c40bf4,
+	0x0bf400d6,
+/* 0x05af: memx_init */
+	0xf800f8e9,
+/* 0x05b1: perf_recv */
+/* 0x05b3: perf_init */
+	0xf800f800,
+/* 0x05b5: i2c_drive_scl */
+	0x0036b000,
+	0xf1110bf4,
+	0xb607e007,
+	0x01d00604,
+	0xf804bd00,
+/* 0x05c9: i2c_drive_scl_lo */
+	0xe407f100,
 	0x0604b607,
-	0xbd0006d0,
-/* 0x04c1: memx_func_leave_wait */
-	0xc067f104,
-	0x0664b607,
-	0xf00066cf,
-	0x1bf40464,
-/* 0x04d3: memx_func_wr32 */
-	0x9800f8f3,
-	0x15980016,
-	0x0810b601,
-	0x50f960f9,
-	0xe0fcd0fc,
-	0xb63f21f4,
-	0x1bf40242,
-/* 0x04ef: memx_func_wait */
-	0xf000f8e9,
-	0x84b62c87,
-	0x0088cf06,
-	0x98001e98,
-	0x1c98011d,
-	0x031b9802,
-	0xf41010b6,
-	0x00f89c21,
-/* 0x050c: memx_func_delay */
-	0xb6001e98,
-	0x21f40410,
-/* 0x0517: memx_exec */
-	0xf900f87f,
-	0xb9d0f9e0,
-	0xb2b902c1,
-/* 0x0521: memx_exec_next */
-	0x00139802,
-	0x950410b6,
-	0x30f01034,
-	0xde35980c,
-	0x12b855f9,
-	0xec1ef406,
-	0xe0fcd0fc,
-	0x02d521f5,
-/* 0x0542: memx_info */
-	0xc7f100f8,
-	0xb7f103ac,
-	0x21f50800,
-	0x00f802d5,
-/* 0x0550: memx_recv */
-	0xf401d6b0,
-	0xd6b0c40b,
-	0xe90bf400,
-/* 0x055e: memx_init */
-	0x00f800f8,
-/* 0x0560: perf_recv */
-/* 0x0562: perf_init */
-	0x00f800f8,
-/* 0x0564: i2c_drive_scl */
-	0xf40036b0,
-	0x07f1110b,
-	0x04b607e0,
-	0x0001d006,
-	0x00f804bd,
-/* 0x0578: i2c_drive_scl_lo */
-	0x07e407f1,
-	0xd00604b6,
-	0x04bd0001,
-/* 0x0586: i2c_drive_sda */
-	0x36b000f8,
-	0x110bf400,
-	0x07e007f1,
-	0xd00604b6,
-	0x04bd0002,
-/* 0x059a: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x04b607e4,
-	0x0002d006,
-	0x00f804bd,
-/* 0x05a8: i2c_sense_scl */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0431fd00,
-	0xf4060bf4,
-/* 0x05be: i2c_sense_scl_done */
-	0x00f80131,
-/* 0x05c0: i2c_sense_sda */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0432fd00,
-	0xf4060bf4,
-/* 0x05d6: i2c_sense_sda_done */
-	0x00f80131,
-/* 0x05d8: i2c_raise_scl */
-	0x47f140f9,
-	0x37f00898,
-	0x6421f501,
-/* 0x05e5: i2c_raise_scl_wait */
+	0xbd0001d0,
+/* 0x05d7: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0xe007f111,
+	0x0604b607,
+	0xbd0002d0,
+/* 0x05eb: i2c_drive_sda_lo */
+	0xf100f804,
+	0xb607e407,
+	0x02d00604,
+	0xf804bd00,
+/* 0x05f9: i2c_sense_scl */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x31fd0033,
+	0x060bf404,
+/* 0x060f: i2c_sense_scl_done */
+	0xf80131f4,
+/* 0x0611: i2c_sense_sda */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x32fd0033,
+	0x060bf404,
+/* 0x0627: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x0629: i2c_raise_scl */
+	0xf140f900,
+	0xf0089847,
+	0x21f50137,
+/* 0x0636: i2c_raise_scl_wait */
+	0xe7f105b5,
+	0x21f403e8,
+	0xf921f57f,
+	0x0901f405,
+	0xf40142b6,
+/* 0x064a: i2c_raise_scl_done */
+	0x40fcef1b,
+/* 0x064e: i2c_start */
+	0x21f500f8,
+	0x11f405f9,
+	0x1121f50d,
+	0x0611f406,
+/* 0x065f: i2c_start_rep */
+	0xf0300ef4,
+	0x21f50037,
+	0x37f005b5,
+	0xd721f501,
+	0x0076bb05,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b60629,
+	0x1f11f404,
+/* 0x068c: i2c_start_send */
+	0xf50037f0,
+	0xf105d721,
+	0xf41388e7,
+	0x37f07f21,
+	0xb521f500,
+	0x88e7f105,
+	0x7f21f413,
+/* 0x06a8: i2c_start_out */
+/* 0x06aa: i2c_stop */
+	0x37f000f8,
+	0xb521f500,
+	0x0037f005,
+	0x05d721f5,
+	0x03e8e7f1,
+	0xf07f21f4,
+	0x21f50137,
+	0xe7f105b5,
+	0x21f41388,
+	0x0137f07f,
+	0x05d721f5,
+	0x1388e7f1,
+	0xf87f21f4,
+/* 0x06dd: i2c_bitw */
+	0xd721f500,
 	0xe8e7f105,
 	0x7f21f403,
-	0x05a821f5,
-	0xb60901f4,
-	0x1bf40142,
-/* 0x05f9: i2c_raise_scl_done */
-	0xf840fcef,
-/* 0x05fd: i2c_start */
-	0xa821f500,
-	0x0d11f405,
-	0x05c021f5,
-	0xf40611f4,
-/* 0x060e: i2c_start_rep */
-	0x37f0300e,
-	0x6421f500,
-	0x0137f005,
-	0x058621f5,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0xd821f550,
-	0x0464b605,
-/* 0x063b: i2c_start_send */
-	0xf01f11f4,
-	0x21f50037,
-	0xe7f10586,
-	0x21f41388,
-	0x0037f07f,
-	0x056421f5,
-	0x1388e7f1,
-/* 0x0657: i2c_start_out */
-	0xf87f21f4,
-/* 0x0659: i2c_stop */
-	0x0037f000,
-	0x056421f5,
-	0xf50037f0,
-	0xf1058621,
-	0xf403e8e7,
-	0x37f07f21,
-	0x6421f501,
-	0x88e7f105,
-	0x7f21f413,
-	0xf50137f0,
-	0xf1058621,
+	0x2921f550,
+	0x0464b606,
+	0xf11811f4,
 	0xf41388e7,
-	0x00f87f21,
-/* 0x068c: i2c_bitw */
-	0x058621f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x05d821f5,
-	0xf40464b6,
-	0xe7f11811,
-	0x21f41388,
-	0x0037f07f,
-	0x056421f5,
-	0x1388e7f1,
-/* 0x06cb: i2c_bitw_out */
-	0xf87f21f4,
-/* 0x06cd: i2c_bitr */
-	0x0137f000,
-	0x058621f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x05d821f5,
-	0xf40464b6,
-	0x21f51b11,
-	0x37f005c0,
-	0x6421f500,
+	0x37f07f21,
+	0xb521f500,
 	0x88e7f105,
 	0x7f21f413,
-	0xf4013cf0,
-/* 0x0712: i2c_bitr_done */
-	0x00f80131,
-/* 0x0714: i2c_get_byte */
-	0xf00057f0,
-/* 0x071a: i2c_get_byte_next */
-	0x54b60847,
+/* 0x071c: i2c_bitw_out */
+/* 0x071e: i2c_bitr */
+	0x37f000f8,
+	0xd721f501,
+	0xe8e7f105,
+	0x7f21f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x2921f550,
+	0x0464b606,
+	0xf51b11f4,
+	0xf0061121,
+	0x21f50037,
+	0xe7f105b5,
+	0x21f41388,
+	0x013cf07f,
+/* 0x0763: i2c_bitr_done */
+	0xf80131f4,
+/* 0x0765: i2c_get_byte */
+	0x0057f000,
+/* 0x076b: i2c_get_byte_next */
+	0xb60847f0,
+	0x76bb0154,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6071e21,
+	0x11f40464,
+	0x0553fd2b,
+	0xf40142b6,
+	0x37f0d81b,
 	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b606cd,
-	0x2b11f404,
-	0xb60553fd,
-	0x1bf40142,
-	0x0137f0d8,
+	0x64b606dd,
+/* 0x07b5: i2c_get_byte_done */
+/* 0x07b7: i2c_put_byte */
+	0xf000f804,
+/* 0x07ba: i2c_put_byte_next */
+	0x42b60847,
+	0x3854ff01,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x8c21f550,
+	0xdd21f550,
 	0x0464b606,
-/* 0x0764: i2c_get_byte_done */
-/* 0x0766: i2c_put_byte */
-	0x47f000f8,
-/* 0x0769: i2c_put_byte_next */
-	0x0142b608,
-	0xbb3854ff,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x068c21f5,
-	0xf40464b6,
-	0x46b03411,
-	0xd81bf400,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xcd21f550,
-	0x0464b606,
-	0xbb0f11f4,
-	0x36b00076,
-	0x061bf401,
-/* 0x07bf: i2c_put_byte_done */
-	0xf80132f4,
-/* 0x07c1: i2c_addr */
-	0x0076bb00,
+	0xb03411f4,
+	0x1bf40046,
+	0x0076bbd8,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b605fd,
-	0x2911f404,
-	0x012ec3e7,
-	0xfd0134b6,
-	0x76bb0553,
+	0x64b6071e,
+	0x0f11f404,
+	0xb00076bb,
+	0x1bf40136,
+	0x0132f406,
+/* 0x0810: i2c_put_byte_done */
+/* 0x0812: i2c_addr */
+	0x76bb00f8,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6076621,
-/* 0x0806: i2c_addr_done */
-	0x00f80464,
-/* 0x0808: i2c_acquire_addr */
-	0xb6f8cec7,
-	0xe0b702e4,
-	0xee980bfc,
-/* 0x0817: i2c_acquire */
-	0xf500f800,
-	0xf4080821,
-	0xd9f00421,
+	0xb6064e21,
+	0x11f40464,
+	0x2ec3e729,
+	0x0134b601,
+	0xbb0553fd,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x07b721f5,
+/* 0x0857: i2c_addr_done */
+	0xf80464b6,
+/* 0x0859: i2c_acquire_addr */
+	0xf8cec700,
+	0xb702e4b6,
+	0x980bfce0,
+	0x00f800ee,
+/* 0x0868: i2c_acquire */
+	0x085921f5,
+	0xf00421f4,
+	0x21f403d9,
+/* 0x0877: i2c_release */
+	0xf500f83f,
+	0xf4085921,
+	0xdaf00421,
 	0x3f21f403,
-/* 0x0826: i2c_release */
-	0x21f500f8,
-	0x21f40808,
-	0x03daf004,
-	0xf83f21f4,
-/* 0x0835: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xd413a001,
-	0x0032980b,
-	0x0bac13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
+/* 0x0886: i2c_recv */
+	0x32f400f8,
+	0xf8c1c701,
+	0xb00214b6,
+	0x1ff52816,
+	0x13a0013a,
+	0x32980bd4,
+	0xac13a000,
+	0x0031980b,
+	0xf90231f4,
+	0xf9e0f9d0,
+	0x0067f1d0,
+	0x0063f100,
+	0x01679210,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x6821f550,
+	0x0464b608,
+	0xd6b0d0fc,
+	0xb31bf500,
+	0x0057f000,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x1221f550,
+	0x0464b608,
+	0x00d011f5,
+	0xbbe0c5c7,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x081721f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07c121f5,
+	0x07b721f5,
 	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0xf000ad11,
+	0x76bb0157,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6076621,
+	0xb6081221,
 	0x11f50464,
-	0x57f000ad,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b607c1,
-	0x8a11f504,
-	0x0076bb00,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60714,
-	0x6a11f404,
-	0xbbe05bcb,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x065921f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x093b: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x07c121f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40766,
-	0x0057f029,
-	0x07c121f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40766,
-	0x5921f515,
-	0xc774bd06,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x097b: i2c_recv_not_wr08 */
-/* 0x097b: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc0826,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x02d521f5,
-/* 0x0990: i2c_recv_exit */
-/* 0x0992: i2c_init */
+	0x76bb008a,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6076521,
+	0x11f40464,
+	0xe05bcb6a,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0xaa21f550,
+	0x0464b606,
+	0xbd025bb9,
+	0x430ef474,
+/* 0x098c: i2c_recv_not_rd08 */
+	0xf401d6b0,
+	0x57f03d1b,
+	0x1221f500,
+	0x3311f408,
+	0xf5e0c5c7,
+	0xf407b721,
+	0x57f02911,
+	0x1221f500,
+	0x1f11f408,
+	0xf5e0b5c7,
+	0xf407b721,
+	0x21f51511,
+	0x74bd06aa,
+	0xf408c5c7,
+	0x32f4091b,
+	0x030ef402,
+/* 0x09cc: i2c_recv_not_wr08 */
+/* 0x09cc: i2c_recv_done */
+	0xf5f8cec7,
+	0xfc087721,
+	0xf4d0fce0,
+	0x7cb90a12,
+	0xd521f502,
+/* 0x09e1: i2c_recv_exit */
+/* 0x09e3: i2c_init */
+	0xf800f802,
+/* 0x09e5: test_recv */
+	0xd817f100,
+	0x0614b605,
+	0xb60011cf,
+	0x07f10110,
+	0x04b605d8,
+	0x0001d006,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x21f5134f,
+	0x00f801f5,
+/* 0x0a0c: test_init */
+	0x0800e7f1,
+	0x01f521f5,
+/* 0x0a16: idle_recv */
 	0x00f800f8,
-/* 0x0994: test_recv */
-	0x05d817f1,
-	0xcf0614b6,
-	0x10b60011,
-	0xd807f101,
-	0x0604b605,
-	0xbd0001d0,
-	0x00e7f104,
-	0x4fe3f1d9,
-	0xf521f513,
-/* 0x09bb: test_init */
-	0xf100f801,
-	0xf50800e7,
-	0xf801f521,
-/* 0x09c5: idle_recv */
-/* 0x09c7: idle */
-	0xf400f800,
-	0x17f10031,
-	0x14b605d4,
-	0x0011cf06,
-	0xf10110b6,
-	0xb605d407,
-	0x01d00604,
-/* 0x09e3: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x09e9: idle_proc */
-/* 0x09e9: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc02de,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x09fd: 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,
+/* 0x0a18: idle */
+	0xf10031f4,
+	0xb605d417,
+	0x11cf0614,
+	0x0110b600,
+	0x05d407f1,
+	0xd00604b6,
+	0x04bd0001,
+/* 0x0a34: idle_loop */
+	0xf45817f0,
+/* 0x0a3a: idle_proc */
+/* 0x0a3a: idle_proc_exec */
+	0x10f90232,
+	0xf5021eb9,
+	0xfc02de21,
+	0x0911f410,
+	0xf40231f4,
+/* 0x0a4e: idle_proc_next */
+	0x10b6ef0e,
+	0x061fb858,
+	0xf4e61bf4,
+	0x28f4dd02,
+	0xbb0ef400,
 	0x00000000,
 	0x00000000,
 	0x00000000,
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc
index 48f7943..ddd72d6 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc
@@ -34,6 +34,7 @@
 .section #nvc0_pwr_data
 #define INCLUDE_PROC
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -44,6 +45,7 @@
 
 #define INCLUDE_DATA
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -56,6 +58,7 @@
 .section #nvc0_pwr_code
 #define INCLUDE_CODE
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc.h b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc.h
index ca96a04..1e2ab16 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc.h
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvc0.fuc.h
@@ -24,8 +24,8 @@
 	0x00000000,
 /* 0x0058: proc_list_head */
 	0x54534f48,
-	0x0000044c,
-	0x000003e9,
+	0x0000049d,
+	0x0000043a,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -46,8 +46,8 @@
 	0x00000000,
 	0x00000000,
 	0x584d454d,
-	0x0000055e,
-	0x00000550,
+	0x000005af,
+	0x000005a1,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -68,8 +68,8 @@
 	0x00000000,
 	0x00000000,
 	0x46524550,
-	0x00000562,
-	0x00000560,
+	0x000005b3,
+	0x000005b1,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x00000992,
-	0x00000835,
+	0x000009e3,
+	0x00000886,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x000009bb,
-	0x00000994,
+	0x00000a0c,
+	0x000009e5,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x000009c7,
-	0x000009c5,
+	0x00000a18,
+	0x00000a16,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -229,20 +229,20 @@
 /* 0x0370: memx_func_head */
 	0x00010000,
 	0x00000000,
-	0x0000048b,
+	0x000004dc,
 /* 0x037c: memx_func_next */
 	0x00000001,
 	0x00000000,
-	0x000004b2,
+	0x00000503,
 	0x00000002,
 	0x00000002,
-	0x000004d3,
+	0x00000524,
 	0x00040003,
 	0x00000000,
-	0x000004ef,
+	0x00000540,
 	0x00010004,
 	0x00000000,
-	0x0000050c,
+	0x0000055d,
 /* 0x03ac: memx_func_tail */
 /* 0x03ac: memx_data_head */
 	0x00000000,
@@ -1113,503 +1113,504 @@
 	0xf40016b0,
 	0x15f9fa0b,
 	0xf458f0b6,
-/* 0x039e: host_send */
-	0x17f1f20e,
-	0x14b604b0,
-	0x0011cf06,
-	0x04a027f1,
-	0xcf0624b6,
-	0x12b80022,
-	0x320bf406,
-	0x94071ec4,
-	0xe0b704ee,
-	0xeb980270,
-	0x02ec9803,
-	0x9801ed98,
-	0x21f500ee,
-	0x10b602d5,
-	0x0f1ec401,
-	0x04b007f1,
-	0xd00604b6,
-	0x04bd000e,
-/* 0x03e7: host_send_done */
-	0xf8ba0ef4,
-/* 0x03e9: host_recv */
-	0x4917f100,
-	0x5413f14e,
-	0x06e1b852,
-/* 0x03f7: host_recv_wait */
-	0xf1aa0bf4,
-	0xb604cc17,
+/* 0x039e: mulu32_32_64 */
+	0x10f9f20e,
+	0x30f920f9,
+	0xe19540f9,
+	0x10d29510,
+	0xb4bdc4bd,
+	0xffc0edff,
+	0x34b9301d,
+	0xff34f102,
+	0x1034b6ff,
+	0xbb1045b6,
+	0xb4bb00c3,
+	0x30e2ff01,
+	0xf10234b9,
+	0xb6ffff34,
+	0x45b61034,
+	0x00c3bb10,
+	0xff01b4bb,
+	0xb3bb3012,
+	0xfc40fc00,
+	0xfc20fc30,
+/* 0x03ef: host_send */
+	0xf100f810,
+	0xb604b017,
 	0x11cf0614,
-	0xc827f100,
+	0xa027f100,
 	0x0624b604,
-	0xf00022cf,
-	0x12b80816,
-	0xe60bf406,
-	0xb60723c4,
-	0x30b70434,
-	0x3b8002f0,
-	0x023c8003,
-	0x80013d80,
-	0x20b6003e,
-	0x0f24f001,
-	0x04c807f1,
+	0xb80022cf,
+	0x0bf40612,
+	0x071ec432,
+	0xb704ee94,
+	0x980270e0,
+	0xec9803eb,
+	0x01ed9802,
+	0xf500ee98,
+	0xb602d521,
+	0x1ec40110,
+	0xb007f10f,
+	0x0604b604,
+	0xbd000ed0,
+	0xba0ef404,
+/* 0x0438: host_send_done */
+/* 0x043a: host_recv */
+	0x17f100f8,
+	0x13f14e49,
+	0xe1b85254,
+	0xaa0bf406,
+/* 0x0448: host_recv_wait */
+	0x04cc17f1,
+	0xcf0614b6,
+	0x27f10011,
+	0x24b604c8,
+	0x0022cf06,
+	0xb80816f0,
+	0x0bf40612,
+	0x0723c4e6,
+	0xb70434b6,
+	0x8002f030,
+	0x3c80033b,
+	0x013d8002,
+	0xb6003e80,
+	0x24f00120,
+	0xc807f10f,
+	0x0604b604,
+	0xbd0002d0,
+	0x4027f004,
+	0xb60007f0,
+	0x02d00604,
+	0xf804bd00,
+/* 0x049d: host_init */
+	0x8017f100,
+	0x1014b600,
+	0x027015f1,
+	0x04d007f1,
 	0xd00604b6,
-	0x04bd0002,
-	0xf04027f0,
-	0x04b60007,
-	0x0002d006,
-	0x00f804bd,
-/* 0x044c: host_init */
+	0x04bd0001,
 	0x008017f1,
 	0xf11014b6,
-	0xf1027015,
-	0xb604d007,
+	0xf102f015,
+	0xb604dc07,
 	0x01d00604,
-	0xf104bd00,
-	0xb6008017,
-	0x15f11014,
-	0x07f102f0,
-	0x04b604dc,
+	0xf004bd00,
+	0x07f10117,
+	0x04b604c4,
 	0x0001d006,
-	0x17f004bd,
-	0xc407f101,
-	0x0604b604,
-	0xbd0001d0,
-/* 0x048b: memx_func_enter */
+	0x00f804bd,
+/* 0x04dc: memx_func_enter */
+	0xf10467f0,
+	0xb607e007,
+	0x06d00604,
+/* 0x04eb: memx_func_enter_wait */
+	0xf104bd00,
+	0xb607c067,
+	0x66cf0664,
+	0x0464f000,
+	0x98f30bf4,
+	0x10b60016,
+/* 0x0503: memx_func_leave */
 	0xf000f804,
 	0x07f10467,
-	0x04b607e0,
+	0x04b607e4,
 	0x0006d006,
-/* 0x049a: memx_func_enter_wait */
+/* 0x0512: memx_func_leave_wait */
 	0x67f104bd,
 	0x64b607c0,
 	0x0066cf06,
 	0xf40464f0,
-	0x1698f30b,
+	0x00f8f31b,
+/* 0x0524: memx_func_wr32 */
+	0x98001698,
+	0x10b60115,
+	0xf960f908,
+	0xfcd0fc50,
+	0x3f21f4e0,
+	0xf40242b6,
+	0x00f8e91b,
+/* 0x0540: memx_func_wait */
+	0xb62c87f0,
+	0x88cf0684,
+	0x001e9800,
+	0x98011d98,
+	0x1b98021c,
+	0x1010b603,
+	0xf89c21f4,
+/* 0x055d: memx_func_delay */
+	0x001e9800,
+	0xf40410b6,
+	0x00f87f21,
+/* 0x0568: memx_exec */
+	0xd0f9e0f9,
+	0xb902c1b9,
+/* 0x0572: memx_exec_next */
+	0x139802b2,
 	0x0410b600,
-/* 0x04b2: memx_func_leave */
-	0x67f000f8,
-	0xe407f104,
+	0xf0103495,
+	0x35980c30,
+	0xb855f9de,
+	0x1ef40612,
+	0xfcd0fcec,
+	0xd521f5e0,
+/* 0x0593: memx_info */
+	0xf100f802,
+	0xf103acc7,
+	0xf50800b7,
+	0xf802d521,
+/* 0x05a1: memx_recv */
+	0x01d6b000,
+	0xb0c40bf4,
+	0x0bf400d6,
+/* 0x05af: memx_init */
+	0xf800f8e9,
+/* 0x05b1: perf_recv */
+/* 0x05b3: perf_init */
+	0xf800f800,
+/* 0x05b5: i2c_drive_scl */
+	0x0036b000,
+	0xf1110bf4,
+	0xb607e007,
+	0x01d00604,
+	0xf804bd00,
+/* 0x05c9: i2c_drive_scl_lo */
+	0xe407f100,
 	0x0604b607,
-	0xbd0006d0,
-/* 0x04c1: memx_func_leave_wait */
-	0xc067f104,
-	0x0664b607,
-	0xf00066cf,
-	0x1bf40464,
-/* 0x04d3: memx_func_wr32 */
-	0x9800f8f3,
-	0x15980016,
-	0x0810b601,
-	0x50f960f9,
-	0xe0fcd0fc,
-	0xb63f21f4,
-	0x1bf40242,
-/* 0x04ef: memx_func_wait */
-	0xf000f8e9,
-	0x84b62c87,
-	0x0088cf06,
-	0x98001e98,
-	0x1c98011d,
-	0x031b9802,
-	0xf41010b6,
-	0x00f89c21,
-/* 0x050c: memx_func_delay */
-	0xb6001e98,
-	0x21f40410,
-/* 0x0517: memx_exec */
-	0xf900f87f,
-	0xb9d0f9e0,
-	0xb2b902c1,
-/* 0x0521: memx_exec_next */
-	0x00139802,
-	0x950410b6,
-	0x30f01034,
-	0xde35980c,
-	0x12b855f9,
-	0xec1ef406,
-	0xe0fcd0fc,
-	0x02d521f5,
-/* 0x0542: memx_info */
-	0xc7f100f8,
-	0xb7f103ac,
-	0x21f50800,
-	0x00f802d5,
-/* 0x0550: memx_recv */
-	0xf401d6b0,
-	0xd6b0c40b,
-	0xe90bf400,
-/* 0x055e: memx_init */
-	0x00f800f8,
-/* 0x0560: perf_recv */
-/* 0x0562: perf_init */
-	0x00f800f8,
-/* 0x0564: i2c_drive_scl */
-	0xf40036b0,
-	0x07f1110b,
-	0x04b607e0,
-	0x0001d006,
-	0x00f804bd,
-/* 0x0578: i2c_drive_scl_lo */
-	0x07e407f1,
-	0xd00604b6,
-	0x04bd0001,
-/* 0x0586: i2c_drive_sda */
-	0x36b000f8,
-	0x110bf400,
-	0x07e007f1,
-	0xd00604b6,
-	0x04bd0002,
-/* 0x059a: i2c_drive_sda_lo */
-	0x07f100f8,
-	0x04b607e4,
-	0x0002d006,
-	0x00f804bd,
-/* 0x05a8: i2c_sense_scl */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0431fd00,
-	0xf4060bf4,
-/* 0x05be: i2c_sense_scl_done */
-	0x00f80131,
-/* 0x05c0: i2c_sense_sda */
-	0xf10132f4,
-	0xb607c437,
-	0x33cf0634,
-	0x0432fd00,
-	0xf4060bf4,
-/* 0x05d6: i2c_sense_sda_done */
-	0x00f80131,
-/* 0x05d8: i2c_raise_scl */
-	0x47f140f9,
-	0x37f00898,
-	0x6421f501,
-/* 0x05e5: i2c_raise_scl_wait */
+	0xbd0001d0,
+/* 0x05d7: i2c_drive_sda */
+	0xb000f804,
+	0x0bf40036,
+	0xe007f111,
+	0x0604b607,
+	0xbd0002d0,
+/* 0x05eb: i2c_drive_sda_lo */
+	0xf100f804,
+	0xb607e407,
+	0x02d00604,
+	0xf804bd00,
+/* 0x05f9: i2c_sense_scl */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x31fd0033,
+	0x060bf404,
+/* 0x060f: i2c_sense_scl_done */
+	0xf80131f4,
+/* 0x0611: i2c_sense_sda */
+	0x0132f400,
+	0x07c437f1,
+	0xcf0634b6,
+	0x32fd0033,
+	0x060bf404,
+/* 0x0627: i2c_sense_sda_done */
+	0xf80131f4,
+/* 0x0629: i2c_raise_scl */
+	0xf140f900,
+	0xf0089847,
+	0x21f50137,
+/* 0x0636: i2c_raise_scl_wait */
+	0xe7f105b5,
+	0x21f403e8,
+	0xf921f57f,
+	0x0901f405,
+	0xf40142b6,
+/* 0x064a: i2c_raise_scl_done */
+	0x40fcef1b,
+/* 0x064e: i2c_start */
+	0x21f500f8,
+	0x11f405f9,
+	0x1121f50d,
+	0x0611f406,
+/* 0x065f: i2c_start_rep */
+	0xf0300ef4,
+	0x21f50037,
+	0x37f005b5,
+	0xd721f501,
+	0x0076bb05,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b60629,
+	0x1f11f404,
+/* 0x068c: i2c_start_send */
+	0xf50037f0,
+	0xf105d721,
+	0xf41388e7,
+	0x37f07f21,
+	0xb521f500,
+	0x88e7f105,
+	0x7f21f413,
+/* 0x06a8: i2c_start_out */
+/* 0x06aa: i2c_stop */
+	0x37f000f8,
+	0xb521f500,
+	0x0037f005,
+	0x05d721f5,
+	0x03e8e7f1,
+	0xf07f21f4,
+	0x21f50137,
+	0xe7f105b5,
+	0x21f41388,
+	0x0137f07f,
+	0x05d721f5,
+	0x1388e7f1,
+	0xf87f21f4,
+/* 0x06dd: i2c_bitw */
+	0xd721f500,
 	0xe8e7f105,
 	0x7f21f403,
-	0x05a821f5,
-	0xb60901f4,
-	0x1bf40142,
-/* 0x05f9: i2c_raise_scl_done */
-	0xf840fcef,
-/* 0x05fd: i2c_start */
-	0xa821f500,
-	0x0d11f405,
-	0x05c021f5,
-	0xf40611f4,
-/* 0x060e: i2c_start_rep */
-	0x37f0300e,
-	0x6421f500,
-	0x0137f005,
-	0x058621f5,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0xd821f550,
-	0x0464b605,
-/* 0x063b: i2c_start_send */
-	0xf01f11f4,
-	0x21f50037,
-	0xe7f10586,
-	0x21f41388,
-	0x0037f07f,
-	0x056421f5,
-	0x1388e7f1,
-/* 0x0657: i2c_start_out */
-	0xf87f21f4,
-/* 0x0659: i2c_stop */
-	0x0037f000,
-	0x056421f5,
-	0xf50037f0,
-	0xf1058621,
-	0xf403e8e7,
-	0x37f07f21,
-	0x6421f501,
-	0x88e7f105,
-	0x7f21f413,
-	0xf50137f0,
-	0xf1058621,
+	0x2921f550,
+	0x0464b606,
+	0xf11811f4,
 	0xf41388e7,
-	0x00f87f21,
-/* 0x068c: i2c_bitw */
-	0x058621f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x05d821f5,
-	0xf40464b6,
-	0xe7f11811,
-	0x21f41388,
-	0x0037f07f,
-	0x056421f5,
-	0x1388e7f1,
-/* 0x06cb: i2c_bitw_out */
-	0xf87f21f4,
-/* 0x06cd: i2c_bitr */
-	0x0137f000,
-	0x058621f5,
-	0x03e8e7f1,
-	0xbb7f21f4,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x05d821f5,
-	0xf40464b6,
-	0x21f51b11,
-	0x37f005c0,
-	0x6421f500,
+	0x37f07f21,
+	0xb521f500,
 	0x88e7f105,
 	0x7f21f413,
-	0xf4013cf0,
-/* 0x0712: i2c_bitr_done */
-	0x00f80131,
-/* 0x0714: i2c_get_byte */
-	0xf00057f0,
-/* 0x071a: i2c_get_byte_next */
-	0x54b60847,
+/* 0x071c: i2c_bitw_out */
+/* 0x071e: i2c_bitr */
+	0x37f000f8,
+	0xd721f501,
+	0xe8e7f105,
+	0x7f21f403,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x2921f550,
+	0x0464b606,
+	0xf51b11f4,
+	0xf0061121,
+	0x21f50037,
+	0xe7f105b5,
+	0x21f41388,
+	0x013cf07f,
+/* 0x0763: i2c_bitr_done */
+	0xf80131f4,
+/* 0x0765: i2c_get_byte */
+	0x0057f000,
+/* 0x076b: i2c_get_byte_next */
+	0xb60847f0,
+	0x76bb0154,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6071e21,
+	0x11f40464,
+	0x0553fd2b,
+	0xf40142b6,
+	0x37f0d81b,
 	0x0076bb01,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b606cd,
-	0x2b11f404,
-	0xb60553fd,
-	0x1bf40142,
-	0x0137f0d8,
+	0x64b606dd,
+/* 0x07b5: i2c_get_byte_done */
+/* 0x07b7: i2c_put_byte */
+	0xf000f804,
+/* 0x07ba: i2c_put_byte_next */
+	0x42b60847,
+	0x3854ff01,
 	0xb60076bb,
 	0x50f90465,
 	0xbb046594,
 	0x50bd0256,
 	0xfc0475fd,
-	0x8c21f550,
+	0xdd21f550,
 	0x0464b606,
-/* 0x0764: i2c_get_byte_done */
-/* 0x0766: i2c_put_byte */
-	0x47f000f8,
-/* 0x0769: i2c_put_byte_next */
-	0x0142b608,
-	0xbb3854ff,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x068c21f5,
-	0xf40464b6,
-	0x46b03411,
-	0xd81bf400,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xcd21f550,
-	0x0464b606,
-	0xbb0f11f4,
-	0x36b00076,
-	0x061bf401,
-/* 0x07bf: i2c_put_byte_done */
-	0xf80132f4,
-/* 0x07c1: i2c_addr */
-	0x0076bb00,
+	0xb03411f4,
+	0x1bf40046,
+	0x0076bbd8,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b605fd,
-	0x2911f404,
-	0x012ec3e7,
-	0xfd0134b6,
-	0x76bb0553,
+	0x64b6071e,
+	0x0f11f404,
+	0xb00076bb,
+	0x1bf40136,
+	0x0132f406,
+/* 0x0810: i2c_put_byte_done */
+/* 0x0812: i2c_addr */
+	0x76bb00f8,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6076621,
-/* 0x0806: i2c_addr_done */
-	0x00f80464,
-/* 0x0808: i2c_acquire_addr */
-	0xb6f8cec7,
-	0xe0b702e4,
-	0xee980bfc,
-/* 0x0817: i2c_acquire */
-	0xf500f800,
-	0xf4080821,
-	0xd9f00421,
+	0xb6064e21,
+	0x11f40464,
+	0x2ec3e729,
+	0x0134b601,
+	0xbb0553fd,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x07b721f5,
+/* 0x0857: i2c_addr_done */
+	0xf80464b6,
+/* 0x0859: i2c_acquire_addr */
+	0xf8cec700,
+	0xb702e4b6,
+	0x980bfce0,
+	0x00f800ee,
+/* 0x0868: i2c_acquire */
+	0x085921f5,
+	0xf00421f4,
+	0x21f403d9,
+/* 0x0877: i2c_release */
+	0xf500f83f,
+	0xf4085921,
+	0xdaf00421,
 	0x3f21f403,
-/* 0x0826: i2c_release */
-	0x21f500f8,
-	0x21f40808,
-	0x03daf004,
-	0xf83f21f4,
-/* 0x0835: i2c_recv */
-	0x0132f400,
-	0xb6f8c1c7,
-	0x16b00214,
-	0x3a1ff528,
-	0xd413a001,
-	0x0032980b,
-	0x0bac13a0,
-	0xf4003198,
-	0xd0f90231,
-	0xd0f9e0f9,
-	0x000067f1,
-	0x100063f1,
-	0xbb016792,
+/* 0x0886: i2c_recv */
+	0x32f400f8,
+	0xf8c1c701,
+	0xb00214b6,
+	0x1ff52816,
+	0x13a0013a,
+	0x32980bd4,
+	0xac13a000,
+	0x0031980b,
+	0xf90231f4,
+	0xf9e0f9d0,
+	0x0067f1d0,
+	0x0063f100,
+	0x01679210,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x6821f550,
+	0x0464b608,
+	0xd6b0d0fc,
+	0xb31bf500,
+	0x0057f000,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x1221f550,
+	0x0464b608,
+	0x00d011f5,
+	0xbbe0c5c7,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x081721f5,
-	0xfc0464b6,
-	0x00d6b0d0,
-	0x00b31bf5,
-	0xbb0057f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x07c121f5,
+	0x07b721f5,
 	0xf50464b6,
-	0xc700d011,
-	0x76bbe0c5,
+	0xf000ad11,
+	0x76bb0157,
 	0x0465b600,
 	0x659450f9,
 	0x0256bb04,
 	0x75fd50bd,
 	0xf550fc04,
-	0xb6076621,
+	0xb6081221,
 	0x11f50464,
-	0x57f000ad,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b607c1,
-	0x8a11f504,
-	0x0076bb00,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60714,
-	0x6a11f404,
-	0xbbe05bcb,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x065921f5,
-	0xb90464b6,
-	0x74bd025b,
-/* 0x093b: i2c_recv_not_rd08 */
-	0xb0430ef4,
-	0x1bf401d6,
-	0x0057f03d,
-	0x07c121f5,
-	0xc73311f4,
-	0x21f5e0c5,
-	0x11f40766,
-	0x0057f029,
-	0x07c121f5,
-	0xc71f11f4,
-	0x21f5e0b5,
-	0x11f40766,
-	0x5921f515,
-	0xc774bd06,
-	0x1bf408c5,
-	0x0232f409,
-/* 0x097b: i2c_recv_not_wr08 */
-/* 0x097b: i2c_recv_done */
-	0xc7030ef4,
-	0x21f5f8ce,
-	0xe0fc0826,
-	0x12f4d0fc,
-	0x027cb90a,
-	0x02d521f5,
-/* 0x0990: i2c_recv_exit */
-/* 0x0992: i2c_init */
+	0x76bb008a,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6076521,
+	0x11f40464,
+	0xe05bcb6a,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0xaa21f550,
+	0x0464b606,
+	0xbd025bb9,
+	0x430ef474,
+/* 0x098c: i2c_recv_not_rd08 */
+	0xf401d6b0,
+	0x57f03d1b,
+	0x1221f500,
+	0x3311f408,
+	0xf5e0c5c7,
+	0xf407b721,
+	0x57f02911,
+	0x1221f500,
+	0x1f11f408,
+	0xf5e0b5c7,
+	0xf407b721,
+	0x21f51511,
+	0x74bd06aa,
+	0xf408c5c7,
+	0x32f4091b,
+	0x030ef402,
+/* 0x09cc: i2c_recv_not_wr08 */
+/* 0x09cc: i2c_recv_done */
+	0xf5f8cec7,
+	0xfc087721,
+	0xf4d0fce0,
+	0x7cb90a12,
+	0xd521f502,
+/* 0x09e1: i2c_recv_exit */
+/* 0x09e3: i2c_init */
+	0xf800f802,
+/* 0x09e5: test_recv */
+	0xd817f100,
+	0x0614b605,
+	0xb60011cf,
+	0x07f10110,
+	0x04b605d8,
+	0x0001d006,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x21f5134f,
+	0x00f801f5,
+/* 0x0a0c: test_init */
+	0x0800e7f1,
+	0x01f521f5,
+/* 0x0a16: idle_recv */
 	0x00f800f8,
-/* 0x0994: test_recv */
-	0x05d817f1,
-	0xcf0614b6,
-	0x10b60011,
-	0xd807f101,
-	0x0604b605,
-	0xbd0001d0,
-	0x00e7f104,
-	0x4fe3f1d9,
-	0xf521f513,
-/* 0x09bb: test_init */
-	0xf100f801,
-	0xf50800e7,
-	0xf801f521,
-/* 0x09c5: idle_recv */
-/* 0x09c7: idle */
-	0xf400f800,
-	0x17f10031,
-	0x14b605d4,
-	0x0011cf06,
-	0xf10110b6,
-	0xb605d407,
-	0x01d00604,
-/* 0x09e3: idle_loop */
-	0xf004bd00,
-	0x32f45817,
-/* 0x09e9: idle_proc */
-/* 0x09e9: idle_proc_exec */
-	0xb910f902,
-	0x21f5021e,
-	0x10fc02de,
-	0xf40911f4,
-	0x0ef40231,
-/* 0x09fd: 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,
+/* 0x0a18: idle */
+	0xf10031f4,
+	0xb605d417,
+	0x11cf0614,
+	0x0110b600,
+	0x05d407f1,
+	0xd00604b6,
+	0x04bd0001,
+/* 0x0a34: idle_loop */
+	0xf45817f0,
+/* 0x0a3a: idle_proc */
+/* 0x0a3a: idle_proc_exec */
+	0x10f90232,
+	0xf5021eb9,
+	0xfc02de21,
+	0x0911f410,
+	0xf40231f4,
+/* 0x0a4e: idle_proc_next */
+	0x10b6ef0e,
+	0x061fb858,
+	0xf4e61bf4,
+	0x28f4dd02,
+	0xbb0ef400,
 	0x00000000,
 	0x00000000,
 	0x00000000,
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc
index 8a89dfe..125439e 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc
@@ -34,6 +34,7 @@
 .section #nvd0_pwr_data
 #define INCLUDE_PROC
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -44,6 +45,7 @@
 
 #define INCLUDE_DATA
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
@@ -56,6 +58,7 @@
 .section #nvd0_pwr_code
 #define INCLUDE_CODE
 #include "kernel.fuc"
+#include "arith.fuc"
 #include "host.fuc"
 #include "memx.fuc"
 #include "perf.fuc"
diff --git a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc.h b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc.h
index 5d81cbd..21929dd 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc.h
+++ b/drivers/gpu/drm/nouveau/core/subdev/pwr/fuc/nvd0.fuc.h
@@ -24,8 +24,8 @@
 	0x00000000,
 /* 0x0058: proc_list_head */
 	0x54534f48,
-	0x000003d7,
-	0x00000380,
+	0x00000428,
+	0x000003d1,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -46,8 +46,8 @@
 	0x00000000,
 	0x00000000,
 	0x584d454d,
-	0x000004d1,
-	0x000004c3,
+	0x00000522,
+	0x00000514,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -68,8 +68,8 @@
 	0x00000000,
 	0x00000000,
 	0x46524550,
-	0x000004d5,
-	0x000004d3,
+	0x00000526,
+	0x00000524,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -90,8 +90,8 @@
 	0x00000000,
 	0x00000000,
 	0x5f433249,
-	0x000008f0,
-	0x00000793,
+	0x00000941,
+	0x000007e4,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -112,8 +112,8 @@
 	0x00000000,
 	0x00000000,
 	0x54534554,
-	0x00000913,
-	0x000008f2,
+	0x00000964,
+	0x00000943,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -134,8 +134,8 @@
 	0x00000000,
 	0x00000000,
 	0x454c4449,
-	0x0000091f,
-	0x0000091d,
+	0x00000970,
+	0x0000096e,
 	0x00000000,
 	0x00000000,
 	0x00000000,
@@ -229,20 +229,20 @@
 /* 0x0370: memx_func_head */
 	0x00010000,
 	0x00000000,
-	0x0000040d,
+	0x0000045e,
 /* 0x037c: memx_func_next */
 	0x00000001,
 	0x00000000,
-	0x0000042e,
+	0x0000047f,
 	0x00000002,
 	0x00000002,
-	0x00000449,
+	0x0000049a,
 	0x00040003,
 	0x00000000,
-	0x00000465,
+	0x000004b6,
 	0x00010004,
 	0x00000000,
-	0x0000047f,
+	0x000004d0,
 /* 0x03ac: memx_func_tail */
 /* 0x03ac: memx_data_head */
 	0x00000000,
@@ -1024,484 +1024,485 @@
 	0xf40016b0,
 	0x15f9fa0b,
 	0xf458f0b6,
-/* 0x033e: host_send */
-	0x17f1f20e,
-	0x11cf04b0,
-	0xa027f100,
-	0x0022cf04,
+/* 0x033e: mulu32_32_64 */
+	0x10f9f20e,
+	0x30f920f9,
+	0xe19540f9,
+	0x10d29510,
+	0xb4bdc4bd,
+	0xffc0edff,
+	0x34b9301d,
+	0xff34f102,
+	0x1034b6ff,
+	0xbb1045b6,
+	0xb4bb00c3,
+	0x30e2ff01,
+	0xf10234b9,
+	0xb6ffff34,
+	0x45b61034,
+	0x00c3bb10,
+	0xff01b4bb,
+	0xb3bb3012,
+	0xfc40fc00,
+	0xfc20fc30,
+/* 0x038f: host_send */
+	0xf100f810,
+	0xcf04b017,
+	0x27f10011,
+	0x22cf04a0,
+	0x0612b800,
+	0xc42f0bf4,
+	0xee94071e,
+	0x70e0b704,
+	0x03eb9802,
+	0x9802ec98,
+	0xee9801ed,
+	0x8421f500,
+	0x0110b602,
+	0xf10f1ec4,
+	0xd004b007,
+	0x04bd000e,
+/* 0x03cf: host_send_done */
+	0xf8c30ef4,
+/* 0x03d1: host_recv */
+	0x4917f100,
+	0x5413f14e,
+	0x06e1b852,
+/* 0x03df: host_recv_wait */
+	0xf1b30bf4,
+	0xcf04cc17,
+	0x27f10011,
+	0x22cf04c8,
+	0x0816f000,
 	0xf40612b8,
-	0x1ec42f0b,
-	0x04ee9407,
-	0x0270e0b7,
-	0x9803eb98,
-	0xed9802ec,
-	0x00ee9801,
-	0x028421f5,
-	0xc40110b6,
-	0x07f10f1e,
-	0x0ed004b0,
-	0xf404bd00,
-/* 0x037e: host_send_done */
-	0x00f8c30e,
-/* 0x0380: host_recv */
-	0x4e4917f1,
-	0x525413f1,
-	0xf406e1b8,
-/* 0x038e: host_recv_wait */
-	0x17f1b30b,
-	0x11cf04cc,
-	0xc827f100,
-	0x0022cf04,
-	0xb80816f0,
-	0x0bf40612,
-	0x0723c4ec,
-	0xb70434b6,
-	0x8002f030,
-	0x3c80033b,
-	0x013d8002,
-	0xb6003e80,
-	0x24f00120,
-	0xc807f10f,
-	0x0002d004,
-	0x27f004bd,
-	0x0007f040,
-	0xbd0002d0,
-/* 0x03d7: host_init */
-	0xf100f804,
-	0xb6008017,
-	0x15f11014,
-	0x07f10270,
-	0x01d004d0,
-	0xf104bd00,
-	0xb6008017,
-	0x15f11014,
-	0x07f102f0,
-	0x01d004dc,
+	0x23c4ec0b,
+	0x0434b607,
+	0x02f030b7,
+	0x80033b80,
+	0x3d80023c,
+	0x003e8001,
+	0xf00120b6,
+	0x07f10f24,
+	0x02d004c8,
 	0xf004bd00,
-	0x07f10117,
-	0x01d004c4,
-	0xf804bd00,
-/* 0x040d: memx_func_enter */
-	0x0467f000,
-	0x07e007f1,
-	0xbd0006d0,
-/* 0x0419: memx_func_enter_wait */
-	0xc067f104,
-	0x0066cf07,
-	0xf40464f0,
-	0x1698f60b,
-	0x0410b600,
-/* 0x042e: memx_func_leave */
+	0x07f04027,
+	0x0002d000,
+	0x00f804bd,
+/* 0x0428: host_init */
+	0x008017f1,
+	0xf11014b6,
+	0xf1027015,
+	0xd004d007,
+	0x04bd0001,
+	0x008017f1,
+	0xf11014b6,
+	0xf102f015,
+	0xd004dc07,
+	0x04bd0001,
+	0xf10117f0,
+	0xd004c407,
+	0x04bd0001,
+/* 0x045e: memx_func_enter */
 	0x67f000f8,
-	0xe407f104,
+	0xe007f104,
 	0x0006d007,
-/* 0x043a: memx_func_leave_wait */
+/* 0x046a: memx_func_enter_wait */
 	0x67f104bd,
 	0x66cf07c0,
 	0x0464f000,
-	0xf8f61bf4,
-/* 0x0449: memx_func_wr32 */
-	0x00169800,
-	0xb6011598,
-	0x60f90810,
-	0xd0fc50f9,
-	0x21f4e0fc,
-	0x0242b633,
-	0xf8e91bf4,
-/* 0x0465: memx_func_wait */
-	0x2c87f000,
-	0x980088cf,
-	0x1d98001e,
-	0x021c9801,
-	0xb6031b98,
-	0x21f41010,
-/* 0x047f: memx_func_delay */
-	0x9800f87e,
-	0x10b6001e,
-	0x6721f404,
-/* 0x048a: memx_exec */
-	0xe0f900f8,
-	0xc1b9d0f9,
-	0x02b2b902,
-/* 0x0494: memx_exec_next */
-	0xb6001398,
-	0x34950410,
-	0x0c30f010,
-	0xf9de3598,
-	0x0612b855,
-	0xfcec1ef4,
-	0xf5e0fcd0,
-	0xf8028421,
-/* 0x04b5: memx_info */
-	0xacc7f100,
-	0x00b7f103,
-	0x8421f508,
-/* 0x04c3: memx_recv */
-	0xb000f802,
-	0x0bf401d6,
-	0x00d6b0c4,
-	0xf8e90bf4,
-/* 0x04d1: memx_init */
-/* 0x04d3: perf_recv */
-	0xf800f800,
-/* 0x04d5: perf_init */
-/* 0x04d7: i2c_drive_scl */
-	0xb000f800,
-	0x0bf40036,
-	0xe007f10e,
+	0x98f60bf4,
+	0x10b60016,
+/* 0x047f: memx_func_leave */
+	0xf000f804,
+	0x07f10467,
+	0x06d007e4,
+/* 0x048b: memx_func_leave_wait */
+	0xf104bd00,
+	0xcf07c067,
+	0x64f00066,
+	0xf61bf404,
+/* 0x049a: memx_func_wr32 */
+	0x169800f8,
+	0x01159800,
+	0xf90810b6,
+	0xfc50f960,
+	0xf4e0fcd0,
+	0x42b63321,
+	0xe91bf402,
+/* 0x04b6: memx_func_wait */
+	0x87f000f8,
+	0x0088cf2c,
+	0x98001e98,
+	0x1c98011d,
+	0x031b9802,
+	0xf41010b6,
+	0x00f87e21,
+/* 0x04d0: memx_func_delay */
+	0xb6001e98,
+	0x21f40410,
+/* 0x04db: memx_exec */
+	0xf900f867,
+	0xb9d0f9e0,
+	0xb2b902c1,
+/* 0x04e5: memx_exec_next */
+	0x00139802,
+	0x950410b6,
+	0x30f01034,
+	0xde35980c,
+	0x12b855f9,
+	0xec1ef406,
+	0xe0fcd0fc,
+	0x028421f5,
+/* 0x0506: memx_info */
+	0xc7f100f8,
+	0xb7f103ac,
+	0x21f50800,
+	0x00f80284,
+/* 0x0514: memx_recv */
+	0xf401d6b0,
+	0xd6b0c40b,
+	0xe90bf400,
+/* 0x0522: memx_init */
+	0x00f800f8,
+/* 0x0524: perf_recv */
+/* 0x0526: perf_init */
+	0x00f800f8,
+/* 0x0528: i2c_drive_scl */
+	0xf40036b0,
+	0x07f10e0b,
+	0x01d007e0,
+	0xf804bd00,
+/* 0x0539: i2c_drive_scl_lo */
+	0xe407f100,
 	0x0001d007,
 	0x00f804bd,
-/* 0x04e8: i2c_drive_scl_lo */
-	0x07e407f1,
-	0xbd0001d0,
-/* 0x04f3: i2c_drive_sda */
-	0xb000f804,
-	0x0bf40036,
-	0xe007f10e,
+/* 0x0544: i2c_drive_sda */
+	0xf40036b0,
+	0x07f10e0b,
+	0x02d007e0,
+	0xf804bd00,
+/* 0x0555: i2c_drive_sda_lo */
+	0xe407f100,
 	0x0002d007,
 	0x00f804bd,
-/* 0x0504: i2c_drive_sda_lo */
-	0x07e407f1,
-	0xbd0002d0,
-/* 0x050f: i2c_sense_scl */
-	0xf400f804,
-	0x37f10132,
-	0x33cf07c4,
-	0x0431fd00,
-	0xf4060bf4,
-/* 0x0522: i2c_sense_scl_done */
-	0x00f80131,
-/* 0x0524: i2c_sense_sda */
+/* 0x0560: i2c_sense_scl */
 	0xf10132f4,
 	0xcf07c437,
-	0x32fd0033,
+	0x31fd0033,
 	0x060bf404,
-/* 0x0537: i2c_sense_sda_done */
+/* 0x0573: i2c_sense_scl_done */
 	0xf80131f4,
-/* 0x0539: i2c_raise_scl */
-	0xf140f900,
-	0xf0089847,
-	0x21f50137,
-/* 0x0546: i2c_raise_scl_wait */
-	0xe7f104d7,
-	0x21f403e8,
-	0x0f21f567,
-	0x0901f405,
-	0xf40142b6,
-/* 0x055a: i2c_raise_scl_done */
-	0x40fcef1b,
-/* 0x055e: i2c_start */
-	0x21f500f8,
-	0x11f4050f,
-	0x2421f50d,
-	0x0611f405,
-/* 0x056f: i2c_start_rep */
-	0xf0300ef4,
-	0x21f50037,
-	0x37f004d7,
-	0xf321f501,
-	0x0076bb04,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60539,
-	0x1f11f404,
-/* 0x059c: i2c_start_send */
+/* 0x0575: i2c_sense_sda */
+	0x0132f400,
+	0x07c437f1,
+	0xfd0033cf,
+	0x0bf40432,
+	0x0131f406,
+/* 0x0588: i2c_sense_sda_done */
+/* 0x058a: i2c_raise_scl */
+	0x40f900f8,
+	0x089847f1,
+	0xf50137f0,
+/* 0x0597: i2c_raise_scl_wait */
+	0xf1052821,
+	0xf403e8e7,
+	0x21f56721,
+	0x01f40560,
+	0x0142b609,
+/* 0x05ab: i2c_raise_scl_done */
+	0xfcef1bf4,
+/* 0x05af: i2c_start */
+	0xf500f840,
+	0xf4056021,
+	0x21f50d11,
+	0x11f40575,
+	0x300ef406,
+/* 0x05c0: i2c_start_rep */
 	0xf50037f0,
-	0xf104f321,
-	0xf41388e7,
-	0x37f06721,
-	0xd721f500,
-	0x88e7f104,
-	0x6721f413,
-/* 0x05b8: i2c_start_out */
-/* 0x05ba: i2c_stop */
-	0x37f000f8,
-	0xd721f500,
-	0x0037f004,
-	0x04f321f5,
-	0x03e8e7f1,
-	0xf06721f4,
+	0xf0052821,
 	0x21f50137,
-	0xe7f104d7,
-	0x21f41388,
-	0x0137f067,
-	0x04f321f5,
+	0x76bb0544,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6058a21,
+	0x11f40464,
+/* 0x05ed: i2c_start_send */
+	0x0037f01f,
+	0x054421f5,
 	0x1388e7f1,
-	0xf86721f4,
-/* 0x05ed: i2c_bitw */
-	0xf321f500,
-	0xe8e7f104,
+	0xf06721f4,
+	0x21f50037,
+	0xe7f10528,
+	0x21f41388,
+/* 0x0609: i2c_start_out */
+/* 0x060b: i2c_stop */
+	0xf000f867,
+	0x21f50037,
+	0x37f00528,
+	0x4421f500,
+	0xe8e7f105,
 	0x6721f403,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x3921f550,
-	0x0464b605,
-	0xf11811f4,
+	0xf50137f0,
+	0xf1052821,
 	0xf41388e7,
 	0x37f06721,
-	0xd721f500,
-	0x88e7f104,
+	0x4421f501,
+	0x88e7f105,
 	0x6721f413,
-/* 0x062c: i2c_bitw_out */
-/* 0x062e: i2c_bitr */
-	0x37f000f8,
-	0xf321f501,
-	0xe8e7f104,
-	0x6721f403,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0x3921f550,
-	0x0464b605,
-	0xf51b11f4,
-	0xf0052421,
+/* 0x063e: i2c_bitw */
+	0x21f500f8,
+	0xe7f10544,
+	0x21f403e8,
+	0x0076bb67,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b6058a,
+	0x1811f404,
+	0x1388e7f1,
+	0xf06721f4,
 	0x21f50037,
-	0xe7f104d7,
+	0xe7f10528,
 	0x21f41388,
-	0x013cf067,
-/* 0x0673: i2c_bitr_done */
-	0xf80131f4,
-/* 0x0675: i2c_get_byte */
-	0x0057f000,
-/* 0x067b: i2c_get_byte_next */
-	0xb60847f0,
-	0x76bb0154,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb6062e21,
-	0x11f40464,
-	0x0553fd2b,
-	0xf40142b6,
-	0x37f0d81b,
-	0x0076bb01,
+/* 0x067d: i2c_bitw_out */
+/* 0x067f: i2c_bitr */
+	0xf000f867,
+	0x21f50137,
+	0xe7f10544,
+	0x21f403e8,
+	0x0076bb67,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b605ed,
-/* 0x06c5: i2c_get_byte_done */
-/* 0x06c7: i2c_put_byte */
-	0xf000f804,
-/* 0x06ca: i2c_put_byte_next */
-	0x42b60847,
-	0x3854ff01,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xed21f550,
-	0x0464b605,
-	0xb03411f4,
-	0x1bf40046,
-	0x0076bbd8,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b6062e,
-	0x0f11f404,
-	0xb00076bb,
-	0x1bf40136,
-	0x0132f406,
-/* 0x0720: i2c_put_byte_done */
-/* 0x0722: i2c_addr */
-	0x76bb00f8,
-	0x0465b600,
-	0x659450f9,
-	0x0256bb04,
-	0x75fd50bd,
-	0xf550fc04,
-	0xb6055e21,
-	0x11f40464,
-	0x2ec3e729,
-	0x0134b601,
-	0xbb0553fd,
+	0x64b6058a,
+	0x1b11f404,
+	0x057521f5,
+	0xf50037f0,
+	0xf1052821,
+	0xf41388e7,
+	0x3cf06721,
+	0x0131f401,
+/* 0x06c4: i2c_bitr_done */
+/* 0x06c6: i2c_get_byte */
+	0x57f000f8,
+	0x0847f000,
+/* 0x06cc: i2c_get_byte_next */
+	0xbb0154b6,
 	0x65b60076,
 	0x9450f904,
 	0x56bb0465,
 	0xfd50bd02,
 	0x50fc0475,
-	0x06c721f5,
-/* 0x0767: i2c_addr_done */
-	0xf80464b6,
-/* 0x0769: i2c_acquire_addr */
-	0xf8cec700,
-	0xb705e4b6,
-	0xf8d014e0,
-/* 0x0775: i2c_acquire */
-	0x6921f500,
-	0x0421f407,
-	0xf403d9f0,
-	0x00f83321,
-/* 0x0784: i2c_release */
-	0x076921f5,
-	0xf00421f4,
-	0x21f403da,
-/* 0x0793: i2c_recv */
-	0xf400f833,
-	0xc1c70132,
-	0x0214b6f8,
-	0xf52816b0,
-	0xa0013a1f,
-	0x980bd413,
-	0x13a00032,
-	0x31980bac,
-	0x0231f400,
-	0xe0f9d0f9,
-	0x67f1d0f9,
-	0x63f10000,
-	0x67921000,
-	0x0076bb01,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60775,
-	0xb0d0fc04,
-	0x1bf500d6,
-	0x57f000b3,
-	0x0076bb00,
-	0xf90465b6,
-	0x04659450,
-	0xbd0256bb,
-	0x0475fd50,
-	0x21f550fc,
-	0x64b60722,
-	0xd011f504,
-	0xe0c5c700,
-	0xb60076bb,
-	0x50f90465,
-	0xbb046594,
-	0x50bd0256,
-	0xfc0475fd,
-	0xc721f550,
-	0x0464b606,
-	0x00ad11f5,
-	0xbb0157f0,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x072221f5,
-	0xf50464b6,
-	0xbb008a11,
-	0x65b60076,
-	0x9450f904,
-	0x56bb0465,
-	0xfd50bd02,
-	0x50fc0475,
-	0x067521f5,
+	0x067f21f5,
 	0xf40464b6,
-	0x5bcb6a11,
+	0x53fd2b11,
+	0x0142b605,
+	0xf0d81bf4,
+	0x76bb0137,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6063e21,
+/* 0x0716: i2c_get_byte_done */
+	0x00f80464,
+/* 0x0718: i2c_put_byte */
+/* 0x071b: i2c_put_byte_next */
+	0xb60847f0,
+	0x54ff0142,
+	0x0076bb38,
+	0xf90465b6,
+	0x04659450,
+	0xbd0256bb,
+	0x0475fd50,
+	0x21f550fc,
+	0x64b6063e,
+	0x3411f404,
+	0xf40046b0,
+	0x76bbd81b,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6067f21,
+	0x11f40464,
+	0x0076bb0f,
+	0xf40136b0,
+	0x32f4061b,
+/* 0x0771: i2c_put_byte_done */
+/* 0x0773: i2c_addr */
+	0xbb00f801,
+	0x65b60076,
+	0x9450f904,
+	0x56bb0465,
+	0xfd50bd02,
+	0x50fc0475,
+	0x05af21f5,
+	0xf40464b6,
+	0xc3e72911,
+	0x34b6012e,
+	0x0553fd01,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x1821f550,
+	0x0464b607,
+/* 0x07b8: i2c_addr_done */
+/* 0x07ba: i2c_acquire_addr */
+	0xcec700f8,
+	0x05e4b6f8,
+	0xd014e0b7,
+/* 0x07c6: i2c_acquire */
+	0x21f500f8,
+	0x21f407ba,
+	0x03d9f004,
+	0xf83321f4,
+/* 0x07d5: i2c_release */
+	0xba21f500,
+	0x0421f407,
+	0xf403daf0,
+	0x00f83321,
+/* 0x07e4: i2c_recv */
+	0xc70132f4,
+	0x14b6f8c1,
+	0x2816b002,
+	0x013a1ff5,
+	0x0bd413a0,
+	0xa0003298,
+	0x980bac13,
+	0x31f40031,
+	0xf9d0f902,
+	0xf1d0f9e0,
+	0xf1000067,
+	0x92100063,
+	0x76bb0167,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb607c621,
+	0xd0fc0464,
+	0xf500d6b0,
+	0xf000b31b,
+	0x76bb0057,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6077321,
+	0x11f50464,
+	0xc5c700d0,
 	0x0076bbe0,
 	0xf90465b6,
 	0x04659450,
 	0xbd0256bb,
 	0x0475fd50,
 	0x21f550fc,
-	0x64b605ba,
-	0x025bb904,
-	0x0ef474bd,
-/* 0x0899: i2c_recv_not_rd08 */
-	0x01d6b043,
-	0xf03d1bf4,
-	0x21f50057,
-	0x11f40722,
-	0xe0c5c733,
-	0x06c721f5,
-	0xf02911f4,
-	0x21f50057,
-	0x11f40722,
-	0xe0b5c71f,
-	0x06c721f5,
-	0xf51511f4,
-	0xbd05ba21,
-	0x08c5c774,
-	0xf4091bf4,
-	0x0ef40232,
-/* 0x08d9: i2c_recv_not_wr08 */
-/* 0x08d9: i2c_recv_done */
-	0xf8cec703,
-	0x078421f5,
-	0xd0fce0fc,
-	0xb90a12f4,
-	0x21f5027c,
-/* 0x08ee: i2c_recv_exit */
-	0x00f80284,
-/* 0x08f0: i2c_init */
-/* 0x08f2: test_recv */
-	0x17f100f8,
-	0x11cf05d8,
-	0x0110b600,
-	0x05d807f1,
-	0xbd0001d0,
-	0x00e7f104,
-	0x4fe3f1d9,
-	0xb621f513,
-/* 0x0913: test_init */
-	0xf100f801,
-	0xf50800e7,
-	0xf801b621,
-/* 0x091d: idle_recv */
-/* 0x091f: idle */
-	0xf400f800,
-	0x17f10031,
-	0x11cf05d4,
-	0x0110b600,
-	0x05d407f1,
-	0xbd0001d0,
-/* 0x0935: idle_loop */
-	0x5817f004,
-/* 0x093b: idle_proc */
-/* 0x093b: idle_proc_exec */
-	0xf90232f4,
-	0x021eb910,
-	0x028d21f5,
-	0x11f410fc,
-	0x0231f409,
-/* 0x094f: idle_proc_next */
-	0xb6ef0ef4,
-	0x1fb85810,
-	0xe61bf406,
-	0xf4dd02f4,
-	0x0ef40028,
-	0x000000c1,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
-	0x00000000,
+	0x64b60718,
+	0xad11f504,
+	0x0157f000,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0x7321f550,
+	0x0464b607,
+	0x008a11f5,
+	0xb60076bb,
+	0x50f90465,
+	0xbb046594,
+	0x50bd0256,
+	0xfc0475fd,
+	0xc621f550,
+	0x0464b606,
+	0xcb6a11f4,
+	0x76bbe05b,
+	0x0465b600,
+	0x659450f9,
+	0x0256bb04,
+	0x75fd50bd,
+	0xf550fc04,
+	0xb6060b21,
+	0x5bb90464,
+	0xf474bd02,
+/* 0x08ea: i2c_recv_not_rd08 */
+	0xd6b0430e,
+	0x3d1bf401,
+	0xf50057f0,
+	0xf4077321,
+	0xc5c73311,
+	0x1821f5e0,
+	0x2911f407,
+	0xf50057f0,
+	0xf4077321,
+	0xb5c71f11,
+	0x1821f5e0,
+	0x1511f407,
+	0x060b21f5,
+	0xc5c774bd,
+	0x091bf408,
+	0xf40232f4,
+/* 0x092a: i2c_recv_not_wr08 */
+/* 0x092a: i2c_recv_done */
+	0xcec7030e,
+	0xd521f5f8,
+	0xfce0fc07,
+	0x0a12f4d0,
+	0xf5027cb9,
+/* 0x093f: i2c_recv_exit */
+	0xf8028421,
+/* 0x0941: i2c_init */
+/* 0x0943: test_recv */
+	0xf100f800,
+	0xcf05d817,
+	0x10b60011,
+	0xd807f101,
+	0x0001d005,
+	0xe7f104bd,
+	0xe3f1d900,
+	0x21f5134f,
+	0x00f801b6,
+/* 0x0964: test_init */
+	0x0800e7f1,
+	0x01b621f5,
+/* 0x096e: idle_recv */
+	0x00f800f8,
+/* 0x0970: idle */
+	0xf10031f4,
+	0xcf05d417,
+	0x10b60011,
+	0xd407f101,
+	0x0001d005,
+/* 0x0986: idle_loop */
+	0x17f004bd,
+	0x0232f458,
+/* 0x098c: idle_proc */
+/* 0x098c: idle_proc_exec */
+	0x1eb910f9,
+	0x8d21f502,
+	0xf410fc02,
+	0x31f40911,
+	0xef0ef402,
+/* 0x09a0: idle_proc_next */
+	0xb85810b6,
+	0x1bf4061f,
+	0xdd02f4e6,
+	0xf40028f4,
+	0x0000c10e,
 	0x00000000,
 	0x00000000,
 	0x00000000,