xref: /linux/drivers/gpu/drm/radeon/btc_dpm.c (revision b7e1e969c887c897947fdc3754fe9b0c24acb155)
16596afd4SAlex Deucher /*
26596afd4SAlex Deucher  * Copyright 2011 Advanced Micro Devices, Inc.
36596afd4SAlex Deucher  *
46596afd4SAlex Deucher  * Permission is hereby granted, free of charge, to any person obtaining a
56596afd4SAlex Deucher  * copy of this software and associated documentation files (the "Software"),
66596afd4SAlex Deucher  * to deal in the Software without restriction, including without limitation
76596afd4SAlex Deucher  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
86596afd4SAlex Deucher  * and/or sell copies of the Software, and to permit persons to whom the
96596afd4SAlex Deucher  * Software is furnished to do so, subject to the following conditions:
106596afd4SAlex Deucher  *
116596afd4SAlex Deucher  * The above copyright notice and this permission notice shall be included in
126596afd4SAlex Deucher  * all copies or substantial portions of the Software.
136596afd4SAlex Deucher  *
146596afd4SAlex Deucher  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
156596afd4SAlex Deucher  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
166596afd4SAlex Deucher  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
176596afd4SAlex Deucher  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
186596afd4SAlex Deucher  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
196596afd4SAlex Deucher  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
206596afd4SAlex Deucher  * OTHER DEALINGS IN THE SOFTWARE.
216596afd4SAlex Deucher  *
226596afd4SAlex Deucher  * Authors: Alex Deucher
236596afd4SAlex Deucher  */
246596afd4SAlex Deucher 
252ef79416SThomas Zimmermann #include <linux/pci.h>
26c182615fSSam Ravnborg #include <linux/seq_file.h>
27c182615fSSam Ravnborg 
28c182615fSSam Ravnborg #include "atom.h"
29c182615fSSam Ravnborg #include "btc_dpm.h"
30c182615fSSam Ravnborg #include "btcd.h"
31c182615fSSam Ravnborg #include "cypress_dpm.h"
321c5ae3baSLee Jones #include "evergreen.h"
33c182615fSSam Ravnborg #include "r600_dpm.h"
34586831d6SLee Jones #include "rv770.h"
356596afd4SAlex Deucher #include "radeon.h"
3601467a9bSMichele Curti #include "radeon_asic.h"
376596afd4SAlex Deucher 
386596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F0           0x0a
396596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F1           0x0b
406596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F2           0x0c
416596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F3           0x0d
426596afd4SAlex Deucher 
436596afd4SAlex Deucher #define MC_CG_SEQ_DRAMCONF_S0       0x05
446596afd4SAlex Deucher #define MC_CG_SEQ_DRAMCONF_S1       0x06
456596afd4SAlex Deucher #define MC_CG_SEQ_YCLK_SUSPEND      0x04
466596afd4SAlex Deucher #define MC_CG_SEQ_YCLK_RESUME       0x0a
476596afd4SAlex Deucher 
486596afd4SAlex Deucher #define SMC_RAM_END 0x8000
496596afd4SAlex Deucher 
506596afd4SAlex Deucher #ifndef BTC_MGCG_SEQUENCE
516596afd4SAlex Deucher #define BTC_MGCG_SEQUENCE  300
526596afd4SAlex Deucher 
536c7bcceaSAlex Deucher extern int ni_mc_load_microcode(struct radeon_device *rdev);
546596afd4SAlex Deucher 
556596afd4SAlex Deucher //********* BARTS **************//
56*3013edd6SGuoHua Chen static const u32 barts_cgcg_cgls_default[] = {
576596afd4SAlex Deucher 	/* Register,   Value,     Mask bits */
586596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
596596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
606596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
616596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
626596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
636596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
646596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
656596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
666596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
676596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
686596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
696596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
706596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
716596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
726596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
736596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
746596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
756596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
766596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
776596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
786596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
796596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
806596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
816596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
826596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
836596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
846596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
856596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
866596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
876596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
886596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
896596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
906596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
916596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
926596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
936596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
946596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
956596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
966596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
976596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
986596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
996596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1006596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
1016596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1026596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
1036596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1046596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
1056596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
1066596afd4SAlex Deucher };
1076596afd4SAlex Deucher #define BARTS_CGCG_CGLS_DEFAULT_LENGTH sizeof(barts_cgcg_cgls_default) / (3 * sizeof(u32))
1086596afd4SAlex Deucher 
109*3013edd6SGuoHua Chen static const u32 barts_cgcg_cgls_disable[] = {
1106596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
1116596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1126596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
1136596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1146596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
1156596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1166596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
1176596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1186596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
1196596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1206596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
1216596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1226596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
1236596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1246596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
1256596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1266596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
1276596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1286596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
1296596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1306596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
1316596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1326596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
1336596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1346596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
1356596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1366596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
1376596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1386596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
1396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1406596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
1416596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1426596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
1436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1446596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
1456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1466596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
1476596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1486596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
1496596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1506596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
1516596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1526596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
1536596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1546596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
1556596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1566596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
1576596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1586596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
1596596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
1606596afd4SAlex Deucher };
1616596afd4SAlex Deucher #define BARTS_CGCG_CGLS_DISABLE_LENGTH sizeof(barts_cgcg_cgls_disable) / (3 * sizeof(u32))
1626596afd4SAlex Deucher 
163*3013edd6SGuoHua Chen static const u32 barts_cgcg_cgls_enable[] = {
1646596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
1656596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
1666596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
1676596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1686596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
1696596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1706596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
1716596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1726596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
1736596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1746596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
1756596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1766596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
1776596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1786596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
1796596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1806596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
1816596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1826596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
1836596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1846596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
1856596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1866596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
1876596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1886596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
1896596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1906596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
1916596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1926596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
1936596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1946596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
1956596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1966596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
1976596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1986596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
1996596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2006596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
2016596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2026596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
2036596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2046596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
2056596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2066596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
2076596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2086596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
2096596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2106596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
2116596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2126596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
2136596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
2146596afd4SAlex Deucher };
2156596afd4SAlex Deucher #define BARTS_CGCG_CGLS_ENABLE_LENGTH sizeof(barts_cgcg_cgls_enable) / (3 * sizeof(u32))
2166596afd4SAlex Deucher 
217*3013edd6SGuoHua Chen static const u32 barts_mgcg_default[] = {
2186596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
2196596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
2206596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
2216596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
2226596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
2236596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
2246596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
2256596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
2266596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
2276596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
2286596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
2296596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
2306596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
2316596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
2326596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
2336596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
2346596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
2356596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
2366596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
2376596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
2386596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
2396596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
2406596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
2416596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
2426596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
2436596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
2446596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
2456596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
2466596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
2476596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
2486596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
2496596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
2506596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
2516596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
2526596afd4SAlex Deucher 	0x0000d0c0, 0xff000100, 0xffffffff,
2536596afd4SAlex Deucher 	0x0000802c, 0x40000000, 0xffffffff,
2546596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
2556596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
2566596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
2576596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
2586596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
2596596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
2606596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
2616596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
2626596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
2636596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
2646596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
2656596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
2666596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
2676596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
2686596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
2696596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
2706596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
2716596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
2726596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
2736596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
2746596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
2756596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
2766596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
2776596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
2786596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
2796596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
2806596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
2816596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
2826596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
2836596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
2846596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
2856596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
2866596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
2876596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
2886596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
2896596afd4SAlex Deucher 	0x00009224, 0x00070000, 0xffffffff,
2906596afd4SAlex Deucher 	0x00009228, 0x00030002, 0xffffffff,
2916596afd4SAlex Deucher 	0x0000922c, 0x00050004, 0xffffffff,
2926596afd4SAlex Deucher 	0x00009238, 0x00010006, 0xffffffff,
2936596afd4SAlex Deucher 	0x0000923c, 0x00090008, 0xffffffff,
2946596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
2956596afd4SAlex Deucher 	0x0000802c, 0x40010000, 0xffffffff,
2966596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
2976596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
2986596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
2996596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
3006596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
3016596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
3026596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
3036596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
3046596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
3056596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
3066596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
3076596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
3086596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
3096596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
3106596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
3116596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
3126596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
3136596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
3146596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
3156596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
3166596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
3176596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
3186596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
3196596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
3206596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
3216596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
3226596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
3236596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
3246596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
3256596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
3266596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
3276596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
3286596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
3296596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
3306596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
3316596afd4SAlex Deucher 	0x00009224, 0x00070000, 0xffffffff,
3326596afd4SAlex Deucher 	0x00009228, 0x00030002, 0xffffffff,
3336596afd4SAlex Deucher 	0x0000922c, 0x00050004, 0xffffffff,
3346596afd4SAlex Deucher 	0x00009238, 0x00010006, 0xffffffff,
3356596afd4SAlex Deucher 	0x0000923c, 0x00090008, 0xffffffff,
3366596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
3376596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3386596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
3396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3406596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
3416596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3426596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
3436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3446596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
3456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3466596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
3476596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3486596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
3496596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3506596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
3516596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3526596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
3536596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3546596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
3556596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3566596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
3576596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3586596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
3596596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3606596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
3616596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
3626596afd4SAlex Deucher };
3636596afd4SAlex Deucher #define BARTS_MGCG_DEFAULT_LENGTH sizeof(barts_mgcg_default) / (3 * sizeof(u32))
3646596afd4SAlex Deucher 
365*3013edd6SGuoHua Chen static const u32 barts_mgcg_disable[] = {
3666596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3676596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
3686596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3696596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
3706596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3716596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
3726596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3736596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
3746596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3756596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
3766596afd4SAlex Deucher };
3776596afd4SAlex Deucher #define BARTS_MGCG_DISABLE_LENGTH sizeof(barts_mgcg_disable) / (3 * sizeof(u32))
3786596afd4SAlex Deucher 
379*3013edd6SGuoHua Chen static const u32 barts_mgcg_enable[] = {
3806596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3816596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
3826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3836596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
3846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3856596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
3866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3876596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
3886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3896596afd4SAlex Deucher 	0x00009150, 0x81944000, 0xffffffff
3906596afd4SAlex Deucher };
3916596afd4SAlex Deucher #define BARTS_MGCG_ENABLE_LENGTH sizeof(barts_mgcg_enable) / (3 * sizeof(u32))
3926596afd4SAlex Deucher 
3936596afd4SAlex Deucher //********* CAICOS **************//
394*3013edd6SGuoHua Chen static const u32 caicos_cgcg_cgls_default[] = {
3956596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
3966596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3976596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
3986596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3996596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
4006596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4016596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
4026596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4036596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
4046596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4056596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
4066596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4076596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
4086596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4096596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
4106596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4116596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
4126596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4136596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
4146596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4156596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
4166596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4176596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
4186596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4196596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
4206596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4216596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
4226596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4236596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
4246596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4256596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
4266596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4276596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
4286596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4296596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
4306596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4316596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
4326596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4336596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
4346596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4356596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
4366596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4376596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
4386596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4396596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
4406596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4416596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
4426596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
4436596afd4SAlex Deucher };
4446596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_DEFAULT_LENGTH sizeof(caicos_cgcg_cgls_default) / (3 * sizeof(u32))
4456596afd4SAlex Deucher 
446*3013edd6SGuoHua Chen static const u32 caicos_cgcg_cgls_disable[] = {
4476596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
4486596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4496596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
4506596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4516596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
4526596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4536596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
4546596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4556596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
4566596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4576596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
4586596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4596596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
4606596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4616596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
4626596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4636596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
4646596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4656596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
4666596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4676596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
4686596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4696596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
4706596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4716596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
4726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4736596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
4746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4756596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
4766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4776596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
4786596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4796596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
4806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4816596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
4826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4836596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
4846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4856596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
4866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4876596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
4886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4896596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
4906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4916596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
4926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4936596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
4946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4956596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
4966596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
4976596afd4SAlex Deucher };
4986596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_DISABLE_LENGTH sizeof(caicos_cgcg_cgls_disable) / (3 * sizeof(u32))
4996596afd4SAlex Deucher 
500*3013edd6SGuoHua Chen static const u32 caicos_cgcg_cgls_enable[] = {
5016596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
5026596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
5036596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
5046596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5056596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
5066596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5076596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
5086596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5096596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
5106596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5116596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
5126596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5136596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
5146596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5156596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
5166596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5176596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
5186596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5196596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
5206596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5216596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
5226596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5236596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
5246596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5256596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
5266596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5276596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
5286596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5296596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
5306596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5316596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
5326596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5336596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
5346596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5356596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
5366596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5376596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
5386596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5396596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
5406596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5416596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
5426596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5436596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
5446596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5456596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
5466596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5476596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
5486596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5496596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
5506596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
5516596afd4SAlex Deucher };
5526596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_ENABLE_LENGTH sizeof(caicos_cgcg_cgls_enable) / (3 * sizeof(u32))
5536596afd4SAlex Deucher 
554*3013edd6SGuoHua Chen static const u32 caicos_mgcg_default[] = {
5556596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
5566596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
5576596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
5586596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
5596596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
5606596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
5616596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
5626596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
5636596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
5646596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
5656596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
5666596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
5676596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
5686596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
5696596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
5706596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
5716596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
5726596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
5736596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
5746596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
5756596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
5766596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
5776596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
5786596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
5796596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
5806596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
5816596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
5826596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
5836596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
5846596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
5856596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
5866596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
5876596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
5886596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
5896596afd4SAlex Deucher 	0x0000d0c0, 0xff000100, 0xffffffff,
5906596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
5916596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
5926596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
5936596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
5946596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
5956596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
5966596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
5976596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
5986596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
5996596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
6006596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
6016596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
6026596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
6036596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
6046596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
6056596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
6066596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
6076596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6086596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
6096596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6106596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
6116596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6126596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
6136596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6146596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
6156596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6166596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
6176596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6186596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
6196596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6206596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
6216596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6226596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
6236596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6246596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
6256596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6266596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
6276596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6286596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
6296596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
6306596afd4SAlex Deucher };
6316596afd4SAlex Deucher #define CAICOS_MGCG_DEFAULT_LENGTH sizeof(caicos_mgcg_default) / (3 * sizeof(u32))
6326596afd4SAlex Deucher 
633*3013edd6SGuoHua Chen static const u32 caicos_mgcg_disable[] = {
6346596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
6356596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
6366596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6376596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
6386596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6396596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
6406596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6416596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
6426596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6436596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
6446596afd4SAlex Deucher };
6456596afd4SAlex Deucher #define CAICOS_MGCG_DISABLE_LENGTH sizeof(caicos_mgcg_disable) / (3 * sizeof(u32))
6466596afd4SAlex Deucher 
647*3013edd6SGuoHua Chen static const u32 caicos_mgcg_enable[] = {
6486596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
6496596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
6506596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6516596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
6526596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6536596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
6546596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6556596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
6566596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6576596afd4SAlex Deucher 	0x00009150, 0x46944040, 0xffffffff
6586596afd4SAlex Deucher };
6596596afd4SAlex Deucher #define CAICOS_MGCG_ENABLE_LENGTH sizeof(caicos_mgcg_enable) / (3 * sizeof(u32))
6606596afd4SAlex Deucher 
6616596afd4SAlex Deucher //********* TURKS **************//
662*3013edd6SGuoHua Chen static const u32 turks_cgcg_cgls_default[] = {
6636596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
6646596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6656596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
6666596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6676596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
6686596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6696596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
6706596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6716596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
6726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6736596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
6746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6756596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
6766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6776596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
6786596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6796596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
6806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6816596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
6826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6836596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
6846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6856596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
6866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6876596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
6886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6896596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
6906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6916596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
6926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6936596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
6946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6956596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
6966596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6976596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
6986596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6996596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
7006596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7016596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
7026596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7036596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
7046596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7056596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
7066596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7076596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
7086596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7096596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
7106596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
7116596afd4SAlex Deucher };
7126596afd4SAlex Deucher #define TURKS_CGCG_CGLS_DEFAULT_LENGTH  sizeof(turks_cgcg_cgls_default) / (3 * sizeof(u32))
7136596afd4SAlex Deucher 
714*3013edd6SGuoHua Chen static const u32 turks_cgcg_cgls_disable[] = {
7156596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
7166596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7176596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
7186596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7196596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
7206596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7216596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
7226596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7236596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
7246596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7256596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
7266596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7276596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
7286596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7296596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
7306596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7316596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
7326596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7336596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
7346596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7356596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
7366596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7376596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
7386596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7396596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
7406596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7416596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
7426596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7436596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
7446596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7456596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
7466596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7476596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
7486596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7496596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
7506596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7516596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
7526596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7536596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
7546596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7556596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
7566596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7576596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
7586596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7596596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
7606596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7616596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
7626596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7636596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
7646596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
7656596afd4SAlex Deucher };
7666596afd4SAlex Deucher #define TURKS_CGCG_CGLS_DISABLE_LENGTH sizeof(turks_cgcg_cgls_disable) / (3 * sizeof(u32))
7676596afd4SAlex Deucher 
768*3013edd6SGuoHua Chen static const u32 turks_cgcg_cgls_enable[] = {
7696596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
7706596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
7716596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
7726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7736596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
7746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7756596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
7766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7776596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
7786596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7796596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
7806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7816596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
7826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7836596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
7846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7856596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
7866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7876596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
7886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7896596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
7906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7916596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
7926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7936596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
7946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7956596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
7966596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7976596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
7986596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7996596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
8006596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8016596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
8026596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8036596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
8046596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8056596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
8066596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8076596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
8086596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8096596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
8106596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8116596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
8126596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8136596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
8146596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8156596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
8166596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8176596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
8186596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
8196596afd4SAlex Deucher };
8206596afd4SAlex Deucher #define TURKS_CGCG_CGLS_ENABLE_LENGTH sizeof(turks_cgcg_cgls_enable) / (3 * sizeof(u32))
8216596afd4SAlex Deucher 
8226596afd4SAlex Deucher // These are the sequences for turks_mgcg_shls
823*3013edd6SGuoHua Chen static const u32 turks_mgcg_default[] = {
8246596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
8256596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
8266596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
8276596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
8286596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
8296596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
8306596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
8316596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
8326596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
8336596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
8346596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
8356596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
8366596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
8376596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
8386596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
8396596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
8406596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
8416596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
8426596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
8436596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
8446596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
8456596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
8466596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
8476596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
8486596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
8496596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
8506596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
8516596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
8526596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
8536596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
8546596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
8556596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
8566596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
8576596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
8586596afd4SAlex Deucher 	0x0000d0c0, 0x00000100, 0xffffffff,
8596596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
8606596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
8616596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
8626596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
8636596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
8646596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
8656596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
8666596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
8676596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
8686596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
8696596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
8706596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
8716596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
8726596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
8736596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
8746596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
8756596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
8766596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
8776596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
8786596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
8796596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
8806596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
8816596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
8826596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
8836596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
8846596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
8856596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
8866596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
8876596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
8886596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
8896596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
8906596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
8916596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
8926596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
8936596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
8946596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
8956596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
8966596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8976596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
8986596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8996596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
9006596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9016596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
9026596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9036596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
9046596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9056596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
9066596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9076596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
9086596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9096596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
9106596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9116596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
9126596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9136596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
9146596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9156596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
9166596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9176596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
9186596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
9196596afd4SAlex Deucher };
9206596afd4SAlex Deucher #define TURKS_MGCG_DEFAULT_LENGTH sizeof(turks_mgcg_default) / (3 * sizeof(u32))
9216596afd4SAlex Deucher 
922*3013edd6SGuoHua Chen static const u32 turks_mgcg_disable[] = {
9236596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
9246596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
9256596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9266596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
9276596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9286596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
9296596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9306596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
9316596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9326596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
9336596afd4SAlex Deucher };
9346596afd4SAlex Deucher #define TURKS_MGCG_DISABLE_LENGTH sizeof(turks_mgcg_disable) / (3 * sizeof(u32))
9356596afd4SAlex Deucher 
936*3013edd6SGuoHua Chen static const u32 turks_mgcg_enable[] = {
9376596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
9386596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
9396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9406596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
9416596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9426596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
9436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9446596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
9456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9466596afd4SAlex Deucher 	0x00009150, 0x6e944000, 0xffffffff
9476596afd4SAlex Deucher };
9486596afd4SAlex Deucher #define TURKS_MGCG_ENABLE_LENGTH sizeof(turks_mgcg_enable) / (3 * sizeof(u32))
9496596afd4SAlex Deucher 
9506596afd4SAlex Deucher #endif
9516596afd4SAlex Deucher 
9526596afd4SAlex Deucher #ifndef BTC_SYSLS_SEQUENCE
9536596afd4SAlex Deucher #define BTC_SYSLS_SEQUENCE  100
9546596afd4SAlex Deucher 
9556596afd4SAlex Deucher 
9566596afd4SAlex Deucher //********* BARTS **************//
957*3013edd6SGuoHua Chen static const u32 barts_sysls_default[] = {
9586596afd4SAlex Deucher 	/* Register,   Value,     Mask bits */
9596596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
9606596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
9616596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
9626596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
9636596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
9646596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
9656596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
9666596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
9676596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
9686596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
9696596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
9706596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
9716596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
9726596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
9736596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
9746596afd4SAlex Deucher };
9756596afd4SAlex Deucher #define BARTS_SYSLS_DEFAULT_LENGTH sizeof(barts_sysls_default) / (3 * sizeof(u32))
9766596afd4SAlex Deucher 
977*3013edd6SGuoHua Chen static const u32 barts_sysls_disable[] = {
9786596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
9796596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
9806596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
9816596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
9826596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
9836596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
9846596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
9856596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
9866596afd4SAlex Deucher 	0x000020c0, 0x00040c80, 0xffffffff,
9876596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
9886596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
9896596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
9906596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
9916596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
9926596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
9936596afd4SAlex Deucher };
9946596afd4SAlex Deucher #define BARTS_SYSLS_DISABLE_LENGTH sizeof(barts_sysls_disable) / (3 * sizeof(u32))
9956596afd4SAlex Deucher 
996*3013edd6SGuoHua Chen static const u32 barts_sysls_enable[] = {
9976596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
9986596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
9996596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10006596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10016596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10026596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10036596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10046596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10056596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
10066596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10076596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10086596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff,
10096596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10106596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10116596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
10126596afd4SAlex Deucher };
10136596afd4SAlex Deucher #define BARTS_SYSLS_ENABLE_LENGTH sizeof(barts_sysls_enable) / (3 * sizeof(u32))
10146596afd4SAlex Deucher 
10156596afd4SAlex Deucher //********* CAICOS **************//
1016*3013edd6SGuoHua Chen static const u32 caicos_sysls_default[] = {
10176596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10186596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10196596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10206596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10216596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10226596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10236596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10246596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10256596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10266596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10276596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10286596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10296596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10306596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
10316596afd4SAlex Deucher };
10326596afd4SAlex Deucher #define CAICOS_SYSLS_DEFAULT_LENGTH sizeof(caicos_sysls_default) / (3 * sizeof(u32))
10336596afd4SAlex Deucher 
1034*3013edd6SGuoHua Chen static const u32 caicos_sysls_disable[] = {
10356596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10366596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10376596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
10386596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
10396596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
10406596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
10416596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
10426596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
10436596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10446596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
10456596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10466596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
10476596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
10486596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
10496596afd4SAlex Deucher };
10506596afd4SAlex Deucher #define CAICOS_SYSLS_DISABLE_LENGTH sizeof(caicos_sysls_disable) / (3 * sizeof(u32))
10516596afd4SAlex Deucher 
1052*3013edd6SGuoHua Chen static const u32 caicos_sysls_enable[] = {
10536596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
10546596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
10556596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10566596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10576596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10586596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10596596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10606596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10616596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10626596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10636596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10646596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10656596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff,
10666596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff
10676596afd4SAlex Deucher };
10686596afd4SAlex Deucher #define CAICOS_SYSLS_ENABLE_LENGTH sizeof(caicos_sysls_enable) / (3 * sizeof(u32))
10696596afd4SAlex Deucher 
10706596afd4SAlex Deucher //********* TURKS **************//
1071*3013edd6SGuoHua Chen static const u32 turks_sysls_default[] = {
10726596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10736596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10746596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10756596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10766596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10776596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10786596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10796596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10806596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
10816596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10826596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10836596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10846596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10856596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10866596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
10876596afd4SAlex Deucher };
10886596afd4SAlex Deucher #define TURKS_SYSLS_DEFAULT_LENGTH sizeof(turks_sysls_default) / (3 * sizeof(u32))
10896596afd4SAlex Deucher 
1090*3013edd6SGuoHua Chen static const u32 turks_sysls_disable[] = {
10916596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10926596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10936596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
10946596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
10956596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
10966596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
10976596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
10986596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
10996596afd4SAlex Deucher 	0x000020c0, 0x00040c80, 0xffffffff,
11006596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
11016596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
11026596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
11036596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
11046596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
11056596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
11066596afd4SAlex Deucher };
11076596afd4SAlex Deucher #define TURKS_SYSLS_DISABLE_LENGTH sizeof(turks_sysls_disable) / (3 * sizeof(u32))
11086596afd4SAlex Deucher 
1109*3013edd6SGuoHua Chen static const u32 turks_sysls_enable[] = {
11106596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
11116596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
11126596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
11136596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
11146596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
11156596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
11166596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
11176596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
11186596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
11196596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
11206596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
11216596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff,
11226596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
11236596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
11246596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
11256596afd4SAlex Deucher };
11266596afd4SAlex Deucher #define TURKS_SYSLS_ENABLE_LENGTH sizeof(turks_sysls_enable) / (3 * sizeof(u32))
11276596afd4SAlex Deucher 
11286596afd4SAlex Deucher #endif
11296596afd4SAlex Deucher 
1130*3013edd6SGuoHua Chen u32 btc_valid_sclk[40] = {
1131d22b7e40SAlex Deucher 	5000,   10000,  15000,  20000,  25000,  30000,  35000,  40000,  45000,  50000,
1132d22b7e40SAlex Deucher 	55000,  60000,  65000,  70000,  75000,  80000,  85000,  90000,  95000,  100000,
1133d22b7e40SAlex Deucher 	105000, 110000, 11500,  120000, 125000, 130000, 135000, 140000, 145000, 150000,
1134d22b7e40SAlex Deucher 	155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000
1135d22b7e40SAlex Deucher };
1136d22b7e40SAlex Deucher 
11373cf8bb1aSJérome Glisse static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = {
1138d22b7e40SAlex Deucher 	{ 10000, 30000, RADEON_SCLK_UP },
1139d22b7e40SAlex Deucher 	{ 15000, 30000, RADEON_SCLK_UP },
1140d22b7e40SAlex Deucher 	{ 20000, 30000, RADEON_SCLK_UP },
1141d22b7e40SAlex Deucher 	{ 25000, 30000, RADEON_SCLK_UP }
1142d22b7e40SAlex Deucher };
1143d22b7e40SAlex Deucher 
btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table * table,u32 * max_clock)114460779143SAlex Deucher void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
114560779143SAlex Deucher 						     u32 *max_clock)
114660779143SAlex Deucher {
114760779143SAlex Deucher 	u32 i, clock = 0;
114860779143SAlex Deucher 
114960779143SAlex Deucher 	if ((table == NULL) || (table->count == 0)) {
115060779143SAlex Deucher 		*max_clock = clock;
115160779143SAlex Deucher 		return;
115260779143SAlex Deucher 	}
115360779143SAlex Deucher 
115460779143SAlex Deucher 	for (i = 0; i < table->count; i++) {
115560779143SAlex Deucher 		if (clock < table->entries[i].clk)
115660779143SAlex Deucher 			clock = table->entries[i].clk;
115760779143SAlex Deucher 	}
115860779143SAlex Deucher 	*max_clock = clock;
115960779143SAlex Deucher }
116060779143SAlex Deucher 
btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table * table,u32 clock,u16 max_voltage,u16 * voltage)116169e0b57aSAlex Deucher void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
1162d22b7e40SAlex Deucher 					u32 clock, u16 max_voltage, u16 *voltage)
1163d22b7e40SAlex Deucher {
1164d22b7e40SAlex Deucher 	u32 i;
1165d22b7e40SAlex Deucher 
1166d22b7e40SAlex Deucher 	if ((table == NULL) || (table->count == 0))
1167d22b7e40SAlex Deucher 		return;
1168d22b7e40SAlex Deucher 
1169d22b7e40SAlex Deucher 	for (i = 0; i < table->count; i++) {
1170d22b7e40SAlex Deucher 		if (clock <= table->entries[i].clk) {
1171d22b7e40SAlex Deucher 			if (*voltage < table->entries[i].v)
1172d22b7e40SAlex Deucher 				*voltage = (u16)((table->entries[i].v < max_voltage) ?
1173d22b7e40SAlex Deucher 						  table->entries[i].v : max_voltage);
1174d22b7e40SAlex Deucher 			return;
1175d22b7e40SAlex Deucher 		}
1176d22b7e40SAlex Deucher 	}
1177d22b7e40SAlex Deucher 
1178d22b7e40SAlex Deucher 	*voltage = (*voltage > max_voltage) ? *voltage : max_voltage;
1179d22b7e40SAlex Deucher }
1180d22b7e40SAlex Deucher 
btc_find_valid_clock(struct radeon_clock_array * clocks,u32 max_clock,u32 requested_clock)1181d22b7e40SAlex Deucher static u32 btc_find_valid_clock(struct radeon_clock_array *clocks,
1182d22b7e40SAlex Deucher 				u32 max_clock, u32 requested_clock)
1183d22b7e40SAlex Deucher {
1184d22b7e40SAlex Deucher 	unsigned int i;
1185d22b7e40SAlex Deucher 
1186d22b7e40SAlex Deucher 	if ((clocks == NULL) || (clocks->count == 0))
1187d22b7e40SAlex Deucher 		return (requested_clock < max_clock) ? requested_clock : max_clock;
1188d22b7e40SAlex Deucher 
1189d22b7e40SAlex Deucher 	for (i = 0; i < clocks->count; i++) {
1190d22b7e40SAlex Deucher 		if (clocks->values[i] >= requested_clock)
1191d22b7e40SAlex Deucher 			return (clocks->values[i] < max_clock) ? clocks->values[i] : max_clock;
1192d22b7e40SAlex Deucher 	}
1193d22b7e40SAlex Deucher 
1194d22b7e40SAlex Deucher 	return (clocks->values[clocks->count - 1] < max_clock) ?
1195d22b7e40SAlex Deucher 		clocks->values[clocks->count - 1] : max_clock;
1196d22b7e40SAlex Deucher }
1197d22b7e40SAlex Deucher 
btc_get_valid_mclk(struct radeon_device * rdev,u32 max_mclk,u32 requested_mclk)1198d22b7e40SAlex Deucher static u32 btc_get_valid_mclk(struct radeon_device *rdev,
1199d22b7e40SAlex Deucher 			      u32 max_mclk, u32 requested_mclk)
1200d22b7e40SAlex Deucher {
1201d22b7e40SAlex Deucher 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_mclk_values,
1202d22b7e40SAlex Deucher 				    max_mclk, requested_mclk);
1203d22b7e40SAlex Deucher }
1204d22b7e40SAlex Deucher 
btc_get_valid_sclk(struct radeon_device * rdev,u32 max_sclk,u32 requested_sclk)1205d22b7e40SAlex Deucher static u32 btc_get_valid_sclk(struct radeon_device *rdev,
1206d22b7e40SAlex Deucher 			      u32 max_sclk, u32 requested_sclk)
1207d22b7e40SAlex Deucher {
1208d22b7e40SAlex Deucher 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_sclk_values,
1209d22b7e40SAlex Deucher 				    max_sclk, requested_sclk);
1210d22b7e40SAlex Deucher }
1211d22b7e40SAlex Deucher 
btc_skip_blacklist_clocks(struct radeon_device * rdev,const u32 max_sclk,const u32 max_mclk,u32 * sclk,u32 * mclk)121269e0b57aSAlex Deucher void btc_skip_blacklist_clocks(struct radeon_device *rdev,
1213d22b7e40SAlex Deucher 			       const u32 max_sclk, const u32 max_mclk,
1214d22b7e40SAlex Deucher 			       u32 *sclk, u32 *mclk)
1215d22b7e40SAlex Deucher {
1216d22b7e40SAlex Deucher 	int i, num_blacklist_clocks;
1217d22b7e40SAlex Deucher 
1218d22b7e40SAlex Deucher 	if ((sclk == NULL) || (mclk == NULL))
1219d22b7e40SAlex Deucher 		return;
1220d22b7e40SAlex Deucher 
1221d22b7e40SAlex Deucher 	num_blacklist_clocks = ARRAY_SIZE(btc_blacklist_clocks);
1222d22b7e40SAlex Deucher 
1223d22b7e40SAlex Deucher 	for (i = 0; i < num_blacklist_clocks; i++) {
1224d22b7e40SAlex Deucher 		if ((btc_blacklist_clocks[i].sclk == *sclk) &&
1225d22b7e40SAlex Deucher 		    (btc_blacklist_clocks[i].mclk == *mclk))
1226d22b7e40SAlex Deucher 			break;
1227d22b7e40SAlex Deucher 	}
1228d22b7e40SAlex Deucher 
1229d22b7e40SAlex Deucher 	if (i < num_blacklist_clocks) {
1230d22b7e40SAlex Deucher 		if (btc_blacklist_clocks[i].action == RADEON_SCLK_UP) {
1231d22b7e40SAlex Deucher 			*sclk = btc_get_valid_sclk(rdev, max_sclk, *sclk + 1);
1232d22b7e40SAlex Deucher 
1233d22b7e40SAlex Deucher 			if (*sclk < max_sclk)
1234d22b7e40SAlex Deucher 				btc_skip_blacklist_clocks(rdev, max_sclk, max_mclk, sclk, mclk);
1235d22b7e40SAlex Deucher 		}
1236d22b7e40SAlex Deucher 	}
1237d22b7e40SAlex Deucher }
1238d22b7e40SAlex Deucher 
btc_adjust_clock_combinations(struct radeon_device * rdev,const struct radeon_clock_and_voltage_limits * max_limits,struct rv7xx_pl * pl)123969e0b57aSAlex Deucher void btc_adjust_clock_combinations(struct radeon_device *rdev,
1240d22b7e40SAlex Deucher 				   const struct radeon_clock_and_voltage_limits *max_limits,
1241d22b7e40SAlex Deucher 				   struct rv7xx_pl *pl)
1242d22b7e40SAlex Deucher {
1243d22b7e40SAlex Deucher 
1244d22b7e40SAlex Deucher 	if ((pl->mclk == 0) || (pl->sclk == 0))
1245d22b7e40SAlex Deucher 		return;
1246d22b7e40SAlex Deucher 
1247d22b7e40SAlex Deucher 	if (pl->mclk == pl->sclk)
1248d22b7e40SAlex Deucher 		return;
1249d22b7e40SAlex Deucher 
1250d22b7e40SAlex Deucher 	if (pl->mclk > pl->sclk) {
1251d22b7e40SAlex Deucher 		if (((pl->mclk + (pl->sclk - 1)) / pl->sclk) > rdev->pm.dpm.dyn_state.mclk_sclk_ratio)
1252d22b7e40SAlex Deucher 			pl->sclk = btc_get_valid_sclk(rdev,
1253d22b7e40SAlex Deucher 						      max_limits->sclk,
1254d22b7e40SAlex Deucher 						      (pl->mclk +
1255d22b7e40SAlex Deucher 						       (rdev->pm.dpm.dyn_state.mclk_sclk_ratio - 1)) /
1256d22b7e40SAlex Deucher 						      rdev->pm.dpm.dyn_state.mclk_sclk_ratio);
1257d22b7e40SAlex Deucher 	} else {
1258d22b7e40SAlex Deucher 		if ((pl->sclk - pl->mclk) > rdev->pm.dpm.dyn_state.sclk_mclk_delta)
1259d22b7e40SAlex Deucher 			pl->mclk = btc_get_valid_mclk(rdev,
1260d22b7e40SAlex Deucher 						      max_limits->mclk,
1261d22b7e40SAlex Deucher 						      pl->sclk -
1262d22b7e40SAlex Deucher 						      rdev->pm.dpm.dyn_state.sclk_mclk_delta);
1263d22b7e40SAlex Deucher 	}
1264d22b7e40SAlex Deucher }
1265d22b7e40SAlex Deucher 
btc_find_voltage(struct atom_voltage_table * table,u16 voltage)1266d22b7e40SAlex Deucher static u16 btc_find_voltage(struct atom_voltage_table *table, u16 voltage)
1267d22b7e40SAlex Deucher {
1268d22b7e40SAlex Deucher 	unsigned int i;
1269d22b7e40SAlex Deucher 
1270d22b7e40SAlex Deucher 	for (i = 0; i < table->count; i++) {
1271d22b7e40SAlex Deucher 		if (voltage <= table->entries[i].value)
1272d22b7e40SAlex Deucher 			return table->entries[i].value;
1273d22b7e40SAlex Deucher 	}
1274d22b7e40SAlex Deucher 
1275d22b7e40SAlex Deucher 	return table->entries[table->count - 1].value;
1276d22b7e40SAlex Deucher }
1277d22b7e40SAlex Deucher 
btc_apply_voltage_delta_rules(struct radeon_device * rdev,u16 max_vddc,u16 max_vddci,u16 * vddc,u16 * vddci)127869e0b57aSAlex Deucher void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
1279d22b7e40SAlex Deucher 				   u16 max_vddc, u16 max_vddci,
1280d22b7e40SAlex Deucher 				   u16 *vddc, u16 *vddci)
1281d22b7e40SAlex Deucher {
1282d22b7e40SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1283d22b7e40SAlex Deucher 	u16 new_voltage;
1284d22b7e40SAlex Deucher 
1285d22b7e40SAlex Deucher 	if ((0 == *vddc) || (0 == *vddci))
1286d22b7e40SAlex Deucher 		return;
1287d22b7e40SAlex Deucher 
1288d22b7e40SAlex Deucher 	if (*vddc > *vddci) {
1289d22b7e40SAlex Deucher 		if ((*vddc - *vddci) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
1290d22b7e40SAlex Deucher 			new_voltage = btc_find_voltage(&eg_pi->vddci_voltage_table,
1291d22b7e40SAlex Deucher 						       (*vddc - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
1292d22b7e40SAlex Deucher 			*vddci = (new_voltage < max_vddci) ? new_voltage : max_vddci;
1293d22b7e40SAlex Deucher 		}
1294d22b7e40SAlex Deucher 	} else {
1295d22b7e40SAlex Deucher 		if ((*vddci - *vddc) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
1296d22b7e40SAlex Deucher 			new_voltage = btc_find_voltage(&eg_pi->vddc_voltage_table,
1297d22b7e40SAlex Deucher 						       (*vddci - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
1298d22b7e40SAlex Deucher 			*vddc = (new_voltage < max_vddc) ? new_voltage : max_vddc;
1299d22b7e40SAlex Deucher 		}
1300d22b7e40SAlex Deucher 	}
1301d22b7e40SAlex Deucher }
1302d22b7e40SAlex Deucher 
btc_enable_bif_dynamic_pcie_gen2(struct radeon_device * rdev,bool enable)13036596afd4SAlex Deucher static void btc_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev,
13046596afd4SAlex Deucher 					     bool enable)
13056596afd4SAlex Deucher {
13066596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
13076596afd4SAlex Deucher 	u32 tmp, bif;
13086596afd4SAlex Deucher 
13096596afd4SAlex Deucher 	tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
13106596afd4SAlex Deucher 	if (enable) {
13116596afd4SAlex Deucher 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
13126596afd4SAlex Deucher 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
13136596afd4SAlex Deucher 			if (!pi->boot_in_gen2) {
13146596afd4SAlex Deucher 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
13156596afd4SAlex Deucher 				bif |= CG_CLIENT_REQ(0xd);
13166596afd4SAlex Deucher 				WREG32(CG_BIF_REQ_AND_RSP, bif);
13176596afd4SAlex Deucher 
13186596afd4SAlex Deucher 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
13196596afd4SAlex Deucher 				tmp |= LC_HW_VOLTAGE_IF_CONTROL(1);
13206596afd4SAlex Deucher 				tmp |= LC_GEN2_EN_STRAP;
13216596afd4SAlex Deucher 
13226596afd4SAlex Deucher 				tmp |= LC_CLR_FAILED_SPD_CHANGE_CNT;
13236596afd4SAlex Deucher 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13246596afd4SAlex Deucher 				udelay(10);
13256596afd4SAlex Deucher 				tmp &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
13266596afd4SAlex Deucher 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13276596afd4SAlex Deucher 			}
13286596afd4SAlex Deucher 		}
13296596afd4SAlex Deucher 	} else {
13306596afd4SAlex Deucher 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
13316596afd4SAlex Deucher 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
13326596afd4SAlex Deucher 			if (!pi->boot_in_gen2) {
13336596afd4SAlex Deucher 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
13346596afd4SAlex Deucher 				bif |= CG_CLIENT_REQ(0xd);
13356596afd4SAlex Deucher 				WREG32(CG_BIF_REQ_AND_RSP, bif);
13366596afd4SAlex Deucher 
13376596afd4SAlex Deucher 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
13386596afd4SAlex Deucher 				tmp &= ~LC_GEN2_EN_STRAP;
13396596afd4SAlex Deucher 			}
13406596afd4SAlex Deucher 			WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13416596afd4SAlex Deucher 		}
13426596afd4SAlex Deucher 	}
13436596afd4SAlex Deucher }
13446596afd4SAlex Deucher 
btc_enable_dynamic_pcie_gen2(struct radeon_device * rdev,bool enable)13456596afd4SAlex Deucher static void btc_enable_dynamic_pcie_gen2(struct radeon_device *rdev,
13466596afd4SAlex Deucher 					 bool enable)
13476596afd4SAlex Deucher {
13486596afd4SAlex Deucher 	btc_enable_bif_dynamic_pcie_gen2(rdev, enable);
13496596afd4SAlex Deucher 
13506596afd4SAlex Deucher 	if (enable)
13516596afd4SAlex Deucher 		WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE);
13526596afd4SAlex Deucher 	else
13536596afd4SAlex Deucher 		WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE);
13546596afd4SAlex Deucher }
13556596afd4SAlex Deucher 
btc_disable_ulv(struct radeon_device * rdev)13566596afd4SAlex Deucher static int btc_disable_ulv(struct radeon_device *rdev)
13576596afd4SAlex Deucher {
13586596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
13596596afd4SAlex Deucher 
13606596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
13616596afd4SAlex Deucher 		if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) != PPSMC_Result_OK)
13626596afd4SAlex Deucher 			return -EINVAL;
13636596afd4SAlex Deucher 	}
13646596afd4SAlex Deucher 	return 0;
13656596afd4SAlex Deucher }
13666596afd4SAlex Deucher 
btc_populate_ulv_state(struct radeon_device * rdev,RV770_SMC_STATETABLE * table)13676596afd4SAlex Deucher static int btc_populate_ulv_state(struct radeon_device *rdev,
13686596afd4SAlex Deucher 				  RV770_SMC_STATETABLE *table)
13696596afd4SAlex Deucher {
13706596afd4SAlex Deucher 	int ret = -EINVAL;
13716596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
13726596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
13736596afd4SAlex Deucher 
13746596afd4SAlex Deucher 	if (ulv_pl->vddc) {
13756596afd4SAlex Deucher 		ret = cypress_convert_power_level_to_smc(rdev,
13766596afd4SAlex Deucher 							 ulv_pl,
13776596afd4SAlex Deucher 							 &table->ULVState.levels[0],
13786596afd4SAlex Deucher 							 PPSMC_DISPLAY_WATERMARK_LOW);
13796596afd4SAlex Deucher 		if (ret == 0) {
13806596afd4SAlex Deucher 			table->ULVState.levels[0].arbValue = MC_CG_ARB_FREQ_F0;
13816596afd4SAlex Deucher 			table->ULVState.levels[0].ACIndex = 1;
13826596afd4SAlex Deucher 
13836596afd4SAlex Deucher 			table->ULVState.levels[1] = table->ULVState.levels[0];
13846596afd4SAlex Deucher 			table->ULVState.levels[2] = table->ULVState.levels[0];
13856596afd4SAlex Deucher 
13866596afd4SAlex Deucher 			table->ULVState.flags |= PPSMC_SWSTATE_FLAG_DC;
13876596afd4SAlex Deucher 
13886596afd4SAlex Deucher 			WREG32(CG_ULV_CONTROL, BTC_CGULVCONTROL_DFLT);
13896596afd4SAlex Deucher 			WREG32(CG_ULV_PARAMETER, BTC_CGULVPARAMETER_DFLT);
13906596afd4SAlex Deucher 		}
13916596afd4SAlex Deucher 	}
13926596afd4SAlex Deucher 
13936596afd4SAlex Deucher 	return ret;
13946596afd4SAlex Deucher }
13956596afd4SAlex Deucher 
btc_populate_smc_acpi_state(struct radeon_device * rdev,RV770_SMC_STATETABLE * table)13966596afd4SAlex Deucher static int btc_populate_smc_acpi_state(struct radeon_device *rdev,
13976596afd4SAlex Deucher 				       RV770_SMC_STATETABLE *table)
13986596afd4SAlex Deucher {
13996596afd4SAlex Deucher 	int ret = cypress_populate_smc_acpi_state(rdev, table);
14006596afd4SAlex Deucher 
14016596afd4SAlex Deucher 	if (ret == 0) {
14026596afd4SAlex Deucher 		table->ACPIState.levels[0].ACIndex = 0;
14036596afd4SAlex Deucher 		table->ACPIState.levels[1].ACIndex = 0;
14046596afd4SAlex Deucher 		table->ACPIState.levels[2].ACIndex = 0;
14056596afd4SAlex Deucher 	}
14066596afd4SAlex Deucher 
14076596afd4SAlex Deucher 	return ret;
14086596afd4SAlex Deucher }
14096596afd4SAlex Deucher 
btc_program_mgcg_hw_sequence(struct radeon_device * rdev,const u32 * sequence,u32 count)141069e0b57aSAlex Deucher void btc_program_mgcg_hw_sequence(struct radeon_device *rdev,
14116596afd4SAlex Deucher 				  const u32 *sequence, u32 count)
14126596afd4SAlex Deucher {
14136596afd4SAlex Deucher 	u32 i, length = count * 3;
14146596afd4SAlex Deucher 	u32 tmp;
14156596afd4SAlex Deucher 
14166596afd4SAlex Deucher 	for (i = 0; i < length; i += 3) {
14176596afd4SAlex Deucher 		tmp = RREG32(sequence[i]);
14186596afd4SAlex Deucher 		tmp &= ~sequence[i+2];
14196596afd4SAlex Deucher 		tmp |= sequence[i+1] & sequence[i+2];
14206596afd4SAlex Deucher 		WREG32(sequence[i], tmp);
14216596afd4SAlex Deucher 	}
14226596afd4SAlex Deucher }
14236596afd4SAlex Deucher 
btc_cg_clock_gating_default(struct radeon_device * rdev)14246596afd4SAlex Deucher static void btc_cg_clock_gating_default(struct radeon_device *rdev)
14256596afd4SAlex Deucher {
14266596afd4SAlex Deucher 	u32 count;
14276596afd4SAlex Deucher 	const u32 *p = NULL;
14286596afd4SAlex Deucher 
14296596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
14306596afd4SAlex Deucher 		p = (const u32 *)&barts_cgcg_cgls_default;
14316596afd4SAlex Deucher 		count = BARTS_CGCG_CGLS_DEFAULT_LENGTH;
14326596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
14336596afd4SAlex Deucher 		p = (const u32 *)&turks_cgcg_cgls_default;
14346596afd4SAlex Deucher 		count = TURKS_CGCG_CGLS_DEFAULT_LENGTH;
14356596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
14366596afd4SAlex Deucher 		p = (const u32 *)&caicos_cgcg_cgls_default;
14376596afd4SAlex Deucher 		count = CAICOS_CGCG_CGLS_DEFAULT_LENGTH;
14386596afd4SAlex Deucher 	} else
14396596afd4SAlex Deucher 		return;
14406596afd4SAlex Deucher 
14416596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
14426596afd4SAlex Deucher }
14436596afd4SAlex Deucher 
btc_cg_clock_gating_enable(struct radeon_device * rdev,bool enable)14446596afd4SAlex Deucher static void btc_cg_clock_gating_enable(struct radeon_device *rdev,
14456596afd4SAlex Deucher 				       bool enable)
14466596afd4SAlex Deucher {
14476596afd4SAlex Deucher 	u32 count;
14486596afd4SAlex Deucher 	const u32 *p = NULL;
14496596afd4SAlex Deucher 
14506596afd4SAlex Deucher 	if (enable) {
14516596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
14526596afd4SAlex Deucher 			p = (const u32 *)&barts_cgcg_cgls_enable;
14536596afd4SAlex Deucher 			count = BARTS_CGCG_CGLS_ENABLE_LENGTH;
14546596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
14556596afd4SAlex Deucher 			p = (const u32 *)&turks_cgcg_cgls_enable;
14566596afd4SAlex Deucher 			count = TURKS_CGCG_CGLS_ENABLE_LENGTH;
14576596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
14586596afd4SAlex Deucher 			p = (const u32 *)&caicos_cgcg_cgls_enable;
14596596afd4SAlex Deucher 			count = CAICOS_CGCG_CGLS_ENABLE_LENGTH;
14606596afd4SAlex Deucher 		} else
14616596afd4SAlex Deucher 			return;
14626596afd4SAlex Deucher 	} else {
14636596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
14646596afd4SAlex Deucher 			p = (const u32 *)&barts_cgcg_cgls_disable;
14656596afd4SAlex Deucher 			count = BARTS_CGCG_CGLS_DISABLE_LENGTH;
14666596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
14676596afd4SAlex Deucher 			p = (const u32 *)&turks_cgcg_cgls_disable;
14686596afd4SAlex Deucher 			count = TURKS_CGCG_CGLS_DISABLE_LENGTH;
14696596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
14706596afd4SAlex Deucher 			p = (const u32 *)&caicos_cgcg_cgls_disable;
14716596afd4SAlex Deucher 			count = CAICOS_CGCG_CGLS_DISABLE_LENGTH;
14726596afd4SAlex Deucher 		} else
14736596afd4SAlex Deucher 			return;
14746596afd4SAlex Deucher 	}
14756596afd4SAlex Deucher 
14766596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
14776596afd4SAlex Deucher }
14786596afd4SAlex Deucher 
btc_mg_clock_gating_default(struct radeon_device * rdev)14796596afd4SAlex Deucher static void btc_mg_clock_gating_default(struct radeon_device *rdev)
14806596afd4SAlex Deucher {
14816596afd4SAlex Deucher 	u32 count;
14826596afd4SAlex Deucher 	const u32 *p = NULL;
14836596afd4SAlex Deucher 
14846596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
14856596afd4SAlex Deucher 		p = (const u32 *)&barts_mgcg_default;
14866596afd4SAlex Deucher 		count = BARTS_MGCG_DEFAULT_LENGTH;
14876596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
14886596afd4SAlex Deucher 		p = (const u32 *)&turks_mgcg_default;
14896596afd4SAlex Deucher 		count = TURKS_MGCG_DEFAULT_LENGTH;
14906596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
14916596afd4SAlex Deucher 		p = (const u32 *)&caicos_mgcg_default;
14926596afd4SAlex Deucher 		count = CAICOS_MGCG_DEFAULT_LENGTH;
14936596afd4SAlex Deucher 	} else
14946596afd4SAlex Deucher 		return;
14956596afd4SAlex Deucher 
14966596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
14976596afd4SAlex Deucher }
14986596afd4SAlex Deucher 
btc_mg_clock_gating_enable(struct radeon_device * rdev,bool enable)14996596afd4SAlex Deucher static void btc_mg_clock_gating_enable(struct radeon_device *rdev,
15006596afd4SAlex Deucher 				       bool enable)
15016596afd4SAlex Deucher {
15026596afd4SAlex Deucher 	u32 count;
15036596afd4SAlex Deucher 	const u32 *p = NULL;
15046596afd4SAlex Deucher 
15056596afd4SAlex Deucher 	if (enable) {
15066596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15076596afd4SAlex Deucher 			p = (const u32 *)&barts_mgcg_enable;
15086596afd4SAlex Deucher 			count = BARTS_MGCG_ENABLE_LENGTH;
15096596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15106596afd4SAlex Deucher 			p = (const u32 *)&turks_mgcg_enable;
15116596afd4SAlex Deucher 			count = TURKS_MGCG_ENABLE_LENGTH;
15126596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15136596afd4SAlex Deucher 			p = (const u32 *)&caicos_mgcg_enable;
15146596afd4SAlex Deucher 			count = CAICOS_MGCG_ENABLE_LENGTH;
15156596afd4SAlex Deucher 		} else
15166596afd4SAlex Deucher 			return;
15176596afd4SAlex Deucher 	} else {
15186596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15196596afd4SAlex Deucher 			p = (const u32 *)&barts_mgcg_disable[0];
15206596afd4SAlex Deucher 			count = BARTS_MGCG_DISABLE_LENGTH;
15216596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15226596afd4SAlex Deucher 			p = (const u32 *)&turks_mgcg_disable[0];
15236596afd4SAlex Deucher 			count = TURKS_MGCG_DISABLE_LENGTH;
15246596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15256596afd4SAlex Deucher 			p = (const u32 *)&caicos_mgcg_disable[0];
15266596afd4SAlex Deucher 			count = CAICOS_MGCG_DISABLE_LENGTH;
15276596afd4SAlex Deucher 		} else
15286596afd4SAlex Deucher 			return;
15296596afd4SAlex Deucher 	}
15306596afd4SAlex Deucher 
15316596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15326596afd4SAlex Deucher }
15336596afd4SAlex Deucher 
btc_ls_clock_gating_default(struct radeon_device * rdev)15346596afd4SAlex Deucher static void btc_ls_clock_gating_default(struct radeon_device *rdev)
15356596afd4SAlex Deucher {
15366596afd4SAlex Deucher 	u32 count;
15376596afd4SAlex Deucher 	const u32 *p = NULL;
15386596afd4SAlex Deucher 
15396596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
15406596afd4SAlex Deucher 		p = (const u32 *)&barts_sysls_default;
15416596afd4SAlex Deucher 		count = BARTS_SYSLS_DEFAULT_LENGTH;
15426596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
15436596afd4SAlex Deucher 		p = (const u32 *)&turks_sysls_default;
15446596afd4SAlex Deucher 		count = TURKS_SYSLS_DEFAULT_LENGTH;
15456596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
15466596afd4SAlex Deucher 		p = (const u32 *)&caicos_sysls_default;
15476596afd4SAlex Deucher 		count = CAICOS_SYSLS_DEFAULT_LENGTH;
15486596afd4SAlex Deucher 	} else
15496596afd4SAlex Deucher 		return;
15506596afd4SAlex Deucher 
15516596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15526596afd4SAlex Deucher }
15536596afd4SAlex Deucher 
btc_ls_clock_gating_enable(struct radeon_device * rdev,bool enable)15546596afd4SAlex Deucher static void btc_ls_clock_gating_enable(struct radeon_device *rdev,
15556596afd4SAlex Deucher 				       bool enable)
15566596afd4SAlex Deucher {
15576596afd4SAlex Deucher 	u32 count;
15586596afd4SAlex Deucher 	const u32 *p = NULL;
15596596afd4SAlex Deucher 
15606596afd4SAlex Deucher 	if (enable) {
15616596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15626596afd4SAlex Deucher 			p = (const u32 *)&barts_sysls_enable;
15636596afd4SAlex Deucher 			count = BARTS_SYSLS_ENABLE_LENGTH;
15646596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15656596afd4SAlex Deucher 			p = (const u32 *)&turks_sysls_enable;
15666596afd4SAlex Deucher 			count = TURKS_SYSLS_ENABLE_LENGTH;
15676596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15686596afd4SAlex Deucher 			p = (const u32 *)&caicos_sysls_enable;
15696596afd4SAlex Deucher 			count = CAICOS_SYSLS_ENABLE_LENGTH;
15706596afd4SAlex Deucher 		} else
15716596afd4SAlex Deucher 			return;
15726596afd4SAlex Deucher 	} else {
15736596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15746596afd4SAlex Deucher 			p = (const u32 *)&barts_sysls_disable;
15756596afd4SAlex Deucher 			count = BARTS_SYSLS_DISABLE_LENGTH;
15766596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15776596afd4SAlex Deucher 			p = (const u32 *)&turks_sysls_disable;
15786596afd4SAlex Deucher 			count = TURKS_SYSLS_DISABLE_LENGTH;
15796596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15806596afd4SAlex Deucher 			p = (const u32 *)&caicos_sysls_disable;
15816596afd4SAlex Deucher 			count = CAICOS_SYSLS_DISABLE_LENGTH;
15826596afd4SAlex Deucher 		} else
15836596afd4SAlex Deucher 			return;
15846596afd4SAlex Deucher 	}
15856596afd4SAlex Deucher 
15866596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15876596afd4SAlex Deucher }
15886596afd4SAlex Deucher 
btc_dpm_enabled(struct radeon_device * rdev)158969e0b57aSAlex Deucher bool btc_dpm_enabled(struct radeon_device *rdev)
15906596afd4SAlex Deucher {
15916596afd4SAlex Deucher 	if (rv770_is_smc_running(rdev))
15926596afd4SAlex Deucher 		return true;
15936596afd4SAlex Deucher 	else
15946596afd4SAlex Deucher 		return false;
15956596afd4SAlex Deucher }
15966596afd4SAlex Deucher 
btc_init_smc_table(struct radeon_device * rdev,struct radeon_ps * radeon_boot_state)15974cb3a02fSAlex Deucher static int btc_init_smc_table(struct radeon_device *rdev,
15984cb3a02fSAlex Deucher 			      struct radeon_ps *radeon_boot_state)
15996596afd4SAlex Deucher {
16006596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
16016596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
16026596afd4SAlex Deucher 	RV770_SMC_STATETABLE *table = &pi->smc_statetable;
16036596afd4SAlex Deucher 	int ret;
16046596afd4SAlex Deucher 
16056596afd4SAlex Deucher 	memset(table, 0, sizeof(RV770_SMC_STATETABLE));
16066596afd4SAlex Deucher 
16076596afd4SAlex Deucher 	cypress_populate_smc_voltage_tables(rdev, table);
16086596afd4SAlex Deucher 
16096596afd4SAlex Deucher 	switch (rdev->pm.int_thermal_type) {
16106596afd4SAlex Deucher 	case THERMAL_TYPE_EVERGREEN:
16116596afd4SAlex Deucher 	case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
16126596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
16136596afd4SAlex Deucher 		break;
16146596afd4SAlex Deucher 	case THERMAL_TYPE_NONE:
16156596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
16166596afd4SAlex Deucher 		break;
16176596afd4SAlex Deucher 	default:
16186596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
16196596afd4SAlex Deucher 		break;
16206596afd4SAlex Deucher 	}
16216596afd4SAlex Deucher 
16226596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
16236596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
16246596afd4SAlex Deucher 
16256596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
16266596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT;
16276596afd4SAlex Deucher 
16286596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
16296596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
16306596afd4SAlex Deucher 
16316596afd4SAlex Deucher 	if (pi->mem_gddr5)
16326596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
16336596afd4SAlex Deucher 
16346596afd4SAlex Deucher 	ret = cypress_populate_smc_initial_state(rdev, radeon_boot_state, table);
16356596afd4SAlex Deucher 	if (ret)
16366596afd4SAlex Deucher 		return ret;
16376596afd4SAlex Deucher 
16386596afd4SAlex Deucher 	if (eg_pi->sclk_deep_sleep)
16396596afd4SAlex Deucher 		WREG32_P(SCLK_PSKIP_CNTL, PSKIP_ON_ALLOW_STOP_HI(32),
16406596afd4SAlex Deucher 			 ~PSKIP_ON_ALLOW_STOP_HI_MASK);
16416596afd4SAlex Deucher 
16426596afd4SAlex Deucher 	ret = btc_populate_smc_acpi_state(rdev, table);
16436596afd4SAlex Deucher 	if (ret)
16446596afd4SAlex Deucher 		return ret;
16456596afd4SAlex Deucher 
16466596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
16476596afd4SAlex Deucher 		ret = btc_populate_ulv_state(rdev, table);
16486596afd4SAlex Deucher 		if (ret)
16496596afd4SAlex Deucher 			eg_pi->ulv.supported = false;
16506596afd4SAlex Deucher 	}
16516596afd4SAlex Deucher 
16526596afd4SAlex Deucher 	table->driverState = table->initialState;
16536596afd4SAlex Deucher 
16546596afd4SAlex Deucher 	return rv770_copy_bytes_to_smc(rdev,
16556596afd4SAlex Deucher 				       pi->state_table_start,
16566596afd4SAlex Deucher 				       (u8 *)table,
16576596afd4SAlex Deucher 				       sizeof(RV770_SMC_STATETABLE),
16586596afd4SAlex Deucher 				       pi->sram_end);
16596596afd4SAlex Deucher }
16606596afd4SAlex Deucher 
btc_set_at_for_uvd(struct radeon_device * rdev,struct radeon_ps * radeon_new_state)16614cb3a02fSAlex Deucher static void btc_set_at_for_uvd(struct radeon_device *rdev,
16624cb3a02fSAlex Deucher 			       struct radeon_ps *radeon_new_state)
1663f85392bcSAlex Deucher {
1664f85392bcSAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1665f85392bcSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1666f85392bcSAlex Deucher 	int idx = 0;
1667f85392bcSAlex Deucher 
1668f85392bcSAlex Deucher 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2))
1669f85392bcSAlex Deucher 		idx = 1;
1670f85392bcSAlex Deucher 
1671f85392bcSAlex Deucher 	if ((idx == 1) && !eg_pi->smu_uvd_hs) {
1672f85392bcSAlex Deucher 		pi->rlp = 10;
1673f85392bcSAlex Deucher 		pi->rmp = 100;
1674f85392bcSAlex Deucher 		pi->lhp = 100;
1675f85392bcSAlex Deucher 		pi->lmp = 10;
1676f85392bcSAlex Deucher 	} else {
1677f85392bcSAlex Deucher 		pi->rlp = eg_pi->ats[idx].rlp;
1678f85392bcSAlex Deucher 		pi->rmp = eg_pi->ats[idx].rmp;
1679f85392bcSAlex Deucher 		pi->lhp = eg_pi->ats[idx].lhp;
1680f85392bcSAlex Deucher 		pi->lmp = eg_pi->ats[idx].lmp;
1681f85392bcSAlex Deucher 	}
1682f85392bcSAlex Deucher 
1683f85392bcSAlex Deucher }
1684f85392bcSAlex Deucher 
btc_notify_uvd_to_smc(struct radeon_device * rdev,struct radeon_ps * radeon_new_state)16854cb3a02fSAlex Deucher void btc_notify_uvd_to_smc(struct radeon_device *rdev,
16864cb3a02fSAlex Deucher 			   struct radeon_ps *radeon_new_state)
1687f85392bcSAlex Deucher {
1688f85392bcSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1689f85392bcSAlex Deucher 
1690f85392bcSAlex Deucher 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2)) {
1691f85392bcSAlex Deucher 		rv770_write_smc_soft_register(rdev,
1692f85392bcSAlex Deucher 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 1);
1693f85392bcSAlex Deucher 		eg_pi->uvd_enabled = true;
1694f85392bcSAlex Deucher 	} else {
1695f85392bcSAlex Deucher 		rv770_write_smc_soft_register(rdev,
1696f85392bcSAlex Deucher 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 0);
1697f85392bcSAlex Deucher 		eg_pi->uvd_enabled = false;
1698f85392bcSAlex Deucher 	}
1699f85392bcSAlex Deucher }
1700f85392bcSAlex Deucher 
btc_reset_to_default(struct radeon_device * rdev)170169e0b57aSAlex Deucher int btc_reset_to_default(struct radeon_device *rdev)
17026596afd4SAlex Deucher {
17036596afd4SAlex Deucher 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) != PPSMC_Result_OK)
17046596afd4SAlex Deucher 		return -EINVAL;
17056596afd4SAlex Deucher 
17066596afd4SAlex Deucher 	return 0;
17076596afd4SAlex Deucher }
17086596afd4SAlex Deucher 
btc_stop_smc(struct radeon_device * rdev)17096596afd4SAlex Deucher static void btc_stop_smc(struct radeon_device *rdev)
17106596afd4SAlex Deucher {
17116596afd4SAlex Deucher 	int i;
17126596afd4SAlex Deucher 
17136596afd4SAlex Deucher 	for (i = 0; i < rdev->usec_timeout; i++) {
17146596afd4SAlex Deucher 		if (((RREG32(LB_SYNC_RESET_SEL) & LB_SYNC_RESET_SEL_MASK) >> LB_SYNC_RESET_SEL_SHIFT) != 1)
17156596afd4SAlex Deucher 			break;
17166596afd4SAlex Deucher 		udelay(1);
17176596afd4SAlex Deucher 	}
17186596afd4SAlex Deucher 	udelay(100);
17196596afd4SAlex Deucher 
17206596afd4SAlex Deucher 	r7xx_stop_smc(rdev);
17216596afd4SAlex Deucher }
17226596afd4SAlex Deucher 
btc_read_arb_registers(struct radeon_device * rdev)172369e0b57aSAlex Deucher void btc_read_arb_registers(struct radeon_device *rdev)
17246596afd4SAlex Deucher {
17256596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17266596afd4SAlex Deucher 	struct evergreen_arb_registers *arb_registers =
17276596afd4SAlex Deucher 		&eg_pi->bootup_arb_registers;
17286596afd4SAlex Deucher 
17296596afd4SAlex Deucher 	arb_registers->mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
17306596afd4SAlex Deucher 	arb_registers->mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
17316596afd4SAlex Deucher 	arb_registers->mc_arb_rfsh_rate = RREG32(MC_ARB_RFSH_RATE);
17326596afd4SAlex Deucher 	arb_registers->mc_arb_burst_time = RREG32(MC_ARB_BURST_TIME);
17336596afd4SAlex Deucher }
17346596afd4SAlex Deucher 
17356596afd4SAlex Deucher 
btc_set_arb0_registers(struct radeon_device * rdev,struct evergreen_arb_registers * arb_registers)17366596afd4SAlex Deucher static void btc_set_arb0_registers(struct radeon_device *rdev,
17376596afd4SAlex Deucher 				   struct evergreen_arb_registers *arb_registers)
17386596afd4SAlex Deucher {
17396596afd4SAlex Deucher 	u32 val;
17406596afd4SAlex Deucher 
17416596afd4SAlex Deucher 	WREG32(MC_ARB_DRAM_TIMING,  arb_registers->mc_arb_dram_timing);
17426596afd4SAlex Deucher 	WREG32(MC_ARB_DRAM_TIMING2, arb_registers->mc_arb_dram_timing2);
17436596afd4SAlex Deucher 
17446596afd4SAlex Deucher 	val = (arb_registers->mc_arb_rfsh_rate & POWERMODE0_MASK) >>
17456596afd4SAlex Deucher 		POWERMODE0_SHIFT;
17466596afd4SAlex Deucher 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
17476596afd4SAlex Deucher 
17486596afd4SAlex Deucher 	val = (arb_registers->mc_arb_burst_time & STATE0_MASK) >>
17496596afd4SAlex Deucher 		STATE0_SHIFT;
17506596afd4SAlex Deucher 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
17516596afd4SAlex Deucher }
17526596afd4SAlex Deucher 
btc_set_boot_state_timing(struct radeon_device * rdev)17536596afd4SAlex Deucher static void btc_set_boot_state_timing(struct radeon_device *rdev)
17546596afd4SAlex Deucher {
17556596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17566596afd4SAlex Deucher 
17576596afd4SAlex Deucher 	if (eg_pi->ulv.supported)
17586596afd4SAlex Deucher 		btc_set_arb0_registers(rdev, &eg_pi->bootup_arb_registers);
17596596afd4SAlex Deucher }
17606596afd4SAlex Deucher 
btc_is_state_ulv_compatible(struct radeon_device * rdev,struct radeon_ps * radeon_state)17616596afd4SAlex Deucher static bool btc_is_state_ulv_compatible(struct radeon_device *rdev,
17626596afd4SAlex Deucher 					struct radeon_ps *radeon_state)
17636596afd4SAlex Deucher {
17646596afd4SAlex Deucher 	struct rv7xx_ps *state = rv770_get_ps(radeon_state);
17656596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17666596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
17676596afd4SAlex Deucher 
17686596afd4SAlex Deucher 	if (state->low.mclk != ulv_pl->mclk)
17696596afd4SAlex Deucher 		return false;
17706596afd4SAlex Deucher 
17716596afd4SAlex Deucher 	if (state->low.vddci != ulv_pl->vddci)
17726596afd4SAlex Deucher 		return false;
17736596afd4SAlex Deucher 
17746596afd4SAlex Deucher 	/* XXX check minclocks, etc. */
17756596afd4SAlex Deucher 
17766596afd4SAlex Deucher 	return true;
17776596afd4SAlex Deucher }
17786596afd4SAlex Deucher 
17796596afd4SAlex Deucher 
btc_set_ulv_dram_timing(struct radeon_device * rdev)17806596afd4SAlex Deucher static int btc_set_ulv_dram_timing(struct radeon_device *rdev)
17816596afd4SAlex Deucher {
17826596afd4SAlex Deucher 	u32 val;
17836596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17846596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
17856596afd4SAlex Deucher 
17866596afd4SAlex Deucher 	radeon_atom_set_engine_dram_timings(rdev,
17876596afd4SAlex Deucher 					    ulv_pl->sclk,
17886596afd4SAlex Deucher 					    ulv_pl->mclk);
17896596afd4SAlex Deucher 
17906596afd4SAlex Deucher 	val = rv770_calculate_memory_refresh_rate(rdev, ulv_pl->sclk);
17916596afd4SAlex Deucher 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
17926596afd4SAlex Deucher 
17936596afd4SAlex Deucher 	val = cypress_calculate_burst_time(rdev, ulv_pl->sclk, ulv_pl->mclk);
17946596afd4SAlex Deucher 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
17956596afd4SAlex Deucher 
17966596afd4SAlex Deucher 	return 0;
17976596afd4SAlex Deucher }
17986596afd4SAlex Deucher 
btc_enable_ulv(struct radeon_device * rdev)17996596afd4SAlex Deucher static int btc_enable_ulv(struct radeon_device *rdev)
18006596afd4SAlex Deucher {
18016596afd4SAlex Deucher 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) != PPSMC_Result_OK)
18026596afd4SAlex Deucher 		return -EINVAL;
18036596afd4SAlex Deucher 
18046596afd4SAlex Deucher 	return 0;
18056596afd4SAlex Deucher }
18066596afd4SAlex Deucher 
btc_set_power_state_conditionally_enable_ulv(struct radeon_device * rdev,struct radeon_ps * radeon_new_state)18074cb3a02fSAlex Deucher static int btc_set_power_state_conditionally_enable_ulv(struct radeon_device *rdev,
18084cb3a02fSAlex Deucher 							struct radeon_ps *radeon_new_state)
18096596afd4SAlex Deucher {
18106596afd4SAlex Deucher 	int ret = 0;
18116596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
18126596afd4SAlex Deucher 
18136596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
18146596afd4SAlex Deucher 		if (btc_is_state_ulv_compatible(rdev, radeon_new_state)) {
18156596afd4SAlex Deucher 			// Set ARB[0] to reflect the DRAM timing needed for ULV.
18166596afd4SAlex Deucher 			ret = btc_set_ulv_dram_timing(rdev);
18176596afd4SAlex Deucher 			if (ret == 0)
18186596afd4SAlex Deucher 				ret = btc_enable_ulv(rdev);
18196596afd4SAlex Deucher 		}
18206596afd4SAlex Deucher 	}
18216596afd4SAlex Deucher 
18226596afd4SAlex Deucher 	return ret;
18236596afd4SAlex Deucher }
18246596afd4SAlex Deucher 
btc_check_s0_mc_reg_index(u16 in_reg,u16 * out_reg)18256596afd4SAlex Deucher static bool btc_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
18266596afd4SAlex Deucher {
18276596afd4SAlex Deucher 	bool result = true;
18286596afd4SAlex Deucher 
18296596afd4SAlex Deucher 	switch (in_reg) {
18306596afd4SAlex Deucher 	case MC_SEQ_RAS_TIMING >> 2:
18316596afd4SAlex Deucher 		*out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
18326596afd4SAlex Deucher 		break;
18336596afd4SAlex Deucher 	case MC_SEQ_CAS_TIMING >> 2:
18346596afd4SAlex Deucher 		*out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
18356596afd4SAlex Deucher 		break;
18366596afd4SAlex Deucher 	case MC_SEQ_MISC_TIMING >> 2:
18376596afd4SAlex Deucher 		*out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
18386596afd4SAlex Deucher 		break;
18396596afd4SAlex Deucher 	case MC_SEQ_MISC_TIMING2 >> 2:
18406596afd4SAlex Deucher 		*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
18416596afd4SAlex Deucher 		break;
18426596afd4SAlex Deucher 	case MC_SEQ_RD_CTL_D0 >> 2:
18436596afd4SAlex Deucher 		*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
18446596afd4SAlex Deucher 		break;
18456596afd4SAlex Deucher 	case MC_SEQ_RD_CTL_D1 >> 2:
18466596afd4SAlex Deucher 		*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
18476596afd4SAlex Deucher 		break;
18486596afd4SAlex Deucher 	case MC_SEQ_WR_CTL_D0 >> 2:
18496596afd4SAlex Deucher 		*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
18506596afd4SAlex Deucher 		break;
18516596afd4SAlex Deucher 	case MC_SEQ_WR_CTL_D1 >> 2:
18526596afd4SAlex Deucher 		*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
18536596afd4SAlex Deucher 		break;
18546596afd4SAlex Deucher 	case MC_PMG_CMD_EMRS >> 2:
18556596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
18566596afd4SAlex Deucher 		break;
18576596afd4SAlex Deucher 	case MC_PMG_CMD_MRS >> 2:
18586596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
18596596afd4SAlex Deucher 		break;
18606596afd4SAlex Deucher 	case MC_PMG_CMD_MRS1 >> 2:
18616596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
18626596afd4SAlex Deucher 		break;
18636596afd4SAlex Deucher 	default:
18646596afd4SAlex Deucher 		result = false;
18656596afd4SAlex Deucher 		break;
18666596afd4SAlex Deucher 	}
18676596afd4SAlex Deucher 
18686596afd4SAlex Deucher 	return result;
18696596afd4SAlex Deucher }
18706596afd4SAlex Deucher 
btc_set_valid_flag(struct evergreen_mc_reg_table * table)18716596afd4SAlex Deucher static void btc_set_valid_flag(struct evergreen_mc_reg_table *table)
18726596afd4SAlex Deucher {
18736596afd4SAlex Deucher 	u8 i, j;
18746596afd4SAlex Deucher 
18756596afd4SAlex Deucher 	for (i = 0; i < table->last; i++) {
18766596afd4SAlex Deucher 		for (j = 1; j < table->num_entries; j++) {
18776596afd4SAlex Deucher 			if (table->mc_reg_table_entry[j-1].mc_data[i] !=
18786596afd4SAlex Deucher 			    table->mc_reg_table_entry[j].mc_data[i]) {
18796596afd4SAlex Deucher 				table->valid_flag |= (1 << i);
18806596afd4SAlex Deucher 				break;
18816596afd4SAlex Deucher 			}
18826596afd4SAlex Deucher 		}
18836596afd4SAlex Deucher 	}
18846596afd4SAlex Deucher }
18856596afd4SAlex Deucher 
btc_set_mc_special_registers(struct radeon_device * rdev,struct evergreen_mc_reg_table * table)18866596afd4SAlex Deucher static int btc_set_mc_special_registers(struct radeon_device *rdev,
18876596afd4SAlex Deucher 					struct evergreen_mc_reg_table *table)
18886596afd4SAlex Deucher {
18896596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
18906596afd4SAlex Deucher 	u8 i, j, k;
18916596afd4SAlex Deucher 	u32 tmp;
18926596afd4SAlex Deucher 
18936596afd4SAlex Deucher 	for (i = 0, j = table->last; i < table->last; i++) {
18946596afd4SAlex Deucher 		switch (table->mc_reg_address[i].s1) {
18956596afd4SAlex Deucher 		case MC_SEQ_MISC1 >> 2:
18966596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_EMRS);
18976596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
18986596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
18996596afd4SAlex Deucher 			for (k = 0; k < table->num_entries; k++) {
19006596afd4SAlex Deucher 				table->mc_reg_table_entry[k].mc_data[j] =
19016596afd4SAlex Deucher 					((tmp & 0xffff0000)) |
19026596afd4SAlex Deucher 					((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
19036596afd4SAlex Deucher 			}
19046596afd4SAlex Deucher 			j++;
19056596afd4SAlex Deucher 
190696d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19076596afd4SAlex Deucher 				return -EINVAL;
19086596afd4SAlex Deucher 
19096596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_MRS);
19106596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
19116596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
19126596afd4SAlex Deucher 			for (k = 0; k < table->num_entries; k++) {
19136596afd4SAlex Deucher 				table->mc_reg_table_entry[k].mc_data[j] =
19146596afd4SAlex Deucher 					(tmp & 0xffff0000) |
19156596afd4SAlex Deucher 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
19166596afd4SAlex Deucher 				if (!pi->mem_gddr5)
19176596afd4SAlex Deucher 					table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
19186596afd4SAlex Deucher 			}
19196596afd4SAlex Deucher 			j++;
19206596afd4SAlex Deucher 
192196d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19226596afd4SAlex Deucher 				return -EINVAL;
19236596afd4SAlex Deucher 			break;
19246596afd4SAlex Deucher 		case MC_SEQ_RESERVE_M >> 2:
19256596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_MRS1);
19266596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
19276596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
19286596afd4SAlex Deucher 			for (k = 0; k < table->num_entries; k++) {
19296596afd4SAlex Deucher 				table->mc_reg_table_entry[k].mc_data[j] =
19306596afd4SAlex Deucher 					(tmp & 0xffff0000) |
19316596afd4SAlex Deucher 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
19326596afd4SAlex Deucher 			}
19336596afd4SAlex Deucher 			j++;
19346596afd4SAlex Deucher 
193596d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19366596afd4SAlex Deucher 				return -EINVAL;
19376596afd4SAlex Deucher 			break;
19386596afd4SAlex Deucher 		default:
19396596afd4SAlex Deucher 			break;
19406596afd4SAlex Deucher 		}
19416596afd4SAlex Deucher 	}
19426596afd4SAlex Deucher 
19436596afd4SAlex Deucher 	table->last = j;
19446596afd4SAlex Deucher 
19456596afd4SAlex Deucher 	return 0;
19466596afd4SAlex Deucher }
19476596afd4SAlex Deucher 
btc_set_s0_mc_reg_index(struct evergreen_mc_reg_table * table)19486596afd4SAlex Deucher static void btc_set_s0_mc_reg_index(struct evergreen_mc_reg_table *table)
19496596afd4SAlex Deucher {
19506596afd4SAlex Deucher 	u32 i;
19516596afd4SAlex Deucher 	u16 address;
19526596afd4SAlex Deucher 
19536596afd4SAlex Deucher 	for (i = 0; i < table->last; i++) {
19546596afd4SAlex Deucher 		table->mc_reg_address[i].s0 =
19556596afd4SAlex Deucher 			btc_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
19566596afd4SAlex Deucher 			address : table->mc_reg_address[i].s1;
19576596afd4SAlex Deucher 	}
19586596afd4SAlex Deucher }
19596596afd4SAlex Deucher 
btc_copy_vbios_mc_reg_table(struct atom_mc_reg_table * table,struct evergreen_mc_reg_table * eg_table)19606596afd4SAlex Deucher static int btc_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table,
19616596afd4SAlex Deucher 				       struct evergreen_mc_reg_table *eg_table)
19626596afd4SAlex Deucher {
19636596afd4SAlex Deucher 	u8 i, j;
19646596afd4SAlex Deucher 
19656596afd4SAlex Deucher 	if (table->last > SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19666596afd4SAlex Deucher 		return -EINVAL;
19676596afd4SAlex Deucher 
19686596afd4SAlex Deucher 	if (table->num_entries > MAX_AC_TIMING_ENTRIES)
19696596afd4SAlex Deucher 		return -EINVAL;
19706596afd4SAlex Deucher 
19716596afd4SAlex Deucher 	for (i = 0; i < table->last; i++)
19726596afd4SAlex Deucher 		eg_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
19736596afd4SAlex Deucher 	eg_table->last = table->last;
19746596afd4SAlex Deucher 
19756596afd4SAlex Deucher 	for (i = 0; i < table->num_entries; i++) {
19766596afd4SAlex Deucher 		eg_table->mc_reg_table_entry[i].mclk_max =
19776596afd4SAlex Deucher 			table->mc_reg_table_entry[i].mclk_max;
19786596afd4SAlex Deucher 		for (j = 0; j < table->last; j++)
19796596afd4SAlex Deucher 			eg_table->mc_reg_table_entry[i].mc_data[j] =
19806596afd4SAlex Deucher 				table->mc_reg_table_entry[i].mc_data[j];
19816596afd4SAlex Deucher 	}
19826596afd4SAlex Deucher 	eg_table->num_entries = table->num_entries;
19836596afd4SAlex Deucher 
19846596afd4SAlex Deucher 	return 0;
19856596afd4SAlex Deucher }
19866596afd4SAlex Deucher 
btc_initialize_mc_reg_table(struct radeon_device * rdev)19876596afd4SAlex Deucher static int btc_initialize_mc_reg_table(struct radeon_device *rdev)
19886596afd4SAlex Deucher {
19896596afd4SAlex Deucher 	int ret;
19906596afd4SAlex Deucher 	struct atom_mc_reg_table *table;
19916596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
19926596afd4SAlex Deucher 	struct evergreen_mc_reg_table *eg_table = &eg_pi->mc_reg_table;
19936596afd4SAlex Deucher 	u8 module_index = rv770_get_memory_module_index(rdev);
19946596afd4SAlex Deucher 
19956596afd4SAlex Deucher 	table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
19966596afd4SAlex Deucher 	if (!table)
19976596afd4SAlex Deucher 		return -ENOMEM;
19986596afd4SAlex Deucher 
19996596afd4SAlex Deucher 	/* Program additional LP registers that are no longer programmed by VBIOS */
20006596afd4SAlex Deucher 	WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
20016596afd4SAlex Deucher 	WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
20026596afd4SAlex Deucher 	WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
20036596afd4SAlex Deucher 	WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
20046596afd4SAlex Deucher 	WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
20056596afd4SAlex Deucher 	WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
20066596afd4SAlex Deucher 	WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
20076596afd4SAlex Deucher 	WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
20086596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
20096596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
20106596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
20116596afd4SAlex Deucher 
20126596afd4SAlex Deucher 	ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
20136596afd4SAlex Deucher 
20146596afd4SAlex Deucher 	if (ret)
20156596afd4SAlex Deucher 		goto init_mc_done;
20166596afd4SAlex Deucher 
20176596afd4SAlex Deucher 	ret = btc_copy_vbios_mc_reg_table(table, eg_table);
20186596afd4SAlex Deucher 
20196596afd4SAlex Deucher 	if (ret)
20206596afd4SAlex Deucher 		goto init_mc_done;
20216596afd4SAlex Deucher 
20226596afd4SAlex Deucher 	btc_set_s0_mc_reg_index(eg_table);
20236596afd4SAlex Deucher 	ret = btc_set_mc_special_registers(rdev, eg_table);
20246596afd4SAlex Deucher 
20256596afd4SAlex Deucher 	if (ret)
20266596afd4SAlex Deucher 		goto init_mc_done;
20276596afd4SAlex Deucher 
20286596afd4SAlex Deucher 	btc_set_valid_flag(eg_table);
20296596afd4SAlex Deucher 
20306596afd4SAlex Deucher init_mc_done:
20316596afd4SAlex Deucher 	kfree(table);
20326596afd4SAlex Deucher 
20336596afd4SAlex Deucher 	return ret;
20346596afd4SAlex Deucher }
20356596afd4SAlex Deucher 
btc_init_stutter_mode(struct radeon_device * rdev)20366596afd4SAlex Deucher static void btc_init_stutter_mode(struct radeon_device *rdev)
20376596afd4SAlex Deucher {
20386596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
20396596afd4SAlex Deucher 	u32 tmp;
20406596afd4SAlex Deucher 
20416596afd4SAlex Deucher 	if (pi->mclk_stutter_mode_threshold) {
20426596afd4SAlex Deucher 		if (pi->mem_gddr5) {
20436596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_AUTO_CFG);
20446596afd4SAlex Deucher 			if ((0x200 & tmp) == 0) {
20456596afd4SAlex Deucher 				tmp = (tmp & 0xfffffc0b) | 0x204;
20466596afd4SAlex Deucher 				WREG32(MC_PMG_AUTO_CFG, tmp);
20476596afd4SAlex Deucher 			}
20486596afd4SAlex Deucher 		}
20496596afd4SAlex Deucher 	}
20506596afd4SAlex Deucher }
20516596afd4SAlex Deucher 
btc_dpm_vblank_too_short(struct radeon_device * rdev)2052a84301c6SAlex Deucher bool btc_dpm_vblank_too_short(struct radeon_device *rdev)
2053a84301c6SAlex Deucher {
2054a84301c6SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2055a84301c6SAlex Deucher 	u32 vblank_time = r600_dpm_get_vblank_time(rdev);
2056a84301c6SAlex Deucher 	u32 switch_limit = pi->mem_gddr5 ? 450 : 100;
2057a84301c6SAlex Deucher 
2058a84301c6SAlex Deucher 	if (vblank_time < switch_limit)
2059a84301c6SAlex Deucher 		return true;
2060a84301c6SAlex Deucher 	else
2061a84301c6SAlex Deucher 		return false;
2062a84301c6SAlex Deucher 
2063a84301c6SAlex Deucher }
2064a84301c6SAlex Deucher 
btc_apply_state_adjust_rules(struct radeon_device * rdev,struct radeon_ps * rps)20654cb3a02fSAlex Deucher static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
20664cb3a02fSAlex Deucher 					 struct radeon_ps *rps)
2067d22b7e40SAlex Deucher {
2068d22b7e40SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
2069d22b7e40SAlex Deucher 	struct radeon_clock_and_voltage_limits *max_limits;
2070d22b7e40SAlex Deucher 	bool disable_mclk_switching;
2071d22b7e40SAlex Deucher 	u32 mclk, sclk;
2072d22b7e40SAlex Deucher 	u16 vddc, vddci;
2073d22b7e40SAlex Deucher 
2074a84301c6SAlex Deucher 	if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
2075a84301c6SAlex Deucher 	    btc_dpm_vblank_too_short(rdev))
2076d22b7e40SAlex Deucher 		disable_mclk_switching = true;
2077d22b7e40SAlex Deucher 	else
2078d22b7e40SAlex Deucher 		disable_mclk_switching = false;
2079d22b7e40SAlex Deucher 
2080d22b7e40SAlex Deucher 	if (rdev->pm.dpm.ac_power)
2081d22b7e40SAlex Deucher 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
2082d22b7e40SAlex Deucher 	else
2083d22b7e40SAlex Deucher 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
2084d22b7e40SAlex Deucher 
2085d22b7e40SAlex Deucher 	if (rdev->pm.dpm.ac_power == false) {
2086d22b7e40SAlex Deucher 		if (ps->high.mclk > max_limits->mclk)
2087d22b7e40SAlex Deucher 			ps->high.mclk = max_limits->mclk;
2088d22b7e40SAlex Deucher 		if (ps->high.sclk > max_limits->sclk)
2089d22b7e40SAlex Deucher 			ps->high.sclk = max_limits->sclk;
2090d22b7e40SAlex Deucher 		if (ps->high.vddc > max_limits->vddc)
2091d22b7e40SAlex Deucher 			ps->high.vddc = max_limits->vddc;
2092d22b7e40SAlex Deucher 		if (ps->high.vddci > max_limits->vddci)
2093d22b7e40SAlex Deucher 			ps->high.vddci = max_limits->vddci;
2094d22b7e40SAlex Deucher 
2095d22b7e40SAlex Deucher 		if (ps->medium.mclk > max_limits->mclk)
2096d22b7e40SAlex Deucher 			ps->medium.mclk = max_limits->mclk;
2097d22b7e40SAlex Deucher 		if (ps->medium.sclk > max_limits->sclk)
2098d22b7e40SAlex Deucher 			ps->medium.sclk = max_limits->sclk;
2099d22b7e40SAlex Deucher 		if (ps->medium.vddc > max_limits->vddc)
2100d22b7e40SAlex Deucher 			ps->medium.vddc = max_limits->vddc;
2101d22b7e40SAlex Deucher 		if (ps->medium.vddci > max_limits->vddci)
2102d22b7e40SAlex Deucher 			ps->medium.vddci = max_limits->vddci;
2103d22b7e40SAlex Deucher 
2104d22b7e40SAlex Deucher 		if (ps->low.mclk > max_limits->mclk)
2105d22b7e40SAlex Deucher 			ps->low.mclk = max_limits->mclk;
2106d22b7e40SAlex Deucher 		if (ps->low.sclk > max_limits->sclk)
2107d22b7e40SAlex Deucher 			ps->low.sclk = max_limits->sclk;
2108d22b7e40SAlex Deucher 		if (ps->low.vddc > max_limits->vddc)
2109d22b7e40SAlex Deucher 			ps->low.vddc = max_limits->vddc;
2110d22b7e40SAlex Deucher 		if (ps->low.vddci > max_limits->vddci)
2111d22b7e40SAlex Deucher 			ps->low.vddci = max_limits->vddci;
2112d22b7e40SAlex Deucher 	}
2113d22b7e40SAlex Deucher 
2114d22b7e40SAlex Deucher 	/* XXX validate the min clocks required for display */
2115d22b7e40SAlex Deucher 
2116d22b7e40SAlex Deucher 	if (disable_mclk_switching) {
2117d22b7e40SAlex Deucher 		sclk = ps->low.sclk;
2118d22b7e40SAlex Deucher 		mclk = ps->high.mclk;
2119d22b7e40SAlex Deucher 		vddc = ps->low.vddc;
2120d22b7e40SAlex Deucher 		vddci = ps->high.vddci;
2121d22b7e40SAlex Deucher 	} else {
2122d22b7e40SAlex Deucher 		sclk = ps->low.sclk;
2123d22b7e40SAlex Deucher 		mclk = ps->low.mclk;
2124d22b7e40SAlex Deucher 		vddc = ps->low.vddc;
2125d22b7e40SAlex Deucher 		vddci = ps->low.vddci;
2126d22b7e40SAlex Deucher 	}
2127d22b7e40SAlex Deucher 
2128d22b7e40SAlex Deucher 	/* adjusted low state */
2129d22b7e40SAlex Deucher 	ps->low.sclk = sclk;
2130d22b7e40SAlex Deucher 	ps->low.mclk = mclk;
2131d22b7e40SAlex Deucher 	ps->low.vddc = vddc;
2132d22b7e40SAlex Deucher 	ps->low.vddci = vddci;
2133d22b7e40SAlex Deucher 
2134d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2135d22b7e40SAlex Deucher 				  &ps->low.sclk, &ps->low.mclk);
2136d22b7e40SAlex Deucher 
2137d22b7e40SAlex Deucher 	/* adjusted medium, high states */
2138d22b7e40SAlex Deucher 	if (ps->medium.sclk < ps->low.sclk)
2139d22b7e40SAlex Deucher 		ps->medium.sclk = ps->low.sclk;
2140d22b7e40SAlex Deucher 	if (ps->medium.vddc < ps->low.vddc)
2141d22b7e40SAlex Deucher 		ps->medium.vddc = ps->low.vddc;
2142d22b7e40SAlex Deucher 	if (ps->high.sclk < ps->medium.sclk)
2143d22b7e40SAlex Deucher 		ps->high.sclk = ps->medium.sclk;
2144d22b7e40SAlex Deucher 	if (ps->high.vddc < ps->medium.vddc)
2145d22b7e40SAlex Deucher 		ps->high.vddc = ps->medium.vddc;
2146d22b7e40SAlex Deucher 
2147d22b7e40SAlex Deucher 	if (disable_mclk_switching) {
2148d22b7e40SAlex Deucher 		mclk = ps->low.mclk;
2149d22b7e40SAlex Deucher 		if (mclk < ps->medium.mclk)
2150d22b7e40SAlex Deucher 			mclk = ps->medium.mclk;
2151d22b7e40SAlex Deucher 		if (mclk < ps->high.mclk)
2152d22b7e40SAlex Deucher 			mclk = ps->high.mclk;
2153d22b7e40SAlex Deucher 		ps->low.mclk = mclk;
2154d22b7e40SAlex Deucher 		ps->low.vddci = vddci;
2155d22b7e40SAlex Deucher 		ps->medium.mclk = mclk;
2156d22b7e40SAlex Deucher 		ps->medium.vddci = vddci;
2157d22b7e40SAlex Deucher 		ps->high.mclk = mclk;
2158d22b7e40SAlex Deucher 		ps->high.vddci = vddci;
2159d22b7e40SAlex Deucher 	} else {
2160d22b7e40SAlex Deucher 		if (ps->medium.mclk < ps->low.mclk)
2161d22b7e40SAlex Deucher 			ps->medium.mclk = ps->low.mclk;
2162d22b7e40SAlex Deucher 		if (ps->medium.vddci < ps->low.vddci)
2163d22b7e40SAlex Deucher 			ps->medium.vddci = ps->low.vddci;
2164d22b7e40SAlex Deucher 		if (ps->high.mclk < ps->medium.mclk)
2165d22b7e40SAlex Deucher 			ps->high.mclk = ps->medium.mclk;
2166d22b7e40SAlex Deucher 		if (ps->high.vddci < ps->medium.vddci)
2167d22b7e40SAlex Deucher 			ps->high.vddci = ps->medium.vddci;
2168d22b7e40SAlex Deucher 	}
2169d22b7e40SAlex Deucher 
2170d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2171d22b7e40SAlex Deucher 				  &ps->medium.sclk, &ps->medium.mclk);
2172d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2173d22b7e40SAlex Deucher 				  &ps->high.sclk, &ps->high.mclk);
2174d22b7e40SAlex Deucher 
2175d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->low);
2176d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->medium);
2177d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->high);
2178d22b7e40SAlex Deucher 
2179d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2180d22b7e40SAlex Deucher 					   ps->low.sclk, max_limits->vddc, &ps->low.vddc);
2181d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2182d22b7e40SAlex Deucher 					   ps->low.mclk, max_limits->vddci, &ps->low.vddci);
2183d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2184d22b7e40SAlex Deucher 					   ps->low.mclk, max_limits->vddc, &ps->low.vddc);
21854489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
21864489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->low.vddc);
21874489cd62SAlex Deucher 
2188d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2189d22b7e40SAlex Deucher 					   ps->medium.sclk, max_limits->vddc, &ps->medium.vddc);
2190d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2191d22b7e40SAlex Deucher 					   ps->medium.mclk, max_limits->vddci, &ps->medium.vddci);
2192d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2193d22b7e40SAlex Deucher 					   ps->medium.mclk, max_limits->vddc, &ps->medium.vddc);
21944489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
21954489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->medium.vddc);
21964489cd62SAlex Deucher 
2197d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2198d22b7e40SAlex Deucher 					   ps->high.sclk, max_limits->vddc, &ps->high.vddc);
2199d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2200d22b7e40SAlex Deucher 					   ps->high.mclk, max_limits->vddci, &ps->high.vddci);
2201d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2202d22b7e40SAlex Deucher 					   ps->high.mclk, max_limits->vddc, &ps->high.vddc);
22034489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
22044489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->high.vddc);
2205d22b7e40SAlex Deucher 
2206d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2207d22b7e40SAlex Deucher 				      &ps->low.vddc, &ps->low.vddci);
2208d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2209d22b7e40SAlex Deucher 				      &ps->medium.vddc, &ps->medium.vddci);
2210d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2211d22b7e40SAlex Deucher 				      &ps->high.vddc, &ps->high.vddci);
2212d22b7e40SAlex Deucher 
2213d22b7e40SAlex Deucher 	if ((ps->high.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
2214d22b7e40SAlex Deucher 	    (ps->medium.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
2215d22b7e40SAlex Deucher 	    (ps->low.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc))
2216d22b7e40SAlex Deucher 		ps->dc_compatible = true;
2217d22b7e40SAlex Deucher 	else
2218d22b7e40SAlex Deucher 		ps->dc_compatible = false;
2219d22b7e40SAlex Deucher 
2220d22b7e40SAlex Deucher 	if (ps->low.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2221d22b7e40SAlex Deucher 		ps->low.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2222d22b7e40SAlex Deucher 	if (ps->medium.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2223d22b7e40SAlex Deucher 		ps->medium.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2224d22b7e40SAlex Deucher 	if (ps->high.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2225d22b7e40SAlex Deucher 		ps->high.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2226d22b7e40SAlex Deucher }
2227d22b7e40SAlex Deucher 
btc_update_current_ps(struct radeon_device * rdev,struct radeon_ps * rps)2228e8a9539fSAlex Deucher static void btc_update_current_ps(struct radeon_device *rdev,
2229e8a9539fSAlex Deucher 				  struct radeon_ps *rps)
2230e8a9539fSAlex Deucher {
2231e8a9539fSAlex Deucher 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
2232e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2233e8a9539fSAlex Deucher 
2234e8a9539fSAlex Deucher 	eg_pi->current_rps = *rps;
2235e8a9539fSAlex Deucher 	eg_pi->current_ps = *new_ps;
2236e8a9539fSAlex Deucher 	eg_pi->current_rps.ps_priv = &eg_pi->current_ps;
2237e8a9539fSAlex Deucher }
2238e8a9539fSAlex Deucher 
btc_update_requested_ps(struct radeon_device * rdev,struct radeon_ps * rps)2239e8a9539fSAlex Deucher static void btc_update_requested_ps(struct radeon_device *rdev,
2240e8a9539fSAlex Deucher 				    struct radeon_ps *rps)
2241e8a9539fSAlex Deucher {
2242e8a9539fSAlex Deucher 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
2243e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2244e8a9539fSAlex Deucher 
2245e8a9539fSAlex Deucher 	eg_pi->requested_rps = *rps;
2246e8a9539fSAlex Deucher 	eg_pi->requested_ps = *new_ps;
2247e8a9539fSAlex Deucher 	eg_pi->requested_rps.ps_priv = &eg_pi->requested_ps;
2248e8a9539fSAlex Deucher }
2249e8a9539fSAlex Deucher 
22507ff96f9dSAlex Deucher #if 0
22516596afd4SAlex Deucher void btc_dpm_reset_asic(struct radeon_device *rdev)
22526596afd4SAlex Deucher {
22536596afd4SAlex Deucher 	rv770_restrict_performance_levels_before_switch(rdev);
22546596afd4SAlex Deucher 	btc_disable_ulv(rdev);
22556596afd4SAlex Deucher 	btc_set_boot_state_timing(rdev);
22566596afd4SAlex Deucher 	rv770_set_boot_state(rdev);
22576596afd4SAlex Deucher }
22587ff96f9dSAlex Deucher #endif
22596596afd4SAlex Deucher 
btc_dpm_pre_set_power_state(struct radeon_device * rdev)2260e8a9539fSAlex Deucher int btc_dpm_pre_set_power_state(struct radeon_device *rdev)
2261e8a9539fSAlex Deucher {
2262e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2263e8a9539fSAlex Deucher 	struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
2264e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &requested_ps;
2265e8a9539fSAlex Deucher 
2266e8a9539fSAlex Deucher 	btc_update_requested_ps(rdev, new_ps);
2267e8a9539fSAlex Deucher 
2268e8a9539fSAlex Deucher 	btc_apply_state_adjust_rules(rdev, &eg_pi->requested_rps);
2269e8a9539fSAlex Deucher 
2270e8a9539fSAlex Deucher 	return 0;
2271e8a9539fSAlex Deucher }
2272e8a9539fSAlex Deucher 
btc_dpm_set_power_state(struct radeon_device * rdev)22736596afd4SAlex Deucher int btc_dpm_set_power_state(struct radeon_device *rdev)
22746596afd4SAlex Deucher {
22756596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2276e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
2277e8a9539fSAlex Deucher 	struct radeon_ps *old_ps = &eg_pi->current_rps;
2278aafb3afaSAlex Deucher 	int ret;
2279d22b7e40SAlex Deucher 
2280aafb3afaSAlex Deucher 	ret = btc_disable_ulv(rdev);
22816596afd4SAlex Deucher 	btc_set_boot_state_timing(rdev);
2282aafb3afaSAlex Deucher 	ret = rv770_restrict_performance_levels_before_switch(rdev);
228372dd2c54SAlex Deucher 	if (ret) {
228472dd2c54SAlex Deucher 		DRM_ERROR("rv770_restrict_performance_levels_before_switch failed\n");
2285aafb3afaSAlex Deucher 		return ret;
228672dd2c54SAlex Deucher 	}
22876596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
2288dbc34160SAlex Deucher 		cypress_notify_link_speed_change_before_state_change(rdev, new_ps, old_ps);
22896596afd4SAlex Deucher 
22905d77d776SAlex Deucher 	rv770_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps);
2291aafb3afaSAlex Deucher 	ret = rv770_halt_smc(rdev);
229272dd2c54SAlex Deucher 	if (ret) {
229372dd2c54SAlex Deucher 		DRM_ERROR("rv770_halt_smc failed\n");
2294aafb3afaSAlex Deucher 		return ret;
229572dd2c54SAlex Deucher 	}
22964cb3a02fSAlex Deucher 	btc_set_at_for_uvd(rdev, new_ps);
2297f85392bcSAlex Deucher 	if (eg_pi->smu_uvd_hs)
22984cb3a02fSAlex Deucher 		btc_notify_uvd_to_smc(rdev, new_ps);
2299aafb3afaSAlex Deucher 	ret = cypress_upload_sw_state(rdev, new_ps);
230072dd2c54SAlex Deucher 	if (ret) {
230172dd2c54SAlex Deucher 		DRM_ERROR("cypress_upload_sw_state failed\n");
2302aafb3afaSAlex Deucher 		return ret;
230372dd2c54SAlex Deucher 	}
2304aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2305aafb3afaSAlex Deucher 		ret = cypress_upload_mc_reg_table(rdev, new_ps);
230672dd2c54SAlex Deucher 		if (ret) {
230772dd2c54SAlex Deucher 			DRM_ERROR("cypress_upload_mc_reg_table failed\n");
2308aafb3afaSAlex Deucher 			return ret;
2309aafb3afaSAlex Deucher 		}
231072dd2c54SAlex Deucher 	}
23116596afd4SAlex Deucher 
2312dbc34160SAlex Deucher 	cypress_program_memory_timing_parameters(rdev, new_ps);
23136596afd4SAlex Deucher 
2314aafb3afaSAlex Deucher 	ret = rv770_resume_smc(rdev);
231572dd2c54SAlex Deucher 	if (ret) {
231672dd2c54SAlex Deucher 		DRM_ERROR("rv770_resume_smc failed\n");
2317aafb3afaSAlex Deucher 		return ret;
231872dd2c54SAlex Deucher 	}
2319aafb3afaSAlex Deucher 	ret = rv770_set_sw_state(rdev);
232072dd2c54SAlex Deucher 	if (ret) {
232172dd2c54SAlex Deucher 		DRM_ERROR("rv770_set_sw_state failed\n");
2322aafb3afaSAlex Deucher 		return ret;
232372dd2c54SAlex Deucher 	}
23245d77d776SAlex Deucher 	rv770_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
23256596afd4SAlex Deucher 
23266596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
2327dbc34160SAlex Deucher 		cypress_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
23286596afd4SAlex Deucher 
2329aafb3afaSAlex Deucher 	ret = btc_set_power_state_conditionally_enable_ulv(rdev, new_ps);
233072dd2c54SAlex Deucher 	if (ret) {
233172dd2c54SAlex Deucher 		DRM_ERROR("btc_set_power_state_conditionally_enable_ulv failed\n");
2332aafb3afaSAlex Deucher 		return ret;
233372dd2c54SAlex Deucher 	}
23346596afd4SAlex Deucher 
23356596afd4SAlex Deucher 	return 0;
23366596afd4SAlex Deucher }
23376596afd4SAlex Deucher 
btc_dpm_post_set_power_state(struct radeon_device * rdev)2338e8a9539fSAlex Deucher void btc_dpm_post_set_power_state(struct radeon_device *rdev)
2339e8a9539fSAlex Deucher {
2340e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2341e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
2342e8a9539fSAlex Deucher 
2343e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, new_ps);
2344e8a9539fSAlex Deucher }
2345e8a9539fSAlex Deucher 
btc_dpm_enable(struct radeon_device * rdev)23466596afd4SAlex Deucher int btc_dpm_enable(struct radeon_device *rdev)
23476596afd4SAlex Deucher {
23486596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
23496596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2350dbc34160SAlex Deucher 	struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
2351aafb3afaSAlex Deucher 	int ret;
23526596afd4SAlex Deucher 
23536596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
23546596afd4SAlex Deucher 		btc_cg_clock_gating_default(rdev);
23556596afd4SAlex Deucher 
23566596afd4SAlex Deucher 	if (btc_dpm_enabled(rdev))
23576596afd4SAlex Deucher 		return -EINVAL;
23586596afd4SAlex Deucher 
23596596afd4SAlex Deucher 	if (pi->mg_clock_gating)
23606596afd4SAlex Deucher 		btc_mg_clock_gating_default(rdev);
23616596afd4SAlex Deucher 
23626596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
23636596afd4SAlex Deucher 		btc_ls_clock_gating_default(rdev);
23646596afd4SAlex Deucher 
23656596afd4SAlex Deucher 	if (pi->voltage_control) {
23666596afd4SAlex Deucher 		rv770_enable_voltage_control(rdev, true);
2367aafb3afaSAlex Deucher 		ret = cypress_construct_voltage_tables(rdev);
2368fa4b5471SAlex Deucher 		if (ret) {
2369fa4b5471SAlex Deucher 			DRM_ERROR("cypress_construct_voltage_tables failed\n");
2370aafb3afaSAlex Deucher 			return ret;
23716596afd4SAlex Deucher 		}
2372fa4b5471SAlex Deucher 	}
23736596afd4SAlex Deucher 
2374aafb3afaSAlex Deucher 	if (pi->mvdd_control) {
2375aafb3afaSAlex Deucher 		ret = cypress_get_mvdd_configuration(rdev);
2376fa4b5471SAlex Deucher 		if (ret) {
2377fa4b5471SAlex Deucher 			DRM_ERROR("cypress_get_mvdd_configuration failed\n");
2378aafb3afaSAlex Deucher 			return ret;
2379aafb3afaSAlex Deucher 		}
2380fa4b5471SAlex Deucher 	}
23816596afd4SAlex Deucher 
2382aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2383aafb3afaSAlex Deucher 		ret = btc_initialize_mc_reg_table(rdev);
2384aafb3afaSAlex Deucher 		if (ret)
2385aafb3afaSAlex Deucher 			eg_pi->dynamic_ac_timing = false;
2386aafb3afaSAlex Deucher 	}
23876596afd4SAlex Deucher 
23886596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_BACKBIAS)
23896596afd4SAlex Deucher 		rv770_enable_backbias(rdev, true);
23906596afd4SAlex Deucher 
23916596afd4SAlex Deucher 	if (pi->dynamic_ss)
23926596afd4SAlex Deucher 		cypress_enable_spread_spectrum(rdev, true);
23936596afd4SAlex Deucher 
23946596afd4SAlex Deucher 	if (pi->thermal_protection)
23956596afd4SAlex Deucher 		rv770_enable_thermal_protection(rdev, true);
23966596afd4SAlex Deucher 
23976596afd4SAlex Deucher 	rv770_setup_bsp(rdev);
23986596afd4SAlex Deucher 	rv770_program_git(rdev);
23996596afd4SAlex Deucher 	rv770_program_tp(rdev);
24006596afd4SAlex Deucher 	rv770_program_tpp(rdev);
24016596afd4SAlex Deucher 	rv770_program_sstp(rdev);
24026596afd4SAlex Deucher 	rv770_program_engine_speed_parameters(rdev);
24036596afd4SAlex Deucher 	cypress_enable_display_gap(rdev);
24046596afd4SAlex Deucher 	rv770_program_vc(rdev);
24056596afd4SAlex Deucher 
24066596afd4SAlex Deucher 	if (pi->dynamic_pcie_gen2)
24076596afd4SAlex Deucher 		btc_enable_dynamic_pcie_gen2(rdev, true);
24086596afd4SAlex Deucher 
2409aafb3afaSAlex Deucher 	ret = rv770_upload_firmware(rdev);
2410fa4b5471SAlex Deucher 	if (ret) {
2411fa4b5471SAlex Deucher 		DRM_ERROR("rv770_upload_firmware failed\n");
2412aafb3afaSAlex Deucher 		return ret;
2413fa4b5471SAlex Deucher 	}
2414aafb3afaSAlex Deucher 	ret = cypress_get_table_locations(rdev);
2415fa4b5471SAlex Deucher 	if (ret) {
2416fa4b5471SAlex Deucher 		DRM_ERROR("cypress_get_table_locations failed\n");
2417aafb3afaSAlex Deucher 		return ret;
2418fa4b5471SAlex Deucher 	}
2419aafb3afaSAlex Deucher 	ret = btc_init_smc_table(rdev, boot_ps);
2420aafb3afaSAlex Deucher 	if (ret)
2421aafb3afaSAlex Deucher 		return ret;
24226596afd4SAlex Deucher 
2423aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2424aafb3afaSAlex Deucher 		ret = cypress_populate_mc_reg_table(rdev, boot_ps);
2425fa4b5471SAlex Deucher 		if (ret) {
2426fa4b5471SAlex Deucher 			DRM_ERROR("cypress_populate_mc_reg_table failed\n");
2427aafb3afaSAlex Deucher 			return ret;
2428aafb3afaSAlex Deucher 		}
2429fa4b5471SAlex Deucher 	}
24306596afd4SAlex Deucher 
24316596afd4SAlex Deucher 	cypress_program_response_times(rdev);
24326596afd4SAlex Deucher 	r7xx_start_smc(rdev);
2433aafb3afaSAlex Deucher 	ret = cypress_notify_smc_display_change(rdev, false);
2434fa4b5471SAlex Deucher 	if (ret) {
2435fa4b5471SAlex Deucher 		DRM_ERROR("cypress_notify_smc_display_change failed\n");
2436aafb3afaSAlex Deucher 		return ret;
2437fa4b5471SAlex Deucher 	}
24386596afd4SAlex Deucher 	cypress_enable_sclk_control(rdev, true);
24396596afd4SAlex Deucher 
24406596afd4SAlex Deucher 	if (eg_pi->memory_transition)
24416596afd4SAlex Deucher 		cypress_enable_mclk_control(rdev, true);
24426596afd4SAlex Deucher 
24436596afd4SAlex Deucher 	cypress_start_dpm(rdev);
24446596afd4SAlex Deucher 
24456596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
24466596afd4SAlex Deucher 		btc_cg_clock_gating_enable(rdev, true);
24476596afd4SAlex Deucher 
24486596afd4SAlex Deucher 	if (pi->mg_clock_gating)
24496596afd4SAlex Deucher 		btc_mg_clock_gating_enable(rdev, true);
24506596afd4SAlex Deucher 
24516596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
24526596afd4SAlex Deucher 		btc_ls_clock_gating_enable(rdev, true);
24536596afd4SAlex Deucher 
24546596afd4SAlex Deucher 	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
24556596afd4SAlex Deucher 
24566596afd4SAlex Deucher 	btc_init_stutter_mode(rdev);
24576596afd4SAlex Deucher 
2458e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
2459e8a9539fSAlex Deucher 
24606596afd4SAlex Deucher 	return 0;
24616596afd4SAlex Deucher };
24626596afd4SAlex Deucher 
btc_dpm_disable(struct radeon_device * rdev)24636596afd4SAlex Deucher void btc_dpm_disable(struct radeon_device *rdev)
24646596afd4SAlex Deucher {
24656596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
24666596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
24676596afd4SAlex Deucher 
24686596afd4SAlex Deucher 	if (!btc_dpm_enabled(rdev))
24696596afd4SAlex Deucher 		return;
24706596afd4SAlex Deucher 
24716596afd4SAlex Deucher 	rv770_clear_vc(rdev);
24726596afd4SAlex Deucher 
24736596afd4SAlex Deucher 	if (pi->thermal_protection)
24746596afd4SAlex Deucher 		rv770_enable_thermal_protection(rdev, false);
24756596afd4SAlex Deucher 
24766596afd4SAlex Deucher 	if (pi->dynamic_pcie_gen2)
24776596afd4SAlex Deucher 		btc_enable_dynamic_pcie_gen2(rdev, false);
24786596afd4SAlex Deucher 
24796596afd4SAlex Deucher 	if (rdev->irq.installed &&
24806596afd4SAlex Deucher 	    r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
24816596afd4SAlex Deucher 		rdev->irq.dpm_thermal = false;
24826596afd4SAlex Deucher 		radeon_irq_set(rdev);
24836596afd4SAlex Deucher 	}
24846596afd4SAlex Deucher 
24856596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
24866596afd4SAlex Deucher 		btc_cg_clock_gating_enable(rdev, false);
24876596afd4SAlex Deucher 
24886596afd4SAlex Deucher 	if (pi->mg_clock_gating)
24896596afd4SAlex Deucher 		btc_mg_clock_gating_enable(rdev, false);
24906596afd4SAlex Deucher 
24916596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
24926596afd4SAlex Deucher 		btc_ls_clock_gating_enable(rdev, false);
24936596afd4SAlex Deucher 
24946596afd4SAlex Deucher 	rv770_stop_dpm(rdev);
24956596afd4SAlex Deucher 	btc_reset_to_default(rdev);
24966596afd4SAlex Deucher 	btc_stop_smc(rdev);
24976596afd4SAlex Deucher 	cypress_enable_spread_spectrum(rdev, false);
2498e8a9539fSAlex Deucher 
2499e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
25006596afd4SAlex Deucher }
25016596afd4SAlex Deucher 
btc_dpm_setup_asic(struct radeon_device * rdev)25026596afd4SAlex Deucher void btc_dpm_setup_asic(struct radeon_device *rdev)
25036596afd4SAlex Deucher {
25046596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
25056c7bcceaSAlex Deucher 	int r;
25066596afd4SAlex Deucher 
25076c7bcceaSAlex Deucher 	r = ni_mc_load_microcode(rdev);
25086c7bcceaSAlex Deucher 	if (r)
25096c7bcceaSAlex Deucher 		DRM_ERROR("Failed to load MC firmware!\n");
25106596afd4SAlex Deucher 	rv770_get_memory_type(rdev);
25116596afd4SAlex Deucher 	rv740_read_clock_registers(rdev);
25126596afd4SAlex Deucher 	btc_read_arb_registers(rdev);
25136596afd4SAlex Deucher 	rv770_read_voltage_smio_registers(rdev);
25146596afd4SAlex Deucher 
25156596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
25166596afd4SAlex Deucher 		cypress_advertise_gen2_capability(rdev);
25176596afd4SAlex Deucher 
25186596afd4SAlex Deucher 	rv770_get_pcie_gen2_status(rdev);
25196596afd4SAlex Deucher 	rv770_enable_acpi_pm(rdev);
25206596afd4SAlex Deucher }
25216596afd4SAlex Deucher 
btc_dpm_init(struct radeon_device * rdev)25226596afd4SAlex Deucher int btc_dpm_init(struct radeon_device *rdev)
25236596afd4SAlex Deucher {
25246596afd4SAlex Deucher 	struct rv7xx_power_info *pi;
25256596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi;
25266596afd4SAlex Deucher 	struct atom_clock_dividers dividers;
25276596afd4SAlex Deucher 	int ret;
25286596afd4SAlex Deucher 
25296596afd4SAlex Deucher 	eg_pi = kzalloc(sizeof(struct evergreen_power_info), GFP_KERNEL);
25306596afd4SAlex Deucher 	if (eg_pi == NULL)
25316596afd4SAlex Deucher 		return -ENOMEM;
25326596afd4SAlex Deucher 	rdev->pm.dpm.priv = eg_pi;
25336596afd4SAlex Deucher 	pi = &eg_pi->rv7xx;
25346596afd4SAlex Deucher 
25356596afd4SAlex Deucher 	rv770_get_max_vddc(rdev);
25366596afd4SAlex Deucher 
25376596afd4SAlex Deucher 	eg_pi->ulv.supported = false;
25386596afd4SAlex Deucher 	pi->acpi_vddc = 0;
25396596afd4SAlex Deucher 	eg_pi->acpi_vddci = 0;
25406596afd4SAlex Deucher 	pi->min_vddc_in_table = 0;
25416596afd4SAlex Deucher 	pi->max_vddc_in_table = 0;
25426596afd4SAlex Deucher 
254382f79cc5SAlex Deucher 	ret = r600_get_platform_caps(rdev);
254482f79cc5SAlex Deucher 	if (ret)
254582f79cc5SAlex Deucher 		return ret;
254682f79cc5SAlex Deucher 
25476596afd4SAlex Deucher 	ret = rv7xx_parse_power_table(rdev);
25486596afd4SAlex Deucher 	if (ret)
25496596afd4SAlex Deucher 		return ret;
2550d22b7e40SAlex Deucher 	ret = r600_parse_extended_power_table(rdev);
2551d22b7e40SAlex Deucher 	if (ret)
2552d22b7e40SAlex Deucher 		return ret;
25536596afd4SAlex Deucher 
25544489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
25556396bb22SKees Cook 		kcalloc(4,
25566396bb22SKees Cook 			sizeof(struct radeon_clock_voltage_dependency_entry),
25576396bb22SKees Cook 			GFP_KERNEL);
25584489cd62SAlex Deucher 	if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
25594489cd62SAlex Deucher 		r600_free_extended_power_table(rdev);
25604489cd62SAlex Deucher 		return -ENOMEM;
25614489cd62SAlex Deucher 	}
25624489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
25634489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
25644489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
25654489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
25664489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 800;
25674489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
25684489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 800;
25694489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
25704489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 800;
25714489cd62SAlex Deucher 
25726596afd4SAlex Deucher 	if (rdev->pm.dpm.voltage_response_time == 0)
25736596afd4SAlex Deucher 		rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
25746596afd4SAlex Deucher 	if (rdev->pm.dpm.backbias_response_time == 0)
25756596afd4SAlex Deucher 		rdev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT;
25766596afd4SAlex Deucher 
25776596afd4SAlex Deucher 	ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
25786596afd4SAlex Deucher 					     0, false, &dividers);
25796596afd4SAlex Deucher 	if (ret)
25806596afd4SAlex Deucher 		pi->ref_div = dividers.ref_div + 1;
25816596afd4SAlex Deucher 	else
25826596afd4SAlex Deucher 		pi->ref_div = R600_REFERENCEDIVIDER_DFLT;
25836596afd4SAlex Deucher 
25846596afd4SAlex Deucher 	pi->mclk_strobe_mode_threshold = 40000;
25856596afd4SAlex Deucher 	pi->mclk_edc_enable_threshold = 40000;
25866596afd4SAlex Deucher 	eg_pi->mclk_edc_wr_enable_threshold = 40000;
25876596afd4SAlex Deucher 
2588f85392bcSAlex Deucher 	pi->rlp = RV770_RLP_DFLT;
2589f85392bcSAlex Deucher 	pi->rmp = RV770_RMP_DFLT;
2590f85392bcSAlex Deucher 	pi->lhp = RV770_LHP_DFLT;
2591f85392bcSAlex Deucher 	pi->lmp = RV770_LMP_DFLT;
2592f85392bcSAlex Deucher 
2593f85392bcSAlex Deucher 	eg_pi->ats[0].rlp = RV770_RLP_DFLT;
2594f85392bcSAlex Deucher 	eg_pi->ats[0].rmp = RV770_RMP_DFLT;
2595f85392bcSAlex Deucher 	eg_pi->ats[0].lhp = RV770_LHP_DFLT;
2596f85392bcSAlex Deucher 	eg_pi->ats[0].lmp = RV770_LMP_DFLT;
2597f85392bcSAlex Deucher 
2598f85392bcSAlex Deucher 	eg_pi->ats[1].rlp = BTC_RLP_UVD_DFLT;
2599f85392bcSAlex Deucher 	eg_pi->ats[1].rmp = BTC_RMP_UVD_DFLT;
2600f85392bcSAlex Deucher 	eg_pi->ats[1].lhp = BTC_LHP_UVD_DFLT;
2601f85392bcSAlex Deucher 	eg_pi->ats[1].lmp = BTC_LMP_UVD_DFLT;
2602f85392bcSAlex Deucher 
2603f85392bcSAlex Deucher 	eg_pi->smu_uvd_hs = true;
2604f85392bcSAlex Deucher 
26056596afd4SAlex Deucher 	pi->voltage_control =
260658653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
26076596afd4SAlex Deucher 
26086596afd4SAlex Deucher 	pi->mvdd_control =
260958653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
26106596afd4SAlex Deucher 
26116596afd4SAlex Deucher 	eg_pi->vddci_control =
261258653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
26136596afd4SAlex Deucher 
2614b841ce7bSAlex Deucher 	rv770_get_engine_memory_ss(rdev);
26156596afd4SAlex Deucher 
26166596afd4SAlex Deucher 	pi->asi = RV770_ASI_DFLT;
26176596afd4SAlex Deucher 	pi->pasi = CYPRESS_HASI_DFLT;
26186596afd4SAlex Deucher 	pi->vrc = CYPRESS_VRC_DFLT;
26196596afd4SAlex Deucher 
26206596afd4SAlex Deucher 	pi->power_gating = false;
26216596afd4SAlex Deucher 
26226596afd4SAlex Deucher 	pi->gfx_clock_gating = true;
26236596afd4SAlex Deucher 
26246596afd4SAlex Deucher 	pi->mg_clock_gating = true;
26256596afd4SAlex Deucher 	pi->mgcgtssm = true;
26266596afd4SAlex Deucher 	eg_pi->ls_clock_gating = false;
26276596afd4SAlex Deucher 	eg_pi->sclk_deep_sleep = false;
26286596afd4SAlex Deucher 
26296596afd4SAlex Deucher 	pi->dynamic_pcie_gen2 = true;
26306596afd4SAlex Deucher 
2631fda83724SAlex Deucher 	if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
26326596afd4SAlex Deucher 		pi->thermal_protection = true;
26336596afd4SAlex Deucher 	else
26346596afd4SAlex Deucher 		pi->thermal_protection = false;
26356596afd4SAlex Deucher 
26366596afd4SAlex Deucher 	pi->display_gap = true;
26376596afd4SAlex Deucher 
26386596afd4SAlex Deucher 	if (rdev->flags & RADEON_IS_MOBILITY)
26396596afd4SAlex Deucher 		pi->dcodt = true;
26406596afd4SAlex Deucher 	else
26416596afd4SAlex Deucher 		pi->dcodt = false;
26426596afd4SAlex Deucher 
26436596afd4SAlex Deucher 	pi->ulps = true;
26446596afd4SAlex Deucher 
26456596afd4SAlex Deucher 	eg_pi->dynamic_ac_timing = true;
26466596afd4SAlex Deucher 	eg_pi->abm = true;
26476596afd4SAlex Deucher 	eg_pi->mcls = true;
26486596afd4SAlex Deucher 	eg_pi->light_sleep = true;
26496596afd4SAlex Deucher 	eg_pi->memory_transition = true;
26506596afd4SAlex Deucher #if defined(CONFIG_ACPI)
26516596afd4SAlex Deucher 	eg_pi->pcie_performance_request =
26526596afd4SAlex Deucher 		radeon_acpi_is_pcie_performance_request_supported(rdev);
26536596afd4SAlex Deucher #else
26546596afd4SAlex Deucher 	eg_pi->pcie_performance_request = false;
26556596afd4SAlex Deucher #endif
26566596afd4SAlex Deucher 
26576596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS)
26586596afd4SAlex Deucher 		eg_pi->dll_default_on = true;
26596596afd4SAlex Deucher 	else
26606596afd4SAlex Deucher 		eg_pi->dll_default_on = false;
26616596afd4SAlex Deucher 
26626596afd4SAlex Deucher 	eg_pi->sclk_deep_sleep = false;
26636596afd4SAlex Deucher 	if (ASIC_IS_LOMBOK(rdev))
26646596afd4SAlex Deucher 		pi->mclk_stutter_mode_threshold = 30000;
26656596afd4SAlex Deucher 	else
26666596afd4SAlex Deucher 		pi->mclk_stutter_mode_threshold = 0;
26676596afd4SAlex Deucher 
26686596afd4SAlex Deucher 	pi->sram_end = SMC_RAM_END;
26696596afd4SAlex Deucher 
2670d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
2671d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
2672d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2 = 900;
2673d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_sclk_values.count = ARRAY_SIZE(btc_valid_sclk);
2674d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_sclk_values.values = btc_valid_sclk;
2675d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
2676d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
2677d22b7e40SAlex Deucher 
2678d22b7e40SAlex Deucher 	if (rdev->family == CHIP_TURKS)
2679d22b7e40SAlex Deucher 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
2680d22b7e40SAlex Deucher 	else
2681d22b7e40SAlex Deucher 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000;
2682d22b7e40SAlex Deucher 
26831ff60ddbSAlex Deucher 	/* make sure dc limits are valid */
26841ff60ddbSAlex Deucher 	if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
26851ff60ddbSAlex Deucher 	    (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
26861ff60ddbSAlex Deucher 		rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
26871ff60ddbSAlex Deucher 			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
26881ff60ddbSAlex Deucher 
26896596afd4SAlex Deucher 	return 0;
26906596afd4SAlex Deucher }
26916596afd4SAlex Deucher 
btc_dpm_fini(struct radeon_device * rdev)26926596afd4SAlex Deucher void btc_dpm_fini(struct radeon_device *rdev)
26936596afd4SAlex Deucher {
26946596afd4SAlex Deucher 	int i;
26956596afd4SAlex Deucher 
26966596afd4SAlex Deucher 	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
26976596afd4SAlex Deucher 		kfree(rdev->pm.dpm.ps[i].ps_priv);
26986596afd4SAlex Deucher 	}
26996596afd4SAlex Deucher 	kfree(rdev->pm.dpm.ps);
27006596afd4SAlex Deucher 	kfree(rdev->pm.dpm.priv);
27014489cd62SAlex Deucher 	kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
2702d22b7e40SAlex Deucher 	r600_free_extended_power_table(rdev);
27036596afd4SAlex Deucher }
2704e8a9539fSAlex Deucher 
btc_dpm_debugfs_print_current_performance_level(struct radeon_device * rdev,struct seq_file * m)27059f3f63f2SAlex Deucher void btc_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
27069f3f63f2SAlex Deucher 						     struct seq_file *m)
27079f3f63f2SAlex Deucher {
27089f3f63f2SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
27099f3f63f2SAlex Deucher 	struct radeon_ps *rps = &eg_pi->current_rps;
27109f3f63f2SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
27119f3f63f2SAlex Deucher 	struct rv7xx_pl *pl;
27129f3f63f2SAlex Deucher 	u32 current_index =
27139f3f63f2SAlex Deucher 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
27149f3f63f2SAlex Deucher 		CURRENT_PROFILE_INDEX_SHIFT;
27159f3f63f2SAlex Deucher 
27169f3f63f2SAlex Deucher 	if (current_index > 2) {
27179f3f63f2SAlex Deucher 		seq_printf(m, "invalid dpm profile %d\n", current_index);
27189f3f63f2SAlex Deucher 	} else {
27199f3f63f2SAlex Deucher 		if (current_index == 0)
27209f3f63f2SAlex Deucher 			pl = &ps->low;
27219f3f63f2SAlex Deucher 		else if (current_index == 1)
27229f3f63f2SAlex Deucher 			pl = &ps->medium;
27239f3f63f2SAlex Deucher 		else /* current_index == 2 */
27249f3f63f2SAlex Deucher 			pl = &ps->high;
27259f3f63f2SAlex Deucher 		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
27269f3f63f2SAlex Deucher 		seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u vddci: %u\n",
27279f3f63f2SAlex Deucher 			   current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
27289f3f63f2SAlex Deucher 	}
27299f3f63f2SAlex Deucher }
27309f3f63f2SAlex Deucher 
btc_dpm_get_current_sclk(struct radeon_device * rdev)273199550ee9SAlex Deucher u32 btc_dpm_get_current_sclk(struct radeon_device *rdev)
273299550ee9SAlex Deucher {
273399550ee9SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
273499550ee9SAlex Deucher 	struct radeon_ps *rps = &eg_pi->current_rps;
273599550ee9SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
273699550ee9SAlex Deucher 	struct rv7xx_pl *pl;
273799550ee9SAlex Deucher 	u32 current_index =
273899550ee9SAlex Deucher 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
273999550ee9SAlex Deucher 		CURRENT_PROFILE_INDEX_SHIFT;
274099550ee9SAlex Deucher 
274199550ee9SAlex Deucher 	if (current_index > 2) {
274299550ee9SAlex Deucher 		return 0;
274399550ee9SAlex Deucher 	} else {
274499550ee9SAlex Deucher 		if (current_index == 0)
274599550ee9SAlex Deucher 			pl = &ps->low;
274699550ee9SAlex Deucher 		else if (current_index == 1)
274799550ee9SAlex Deucher 			pl = &ps->medium;
274899550ee9SAlex Deucher 		else /* current_index == 2 */
274999550ee9SAlex Deucher 			pl = &ps->high;
275099550ee9SAlex Deucher 		return pl->sclk;
275199550ee9SAlex Deucher 	}
275299550ee9SAlex Deucher }
275399550ee9SAlex Deucher 
btc_dpm_get_current_mclk(struct radeon_device * rdev)275499550ee9SAlex Deucher u32 btc_dpm_get_current_mclk(struct radeon_device *rdev)
275599550ee9SAlex Deucher {
275699550ee9SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
275799550ee9SAlex Deucher 	struct radeon_ps *rps = &eg_pi->current_rps;
275899550ee9SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
275999550ee9SAlex Deucher 	struct rv7xx_pl *pl;
276099550ee9SAlex Deucher 	u32 current_index =
276199550ee9SAlex Deucher 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
276299550ee9SAlex Deucher 		CURRENT_PROFILE_INDEX_SHIFT;
276399550ee9SAlex Deucher 
276499550ee9SAlex Deucher 	if (current_index > 2) {
276599550ee9SAlex Deucher 		return 0;
276699550ee9SAlex Deucher 	} else {
276799550ee9SAlex Deucher 		if (current_index == 0)
276899550ee9SAlex Deucher 			pl = &ps->low;
276999550ee9SAlex Deucher 		else if (current_index == 1)
277099550ee9SAlex Deucher 			pl = &ps->medium;
277199550ee9SAlex Deucher 		else /* current_index == 2 */
277299550ee9SAlex Deucher 			pl = &ps->high;
277399550ee9SAlex Deucher 		return pl->mclk;
277499550ee9SAlex Deucher 	}
277599550ee9SAlex Deucher }
277699550ee9SAlex Deucher 
btc_dpm_get_sclk(struct radeon_device * rdev,bool low)2777e8a9539fSAlex Deucher u32 btc_dpm_get_sclk(struct radeon_device *rdev, bool low)
2778e8a9539fSAlex Deucher {
2779e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2780e8a9539fSAlex Deucher 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
2781e8a9539fSAlex Deucher 
2782e8a9539fSAlex Deucher 	if (low)
2783e8a9539fSAlex Deucher 		return requested_state->low.sclk;
2784e8a9539fSAlex Deucher 	else
2785e8a9539fSAlex Deucher 		return requested_state->high.sclk;
2786e8a9539fSAlex Deucher }
2787e8a9539fSAlex Deucher 
btc_dpm_get_mclk(struct radeon_device * rdev,bool low)2788e8a9539fSAlex Deucher u32 btc_dpm_get_mclk(struct radeon_device *rdev, bool low)
2789e8a9539fSAlex Deucher {
2790e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2791e8a9539fSAlex Deucher 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
2792e8a9539fSAlex Deucher 
2793e8a9539fSAlex Deucher 	if (low)
2794e8a9539fSAlex Deucher 		return requested_state->low.mclk;
2795e8a9539fSAlex Deucher 	else
2796e8a9539fSAlex Deucher 		return requested_state->high.mclk;
2797e8a9539fSAlex Deucher }
2798