]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/si.c
drm/amdgpu: update rev id for verde
[linux.git] / drivers / gpu / drm / amd / amdgpu / si.c
index dc9511c5ecb8ea393cc3097a9507b2e2e959f962..c46b0159007d976406d64557316f45e045d82191 100644 (file)
 #include "si_dma.h"
 #include "dce_v6_0.h"
 #include "si.h"
+#include "dce_virtual.h"
 
 static const u32 tahiti_golden_registers[] =
 {
+       0x17bc, 0x00000030, 0x00000011,
        0x2684, 0x00010000, 0x00018208,
        0x260c, 0xffffffff, 0x00000000,
        0x260d, 0xf00fffff, 0x00000400,
        0x260e, 0x0002021c, 0x00020200,
        0x031e, 0x00000080, 0x00000000,
-       0x340c, 0x000300c0, 0x00800040,
-       0x360c, 0x000300c0, 0x00800040,
+       0x340c, 0x000000c0, 0x00800040,
+       0x360c, 0x000000c0, 0x00800040,
        0x16ec, 0x000000f0, 0x00000070,
        0x16f0, 0x00200000, 0x50100000,
        0x1c0c, 0x31000311, 0x00000011,
@@ -59,7 +61,7 @@ static const u32 tahiti_golden_registers[] =
        0x22c4, 0x0000ff0f, 0x00000000,
        0xa293, 0x07ffffff, 0x4e000000,
        0xa0d4, 0x3f3f3fff, 0x2a00126a,
-       0x000c, 0x000000ff, 0x0040,
+       0x000c, 0xffffffff, 0x0040,
        0x000d, 0x00000040, 0x00004040,
        0x2440, 0x07ffffff, 0x03000000,
        0x23a2, 0x01ff1f3f, 0x00000000,
@@ -72,7 +74,11 @@ static const u32 tahiti_golden_registers[] =
        0x2234, 0xffffffff, 0x000fff40,
        0x2235, 0x0000001f, 0x00000010,
        0x0504, 0x20000000, 0x20fffed8,
-       0x0570, 0x000c0fc0, 0x000c0400
+       0x0570, 0x000c0fc0, 0x000c0400,
+       0x052c, 0x0fffffff, 0xffffffff,
+       0x052d, 0x0fffffff, 0x0fffffff,
+       0x052e, 0x0fffffff, 0x0fffffff,
+       0x052f, 0x0fffffff, 0x0fffffff
 };
 
 static const u32 tahiti_golden_registers2[] =
@@ -82,16 +88,18 @@ static const u32 tahiti_golden_registers2[] =
 
 static const u32 tahiti_golden_rlc_registers[] =
 {
+       0x263e, 0xffffffff, 0x12011003,
        0x3109, 0xffffffff, 0x00601005,
        0x311f, 0xffffffff, 0x10104040,
        0x3122, 0xffffffff, 0x0100000a,
        0x30c5, 0xffffffff, 0x00000800,
        0x30c3, 0xffffffff, 0x800000f4,
-       0x3d2a, 0xffffffff, 0x00000000
+       0x3d2a, 0x00000008, 0x00000000
 };
 
 static const u32 pitcairn_golden_registers[] =
 {
+       0x17bc, 0x00000030, 0x00000011,
        0x2684, 0x00010000, 0x00018208,
        0x260c, 0xffffffff, 0x00000000,
        0x260d, 0xf00fffff, 0x00000400,
@@ -109,7 +117,7 @@ static const u32 pitcairn_golden_registers[] =
        0x22c4, 0x0000ff0f, 0x00000000,
        0xa293, 0x07ffffff, 0x4e000000,
        0xa0d4, 0x3f3f3fff, 0x2a00126a,
-       0x000c, 0x000000ff, 0x0040,
+       0x000c, 0xffffffff, 0x0040,
        0x000d, 0x00000040, 0x00004040,
        0x2440, 0x07ffffff, 0x03000000,
        0x2418, 0x0000007f, 0x00000020,
@@ -118,11 +126,16 @@ static const u32 pitcairn_golden_registers[] =
        0x2b04, 0xffffffff, 0x00000000,
        0x2b03, 0xffffffff, 0x32761054,
        0x2235, 0x0000001f, 0x00000010,
-       0x0570, 0x000c0fc0, 0x000c0400
+       0x0570, 0x000c0fc0, 0x000c0400,
+       0x052c, 0x0fffffff, 0xffffffff,
+       0x052d, 0x0fffffff, 0x0fffffff,
+       0x052e, 0x0fffffff, 0x0fffffff,
+       0x052f, 0x0fffffff, 0x0fffffff
 };
 
 static const u32 pitcairn_golden_rlc_registers[] =
 {
+       0x263e, 0xffffffff, 0x12011003,
        0x3109, 0xffffffff, 0x00601004,
        0x311f, 0xffffffff, 0x10102020,
        0x3122, 0xffffffff, 0x01000020,
@@ -132,133 +145,134 @@ static const u32 pitcairn_golden_rlc_registers[] =
 
 static const u32 verde_pg_init[] =
 {
-       0xd4f, 0xffffffff, 0x40000,
-       0xd4e, 0xffffffff, 0x200010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x7007,
-       0xd4e, 0xffffffff, 0x300010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x400000,
-       0xd4e, 0xffffffff, 0x100010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x120200,
-       0xd4e, 0xffffffff, 0x500010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x1e1e16,
-       0xd4e, 0xffffffff, 0x600010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x171f1e,
-       0xd4e, 0xffffffff, 0x700010ff,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4f, 0xffffffff, 0x0,
-       0xd4e, 0xffffffff, 0x9ff,
-       0xd40, 0xffffffff, 0x0,
-       0xd41, 0xffffffff, 0x10000800,
-       0xd41, 0xffffffff, 0xf,
-       0xd41, 0xffffffff, 0xf,
-       0xd40, 0xffffffff, 0x4,
-       0xd41, 0xffffffff, 0x1000051e,
-       0xd41, 0xffffffff, 0xffff,
-       0xd41, 0xffffffff, 0xffff,
-       0xd40, 0xffffffff, 0x8,
-       0xd41, 0xffffffff, 0x80500,
-       0xd40, 0xffffffff, 0x12,
-       0xd41, 0xffffffff, 0x9050c,
-       0xd40, 0xffffffff, 0x1d,
-       0xd41, 0xffffffff, 0xb052c,
-       0xd40, 0xffffffff, 0x2a,
-       0xd41, 0xffffffff, 0x1053e,
-       0xd40, 0xffffffff, 0x2d,
-       0xd41, 0xffffffff, 0x10546,
-       0xd40, 0xffffffff, 0x30,
-       0xd41, 0xffffffff, 0xa054e,
-       0xd40, 0xffffffff, 0x3c,
-       0xd41, 0xffffffff, 0x1055f,
-       0xd40, 0xffffffff, 0x3f,
-       0xd41, 0xffffffff, 0x10567,
-       0xd40, 0xffffffff, 0x42,
-       0xd41, 0xffffffff, 0x1056f,
-       0xd40, 0xffffffff, 0x45,
-       0xd41, 0xffffffff, 0x10572,
-       0xd40, 0xffffffff, 0x48,
-       0xd41, 0xffffffff, 0x20575,
-       0xd40, 0xffffffff, 0x4c,
-       0xd41, 0xffffffff, 0x190801,
-       0xd40, 0xffffffff, 0x67,
-       0xd41, 0xffffffff, 0x1082a,
-       0xd40, 0xffffffff, 0x6a,
-       0xd41, 0xffffffff, 0x1b082d,
-       0xd40, 0xffffffff, 0x87,
-       0xd41, 0xffffffff, 0x310851,
-       0xd40, 0xffffffff, 0xba,
-       0xd41, 0xffffffff, 0x891,
-       0xd40, 0xffffffff, 0xbc,
-       0xd41, 0xffffffff, 0x893,
-       0xd40, 0xffffffff, 0xbe,
-       0xd41, 0xffffffff, 0x20895,
-       0xd40, 0xffffffff, 0xc2,
-       0xd41, 0xffffffff, 0x20899,
-       0xd40, 0xffffffff, 0xc6,
-       0xd41, 0xffffffff, 0x2089d,
-       0xd40, 0xffffffff, 0xca,
-       0xd41, 0xffffffff, 0x8a1,
-       0xd40, 0xffffffff, 0xcc,
-       0xd41, 0xffffffff, 0x8a3,
-       0xd40, 0xffffffff, 0xce,
-       0xd41, 0xffffffff, 0x308a5,
-       0xd40, 0xffffffff, 0xd3,
-       0xd41, 0xffffffff, 0x6d08cd,
-       0xd40, 0xffffffff, 0x142,
-       0xd41, 0xffffffff, 0x2000095a,
-       0xd41, 0xffffffff, 0x1,
-       0xd40, 0xffffffff, 0x144,
-       0xd41, 0xffffffff, 0x301f095b,
-       0xd40, 0xffffffff, 0x165,
-       0xd41, 0xffffffff, 0xc094d,
-       0xd40, 0xffffffff, 0x173,
-       0xd41, 0xffffffff, 0xf096d,
-       0xd40, 0xffffffff, 0x184,
-       0xd41, 0xffffffff, 0x15097f,
-       0xd40, 0xffffffff, 0x19b,
-       0xd41, 0xffffffff, 0xc0998,
-       0xd40, 0xffffffff, 0x1a9,
-       0xd41, 0xffffffff, 0x409a7,
-       0xd40, 0xffffffff, 0x1af,
-       0xd41, 0xffffffff, 0xcdc,
-       0xd40, 0xffffffff, 0x1b1,
-       0xd41, 0xffffffff, 0x800,
-       0xd42, 0xffffffff, 0x6c9b2000,
-       0xd44, 0xfc00, 0x2000,
-       0xd51, 0xffffffff, 0xfc0,
-       0xa35, 0x00000100, 0x100
+       0x0d4f, 0xffffffff, 0x40000,
+       0x0d4e, 0xffffffff, 0x200010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x7007,
+       0x0d4e, 0xffffffff, 0x300010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x400000,
+       0x0d4e, 0xffffffff, 0x100010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x120200,
+       0x0d4e, 0xffffffff, 0x500010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x1e1e16,
+       0x0d4e, 0xffffffff, 0x600010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x171f1e,
+       0x0d4e, 0xffffffff, 0x700010ff,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4f, 0xffffffff, 0x0,
+       0x0d4e, 0xffffffff, 0x9ff,
+       0x0d40, 0xffffffff, 0x0,
+       0x0d41, 0xffffffff, 0x10000800,
+       0x0d41, 0xffffffff, 0xf,
+       0x0d41, 0xffffffff, 0xf,
+       0x0d40, 0xffffffff, 0x4,
+       0x0d41, 0xffffffff, 0x1000051e,
+       0x0d41, 0xffffffff, 0xffff,
+       0x0d41, 0xffffffff, 0xffff,
+       0x0d40, 0xffffffff, 0x8,
+       0x0d41, 0xffffffff, 0x80500,
+       0x0d40, 0xffffffff, 0x12,
+       0x0d41, 0xffffffff, 0x9050c,
+       0x0d40, 0xffffffff, 0x1d,
+       0x0d41, 0xffffffff, 0xb052c,
+       0x0d40, 0xffffffff, 0x2a,
+       0x0d41, 0xffffffff, 0x1053e,
+       0x0d40, 0xffffffff, 0x2d,
+       0x0d41, 0xffffffff, 0x10546,
+       0x0d40, 0xffffffff, 0x30,
+       0x0d41, 0xffffffff, 0xa054e,
+       0x0d40, 0xffffffff, 0x3c,
+       0x0d41, 0xffffffff, 0x1055f,
+       0x0d40, 0xffffffff, 0x3f,
+       0x0d41, 0xffffffff, 0x10567,
+       0x0d40, 0xffffffff, 0x42,
+       0x0d41, 0xffffffff, 0x1056f,
+       0x0d40, 0xffffffff, 0x45,
+       0x0d41, 0xffffffff, 0x10572,
+       0x0d40, 0xffffffff, 0x48,
+       0x0d41, 0xffffffff, 0x20575,
+       0x0d40, 0xffffffff, 0x4c,
+       0x0d41, 0xffffffff, 0x190801,
+       0x0d40, 0xffffffff, 0x67,
+       0x0d41, 0xffffffff, 0x1082a,
+       0x0d40, 0xffffffff, 0x6a,
+       0x0d41, 0xffffffff, 0x1b082d,
+       0x0d40, 0xffffffff, 0x87,
+       0x0d41, 0xffffffff, 0x310851,
+       0x0d40, 0xffffffff, 0xba,
+       0x0d41, 0xffffffff, 0x891,
+       0x0d40, 0xffffffff, 0xbc,
+       0x0d41, 0xffffffff, 0x893,
+       0x0d40, 0xffffffff, 0xbe,
+       0x0d41, 0xffffffff, 0x20895,
+       0x0d40, 0xffffffff, 0xc2,
+       0x0d41, 0xffffffff, 0x20899,
+       0x0d40, 0xffffffff, 0xc6,
+       0x0d41, 0xffffffff, 0x2089d,
+       0x0d40, 0xffffffff, 0xca,
+       0x0d41, 0xffffffff, 0x8a1,
+       0x0d40, 0xffffffff, 0xcc,
+       0x0d41, 0xffffffff, 0x8a3,
+       0x0d40, 0xffffffff, 0xce,
+       0x0d41, 0xffffffff, 0x308a5,
+       0x0d40, 0xffffffff, 0xd3,
+       0x0d41, 0xffffffff, 0x6d08cd,
+       0x0d40, 0xffffffff, 0x142,
+       0x0d41, 0xffffffff, 0x2000095a,
+       0x0d41, 0xffffffff, 0x1,
+       0x0d40, 0xffffffff, 0x144,
+       0x0d41, 0xffffffff, 0x301f095b,
+       0x0d40, 0xffffffff, 0x165,
+       0x0d41, 0xffffffff, 0xc094d,
+       0x0d40, 0xffffffff, 0x173,
+       0x0d41, 0xffffffff, 0xf096d,
+       0x0d40, 0xffffffff, 0x184,
+       0x0d41, 0xffffffff, 0x15097f,
+       0x0d40, 0xffffffff, 0x19b,
+       0x0d41, 0xffffffff, 0xc0998,
+       0x0d40, 0xffffffff, 0x1a9,
+       0x0d41, 0xffffffff, 0x409a7,
+       0x0d40, 0xffffffff, 0x1af,
+       0x0d41, 0xffffffff, 0xcdc,
+       0x0d40, 0xffffffff, 0x1b1,
+       0x0d41, 0xffffffff, 0x800,
+       0x0d42, 0xffffffff, 0x6c9b2000,
+       0x0d44, 0xfc00, 0x2000,
+       0x0d51, 0xffffffff, 0xfc0,
+       0x0a35, 0x00000100, 0x100
 };
 
 static const u32 verde_golden_rlc_registers[] =
 {
+       0x263e, 0xffffffff, 0x02010002,
        0x3109, 0xffffffff, 0x033f1005,
        0x311f, 0xffffffff, 0x10808020,
        0x3122, 0xffffffff, 0x00800008,
@@ -268,65 +282,45 @@ static const u32 verde_golden_rlc_registers[] =
 
 static const u32 verde_golden_registers[] =
 {
+       0x17bc, 0x00000030, 0x00000011,
        0x2684, 0x00010000, 0x00018208,
        0x260c, 0xffffffff, 0x00000000,
        0x260d, 0xf00fffff, 0x00000400,
        0x260e, 0x0002021c, 0x00020200,
        0x031e, 0x00000080, 0x00000000,
        0x340c, 0x000300c0, 0x00800040,
-       0x340c, 0x000300c0, 0x00800040,
-       0x360c, 0x000300c0, 0x00800040,
        0x360c, 0x000300c0, 0x00800040,
        0x16ec, 0x000000f0, 0x00000070,
        0x16f0, 0x00200000, 0x50100000,
-
        0x1c0c, 0x31000311, 0x00000011,
        0x0ab9, 0x00073ffe, 0x000022a2,
-       0x0ab9, 0x00073ffe, 0x000022a2,
-       0x0ab9, 0x00073ffe, 0x000022a2,
-       0x0903, 0x000007ff, 0x00000000,
        0x0903, 0x000007ff, 0x00000000,
-       0x0903, 0x000007ff, 0x00000000,
-       0x2285, 0xf000001f, 0x00000007,
        0x2285, 0xf000001f, 0x00000007,
-       0x2285, 0xf000001f, 0x00000007,
-       0x2285, 0xffffffff, 0x00ffffff,
+       0x22c9, 0xffffffff, 0x00ffffff,
        0x22c4, 0x0000ff0f, 0x00000000,
-
        0xa293, 0x07ffffff, 0x4e000000,
        0xa0d4, 0x3f3f3fff, 0x0000124a,
-       0xa0d4, 0x3f3f3fff, 0x0000124a,
-       0xa0d4, 0x3f3f3fff, 0x0000124a,
-       0x000c, 0x000000ff, 0x0040,
+       0x000c, 0xffffffff, 0x0040,
        0x000d, 0x00000040, 0x00004040,
        0x2440, 0x07ffffff, 0x03000000,
-       0x2440, 0x07ffffff, 0x03000000,
-       0x23a2, 0x01ff1f3f, 0x00000000,
-       0x23a3, 0x01ff1f3f, 0x00000000,
        0x23a2, 0x01ff1f3f, 0x00000000,
-       0x23a1, 0x01ff1f3f, 0x00000000,
-       0x23a1, 0x01ff1f3f, 0x00000000,
-
        0x23a1, 0x01ff1f3f, 0x00000000,
        0x2418, 0x0000007f, 0x00000020,
        0x2542, 0x00010000, 0x00010000,
-       0x2b01, 0x000003ff, 0x00000003,
-       0x2b05, 0x000003ff, 0x00000003,
        0x2b05, 0x000003ff, 0x00000003,
        0x2b04, 0xffffffff, 0x00000000,
-       0x2b04, 0xffffffff, 0x00000000,
-       0x2b04, 0xffffffff, 0x00000000,
-       0x2b03, 0xffffffff, 0x00001032,
        0x2b03, 0xffffffff, 0x00001032,
-       0x2b03, 0xffffffff, 0x00001032,
-       0x2235, 0x0000001f, 0x00000010,
-       0x2235, 0x0000001f, 0x00000010,
        0x2235, 0x0000001f, 0x00000010,
-       0x0570, 0x000c0fc0, 0x000c0400
+       0x0570, 0x000c0fc0, 0x000c0400,
+       0x052c, 0x0fffffff, 0xffffffff,
+       0x052d, 0x0fffffff, 0x0fffffff,
+       0x052e, 0x0fffffff, 0x0fffffff,
+       0x052f, 0x0fffffff, 0x0fffffff
 };
 
 static const u32 oland_golden_registers[] =
 {
+       0x17bc, 0x00000030, 0x00000011,
        0x2684, 0x00010000, 0x00018208,
        0x260c, 0xffffffff, 0x00000000,
        0x260d, 0xf00fffff, 0x00000400,
@@ -335,7 +329,7 @@ static const u32 oland_golden_registers[] =
        0x340c, 0x000300c0, 0x00800040,
        0x360c, 0x000300c0, 0x00800040,
        0x16ec, 0x000000f0, 0x00000070,
-       0x16f9, 0x00200000, 0x50100000,
+       0x16f0, 0x00200000, 0x50100000,
        0x1c0c, 0x31000311, 0x00000011,
        0x0ab9, 0x00073ffe, 0x000022a2,
        0x0903, 0x000007ff, 0x00000000,
@@ -344,7 +338,7 @@ static const u32 oland_golden_registers[] =
        0x22c4, 0x0000ff0f, 0x00000000,
        0xa293, 0x07ffffff, 0x4e000000,
        0xa0d4, 0x3f3f3fff, 0x00000082,
-       0x000c, 0x000000ff, 0x0040,
+       0x000c, 0xffffffff, 0x0040,
        0x000d, 0x00000040, 0x00004040,
        0x2440, 0x07ffffff, 0x03000000,
        0x2418, 0x0000007f, 0x00000020,
@@ -353,11 +347,16 @@ static const u32 oland_golden_registers[] =
        0x2b04, 0xffffffff, 0x00000000,
        0x2b03, 0xffffffff, 0x00003210,
        0x2235, 0x0000001f, 0x00000010,
-       0x0570, 0x000c0fc0, 0x000c0400
+       0x0570, 0x000c0fc0, 0x000c0400,
+       0x052c, 0x0fffffff, 0xffffffff,
+       0x052d, 0x0fffffff, 0x0fffffff,
+       0x052e, 0x0fffffff, 0x0fffffff,
+       0x052f, 0x0fffffff, 0x0fffffff
 };
 
 static const u32 oland_golden_rlc_registers[] =
 {
+       0x263e, 0xffffffff, 0x02010002,
        0x3109, 0xffffffff, 0x00601005,
        0x311f, 0xffffffff, 0x10104040,
        0x3122, 0xffffffff, 0x0100000a,
@@ -367,22 +366,27 @@ static const u32 oland_golden_rlc_registers[] =
 
 static const u32 hainan_golden_registers[] =
 {
+       0x17bc, 0x00000030, 0x00000011,
        0x2684, 0x00010000, 0x00018208,
        0x260c, 0xffffffff, 0x00000000,
        0x260d, 0xf00fffff, 0x00000400,
        0x260e, 0x0002021c, 0x00020200,
-       0x4595, 0xff000fff, 0x00000100,
+       0x031e, 0x00000080, 0x00000000,
+       0x3430, 0xff000fff, 0x00000100,
        0x340c, 0x000300c0, 0x00800040,
        0x3630, 0xff000fff, 0x00000100,
        0x360c, 0x000300c0, 0x00800040,
+       0x16ec, 0x000000f0, 0x00000070,
+       0x16f0, 0x00200000, 0x50100000,
+       0x1c0c, 0x31000311, 0x00000011,
        0x0ab9, 0x00073ffe, 0x000022a2,
        0x0903, 0x000007ff, 0x00000000,
        0x2285, 0xf000001f, 0x00000007,
        0x22c9, 0xffffffff, 0x00ffffff,
        0x22c4, 0x0000ff0f, 0x00000000,
-       0xa393, 0x07ffffff, 0x4e000000,
+       0xa293, 0x07ffffff, 0x4e000000,
        0xa0d4, 0x3f3f3fff, 0x00000000,
-       0x000c, 0x000000ff, 0x0040,
+       0x000c, 0xffffffff, 0x0040,
        0x000d, 0x00000040, 0x00004040,
        0x2440, 0x03e00000, 0x03600000,
        0x2418, 0x0000007f, 0x00000020,
@@ -391,12 +395,16 @@ static const u32 hainan_golden_registers[] =
        0x2b04, 0xffffffff, 0x00000000,
        0x2b03, 0xffffffff, 0x00003210,
        0x2235, 0x0000001f, 0x00000010,
-       0x0570, 0x000c0fc0, 0x000c0400
+       0x0570, 0x000c0fc0, 0x000c0400,
+       0x052c, 0x0fffffff, 0xffffffff,
+       0x052d, 0x0fffffff, 0x0fffffff,
+       0x052e, 0x0fffffff, 0x0fffffff,
+       0x052f, 0x0fffffff, 0x0fffffff
 };
 
 static const u32 hainan_golden_registers2[] =
 {
-       0x263e, 0xffffffff, 0x02010001
+       0x263e, 0xffffffff, 0x2011003
 };
 
 static const u32 tahiti_mgcg_cgcg_init[] =
@@ -512,18 +520,18 @@ static const u32 tahiti_mgcg_cgcg_init[] =
        0x21c2, 0xffffffff, 0x00900100,
        0x311e, 0xffffffff, 0x00000080,
        0x3101, 0xffffffff, 0x0020003f,
-       0xc, 0xffffffff, 0x0000001c,
-       0xd, 0x000f0000, 0x000f0000,
-       0x583, 0xffffffff, 0x00000100,
-       0x409, 0xffffffff, 0x00000100,
-       0x40b, 0x00000101, 0x00000000,
-       0x82a, 0xffffffff, 0x00000104,
-       0x993, 0x000c0000, 0x000c0000,
-       0x992, 0x000c0000, 0x000c0000,
+       0x000c, 0xffffffff, 0x0000001c,
+       0x000d, 0x000f0000, 0x000f0000,
+       0x0583, 0xffffffff, 0x00000100,
+       0x0409, 0xffffffff, 0x00000100,
+       0x040b, 0x00000101, 0x00000000,
+       0x082a, 0xffffffff, 0x00000104,
+       0x0993, 0x000c0000, 0x000c0000,
+       0x0992, 0x000c0000, 0x000c0000,
        0x1579, 0xff000fff, 0x00000100,
        0x157a, 0x00000001, 0x00000001,
-       0xbd4, 0x00000001, 0x00000001,
-       0xc33, 0xc0000fff, 0x00000104,
+       0x0bd4, 0x00000001, 0x00000001,
+       0x0c33, 0xc0000fff, 0x00000104,
        0x3079, 0x00000001, 0x00000001,
        0x3430, 0xfffffff0, 0x00000100,
        0x3630, 0xfffffff0, 0x00000100
@@ -611,16 +619,16 @@ static const u32 pitcairn_mgcg_cgcg_init[] =
        0x21c2, 0xffffffff, 0x00900100,
        0x311e, 0xffffffff, 0x00000080,
        0x3101, 0xffffffff, 0x0020003f,
-       0xc, 0xffffffff, 0x0000001c,
-       0xd, 0x000f0000, 0x000f0000,
-       0x583, 0xffffffff, 0x00000100,
-       0x409, 0xffffffff, 0x00000100,
-       0x40b, 0x00000101, 0x00000000,
-       0x82a, 0xffffffff, 0x00000104,
+       0x000c, 0xffffffff, 0x0000001c,
+       0x000d, 0x000f0000, 0x000f0000,
+       0x0583, 0xffffffff, 0x00000100,
+       0x0409, 0xffffffff, 0x00000100,
+       0x040b, 0x00000101, 0x00000000,
+       0x082a, 0xffffffff, 0x00000104,
        0x1579, 0xff000fff, 0x00000100,
        0x157a, 0x00000001, 0x00000001,
-       0xbd4, 0x00000001, 0x00000001,
-       0xc33, 0xc0000fff, 0x00000104,
+       0x0bd4, 0x00000001, 0x00000001,
+       0x0c33, 0xc0000fff, 0x00000104,
        0x3079, 0x00000001, 0x00000001,
        0x3430, 0xfffffff0, 0x00000100,
        0x3630, 0xfffffff0, 0x00000100
@@ -708,18 +716,18 @@ static const u32 verde_mgcg_cgcg_init[] =
        0x21c2, 0xffffffff, 0x00900100,
        0x311e, 0xffffffff, 0x00000080,
        0x3101, 0xffffffff, 0x0020003f,
-       0xc, 0xffffffff, 0x0000001c,
-       0xd, 0x000f0000, 0x000f0000,
-       0x583, 0xffffffff, 0x00000100,
-       0x409, 0xffffffff, 0x00000100,
-       0x40b, 0x00000101, 0x00000000,
-       0x82a, 0xffffffff, 0x00000104,
-       0x993, 0x000c0000, 0x000c0000,
-       0x992, 0x000c0000, 0x000c0000,
+       0x000c, 0xffffffff, 0x0000001c,
+       0x000d, 0x000f0000, 0x000f0000,
+       0x0583, 0xffffffff, 0x00000100,
+       0x0409, 0xffffffff, 0x00000100,
+       0x040b, 0x00000101, 0x00000000,
+       0x082a, 0xffffffff, 0x00000104,
+       0x0993, 0x000c0000, 0x000c0000,
+       0x0992, 0x000c0000, 0x000c0000,
        0x1579, 0xff000fff, 0x00000100,
        0x157a, 0x00000001, 0x00000001,
-       0xbd4, 0x00000001, 0x00000001,
-       0xc33, 0xc0000fff, 0x00000104,
+       0x0bd4, 0x00000001, 0x00000001,
+       0x0c33, 0xc0000fff, 0x00000104,
        0x3079, 0x00000001, 0x00000001,
        0x3430, 0xfffffff0, 0x00000100,
        0x3630, 0xfffffff0, 0x00000100
@@ -787,18 +795,18 @@ static const u32 oland_mgcg_cgcg_init[] =
        0x21c2, 0xffffffff, 0x00900100,
        0x311e, 0xffffffff, 0x00000080,
        0x3101, 0xffffffff, 0x0020003f,
-       0xc, 0xffffffff, 0x0000001c,
-       0xd, 0x000f0000, 0x000f0000,
-       0x583, 0xffffffff, 0x00000100,
-       0x409, 0xffffffff, 0x00000100,
-       0x40b, 0x00000101, 0x00000000,
-       0x82a, 0xffffffff, 0x00000104,
-       0x993, 0x000c0000, 0x000c0000,
-       0x992, 0x000c0000, 0x000c0000,
+       0x000c, 0xffffffff, 0x0000001c,
+       0x000d, 0x000f0000, 0x000f0000,
+       0x0583, 0xffffffff, 0x00000100,
+       0x0409, 0xffffffff, 0x00000100,
+       0x040b, 0x00000101, 0x00000000,
+       0x082a, 0xffffffff, 0x00000104,
+       0x0993, 0x000c0000, 0x000c0000,
+       0x0992, 0x000c0000, 0x000c0000,
        0x1579, 0xff000fff, 0x00000100,
        0x157a, 0x00000001, 0x00000001,
-       0xbd4, 0x00000001, 0x00000001,
-       0xc33, 0xc0000fff, 0x00000104,
+       0x0bd4, 0x00000001, 0x00000001,
+       0x0c33, 0xc0000fff, 0x00000104,
        0x3079, 0x00000001, 0x00000001,
        0x3430, 0xfffffff0, 0x00000100,
        0x3630, 0xfffffff0, 0x00000100
@@ -866,15 +874,15 @@ static const u32 hainan_mgcg_cgcg_init[] =
        0x21c2, 0xffffffff, 0x00900100,
        0x311e, 0xffffffff, 0x00000080,
        0x3101, 0xffffffff, 0x0020003f,
-       0xc, 0xffffffff, 0x0000001c,
-       0xd, 0x000f0000, 0x000f0000,
-       0x583, 0xffffffff, 0x00000100,
-       0x409, 0xffffffff, 0x00000100,
-       0x82a, 0xffffffff, 0x00000104,
-       0x993, 0x000c0000, 0x000c0000,
-       0x992, 0x000c0000, 0x000c0000,
-       0xbd4, 0x00000001, 0x00000001,
-       0xc33, 0xc0000fff, 0x00000104,
+       0x000c, 0xffffffff, 0x0000001c,
+       0x000d, 0x000f0000, 0x000f0000,
+       0x0583, 0xffffffff, 0x00000100,
+       0x0409, 0xffffffff, 0x00000100,
+       0x082a, 0xffffffff, 0x00000104,
+       0x0993, 0x000c0000, 0x000c0000,
+       0x0992, 0x000c0000, 0x000c0000,
+       0x0bd4, 0x00000001, 0x00000001,
+       0x0c33, 0xc0000fff, 0x00000104,
        0x3079, 0x00000001, 0x00000001,
        0x3430, 0xfffffff0, 0x00000100,
        0x3630, 0xfffffff0, 0x00000100
@@ -905,7 +913,7 @@ static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
        spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
 }
 
-u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
+static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
 {
        unsigned long flags;
        u32 r;
@@ -918,7 +926,7 @@ u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
        return r;
 }
 
-void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
+static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
 {
        unsigned long flags;
 
@@ -1178,6 +1186,8 @@ static int si_common_early_init(void *handle)
                        AMD_CG_SUPPORT_HDP_LS |
                        AMD_CG_SUPPORT_HDP_MGCG;
                        adev->pg_flags = 0;
+               adev->external_rev_id = (adev->rev_id == 0) ? 1 :
+                                       (adev->rev_id == 1) ? 5 : 6;
                break;
        case CHIP_PITCAIRN:
                adev->cg_flags =
@@ -1197,6 +1207,7 @@ static int si_common_early_init(void *handle)
                        AMD_CG_SUPPORT_HDP_LS |
                        AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
+               adev->external_rev_id = adev->rev_id + 20;
                break;
 
        case CHIP_VERDE:
@@ -1218,7 +1229,7 @@ static int si_common_early_init(void *handle)
                        AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
                //???
-               adev->external_rev_id = adev->rev_id + 0x14;
+               adev->external_rev_id = adev->rev_id + 40;
                break;
        case CHIP_OLAND:
                adev->cg_flags =
@@ -1237,6 +1248,7 @@ static int si_common_early_init(void *handle)
                        AMD_CG_SUPPORT_HDP_LS |
                        AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
+               adev->external_rev_id = 60;
                break;
        case CHIP_HAINAN:
                adev->cg_flags =
@@ -1254,6 +1266,7 @@ static int si_common_early_init(void *handle)
                        AMD_CG_SUPPORT_HDP_LS |
                        AMD_CG_SUPPORT_HDP_MGCG;
                adev->pg_flags = 0;
+               adev->external_rev_id = 70;
                break;
 
        default:
@@ -1811,7 +1824,7 @@ static int si_common_set_powergating_state(void *handle,
        return 0;
 }
 
-const struct amd_ip_funcs si_common_ip_funcs = {
+static const struct amd_ip_funcs si_common_ip_funcs = {
        .name = "si_common",
        .early_init = si_common_early_init,
        .late_init = NULL,
@@ -1828,119 +1841,13 @@ const struct amd_ip_funcs si_common_ip_funcs = {
        .set_powergating_state = si_common_set_powergating_state,
 };
 
-static const struct amdgpu_ip_block_version verde_ip_blocks[] =
+static const struct amdgpu_ip_block_version si_common_ip_block =
 {
-       {
-               .type = AMD_IP_BLOCK_TYPE_COMMON,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_common_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_GMC,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &gmc_v6_0_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_IH,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_ih_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_SMC,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &amdgpu_pp_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_DCE,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &dce_v6_0_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_GFX,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &gfx_v6_0_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_SDMA,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_dma_ip_funcs,
-       },
-/*     {
-               .type = AMD_IP_BLOCK_TYPE_UVD,
-               .major = 3,
-               .minor = 1,
-               .rev = 0,
-               .funcs = &si_null_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_VCE,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_null_ip_funcs,
-       },
-       */
-};
-
-
-static const struct amdgpu_ip_block_version hainan_ip_blocks[] =
-{
-       {
-               .type = AMD_IP_BLOCK_TYPE_COMMON,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_common_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_GMC,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &gmc_v6_0_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_IH,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_ih_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_SMC,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &amdgpu_pp_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_GFX,
-               .major = 6,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &gfx_v6_0_ip_funcs,
-       },
-       {
-               .type = AMD_IP_BLOCK_TYPE_SDMA,
-               .major = 1,
-               .minor = 0,
-               .rev = 0,
-               .funcs = &si_dma_ip_funcs,
-       },
+       .type = AMD_IP_BLOCK_TYPE_COMMON,
+       .major = 1,
+       .minor = 0,
+       .rev = 0,
+       .funcs = &si_common_ip_funcs,
 };
 
 int si_set_ip_blocks(struct amdgpu_device *adev)
@@ -1949,13 +1856,42 @@ int si_set_ip_blocks(struct amdgpu_device *adev)
        case CHIP_VERDE:
        case CHIP_TAHITI:
        case CHIP_PITCAIRN:
+               amdgpu_ip_block_add(adev, &si_common_ip_block);
+               amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_ih_ip_block);
+               amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
+               if (adev->enable_virtual_display)
+                       amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
+               else
+                       amdgpu_ip_block_add(adev, &dce_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_dma_ip_block);
+               /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
+               /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
+               break;
        case CHIP_OLAND:
-               adev->ip_blocks = verde_ip_blocks;
-               adev->num_ip_blocks = ARRAY_SIZE(verde_ip_blocks);
+               amdgpu_ip_block_add(adev, &si_common_ip_block);
+               amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_ih_ip_block);
+               amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
+               if (adev->enable_virtual_display)
+                       amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
+               else
+                       amdgpu_ip_block_add(adev, &dce_v6_4_ip_block);
+               amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_dma_ip_block);
+               /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
+               /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
                break;
        case CHIP_HAINAN:
-               adev->ip_blocks = hainan_ip_blocks;
-               adev->num_ip_blocks = ARRAY_SIZE(hainan_ip_blocks);
+               amdgpu_ip_block_add(adev, &si_common_ip_block);
+               amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_ih_ip_block);
+               amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
+               if (adev->enable_virtual_display)
+                       amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
+               amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
+               amdgpu_ip_block_add(adev, &si_dma_ip_block);
                break;
        default:
                BUG();