xref: /openbmc/linux/drivers/gpu/drm/radeon/btc_dpm.c (revision d02f8575)
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 
256596afd4SAlex Deucher #include "drmP.h"
266596afd4SAlex Deucher #include "radeon.h"
276596afd4SAlex Deucher #include "btcd.h"
286596afd4SAlex Deucher #include "r600_dpm.h"
296596afd4SAlex Deucher #include "cypress_dpm.h"
306596afd4SAlex Deucher #include "btc_dpm.h"
316596afd4SAlex Deucher #include "atom.h"
32d02f8575SAlex Deucher #include <linux/seq_file.h>
336596afd4SAlex Deucher 
346596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F0           0x0a
356596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F1           0x0b
366596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F2           0x0c
376596afd4SAlex Deucher #define MC_CG_ARB_FREQ_F3           0x0d
386596afd4SAlex Deucher 
396596afd4SAlex Deucher #define MC_CG_SEQ_DRAMCONF_S0       0x05
406596afd4SAlex Deucher #define MC_CG_SEQ_DRAMCONF_S1       0x06
416596afd4SAlex Deucher #define MC_CG_SEQ_YCLK_SUSPEND      0x04
426596afd4SAlex Deucher #define MC_CG_SEQ_YCLK_RESUME       0x0a
436596afd4SAlex Deucher 
446596afd4SAlex Deucher #define SMC_RAM_END 0x8000
456596afd4SAlex Deucher 
466596afd4SAlex Deucher #ifndef BTC_MGCG_SEQUENCE
476596afd4SAlex Deucher #define BTC_MGCG_SEQUENCE  300
486596afd4SAlex Deucher 
496596afd4SAlex Deucher struct rv7xx_ps *rv770_get_ps(struct radeon_ps *rps);
506596afd4SAlex Deucher struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);
516596afd4SAlex Deucher struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
526596afd4SAlex Deucher 
536c7bcceaSAlex Deucher extern int ni_mc_load_microcode(struct radeon_device *rdev);
546596afd4SAlex Deucher 
556596afd4SAlex Deucher //********* BARTS **************//
566596afd4SAlex Deucher static const u32 barts_cgcg_cgls_default[] =
576596afd4SAlex Deucher {
586596afd4SAlex Deucher 	/* Register,   Value,     Mask bits */
596596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
606596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
616596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
626596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
636596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
646596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
656596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
666596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
676596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
686596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
696596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
706596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
716596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
736596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
756596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
776596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
786596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
796596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
816596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
836596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
856596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
876596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
896596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
916596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
936596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
956596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
966596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
976596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
986596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
996596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
1006596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1016596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
1026596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1036596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
1046596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1056596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
1066596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
1076596afd4SAlex Deucher };
1086596afd4SAlex Deucher #define BARTS_CGCG_CGLS_DEFAULT_LENGTH sizeof(barts_cgcg_cgls_default) / (3 * sizeof(u32))
1096596afd4SAlex Deucher 
1106596afd4SAlex Deucher static const u32 barts_cgcg_cgls_disable[] =
1116596afd4SAlex Deucher {
1126596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
1136596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1146596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
1156596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1166596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
1176596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1186596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
1196596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1206596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
1216596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1226596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
1236596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1246596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
1256596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1266596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
1276596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1286596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
1296596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1306596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
1316596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1326596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
1336596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1346596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
1356596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1366596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
1376596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1386596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
1396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1406596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
1416596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1426596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
1436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1446596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
1456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1466596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
1476596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1486596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
1496596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1506596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
1516596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1526596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
1536596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1546596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
1556596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1566596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
1576596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1586596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
1596596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1606596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
1616596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
1626596afd4SAlex Deucher };
1636596afd4SAlex Deucher #define BARTS_CGCG_CGLS_DISABLE_LENGTH sizeof(barts_cgcg_cgls_disable) / (3 * sizeof(u32))
1646596afd4SAlex Deucher 
1656596afd4SAlex Deucher static const u32 barts_cgcg_cgls_enable[] =
1666596afd4SAlex Deucher {
1676596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
1686596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
1696596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
1706596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1716596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
1726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1736596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
1746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1756596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
1766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1776596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
1786596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1796596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
1806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1816596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
1826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1836596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
1846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1856596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
1866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1876596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
1886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1896596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
1906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1916596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
1926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
1936596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
1946596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1956596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
1966596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1976596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
1986596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
1996596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
2006596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2016596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
2026596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2036596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
2046596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2056596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
2066596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2076596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
2086596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2096596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
2106596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2116596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
2126596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2136596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
2146596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
2156596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
2166596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
2176596afd4SAlex Deucher };
2186596afd4SAlex Deucher #define BARTS_CGCG_CGLS_ENABLE_LENGTH sizeof(barts_cgcg_cgls_enable) / (3 * sizeof(u32))
2196596afd4SAlex Deucher 
2206596afd4SAlex Deucher static const u32 barts_mgcg_default[] =
2216596afd4SAlex Deucher {
2226596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
2236596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
2246596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
2256596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
2266596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
2276596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
2286596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
2296596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
2306596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
2316596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
2326596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
2336596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
2346596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
2356596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
2366596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
2376596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
2386596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
2396596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
2406596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
2416596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
2426596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
2436596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
2446596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
2456596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
2466596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
2476596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
2486596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
2496596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
2506596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
2516596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
2526596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
2536596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
2546596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
2556596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
2566596afd4SAlex Deucher 	0x0000d0c0, 0xff000100, 0xffffffff,
2576596afd4SAlex Deucher 	0x0000802c, 0x40000000, 0xffffffff,
2586596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
2596596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
2606596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
2616596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
2626596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
2636596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
2646596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
2656596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
2666596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
2676596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
2686596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
2696596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
2706596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
2716596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
2726596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
2736596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
2746596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
2756596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
2766596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
2776596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
2786596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
2796596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
2806596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
2816596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
2826596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
2836596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
2846596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
2856596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
2866596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
2876596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
2886596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
2896596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
2906596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
2916596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
2926596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
2936596afd4SAlex Deucher 	0x00009224, 0x00070000, 0xffffffff,
2946596afd4SAlex Deucher 	0x00009228, 0x00030002, 0xffffffff,
2956596afd4SAlex Deucher 	0x0000922c, 0x00050004, 0xffffffff,
2966596afd4SAlex Deucher 	0x00009238, 0x00010006, 0xffffffff,
2976596afd4SAlex Deucher 	0x0000923c, 0x00090008, 0xffffffff,
2986596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
2996596afd4SAlex Deucher 	0x0000802c, 0x40010000, 0xffffffff,
3006596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
3016596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
3026596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
3036596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
3046596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
3056596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
3066596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
3076596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
3086596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
3096596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
3106596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
3116596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
3126596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
3136596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
3146596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
3156596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
3166596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
3176596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
3186596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
3196596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
3206596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
3216596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
3226596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
3236596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
3246596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
3256596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
3266596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
3276596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
3286596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
3296596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
3306596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
3316596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
3326596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
3336596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
3346596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
3356596afd4SAlex Deucher 	0x00009224, 0x00070000, 0xffffffff,
3366596afd4SAlex Deucher 	0x00009228, 0x00030002, 0xffffffff,
3376596afd4SAlex Deucher 	0x0000922c, 0x00050004, 0xffffffff,
3386596afd4SAlex Deucher 	0x00009238, 0x00010006, 0xffffffff,
3396596afd4SAlex Deucher 	0x0000923c, 0x00090008, 0xffffffff,
3406596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
3416596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3426596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
3436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3446596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
3456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3466596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
3476596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3486596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
3496596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3506596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
3516596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3526596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
3536596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3546596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
3556596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3566596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
3576596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3586596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
3596596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3606596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
3616596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3626596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
3636596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3646596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
3656596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
3666596afd4SAlex Deucher };
3676596afd4SAlex Deucher #define BARTS_MGCG_DEFAULT_LENGTH sizeof(barts_mgcg_default) / (3 * sizeof(u32))
3686596afd4SAlex Deucher 
3696596afd4SAlex Deucher static const u32 barts_mgcg_disable[] =
3706596afd4SAlex Deucher {
3716596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3726596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
3736596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3746596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
3756596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3766596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
3776596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3786596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
3796596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
3806596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
3816596afd4SAlex Deucher };
3826596afd4SAlex Deucher #define BARTS_MGCG_DISABLE_LENGTH sizeof(barts_mgcg_disable) / (3 * sizeof(u32))
3836596afd4SAlex Deucher 
3846596afd4SAlex Deucher static const u32 barts_mgcg_enable[] =
3856596afd4SAlex Deucher {
3866596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
3876596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
3886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3896596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
3906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3916596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
3926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3936596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
3946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
3956596afd4SAlex Deucher 	0x00009150, 0x81944000, 0xffffffff
3966596afd4SAlex Deucher };
3976596afd4SAlex Deucher #define BARTS_MGCG_ENABLE_LENGTH sizeof(barts_mgcg_enable) / (3 * sizeof(u32))
3986596afd4SAlex Deucher 
3996596afd4SAlex Deucher //********* CAICOS **************//
4006596afd4SAlex Deucher static const u32 caicos_cgcg_cgls_default[] =
4016596afd4SAlex Deucher {
4026596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
4036596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4046596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
4056596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4066596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
4076596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4086596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
4096596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4106596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
4116596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4126596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
4136596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4146596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
4156596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4166596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
4176596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4186596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
4196596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4206596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
4216596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4226596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
4236596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4246596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
4256596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4266596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
4276596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4286596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
4296596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4306596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
4316596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4326596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
4336596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4346596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
4356596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4366596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
4376596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4386596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
4396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4406596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
4416596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4426596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
4436596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4446596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
4456596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4466596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
4476596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4486596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
4496596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
4506596afd4SAlex Deucher };
4516596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_DEFAULT_LENGTH sizeof(caicos_cgcg_cgls_default) / (3 * sizeof(u32))
4526596afd4SAlex Deucher 
4536596afd4SAlex Deucher static const u32 caicos_cgcg_cgls_disable[] =
4546596afd4SAlex Deucher {
4556596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
4566596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4576596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
4586596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4596596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
4606596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4616596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
4626596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4636596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
4646596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4656596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
4666596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4676596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
4686596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4696596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
4706596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4716596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
4726596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4736596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
4746596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4756596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
4766596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4776596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
4786596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
4796596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
4806596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4816596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
4826596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4836596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
4846596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4856596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
4866596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4876596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
4886596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4896596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
4906596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4916596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
4926596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4936596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
4946596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4956596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
4966596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4976596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
4986596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
4996596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
5006596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5016596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
5026596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5036596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
5046596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
5056596afd4SAlex Deucher };
5066596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_DISABLE_LENGTH sizeof(caicos_cgcg_cgls_disable) / (3 * sizeof(u32))
5076596afd4SAlex Deucher 
5086596afd4SAlex Deucher static const u32 caicos_cgcg_cgls_enable[] =
5096596afd4SAlex Deucher {
5106596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
5116596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
5126596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
5136596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5146596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
5156596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5166596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
5176596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5186596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
5196596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5206596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
5216596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5226596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
5236596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5246596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
5256596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5266596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
5276596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5286596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
5296596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5306596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
5316596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5326596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
5336596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5346596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
5356596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
5366596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
5376596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5386596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
5396596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5406596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
5416596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5426596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
5436596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5446596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
5456596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5466596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
5476596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5486596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
5496596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5506596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
5516596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5526596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
5536596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5546596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
5556596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5566596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
5576596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
5586596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
5596596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
5606596afd4SAlex Deucher };
5616596afd4SAlex Deucher #define CAICOS_CGCG_CGLS_ENABLE_LENGTH sizeof(caicos_cgcg_cgls_enable) / (3 * sizeof(u32))
5626596afd4SAlex Deucher 
5636596afd4SAlex Deucher static const u32 caicos_mgcg_default[] =
5646596afd4SAlex Deucher {
5656596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
5666596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
5676596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
5686596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
5696596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
5706596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
5716596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
5726596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
5736596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
5746596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
5756596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
5766596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
5776596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
5786596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
5796596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
5806596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
5816596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
5826596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
5836596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
5846596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
5856596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
5866596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
5876596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
5886596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
5896596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
5906596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
5916596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
5926596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
5936596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
5946596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
5956596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
5966596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
5976596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
5986596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
5996596afd4SAlex Deucher 	0x0000d0c0, 0xff000100, 0xffffffff,
6006596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
6016596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
6026596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
6036596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
6046596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
6056596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
6066596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
6076596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
6086596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
6096596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
6106596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
6116596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
6126596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
6136596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
6146596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
6156596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
6166596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
6176596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6186596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
6196596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6206596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
6216596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6226596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
6236596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6246596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
6256596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6266596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
6276596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6286596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
6296596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6306596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
6316596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6326596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
6336596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6346596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
6356596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6366596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
6376596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6386596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
6396596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
6406596afd4SAlex Deucher };
6416596afd4SAlex Deucher #define CAICOS_MGCG_DEFAULT_LENGTH sizeof(caicos_mgcg_default) / (3 * sizeof(u32))
6426596afd4SAlex Deucher 
6436596afd4SAlex Deucher static const u32 caicos_mgcg_disable[] =
6446596afd4SAlex Deucher {
6456596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
6466596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
6476596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6486596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
6496596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6506596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
6516596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6526596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
6536596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
6546596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
6556596afd4SAlex Deucher };
6566596afd4SAlex Deucher #define CAICOS_MGCG_DISABLE_LENGTH sizeof(caicos_mgcg_disable) / (3 * sizeof(u32))
6576596afd4SAlex Deucher 
6586596afd4SAlex Deucher static const u32 caicos_mgcg_enable[] =
6596596afd4SAlex Deucher {
6606596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
6616596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
6626596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6636596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
6646596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6656596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
6666596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6676596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
6686596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6696596afd4SAlex Deucher 	0x00009150, 0x46944040, 0xffffffff
6706596afd4SAlex Deucher };
6716596afd4SAlex Deucher #define CAICOS_MGCG_ENABLE_LENGTH sizeof(caicos_mgcg_enable) / (3 * sizeof(u32))
6726596afd4SAlex Deucher 
6736596afd4SAlex Deucher //********* TURKS **************//
6746596afd4SAlex Deucher static const u32 turks_cgcg_cgls_default[] =
6756596afd4SAlex Deucher {
6766596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
6776596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6786596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
6796596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6806596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
6816596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6826596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
6836596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6846596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
6856596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6866596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
6876596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6886596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
6896596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6906596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
6916596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6926596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
6936596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6946596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
6956596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6966596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
6976596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
6986596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
6996596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7006596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
7016596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7026596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
7036596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7046596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
7056596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7066596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
7076596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7086596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
7096596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7106596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
7116596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7126596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
7136596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7146596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
7156596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7166596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
7176596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7186596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
7196596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7206596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
7216596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7226596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
7236596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
7246596afd4SAlex Deucher };
7256596afd4SAlex Deucher #define TURKS_CGCG_CGLS_DEFAULT_LENGTH  sizeof(turks_cgcg_cgls_default) / (3 * sizeof(u32))
7266596afd4SAlex Deucher 
7276596afd4SAlex Deucher static const u32 turks_cgcg_cgls_disable[] =
7286596afd4SAlex Deucher {
7296596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
7306596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7316596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
7326596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7336596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
7346596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7356596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
7366596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7376596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
7386596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7396596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
7406596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7416596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
7426596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7436596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
7446596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7456596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
7466596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7476596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
7486596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7496596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
7506596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7516596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
7526596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
7536596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
7546596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7556596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
7566596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7576596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
7586596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7596596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
7606596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7616596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
7626596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7636596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
7646596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7656596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
7666596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7676596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
7686596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7696596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
7706596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7716596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
7726596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7736596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
7746596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7756596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
7766596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7776596afd4SAlex Deucher 	0x00000644, 0x000f7912, 0x001f4180,
7786596afd4SAlex Deucher 	0x00000644, 0x000f3812, 0x001f4180
7796596afd4SAlex Deucher };
7806596afd4SAlex Deucher #define TURKS_CGCG_CGLS_DISABLE_LENGTH sizeof(turks_cgcg_cgls_disable) / (3 * sizeof(u32))
7816596afd4SAlex Deucher 
7826596afd4SAlex Deucher static const u32 turks_cgcg_cgls_enable[] =
7836596afd4SAlex Deucher {
7846596afd4SAlex Deucher 	/* 0x0000c124, 0x84180000, 0x00180000, */
7856596afd4SAlex Deucher 	0x00000644, 0x000f7892, 0x001f4080,
7866596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
7876596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7886596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
7896596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7906596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
7916596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7926596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
7936596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7946596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
7956596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7966596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
7976596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
7986596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
7996596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8006596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
8016596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8026596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
8036596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8046596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
8056596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8066596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
8076596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8086596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
8096596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
8106596afd4SAlex Deucher 	0x000008f8, 0x00000020, 0xffffffff,
8116596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8126596afd4SAlex Deucher 	0x000008f8, 0x00000021, 0xffffffff,
8136596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8146596afd4SAlex Deucher 	0x000008f8, 0x00000022, 0xffffffff,
8156596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8166596afd4SAlex Deucher 	0x000008f8, 0x00000023, 0xffffffff,
8176596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8186596afd4SAlex Deucher 	0x000008f8, 0x00000024, 0xffffffff,
8196596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8206596afd4SAlex Deucher 	0x000008f8, 0x00000025, 0xffffffff,
8216596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8226596afd4SAlex Deucher 	0x000008f8, 0x00000026, 0xffffffff,
8236596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8246596afd4SAlex Deucher 	0x000008f8, 0x00000027, 0xffffffff,
8256596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8266596afd4SAlex Deucher 	0x000008f8, 0x00000028, 0xffffffff,
8276596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8286596afd4SAlex Deucher 	0x000008f8, 0x00000029, 0xffffffff,
8296596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8306596afd4SAlex Deucher 	0x000008f8, 0x0000002a, 0xffffffff,
8316596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
8326596afd4SAlex Deucher 	0x000008f8, 0x0000002b, 0xffffffff,
8336596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff
8346596afd4SAlex Deucher };
8356596afd4SAlex Deucher #define TURKS_CGCG_CGLS_ENABLE_LENGTH sizeof(turks_cgcg_cgls_enable) / (3 * sizeof(u32))
8366596afd4SAlex Deucher 
8376596afd4SAlex Deucher // These are the sequences for turks_mgcg_shls
8386596afd4SAlex Deucher static const u32 turks_mgcg_default[] =
8396596afd4SAlex Deucher {
8406596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
8416596afd4SAlex Deucher 	0x00005448, 0x00000100, 0xffffffff,
8426596afd4SAlex Deucher 	0x000055e4, 0x00600100, 0xffffffff,
8436596afd4SAlex Deucher 	0x0000160c, 0x00000100, 0xffffffff,
8446596afd4SAlex Deucher 	0x0000c164, 0x00000100, 0xffffffff,
8456596afd4SAlex Deucher 	0x00008a18, 0x00000100, 0xffffffff,
8466596afd4SAlex Deucher 	0x0000897c, 0x06000100, 0xffffffff,
8476596afd4SAlex Deucher 	0x00008b28, 0x00000100, 0xffffffff,
8486596afd4SAlex Deucher 	0x00009144, 0x00000100, 0xffffffff,
8496596afd4SAlex Deucher 	0x00009a60, 0x00000100, 0xffffffff,
8506596afd4SAlex Deucher 	0x00009868, 0x00000100, 0xffffffff,
8516596afd4SAlex Deucher 	0x00008d58, 0x00000100, 0xffffffff,
8526596afd4SAlex Deucher 	0x00009510, 0x00000100, 0xffffffff,
8536596afd4SAlex Deucher 	0x0000949c, 0x00000100, 0xffffffff,
8546596afd4SAlex Deucher 	0x00009654, 0x00000100, 0xffffffff,
8556596afd4SAlex Deucher 	0x00009030, 0x00000100, 0xffffffff,
8566596afd4SAlex Deucher 	0x00009034, 0x00000100, 0xffffffff,
8576596afd4SAlex Deucher 	0x00009038, 0x00000100, 0xffffffff,
8586596afd4SAlex Deucher 	0x0000903c, 0x00000100, 0xffffffff,
8596596afd4SAlex Deucher 	0x00009040, 0x00000100, 0xffffffff,
8606596afd4SAlex Deucher 	0x0000a200, 0x00000100, 0xffffffff,
8616596afd4SAlex Deucher 	0x0000a204, 0x00000100, 0xffffffff,
8626596afd4SAlex Deucher 	0x0000a208, 0x00000100, 0xffffffff,
8636596afd4SAlex Deucher 	0x0000a20c, 0x00000100, 0xffffffff,
8646596afd4SAlex Deucher 	0x0000977c, 0x00000100, 0xffffffff,
8656596afd4SAlex Deucher 	0x00003f80, 0x00000100, 0xffffffff,
8666596afd4SAlex Deucher 	0x0000a210, 0x00000100, 0xffffffff,
8676596afd4SAlex Deucher 	0x0000a214, 0x00000100, 0xffffffff,
8686596afd4SAlex Deucher 	0x000004d8, 0x00000100, 0xffffffff,
8696596afd4SAlex Deucher 	0x00009784, 0x00000100, 0xffffffff,
8706596afd4SAlex Deucher 	0x00009698, 0x00000100, 0xffffffff,
8716596afd4SAlex Deucher 	0x000004d4, 0x00000200, 0xffffffff,
8726596afd4SAlex Deucher 	0x000004d0, 0x00000000, 0xffffffff,
8736596afd4SAlex Deucher 	0x000030cc, 0x00000100, 0xffffffff,
8746596afd4SAlex Deucher 	0x0000d0c0, 0x00000100, 0xffffffff,
8756596afd4SAlex Deucher 	0x0000915c, 0x00010000, 0xffffffff,
8766596afd4SAlex Deucher 	0x00009160, 0x00030002, 0xffffffff,
8776596afd4SAlex Deucher 	0x00009164, 0x00050004, 0xffffffff,
8786596afd4SAlex Deucher 	0x00009168, 0x00070006, 0xffffffff,
8796596afd4SAlex Deucher 	0x00009178, 0x00070000, 0xffffffff,
8806596afd4SAlex Deucher 	0x0000917c, 0x00030002, 0xffffffff,
8816596afd4SAlex Deucher 	0x00009180, 0x00050004, 0xffffffff,
8826596afd4SAlex Deucher 	0x0000918c, 0x00010006, 0xffffffff,
8836596afd4SAlex Deucher 	0x00009190, 0x00090008, 0xffffffff,
8846596afd4SAlex Deucher 	0x00009194, 0x00070000, 0xffffffff,
8856596afd4SAlex Deucher 	0x00009198, 0x00030002, 0xffffffff,
8866596afd4SAlex Deucher 	0x0000919c, 0x00050004, 0xffffffff,
8876596afd4SAlex Deucher 	0x000091a8, 0x00010006, 0xffffffff,
8886596afd4SAlex Deucher 	0x000091ac, 0x00090008, 0xffffffff,
8896596afd4SAlex Deucher 	0x000091b0, 0x00070000, 0xffffffff,
8906596afd4SAlex Deucher 	0x000091b4, 0x00030002, 0xffffffff,
8916596afd4SAlex Deucher 	0x000091b8, 0x00050004, 0xffffffff,
8926596afd4SAlex Deucher 	0x000091c4, 0x00010006, 0xffffffff,
8936596afd4SAlex Deucher 	0x000091c8, 0x00090008, 0xffffffff,
8946596afd4SAlex Deucher 	0x000091cc, 0x00070000, 0xffffffff,
8956596afd4SAlex Deucher 	0x000091d0, 0x00030002, 0xffffffff,
8966596afd4SAlex Deucher 	0x000091d4, 0x00050004, 0xffffffff,
8976596afd4SAlex Deucher 	0x000091e0, 0x00010006, 0xffffffff,
8986596afd4SAlex Deucher 	0x000091e4, 0x00090008, 0xffffffff,
8996596afd4SAlex Deucher 	0x000091e8, 0x00000000, 0xffffffff,
9006596afd4SAlex Deucher 	0x000091ec, 0x00070000, 0xffffffff,
9016596afd4SAlex Deucher 	0x000091f0, 0x00030002, 0xffffffff,
9026596afd4SAlex Deucher 	0x000091f4, 0x00050004, 0xffffffff,
9036596afd4SAlex Deucher 	0x00009200, 0x00010006, 0xffffffff,
9046596afd4SAlex Deucher 	0x00009204, 0x00090008, 0xffffffff,
9056596afd4SAlex Deucher 	0x00009208, 0x00070000, 0xffffffff,
9066596afd4SAlex Deucher 	0x0000920c, 0x00030002, 0xffffffff,
9076596afd4SAlex Deucher 	0x00009210, 0x00050004, 0xffffffff,
9086596afd4SAlex Deucher 	0x0000921c, 0x00010006, 0xffffffff,
9096596afd4SAlex Deucher 	0x00009220, 0x00090008, 0xffffffff,
9106596afd4SAlex Deucher 	0x00009294, 0x00000000, 0xffffffff,
9116596afd4SAlex Deucher 	0x000008f8, 0x00000010, 0xffffffff,
9126596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9136596afd4SAlex Deucher 	0x000008f8, 0x00000011, 0xffffffff,
9146596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9156596afd4SAlex Deucher 	0x000008f8, 0x00000012, 0xffffffff,
9166596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9176596afd4SAlex Deucher 	0x000008f8, 0x00000013, 0xffffffff,
9186596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9196596afd4SAlex Deucher 	0x000008f8, 0x00000014, 0xffffffff,
9206596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9216596afd4SAlex Deucher 	0x000008f8, 0x00000015, 0xffffffff,
9226596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9236596afd4SAlex Deucher 	0x000008f8, 0x00000016, 0xffffffff,
9246596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9256596afd4SAlex Deucher 	0x000008f8, 0x00000017, 0xffffffff,
9266596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9276596afd4SAlex Deucher 	0x000008f8, 0x00000018, 0xffffffff,
9286596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9296596afd4SAlex Deucher 	0x000008f8, 0x00000019, 0xffffffff,
9306596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9316596afd4SAlex Deucher 	0x000008f8, 0x0000001a, 0xffffffff,
9326596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9336596afd4SAlex Deucher 	0x000008f8, 0x0000001b, 0xffffffff,
9346596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff
9356596afd4SAlex Deucher };
9366596afd4SAlex Deucher #define TURKS_MGCG_DEFAULT_LENGTH sizeof(turks_mgcg_default) / (3 * sizeof(u32))
9376596afd4SAlex Deucher 
9386596afd4SAlex Deucher static const u32 turks_mgcg_disable[] =
9396596afd4SAlex Deucher {
9406596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
9416596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
9426596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9436596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
9446596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9456596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
9466596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9476596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
9486596afd4SAlex Deucher 	0x000008fc, 0xffffffff, 0xffffffff,
9496596afd4SAlex Deucher 	0x00009150, 0x00600000, 0xffffffff
9506596afd4SAlex Deucher };
9516596afd4SAlex Deucher #define TURKS_MGCG_DISABLE_LENGTH sizeof(turks_mgcg_disable) / (3 * sizeof(u32))
9526596afd4SAlex Deucher 
9536596afd4SAlex Deucher static const u32 turks_mgcg_enable[] =
9546596afd4SAlex Deucher {
9556596afd4SAlex Deucher 	0x0000802c, 0xc0000000, 0xffffffff,
9566596afd4SAlex Deucher 	0x000008f8, 0x00000000, 0xffffffff,
9576596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9586596afd4SAlex Deucher 	0x000008f8, 0x00000001, 0xffffffff,
9596596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9606596afd4SAlex Deucher 	0x000008f8, 0x00000002, 0xffffffff,
9616596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9626596afd4SAlex Deucher 	0x000008f8, 0x00000003, 0xffffffff,
9636596afd4SAlex Deucher 	0x000008fc, 0x00000000, 0xffffffff,
9646596afd4SAlex Deucher 	0x00009150, 0x6e944000, 0xffffffff
9656596afd4SAlex Deucher };
9666596afd4SAlex Deucher #define TURKS_MGCG_ENABLE_LENGTH sizeof(turks_mgcg_enable) / (3 * sizeof(u32))
9676596afd4SAlex Deucher 
9686596afd4SAlex Deucher #endif
9696596afd4SAlex Deucher 
9706596afd4SAlex Deucher #ifndef BTC_SYSLS_SEQUENCE
9716596afd4SAlex Deucher #define BTC_SYSLS_SEQUENCE  100
9726596afd4SAlex Deucher 
9736596afd4SAlex Deucher 
9746596afd4SAlex Deucher //********* BARTS **************//
9756596afd4SAlex Deucher static const u32 barts_sysls_default[] =
9766596afd4SAlex Deucher {
9776596afd4SAlex Deucher 	/* Register,   Value,     Mask bits */
9786596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
9796596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
9806596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
9816596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
9826596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
9836596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
9846596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
9856596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
9866596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
9876596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
9886596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
9896596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
9906596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
9916596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
9926596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
9936596afd4SAlex Deucher };
9946596afd4SAlex Deucher #define BARTS_SYSLS_DEFAULT_LENGTH sizeof(barts_sysls_default) / (3 * sizeof(u32))
9956596afd4SAlex Deucher 
9966596afd4SAlex Deucher static const u32 barts_sysls_disable[] =
9976596afd4SAlex Deucher {
9986596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
9996596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10006596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
10016596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
10026596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
10036596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
10046596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
10056596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
10066596afd4SAlex Deucher 	0x000020c0, 0x00040c80, 0xffffffff,
10076596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10086596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
10096596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10106596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
10116596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
10126596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
10136596afd4SAlex Deucher };
10146596afd4SAlex Deucher #define BARTS_SYSLS_DISABLE_LENGTH sizeof(barts_sysls_disable) / (3 * sizeof(u32))
10156596afd4SAlex Deucher 
10166596afd4SAlex Deucher static const u32 barts_sysls_enable[] =
10176596afd4SAlex Deucher {
10186596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
10196596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
10206596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10216596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10226596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10236596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10246596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10256596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10266596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
10276596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10286596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10296596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff,
10306596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10316596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10326596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
10336596afd4SAlex Deucher };
10346596afd4SAlex Deucher #define BARTS_SYSLS_ENABLE_LENGTH sizeof(barts_sysls_enable) / (3 * sizeof(u32))
10356596afd4SAlex Deucher 
10366596afd4SAlex Deucher //********* CAICOS **************//
10376596afd4SAlex Deucher static const u32 caicos_sysls_default[] =
10386596afd4SAlex Deucher {
10396596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10406596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10416596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10426596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10436596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10446596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10456596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10466596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10476596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10486596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10496596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10506596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10516596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10526596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
10536596afd4SAlex Deucher };
10546596afd4SAlex Deucher #define CAICOS_SYSLS_DEFAULT_LENGTH sizeof(caicos_sysls_default) / (3 * sizeof(u32))
10556596afd4SAlex Deucher 
10566596afd4SAlex Deucher static const u32 caicos_sysls_disable[] =
10576596afd4SAlex Deucher {
10586596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10596596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10606596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
10616596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
10626596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
10636596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
10646596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
10656596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
10666596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10676596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
10686596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
10696596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
10706596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
10716596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
10726596afd4SAlex Deucher };
10736596afd4SAlex Deucher #define CAICOS_SYSLS_DISABLE_LENGTH sizeof(caicos_sysls_disable) / (3 * sizeof(u32))
10746596afd4SAlex Deucher 
10756596afd4SAlex Deucher static const u32 caicos_sysls_enable[] =
10766596afd4SAlex Deucher {
10776596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
10786596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
10796596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
10806596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
10816596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
10826596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
10836596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
10846596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
10856596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
10866596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
10876596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
10886596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
10896596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff,
10906596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff
10916596afd4SAlex Deucher };
10926596afd4SAlex Deucher #define CAICOS_SYSLS_ENABLE_LENGTH sizeof(caicos_sysls_enable) / (3 * sizeof(u32))
10936596afd4SAlex Deucher 
10946596afd4SAlex Deucher //********* TURKS **************//
10956596afd4SAlex Deucher static const u32 turks_sysls_default[] =
10966596afd4SAlex Deucher {
10976596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
10986596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
10996596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
11006596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
11016596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
11026596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
11036596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
11046596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
11056596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
11066596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
11076596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
11086596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
11096596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
11106596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
11116596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
11126596afd4SAlex Deucher };
11136596afd4SAlex Deucher #define TURKS_SYSLS_DEFAULT_LENGTH sizeof(turks_sysls_default) / (3 * sizeof(u32))
11146596afd4SAlex Deucher 
11156596afd4SAlex Deucher static const u32 turks_sysls_disable[] =
11166596afd4SAlex Deucher {
11176596afd4SAlex Deucher 	0x000055e8, 0x00000000, 0xffffffff,
11186596afd4SAlex Deucher 	0x0000d0bc, 0x00000000, 0xffffffff,
11196596afd4SAlex Deucher 	0x000015c0, 0x00041401, 0xffffffff,
11206596afd4SAlex Deucher 	0x0000264c, 0x00040400, 0xffffffff,
11216596afd4SAlex Deucher 	0x00002648, 0x00040400, 0xffffffff,
11226596afd4SAlex Deucher 	0x00002650, 0x00040400, 0xffffffff,
11236596afd4SAlex Deucher 	0x000020b8, 0x00040400, 0xffffffff,
11246596afd4SAlex Deucher 	0x000020bc, 0x00040400, 0xffffffff,
11256596afd4SAlex Deucher 	0x000020c0, 0x00040c80, 0xffffffff,
11266596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
11276596afd4SAlex Deucher 	0x0000f4a4, 0x00680000, 0xffffffff,
11286596afd4SAlex Deucher 	0x000004c8, 0x00000001, 0xffffffff,
11296596afd4SAlex Deucher 	0x000064ec, 0x00007ffd, 0xffffffff,
11306596afd4SAlex Deucher 	0x00000c7c, 0x0000ff00, 0xffffffff,
11316596afd4SAlex Deucher 	0x00006dfc, 0x0000007f, 0xffffffff
11326596afd4SAlex Deucher };
11336596afd4SAlex Deucher #define TURKS_SYSLS_DISABLE_LENGTH sizeof(turks_sysls_disable) / (3 * sizeof(u32))
11346596afd4SAlex Deucher 
11356596afd4SAlex Deucher static const u32 turks_sysls_enable[] =
11366596afd4SAlex Deucher {
11376596afd4SAlex Deucher 	0x000055e8, 0x00000001, 0xffffffff,
11386596afd4SAlex Deucher 	0x0000d0bc, 0x00000100, 0xffffffff,
11396596afd4SAlex Deucher 	0x000015c0, 0x000c1401, 0xffffffff,
11406596afd4SAlex Deucher 	0x0000264c, 0x000c0400, 0xffffffff,
11416596afd4SAlex Deucher 	0x00002648, 0x000c0400, 0xffffffff,
11426596afd4SAlex Deucher 	0x00002650, 0x000c0400, 0xffffffff,
11436596afd4SAlex Deucher 	0x000020b8, 0x000c0400, 0xffffffff,
11446596afd4SAlex Deucher 	0x000020bc, 0x000c0400, 0xffffffff,
11456596afd4SAlex Deucher 	0x000020c0, 0x000c0c80, 0xffffffff,
11466596afd4SAlex Deucher 	0x0000f4a0, 0x000000c0, 0xffffffff,
11476596afd4SAlex Deucher 	0x0000f4a4, 0x00680fff, 0xffffffff,
11486596afd4SAlex Deucher 	0x000004c8, 0x00000000, 0xffffffff,
11496596afd4SAlex Deucher 	0x000064ec, 0x00000000, 0xffffffff,
11506596afd4SAlex Deucher 	0x00000c7c, 0x00000000, 0xffffffff,
11516596afd4SAlex Deucher 	0x00006dfc, 0x00000000, 0xffffffff
11526596afd4SAlex Deucher };
11536596afd4SAlex Deucher #define TURKS_SYSLS_ENABLE_LENGTH sizeof(turks_sysls_enable) / (3 * sizeof(u32))
11546596afd4SAlex Deucher 
11556596afd4SAlex Deucher #endif
11566596afd4SAlex Deucher 
115769e0b57aSAlex Deucher u32 btc_valid_sclk[40] =
1158d22b7e40SAlex Deucher {
1159d22b7e40SAlex Deucher 	5000,   10000,  15000,  20000,  25000,  30000,  35000,  40000,  45000,  50000,
1160d22b7e40SAlex Deucher 	55000,  60000,  65000,  70000,  75000,  80000,  85000,  90000,  95000,  100000,
1161d22b7e40SAlex Deucher 	105000, 110000, 11500,  120000, 125000, 130000, 135000, 140000, 145000, 150000,
1162d22b7e40SAlex Deucher 	155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000
1163d22b7e40SAlex Deucher };
1164d22b7e40SAlex Deucher 
1165d22b7e40SAlex Deucher static const struct radeon_blacklist_clocks btc_blacklist_clocks[] =
1166d22b7e40SAlex Deucher {
1167d22b7e40SAlex Deucher         { 10000, 30000, RADEON_SCLK_UP },
1168d22b7e40SAlex Deucher         { 15000, 30000, RADEON_SCLK_UP },
1169d22b7e40SAlex Deucher         { 20000, 30000, RADEON_SCLK_UP },
1170d22b7e40SAlex Deucher         { 25000, 30000, RADEON_SCLK_UP }
1171d22b7e40SAlex Deucher };
1172d22b7e40SAlex Deucher 
11737102e232SAlex Deucher void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
11747102e232SAlex Deucher 						     u32 *max_clock)
11757102e232SAlex Deucher {
11767102e232SAlex Deucher 	u32 i, clock = 0;
11777102e232SAlex Deucher 
11787102e232SAlex Deucher 	if ((table == NULL) || (table->count == 0)) {
11797102e232SAlex Deucher 		*max_clock = clock;
11807102e232SAlex Deucher 		return;
11817102e232SAlex Deucher 	}
11827102e232SAlex Deucher 
11837102e232SAlex Deucher 	for (i = 0; i < table->count; i++) {
11847102e232SAlex Deucher 		if (clock < table->entries[i].clk)
11857102e232SAlex Deucher 			clock = table->entries[i].clk;
11867102e232SAlex Deucher 	}
11877102e232SAlex Deucher 	*max_clock = clock;
11887102e232SAlex Deucher }
11897102e232SAlex Deucher 
119069e0b57aSAlex Deucher void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
1191d22b7e40SAlex Deucher 					u32 clock, u16 max_voltage, u16 *voltage)
1192d22b7e40SAlex Deucher {
1193d22b7e40SAlex Deucher 	u32 i;
1194d22b7e40SAlex Deucher 
1195d22b7e40SAlex Deucher 	if ((table == NULL) || (table->count == 0))
1196d22b7e40SAlex Deucher 		return;
1197d22b7e40SAlex Deucher 
1198d22b7e40SAlex Deucher 	for (i= 0; i < table->count; i++) {
1199d22b7e40SAlex Deucher 		if (clock <= table->entries[i].clk) {
1200d22b7e40SAlex Deucher 			if (*voltage < table->entries[i].v)
1201d22b7e40SAlex Deucher 				*voltage = (u16)((table->entries[i].v < max_voltage) ?
1202d22b7e40SAlex Deucher 						  table->entries[i].v : max_voltage);
1203d22b7e40SAlex Deucher 			return;
1204d22b7e40SAlex Deucher 		}
1205d22b7e40SAlex Deucher 	}
1206d22b7e40SAlex Deucher 
1207d22b7e40SAlex Deucher 	*voltage = (*voltage > max_voltage) ? *voltage : max_voltage;
1208d22b7e40SAlex Deucher }
1209d22b7e40SAlex Deucher 
1210d22b7e40SAlex Deucher static u32 btc_find_valid_clock(struct radeon_clock_array *clocks,
1211d22b7e40SAlex Deucher 				u32 max_clock, u32 requested_clock)
1212d22b7e40SAlex Deucher {
1213d22b7e40SAlex Deucher 	unsigned int i;
1214d22b7e40SAlex Deucher 
1215d22b7e40SAlex Deucher 	if ((clocks == NULL) || (clocks->count == 0))
1216d22b7e40SAlex Deucher 		return (requested_clock < max_clock) ? requested_clock : max_clock;
1217d22b7e40SAlex Deucher 
1218d22b7e40SAlex Deucher 	for (i = 0; i < clocks->count; i++) {
1219d22b7e40SAlex Deucher 		if (clocks->values[i] >= requested_clock)
1220d22b7e40SAlex Deucher 			return (clocks->values[i] < max_clock) ? clocks->values[i] : max_clock;
1221d22b7e40SAlex Deucher 	}
1222d22b7e40SAlex Deucher 
1223d22b7e40SAlex Deucher 	return (clocks->values[clocks->count - 1] < max_clock) ?
1224d22b7e40SAlex Deucher 		clocks->values[clocks->count - 1] : max_clock;
1225d22b7e40SAlex Deucher }
1226d22b7e40SAlex Deucher 
1227d22b7e40SAlex Deucher static u32 btc_get_valid_mclk(struct radeon_device *rdev,
1228d22b7e40SAlex Deucher 			      u32 max_mclk, u32 requested_mclk)
1229d22b7e40SAlex Deucher {
1230d22b7e40SAlex Deucher 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_mclk_values,
1231d22b7e40SAlex Deucher 				    max_mclk, requested_mclk);
1232d22b7e40SAlex Deucher }
1233d22b7e40SAlex Deucher 
1234d22b7e40SAlex Deucher static u32 btc_get_valid_sclk(struct radeon_device *rdev,
1235d22b7e40SAlex Deucher 			      u32 max_sclk, u32 requested_sclk)
1236d22b7e40SAlex Deucher {
1237d22b7e40SAlex Deucher 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_sclk_values,
1238d22b7e40SAlex Deucher 				    max_sclk, requested_sclk);
1239d22b7e40SAlex Deucher }
1240d22b7e40SAlex Deucher 
124169e0b57aSAlex Deucher void btc_skip_blacklist_clocks(struct radeon_device *rdev,
1242d22b7e40SAlex Deucher 			       const u32 max_sclk, const u32 max_mclk,
1243d22b7e40SAlex Deucher 			       u32 *sclk, u32 *mclk)
1244d22b7e40SAlex Deucher {
1245d22b7e40SAlex Deucher 	int i, num_blacklist_clocks;
1246d22b7e40SAlex Deucher 
1247d22b7e40SAlex Deucher 	if ((sclk == NULL) || (mclk == NULL))
1248d22b7e40SAlex Deucher 		return;
1249d22b7e40SAlex Deucher 
1250d22b7e40SAlex Deucher 	num_blacklist_clocks = ARRAY_SIZE(btc_blacklist_clocks);
1251d22b7e40SAlex Deucher 
1252d22b7e40SAlex Deucher 	for (i = 0; i < num_blacklist_clocks; i++) {
1253d22b7e40SAlex Deucher 		if ((btc_blacklist_clocks[i].sclk == *sclk) &&
1254d22b7e40SAlex Deucher 		    (btc_blacklist_clocks[i].mclk == *mclk))
1255d22b7e40SAlex Deucher 			break;
1256d22b7e40SAlex Deucher 	}
1257d22b7e40SAlex Deucher 
1258d22b7e40SAlex Deucher 	if (i < num_blacklist_clocks) {
1259d22b7e40SAlex Deucher 		if (btc_blacklist_clocks[i].action == RADEON_SCLK_UP) {
1260d22b7e40SAlex Deucher 			*sclk = btc_get_valid_sclk(rdev, max_sclk, *sclk + 1);
1261d22b7e40SAlex Deucher 
1262d22b7e40SAlex Deucher 			if (*sclk < max_sclk)
1263d22b7e40SAlex Deucher 				btc_skip_blacklist_clocks(rdev, max_sclk, max_mclk, sclk, mclk);
1264d22b7e40SAlex Deucher 		}
1265d22b7e40SAlex Deucher 	}
1266d22b7e40SAlex Deucher }
1267d22b7e40SAlex Deucher 
126869e0b57aSAlex Deucher void btc_adjust_clock_combinations(struct radeon_device *rdev,
1269d22b7e40SAlex Deucher 				   const struct radeon_clock_and_voltage_limits *max_limits,
1270d22b7e40SAlex Deucher 				   struct rv7xx_pl *pl)
1271d22b7e40SAlex Deucher {
1272d22b7e40SAlex Deucher 
1273d22b7e40SAlex Deucher 	if ((pl->mclk == 0) || (pl->sclk == 0))
1274d22b7e40SAlex Deucher 		return;
1275d22b7e40SAlex Deucher 
1276d22b7e40SAlex Deucher 	if (pl->mclk == pl->sclk)
1277d22b7e40SAlex Deucher 		return;
1278d22b7e40SAlex Deucher 
1279d22b7e40SAlex Deucher 	if (pl->mclk > pl->sclk) {
1280d22b7e40SAlex Deucher 		if (((pl->mclk + (pl->sclk - 1)) / pl->sclk) > rdev->pm.dpm.dyn_state.mclk_sclk_ratio)
1281d22b7e40SAlex Deucher 			pl->sclk = btc_get_valid_sclk(rdev,
1282d22b7e40SAlex Deucher 						      max_limits->sclk,
1283d22b7e40SAlex Deucher 						      (pl->mclk +
1284d22b7e40SAlex Deucher 						       (rdev->pm.dpm.dyn_state.mclk_sclk_ratio - 1)) /
1285d22b7e40SAlex Deucher 						      rdev->pm.dpm.dyn_state.mclk_sclk_ratio);
1286d22b7e40SAlex Deucher 	} else {
1287d22b7e40SAlex Deucher 		if ((pl->sclk - pl->mclk) > rdev->pm.dpm.dyn_state.sclk_mclk_delta)
1288d22b7e40SAlex Deucher 			pl->mclk = btc_get_valid_mclk(rdev,
1289d22b7e40SAlex Deucher 						      max_limits->mclk,
1290d22b7e40SAlex Deucher 						      pl->sclk -
1291d22b7e40SAlex Deucher 						      rdev->pm.dpm.dyn_state.sclk_mclk_delta);
1292d22b7e40SAlex Deucher 	}
1293d22b7e40SAlex Deucher }
1294d22b7e40SAlex Deucher 
1295d22b7e40SAlex Deucher static u16 btc_find_voltage(struct atom_voltage_table *table, u16 voltage)
1296d22b7e40SAlex Deucher {
1297d22b7e40SAlex Deucher 	unsigned int i;
1298d22b7e40SAlex Deucher 
1299d22b7e40SAlex Deucher 	for (i = 0; i < table->count; i++) {
1300d22b7e40SAlex Deucher 		if (voltage <= table->entries[i].value)
1301d22b7e40SAlex Deucher 			return table->entries[i].value;
1302d22b7e40SAlex Deucher 	}
1303d22b7e40SAlex Deucher 
1304d22b7e40SAlex Deucher 	return table->entries[table->count - 1].value;
1305d22b7e40SAlex Deucher }
1306d22b7e40SAlex Deucher 
130769e0b57aSAlex Deucher void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
1308d22b7e40SAlex Deucher 				   u16 max_vddc, u16 max_vddci,
1309d22b7e40SAlex Deucher 				   u16 *vddc, u16 *vddci)
1310d22b7e40SAlex Deucher {
1311d22b7e40SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1312d22b7e40SAlex Deucher 	u16 new_voltage;
1313d22b7e40SAlex Deucher 
1314d22b7e40SAlex Deucher 	if ((0 == *vddc) || (0 == *vddci))
1315d22b7e40SAlex Deucher 		return;
1316d22b7e40SAlex Deucher 
1317d22b7e40SAlex Deucher 	if (*vddc > *vddci) {
1318d22b7e40SAlex Deucher 		if ((*vddc - *vddci) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
1319d22b7e40SAlex Deucher 			new_voltage = btc_find_voltage(&eg_pi->vddci_voltage_table,
1320d22b7e40SAlex Deucher 						       (*vddc - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
1321d22b7e40SAlex Deucher 			*vddci = (new_voltage < max_vddci) ? new_voltage : max_vddci;
1322d22b7e40SAlex Deucher 		}
1323d22b7e40SAlex Deucher 	} else {
1324d22b7e40SAlex Deucher 		if ((*vddci - *vddc) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
1325d22b7e40SAlex Deucher 			new_voltage = btc_find_voltage(&eg_pi->vddc_voltage_table,
1326d22b7e40SAlex Deucher 						       (*vddci - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
1327d22b7e40SAlex Deucher 			*vddc = (new_voltage < max_vddc) ? new_voltage : max_vddc;
1328d22b7e40SAlex Deucher 		}
1329d22b7e40SAlex Deucher 	}
1330d22b7e40SAlex Deucher }
1331d22b7e40SAlex Deucher 
13326596afd4SAlex Deucher static void btc_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev,
13336596afd4SAlex Deucher 					     bool enable)
13346596afd4SAlex Deucher {
13356596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
13366596afd4SAlex Deucher 	u32 tmp, bif;
13376596afd4SAlex Deucher 
13386596afd4SAlex Deucher 	tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
13396596afd4SAlex Deucher 	if (enable) {
13406596afd4SAlex Deucher 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
13416596afd4SAlex Deucher 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
13426596afd4SAlex Deucher 			if (!pi->boot_in_gen2) {
13436596afd4SAlex Deucher 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
13446596afd4SAlex Deucher 				bif |= CG_CLIENT_REQ(0xd);
13456596afd4SAlex Deucher 				WREG32(CG_BIF_REQ_AND_RSP, bif);
13466596afd4SAlex Deucher 
13476596afd4SAlex Deucher 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
13486596afd4SAlex Deucher 				tmp |= LC_HW_VOLTAGE_IF_CONTROL(1);
13496596afd4SAlex Deucher 				tmp |= LC_GEN2_EN_STRAP;
13506596afd4SAlex Deucher 
13516596afd4SAlex Deucher 				tmp |= LC_CLR_FAILED_SPD_CHANGE_CNT;
13526596afd4SAlex Deucher 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13536596afd4SAlex Deucher 				udelay(10);
13546596afd4SAlex Deucher 				tmp &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
13556596afd4SAlex Deucher 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13566596afd4SAlex Deucher 			}
13576596afd4SAlex Deucher 		}
13586596afd4SAlex Deucher 	} else {
13596596afd4SAlex Deucher 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
13606596afd4SAlex Deucher 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
13616596afd4SAlex Deucher 			if (!pi->boot_in_gen2) {
13626596afd4SAlex Deucher 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
13636596afd4SAlex Deucher 				bif |= CG_CLIENT_REQ(0xd);
13646596afd4SAlex Deucher 				WREG32(CG_BIF_REQ_AND_RSP, bif);
13656596afd4SAlex Deucher 
13666596afd4SAlex Deucher 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
13676596afd4SAlex Deucher 				tmp &= ~LC_GEN2_EN_STRAP;
13686596afd4SAlex Deucher 			}
13696596afd4SAlex Deucher 			WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
13706596afd4SAlex Deucher 		}
13716596afd4SAlex Deucher 	}
13726596afd4SAlex Deucher }
13736596afd4SAlex Deucher 
13746596afd4SAlex Deucher static void btc_enable_dynamic_pcie_gen2(struct radeon_device *rdev,
13756596afd4SAlex Deucher 					 bool enable)
13766596afd4SAlex Deucher {
13776596afd4SAlex Deucher 	btc_enable_bif_dynamic_pcie_gen2(rdev, enable);
13786596afd4SAlex Deucher 
13796596afd4SAlex Deucher 	if (enable)
13806596afd4SAlex Deucher 		WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE);
13816596afd4SAlex Deucher 	else
13826596afd4SAlex Deucher 		WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE);
13836596afd4SAlex Deucher }
13846596afd4SAlex Deucher 
13856596afd4SAlex Deucher static int btc_disable_ulv(struct radeon_device *rdev)
13866596afd4SAlex Deucher {
13876596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
13886596afd4SAlex Deucher 
13896596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
13906596afd4SAlex Deucher 		if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) != PPSMC_Result_OK)
13916596afd4SAlex Deucher 			return -EINVAL;
13926596afd4SAlex Deucher 	}
13936596afd4SAlex Deucher 	return 0;
13946596afd4SAlex Deucher }
13956596afd4SAlex Deucher 
13966596afd4SAlex Deucher static int btc_populate_ulv_state(struct radeon_device *rdev,
13976596afd4SAlex Deucher 				  RV770_SMC_STATETABLE *table)
13986596afd4SAlex Deucher {
13996596afd4SAlex Deucher 	int ret = -EINVAL;
14006596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
14016596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
14026596afd4SAlex Deucher 
14036596afd4SAlex Deucher 	if (ulv_pl->vddc) {
14046596afd4SAlex Deucher 		ret = cypress_convert_power_level_to_smc(rdev,
14056596afd4SAlex Deucher 							 ulv_pl,
14066596afd4SAlex Deucher 							 &table->ULVState.levels[0],
14076596afd4SAlex Deucher 							 PPSMC_DISPLAY_WATERMARK_LOW);
14086596afd4SAlex Deucher 		if (ret == 0) {
14096596afd4SAlex Deucher 			table->ULVState.levels[0].arbValue = MC_CG_ARB_FREQ_F0;
14106596afd4SAlex Deucher 			table->ULVState.levels[0].ACIndex = 1;
14116596afd4SAlex Deucher 
14126596afd4SAlex Deucher 			table->ULVState.levels[1] = table->ULVState.levels[0];
14136596afd4SAlex Deucher 			table->ULVState.levels[2] = table->ULVState.levels[0];
14146596afd4SAlex Deucher 
14156596afd4SAlex Deucher 			table->ULVState.flags |= PPSMC_SWSTATE_FLAG_DC;
14166596afd4SAlex Deucher 
14176596afd4SAlex Deucher 			WREG32(CG_ULV_CONTROL, BTC_CGULVCONTROL_DFLT);
14186596afd4SAlex Deucher 			WREG32(CG_ULV_PARAMETER, BTC_CGULVPARAMETER_DFLT);
14196596afd4SAlex Deucher 		}
14206596afd4SAlex Deucher 	}
14216596afd4SAlex Deucher 
14226596afd4SAlex Deucher 	return ret;
14236596afd4SAlex Deucher }
14246596afd4SAlex Deucher 
14256596afd4SAlex Deucher static int btc_populate_smc_acpi_state(struct radeon_device *rdev,
14266596afd4SAlex Deucher 				       RV770_SMC_STATETABLE *table)
14276596afd4SAlex Deucher {
14286596afd4SAlex Deucher 	int ret = cypress_populate_smc_acpi_state(rdev, table);
14296596afd4SAlex Deucher 
14306596afd4SAlex Deucher 	if (ret == 0) {
14316596afd4SAlex Deucher 		table->ACPIState.levels[0].ACIndex = 0;
14326596afd4SAlex Deucher 		table->ACPIState.levels[1].ACIndex = 0;
14336596afd4SAlex Deucher 		table->ACPIState.levels[2].ACIndex = 0;
14346596afd4SAlex Deucher 	}
14356596afd4SAlex Deucher 
14366596afd4SAlex Deucher 	return ret;
14376596afd4SAlex Deucher }
14386596afd4SAlex Deucher 
143969e0b57aSAlex Deucher void btc_program_mgcg_hw_sequence(struct radeon_device *rdev,
14406596afd4SAlex Deucher 				  const u32 *sequence, u32 count)
14416596afd4SAlex Deucher {
14426596afd4SAlex Deucher 	u32 i, length = count * 3;
14436596afd4SAlex Deucher 	u32 tmp;
14446596afd4SAlex Deucher 
14456596afd4SAlex Deucher 	for (i = 0; i < length; i+=3) {
14466596afd4SAlex Deucher 		tmp = RREG32(sequence[i]);
14476596afd4SAlex Deucher 		tmp &= ~sequence[i+2];
14486596afd4SAlex Deucher 		tmp |= sequence[i+1] & sequence[i+2];
14496596afd4SAlex Deucher 		WREG32(sequence[i], tmp);
14506596afd4SAlex Deucher 	}
14516596afd4SAlex Deucher }
14526596afd4SAlex Deucher 
14536596afd4SAlex Deucher static void btc_cg_clock_gating_default(struct radeon_device *rdev)
14546596afd4SAlex Deucher {
14556596afd4SAlex Deucher 	u32 count;
14566596afd4SAlex Deucher 	const u32 *p = NULL;
14576596afd4SAlex Deucher 
14586596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
14596596afd4SAlex Deucher 		p = (const u32 *)&barts_cgcg_cgls_default;
14606596afd4SAlex Deucher 		count = BARTS_CGCG_CGLS_DEFAULT_LENGTH;
14616596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
14626596afd4SAlex Deucher 		p = (const u32 *)&turks_cgcg_cgls_default;
14636596afd4SAlex Deucher 		count = TURKS_CGCG_CGLS_DEFAULT_LENGTH;
14646596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
14656596afd4SAlex Deucher 		p = (const u32 *)&caicos_cgcg_cgls_default;
14666596afd4SAlex Deucher 		count = CAICOS_CGCG_CGLS_DEFAULT_LENGTH;
14676596afd4SAlex Deucher 	} else
14686596afd4SAlex Deucher 		return;
14696596afd4SAlex Deucher 
14706596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
14716596afd4SAlex Deucher }
14726596afd4SAlex Deucher 
14736596afd4SAlex Deucher static void btc_cg_clock_gating_enable(struct radeon_device *rdev,
14746596afd4SAlex Deucher 				       bool enable)
14756596afd4SAlex Deucher {
14766596afd4SAlex Deucher 	u32 count;
14776596afd4SAlex Deucher 	const u32 *p = NULL;
14786596afd4SAlex Deucher 
14796596afd4SAlex Deucher 	if (enable) {
14806596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
14816596afd4SAlex Deucher 			p = (const u32 *)&barts_cgcg_cgls_enable;
14826596afd4SAlex Deucher 			count = BARTS_CGCG_CGLS_ENABLE_LENGTH;
14836596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
14846596afd4SAlex Deucher 			p = (const u32 *)&turks_cgcg_cgls_enable;
14856596afd4SAlex Deucher 			count = TURKS_CGCG_CGLS_ENABLE_LENGTH;
14866596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
14876596afd4SAlex Deucher 			p = (const u32 *)&caicos_cgcg_cgls_enable;
14886596afd4SAlex Deucher 			count = CAICOS_CGCG_CGLS_ENABLE_LENGTH;
14896596afd4SAlex Deucher 		} else
14906596afd4SAlex Deucher 			return;
14916596afd4SAlex Deucher 	} else {
14926596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
14936596afd4SAlex Deucher 			p = (const u32 *)&barts_cgcg_cgls_disable;
14946596afd4SAlex Deucher 			count = BARTS_CGCG_CGLS_DISABLE_LENGTH;
14956596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
14966596afd4SAlex Deucher 			p = (const u32 *)&turks_cgcg_cgls_disable;
14976596afd4SAlex Deucher 			count = TURKS_CGCG_CGLS_DISABLE_LENGTH;
14986596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
14996596afd4SAlex Deucher 			p = (const u32 *)&caicos_cgcg_cgls_disable;
15006596afd4SAlex Deucher 			count = CAICOS_CGCG_CGLS_DISABLE_LENGTH;
15016596afd4SAlex Deucher 		} else
15026596afd4SAlex Deucher 			return;
15036596afd4SAlex Deucher 	}
15046596afd4SAlex Deucher 
15056596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15066596afd4SAlex Deucher }
15076596afd4SAlex Deucher 
15086596afd4SAlex Deucher static void btc_mg_clock_gating_default(struct radeon_device *rdev)
15096596afd4SAlex Deucher {
15106596afd4SAlex Deucher 	u32 count;
15116596afd4SAlex Deucher 	const u32 *p = NULL;
15126596afd4SAlex Deucher 
15136596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
15146596afd4SAlex Deucher 		p = (const u32 *)&barts_mgcg_default;
15156596afd4SAlex Deucher 		count = BARTS_MGCG_DEFAULT_LENGTH;
15166596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
15176596afd4SAlex Deucher 		p = (const u32 *)&turks_mgcg_default;
15186596afd4SAlex Deucher 		count = TURKS_MGCG_DEFAULT_LENGTH;
15196596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
15206596afd4SAlex Deucher 		p = (const u32 *)&caicos_mgcg_default;
15216596afd4SAlex Deucher 		count = CAICOS_MGCG_DEFAULT_LENGTH;
15226596afd4SAlex Deucher 	} else
15236596afd4SAlex Deucher 		return;
15246596afd4SAlex Deucher 
15256596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15266596afd4SAlex Deucher }
15276596afd4SAlex Deucher 
15286596afd4SAlex Deucher static void btc_mg_clock_gating_enable(struct radeon_device *rdev,
15296596afd4SAlex Deucher 				       bool enable)
15306596afd4SAlex Deucher {
15316596afd4SAlex Deucher 	u32 count;
15326596afd4SAlex Deucher 	const u32 *p = NULL;
15336596afd4SAlex Deucher 
15346596afd4SAlex Deucher 	if (enable) {
15356596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15366596afd4SAlex Deucher 			p = (const u32 *)&barts_mgcg_enable;
15376596afd4SAlex Deucher 			count = BARTS_MGCG_ENABLE_LENGTH;
15386596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15396596afd4SAlex Deucher 			p = (const u32 *)&turks_mgcg_enable;
15406596afd4SAlex Deucher 			count = TURKS_MGCG_ENABLE_LENGTH;
15416596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15426596afd4SAlex Deucher 			p = (const u32 *)&caicos_mgcg_enable;
15436596afd4SAlex Deucher 			count = CAICOS_MGCG_ENABLE_LENGTH;
15446596afd4SAlex Deucher 		} else
15456596afd4SAlex Deucher 			return;
15466596afd4SAlex Deucher 	} else {
15476596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15486596afd4SAlex Deucher 			p = (const u32 *)&barts_mgcg_disable[0];
15496596afd4SAlex Deucher 			count = BARTS_MGCG_DISABLE_LENGTH;
15506596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15516596afd4SAlex Deucher 			p = (const u32 *)&turks_mgcg_disable[0];
15526596afd4SAlex Deucher 			count = TURKS_MGCG_DISABLE_LENGTH;
15536596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15546596afd4SAlex Deucher 			p = (const u32 *)&caicos_mgcg_disable[0];
15556596afd4SAlex Deucher 			count = CAICOS_MGCG_DISABLE_LENGTH;
15566596afd4SAlex Deucher 		} else
15576596afd4SAlex Deucher 			return;
15586596afd4SAlex Deucher 	}
15596596afd4SAlex Deucher 
15606596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15616596afd4SAlex Deucher }
15626596afd4SAlex Deucher 
15636596afd4SAlex Deucher static void btc_ls_clock_gating_default(struct radeon_device *rdev)
15646596afd4SAlex Deucher {
15656596afd4SAlex Deucher 	u32 count;
15666596afd4SAlex Deucher 	const u32 *p = NULL;
15676596afd4SAlex Deucher 
15686596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS) {
15696596afd4SAlex Deucher 		p = (const u32 *)&barts_sysls_default;
15706596afd4SAlex Deucher 		count = BARTS_SYSLS_DEFAULT_LENGTH;
15716596afd4SAlex Deucher 	} else if (rdev->family == CHIP_TURKS) {
15726596afd4SAlex Deucher 		p = (const u32 *)&turks_sysls_default;
15736596afd4SAlex Deucher 		count = TURKS_SYSLS_DEFAULT_LENGTH;
15746596afd4SAlex Deucher 	} else if (rdev->family == CHIP_CAICOS) {
15756596afd4SAlex Deucher 		p = (const u32 *)&caicos_sysls_default;
15766596afd4SAlex Deucher 		count = CAICOS_SYSLS_DEFAULT_LENGTH;
15776596afd4SAlex Deucher 	} else
15786596afd4SAlex Deucher 		return;
15796596afd4SAlex Deucher 
15806596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
15816596afd4SAlex Deucher }
15826596afd4SAlex Deucher 
15836596afd4SAlex Deucher static void btc_ls_clock_gating_enable(struct radeon_device *rdev,
15846596afd4SAlex Deucher 				       bool enable)
15856596afd4SAlex Deucher {
15866596afd4SAlex Deucher 	u32 count;
15876596afd4SAlex Deucher 	const u32 *p = NULL;
15886596afd4SAlex Deucher 
15896596afd4SAlex Deucher 	if (enable) {
15906596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
15916596afd4SAlex Deucher 			p = (const u32 *)&barts_sysls_enable;
15926596afd4SAlex Deucher 			count = BARTS_SYSLS_ENABLE_LENGTH;
15936596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
15946596afd4SAlex Deucher 			p = (const u32 *)&turks_sysls_enable;
15956596afd4SAlex Deucher 			count = TURKS_SYSLS_ENABLE_LENGTH;
15966596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
15976596afd4SAlex Deucher 			p = (const u32 *)&caicos_sysls_enable;
15986596afd4SAlex Deucher 			count = CAICOS_SYSLS_ENABLE_LENGTH;
15996596afd4SAlex Deucher 		} else
16006596afd4SAlex Deucher 			return;
16016596afd4SAlex Deucher 	} else {
16026596afd4SAlex Deucher 		if (rdev->family == CHIP_BARTS) {
16036596afd4SAlex Deucher 			p = (const u32 *)&barts_sysls_disable;
16046596afd4SAlex Deucher 			count = BARTS_SYSLS_DISABLE_LENGTH;
16056596afd4SAlex Deucher 		} else if (rdev->family == CHIP_TURKS) {
16066596afd4SAlex Deucher 			p = (const u32 *)&turks_sysls_disable;
16076596afd4SAlex Deucher 			count = TURKS_SYSLS_DISABLE_LENGTH;
16086596afd4SAlex Deucher 		} else if (rdev->family == CHIP_CAICOS) {
16096596afd4SAlex Deucher 			p = (const u32 *)&caicos_sysls_disable;
16106596afd4SAlex Deucher 			count = CAICOS_SYSLS_DISABLE_LENGTH;
16116596afd4SAlex Deucher 		} else
16126596afd4SAlex Deucher 			return;
16136596afd4SAlex Deucher 	}
16146596afd4SAlex Deucher 
16156596afd4SAlex Deucher 	btc_program_mgcg_hw_sequence(rdev, p, count);
16166596afd4SAlex Deucher }
16176596afd4SAlex Deucher 
161869e0b57aSAlex Deucher bool btc_dpm_enabled(struct radeon_device *rdev)
16196596afd4SAlex Deucher {
16206596afd4SAlex Deucher 	if (rv770_is_smc_running(rdev))
16216596afd4SAlex Deucher 		return true;
16226596afd4SAlex Deucher 	else
16236596afd4SAlex Deucher 		return false;
16246596afd4SAlex Deucher }
16256596afd4SAlex Deucher 
16264cb3a02fSAlex Deucher static int btc_init_smc_table(struct radeon_device *rdev,
16274cb3a02fSAlex Deucher 			      struct radeon_ps *radeon_boot_state)
16286596afd4SAlex Deucher {
16296596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
16306596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
16316596afd4SAlex Deucher 	RV770_SMC_STATETABLE *table = &pi->smc_statetable;
16326596afd4SAlex Deucher 	int ret;
16336596afd4SAlex Deucher 
16346596afd4SAlex Deucher 	memset(table, 0, sizeof(RV770_SMC_STATETABLE));
16356596afd4SAlex Deucher 
16366596afd4SAlex Deucher 	cypress_populate_smc_voltage_tables(rdev, table);
16376596afd4SAlex Deucher 
16386596afd4SAlex Deucher 	switch (rdev->pm.int_thermal_type) {
16396596afd4SAlex Deucher         case THERMAL_TYPE_EVERGREEN:
16406596afd4SAlex Deucher         case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
16416596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
16426596afd4SAlex Deucher 		break;
16436596afd4SAlex Deucher         case THERMAL_TYPE_NONE:
16446596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
16456596afd4SAlex Deucher 		break;
16466596afd4SAlex Deucher         default:
16476596afd4SAlex Deucher 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
16486596afd4SAlex Deucher 		break;
16496596afd4SAlex Deucher 	}
16506596afd4SAlex Deucher 
16516596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
16526596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
16536596afd4SAlex Deucher 
16546596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
16556596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT;
16566596afd4SAlex Deucher 
16576596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
16586596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
16596596afd4SAlex Deucher 
16606596afd4SAlex Deucher 	if (pi->mem_gddr5)
16616596afd4SAlex Deucher 		table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
16626596afd4SAlex Deucher 
16636596afd4SAlex Deucher 	ret = cypress_populate_smc_initial_state(rdev, radeon_boot_state, table);
16646596afd4SAlex Deucher 	if (ret)
16656596afd4SAlex Deucher 		return ret;
16666596afd4SAlex Deucher 
16676596afd4SAlex Deucher 	if (eg_pi->sclk_deep_sleep)
16686596afd4SAlex Deucher 		WREG32_P(SCLK_PSKIP_CNTL, PSKIP_ON_ALLOW_STOP_HI(32),
16696596afd4SAlex Deucher 			 ~PSKIP_ON_ALLOW_STOP_HI_MASK);
16706596afd4SAlex Deucher 
16716596afd4SAlex Deucher 	ret = btc_populate_smc_acpi_state(rdev, table);
16726596afd4SAlex Deucher 	if (ret)
16736596afd4SAlex Deucher 		return ret;
16746596afd4SAlex Deucher 
16756596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
16766596afd4SAlex Deucher 		ret = btc_populate_ulv_state(rdev, table);
16776596afd4SAlex Deucher 		if (ret)
16786596afd4SAlex Deucher 			eg_pi->ulv.supported = false;
16796596afd4SAlex Deucher 	}
16806596afd4SAlex Deucher 
16816596afd4SAlex Deucher 	table->driverState = table->initialState;
16826596afd4SAlex Deucher 
16836596afd4SAlex Deucher 	return rv770_copy_bytes_to_smc(rdev,
16846596afd4SAlex Deucher 				       pi->state_table_start,
16856596afd4SAlex Deucher 				       (u8 *)table,
16866596afd4SAlex Deucher 				       sizeof(RV770_SMC_STATETABLE),
16876596afd4SAlex Deucher 				       pi->sram_end);
16886596afd4SAlex Deucher }
16896596afd4SAlex Deucher 
16904cb3a02fSAlex Deucher static void btc_set_at_for_uvd(struct radeon_device *rdev,
16914cb3a02fSAlex Deucher 			       struct radeon_ps *radeon_new_state)
1692f85392bcSAlex Deucher {
1693f85392bcSAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
1694f85392bcSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1695f85392bcSAlex Deucher 	int idx = 0;
1696f85392bcSAlex Deucher 
1697f85392bcSAlex Deucher 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2))
1698f85392bcSAlex Deucher 		idx = 1;
1699f85392bcSAlex Deucher 
1700f85392bcSAlex Deucher 	if ((idx == 1) && !eg_pi->smu_uvd_hs) {
1701f85392bcSAlex Deucher 		pi->rlp = 10;
1702f85392bcSAlex Deucher 		pi->rmp = 100;
1703f85392bcSAlex Deucher 		pi->lhp = 100;
1704f85392bcSAlex Deucher 		pi->lmp = 10;
1705f85392bcSAlex Deucher 	} else {
1706f85392bcSAlex Deucher 		pi->rlp = eg_pi->ats[idx].rlp;
1707f85392bcSAlex Deucher 		pi->rmp = eg_pi->ats[idx].rmp;
1708f85392bcSAlex Deucher 		pi->lhp = eg_pi->ats[idx].lhp;
1709f85392bcSAlex Deucher 		pi->lmp = eg_pi->ats[idx].lmp;
1710f85392bcSAlex Deucher 	}
1711f85392bcSAlex Deucher 
1712f85392bcSAlex Deucher }
1713f85392bcSAlex Deucher 
17144cb3a02fSAlex Deucher void btc_notify_uvd_to_smc(struct radeon_device *rdev,
17154cb3a02fSAlex Deucher 			   struct radeon_ps *radeon_new_state)
1716f85392bcSAlex Deucher {
1717f85392bcSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
1718f85392bcSAlex Deucher 
1719f85392bcSAlex Deucher 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2)) {
1720f85392bcSAlex Deucher 		rv770_write_smc_soft_register(rdev,
1721f85392bcSAlex Deucher 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 1);
1722f85392bcSAlex Deucher 		eg_pi->uvd_enabled = true;
1723f85392bcSAlex Deucher 	} else {
1724f85392bcSAlex Deucher 		rv770_write_smc_soft_register(rdev,
1725f85392bcSAlex Deucher 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 0);
1726f85392bcSAlex Deucher 		eg_pi->uvd_enabled = false;
1727f85392bcSAlex Deucher 	}
1728f85392bcSAlex Deucher }
1729f85392bcSAlex Deucher 
173069e0b57aSAlex Deucher int btc_reset_to_default(struct radeon_device *rdev)
17316596afd4SAlex Deucher {
17326596afd4SAlex Deucher 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) != PPSMC_Result_OK)
17336596afd4SAlex Deucher 		return -EINVAL;
17346596afd4SAlex Deucher 
17356596afd4SAlex Deucher 	return 0;
17366596afd4SAlex Deucher }
17376596afd4SAlex Deucher 
17386596afd4SAlex Deucher static void btc_stop_smc(struct radeon_device *rdev)
17396596afd4SAlex Deucher {
17406596afd4SAlex Deucher 	int i;
17416596afd4SAlex Deucher 
17426596afd4SAlex Deucher 	for (i = 0; i < rdev->usec_timeout; i++) {
17436596afd4SAlex Deucher 		if (((RREG32(LB_SYNC_RESET_SEL) & LB_SYNC_RESET_SEL_MASK) >> LB_SYNC_RESET_SEL_SHIFT) != 1)
17446596afd4SAlex Deucher 			break;
17456596afd4SAlex Deucher 		udelay(1);
17466596afd4SAlex Deucher 	}
17476596afd4SAlex Deucher 	udelay(100);
17486596afd4SAlex Deucher 
17496596afd4SAlex Deucher 	r7xx_stop_smc(rdev);
17506596afd4SAlex Deucher }
17516596afd4SAlex Deucher 
175269e0b57aSAlex Deucher void btc_read_arb_registers(struct radeon_device *rdev)
17536596afd4SAlex Deucher {
17546596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17556596afd4SAlex Deucher 	struct evergreen_arb_registers *arb_registers =
17566596afd4SAlex Deucher 		&eg_pi->bootup_arb_registers;
17576596afd4SAlex Deucher 
17586596afd4SAlex Deucher 	arb_registers->mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
17596596afd4SAlex Deucher 	arb_registers->mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
17606596afd4SAlex Deucher 	arb_registers->mc_arb_rfsh_rate = RREG32(MC_ARB_RFSH_RATE);
17616596afd4SAlex Deucher 	arb_registers->mc_arb_burst_time = RREG32(MC_ARB_BURST_TIME);
17626596afd4SAlex Deucher }
17636596afd4SAlex Deucher 
17646596afd4SAlex Deucher 
17656596afd4SAlex Deucher static void btc_set_arb0_registers(struct radeon_device *rdev,
17666596afd4SAlex Deucher 				   struct evergreen_arb_registers *arb_registers)
17676596afd4SAlex Deucher {
17686596afd4SAlex Deucher 	u32 val;
17696596afd4SAlex Deucher 
17706596afd4SAlex Deucher 	WREG32(MC_ARB_DRAM_TIMING,  arb_registers->mc_arb_dram_timing);
17716596afd4SAlex Deucher 	WREG32(MC_ARB_DRAM_TIMING2, arb_registers->mc_arb_dram_timing2);
17726596afd4SAlex Deucher 
17736596afd4SAlex Deucher 	val = (arb_registers->mc_arb_rfsh_rate & POWERMODE0_MASK) >>
17746596afd4SAlex Deucher 		POWERMODE0_SHIFT;
17756596afd4SAlex Deucher 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
17766596afd4SAlex Deucher 
17776596afd4SAlex Deucher 	val = (arb_registers->mc_arb_burst_time & STATE0_MASK) >>
17786596afd4SAlex Deucher 		STATE0_SHIFT;
17796596afd4SAlex Deucher 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
17806596afd4SAlex Deucher }
17816596afd4SAlex Deucher 
17826596afd4SAlex Deucher static void btc_set_boot_state_timing(struct radeon_device *rdev)
17836596afd4SAlex Deucher {
17846596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17856596afd4SAlex Deucher 
17866596afd4SAlex Deucher 	if (eg_pi->ulv.supported)
17876596afd4SAlex Deucher 		btc_set_arb0_registers(rdev, &eg_pi->bootup_arb_registers);
17886596afd4SAlex Deucher }
17896596afd4SAlex Deucher 
17906596afd4SAlex Deucher static bool btc_is_state_ulv_compatible(struct radeon_device *rdev,
17916596afd4SAlex Deucher 					struct radeon_ps *radeon_state)
17926596afd4SAlex Deucher {
17936596afd4SAlex Deucher 	struct rv7xx_ps *state = rv770_get_ps(radeon_state);
17946596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
17956596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
17966596afd4SAlex Deucher 
17976596afd4SAlex Deucher 	if (state->low.mclk != ulv_pl->mclk)
17986596afd4SAlex Deucher 		return false;
17996596afd4SAlex Deucher 
18006596afd4SAlex Deucher 	if (state->low.vddci != ulv_pl->vddci)
18016596afd4SAlex Deucher 		return false;
18026596afd4SAlex Deucher 
18036596afd4SAlex Deucher 	/* XXX check minclocks, etc. */
18046596afd4SAlex Deucher 
18056596afd4SAlex Deucher 	return true;
18066596afd4SAlex Deucher }
18076596afd4SAlex Deucher 
18086596afd4SAlex Deucher 
18096596afd4SAlex Deucher static int btc_set_ulv_dram_timing(struct radeon_device *rdev)
18106596afd4SAlex Deucher {
18116596afd4SAlex Deucher 	u32 val;
18126596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
18136596afd4SAlex Deucher 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
18146596afd4SAlex Deucher 
18156596afd4SAlex Deucher 	radeon_atom_set_engine_dram_timings(rdev,
18166596afd4SAlex Deucher 					    ulv_pl->sclk,
18176596afd4SAlex Deucher 					    ulv_pl->mclk);
18186596afd4SAlex Deucher 
18196596afd4SAlex Deucher 	val = rv770_calculate_memory_refresh_rate(rdev, ulv_pl->sclk);
18206596afd4SAlex Deucher 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
18216596afd4SAlex Deucher 
18226596afd4SAlex Deucher 	val = cypress_calculate_burst_time(rdev, ulv_pl->sclk, ulv_pl->mclk);
18236596afd4SAlex Deucher 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
18246596afd4SAlex Deucher 
18256596afd4SAlex Deucher 	return 0;
18266596afd4SAlex Deucher }
18276596afd4SAlex Deucher 
18286596afd4SAlex Deucher static int btc_enable_ulv(struct radeon_device *rdev)
18296596afd4SAlex Deucher {
18306596afd4SAlex Deucher 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) != PPSMC_Result_OK)
18316596afd4SAlex Deucher 		return -EINVAL;
18326596afd4SAlex Deucher 
18336596afd4SAlex Deucher 	return 0;
18346596afd4SAlex Deucher }
18356596afd4SAlex Deucher 
18364cb3a02fSAlex Deucher static int btc_set_power_state_conditionally_enable_ulv(struct radeon_device *rdev,
18374cb3a02fSAlex Deucher 							struct radeon_ps *radeon_new_state)
18386596afd4SAlex Deucher {
18396596afd4SAlex Deucher 	int ret = 0;
18406596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
18416596afd4SAlex Deucher 
18426596afd4SAlex Deucher 	if (eg_pi->ulv.supported) {
18436596afd4SAlex Deucher 		if (btc_is_state_ulv_compatible(rdev, radeon_new_state)) {
18446596afd4SAlex Deucher 			// Set ARB[0] to reflect the DRAM timing needed for ULV.
18456596afd4SAlex Deucher 			ret = btc_set_ulv_dram_timing(rdev);
18466596afd4SAlex Deucher 			if (ret == 0)
18476596afd4SAlex Deucher 				ret = btc_enable_ulv(rdev);
18486596afd4SAlex Deucher 		}
18496596afd4SAlex Deucher 	}
18506596afd4SAlex Deucher 
18516596afd4SAlex Deucher 	return ret;
18526596afd4SAlex Deucher }
18536596afd4SAlex Deucher 
18546596afd4SAlex Deucher static bool btc_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
18556596afd4SAlex Deucher {
18566596afd4SAlex Deucher 	bool result = true;
18576596afd4SAlex Deucher 
18586596afd4SAlex Deucher 	switch (in_reg) {
18596596afd4SAlex Deucher 	case MC_SEQ_RAS_TIMING >> 2:
18606596afd4SAlex Deucher 		*out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
18616596afd4SAlex Deucher 		break;
18626596afd4SAlex Deucher         case MC_SEQ_CAS_TIMING >> 2:
18636596afd4SAlex Deucher 		*out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
18646596afd4SAlex Deucher 		break;
18656596afd4SAlex Deucher         case MC_SEQ_MISC_TIMING >> 2:
18666596afd4SAlex Deucher 		*out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
18676596afd4SAlex Deucher 		break;
18686596afd4SAlex Deucher         case MC_SEQ_MISC_TIMING2 >> 2:
18696596afd4SAlex Deucher 		*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
18706596afd4SAlex Deucher 		break;
18716596afd4SAlex Deucher         case MC_SEQ_RD_CTL_D0 >> 2:
18726596afd4SAlex Deucher 		*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
18736596afd4SAlex Deucher 		break;
18746596afd4SAlex Deucher         case MC_SEQ_RD_CTL_D1 >> 2:
18756596afd4SAlex Deucher 		*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
18766596afd4SAlex Deucher 		break;
18776596afd4SAlex Deucher         case MC_SEQ_WR_CTL_D0 >> 2:
18786596afd4SAlex Deucher 		*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
18796596afd4SAlex Deucher 		break;
18806596afd4SAlex Deucher         case MC_SEQ_WR_CTL_D1 >> 2:
18816596afd4SAlex Deucher 		*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
18826596afd4SAlex Deucher 		break;
18836596afd4SAlex Deucher         case MC_PMG_CMD_EMRS >> 2:
18846596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
18856596afd4SAlex Deucher 		break;
18866596afd4SAlex Deucher         case MC_PMG_CMD_MRS >> 2:
18876596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
18886596afd4SAlex Deucher 		break;
18896596afd4SAlex Deucher         case MC_PMG_CMD_MRS1 >> 2:
18906596afd4SAlex Deucher 		*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
18916596afd4SAlex Deucher 		break;
18926596afd4SAlex Deucher         default:
18936596afd4SAlex Deucher 		result = false;
18946596afd4SAlex Deucher 		break;
18956596afd4SAlex Deucher 	}
18966596afd4SAlex Deucher 
18976596afd4SAlex Deucher 	return result;
18986596afd4SAlex Deucher }
18996596afd4SAlex Deucher 
19006596afd4SAlex Deucher static void btc_set_valid_flag(struct evergreen_mc_reg_table *table)
19016596afd4SAlex Deucher {
19026596afd4SAlex Deucher 	u8 i, j;
19036596afd4SAlex Deucher 
19046596afd4SAlex Deucher 	for (i = 0; i < table->last; i++) {
19056596afd4SAlex Deucher 		for (j = 1; j < table->num_entries; j++) {
19066596afd4SAlex Deucher 			if (table->mc_reg_table_entry[j-1].mc_data[i] !=
19076596afd4SAlex Deucher 			    table->mc_reg_table_entry[j].mc_data[i]) {
19086596afd4SAlex Deucher 				table->valid_flag |= (1 << i);
19096596afd4SAlex Deucher 				break;
19106596afd4SAlex Deucher 			}
19116596afd4SAlex Deucher 		}
19126596afd4SAlex Deucher 	}
19136596afd4SAlex Deucher }
19146596afd4SAlex Deucher 
19156596afd4SAlex Deucher static int btc_set_mc_special_registers(struct radeon_device *rdev,
19166596afd4SAlex Deucher 					struct evergreen_mc_reg_table *table)
19176596afd4SAlex Deucher {
19186596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
19196596afd4SAlex Deucher 	u8 i, j, k;
19206596afd4SAlex Deucher 	u32 tmp;
19216596afd4SAlex Deucher 
19226596afd4SAlex Deucher 	for (i = 0, j = table->last; i < table->last; i++) {
19236596afd4SAlex Deucher 		switch (table->mc_reg_address[i].s1) {
19246596afd4SAlex Deucher 		case MC_SEQ_MISC1 >> 2:
19256596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_EMRS);
19266596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
19276596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_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] & 0xffff0000) >> 16);
19326596afd4SAlex Deucher 			}
19336596afd4SAlex Deucher 			j++;
19346596afd4SAlex Deucher 
193596d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19366596afd4SAlex Deucher 				return -EINVAL;
19376596afd4SAlex Deucher 
19386596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_MRS);
19396596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
19406596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
19416596afd4SAlex Deucher 			for (k = 0; k < table->num_entries; k++) {
19426596afd4SAlex Deucher 				table->mc_reg_table_entry[k].mc_data[j] =
19436596afd4SAlex Deucher 					(tmp & 0xffff0000) |
19446596afd4SAlex Deucher 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
19456596afd4SAlex Deucher 				if (!pi->mem_gddr5)
19466596afd4SAlex Deucher 					table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
19476596afd4SAlex Deucher 			}
19486596afd4SAlex Deucher 			j++;
19496596afd4SAlex Deucher 
195096d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19516596afd4SAlex Deucher 				return -EINVAL;
19526596afd4SAlex Deucher 			break;
19536596afd4SAlex Deucher 		case MC_SEQ_RESERVE_M >> 2:
19546596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_CMD_MRS1);
19556596afd4SAlex Deucher 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
19566596afd4SAlex Deucher 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
19576596afd4SAlex Deucher 			for (k = 0; k < table->num_entries; k++) {
19586596afd4SAlex Deucher 				table->mc_reg_table_entry[k].mc_data[j] =
19596596afd4SAlex Deucher 					(tmp & 0xffff0000) |
19606596afd4SAlex Deucher 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
19616596afd4SAlex Deucher 			}
19626596afd4SAlex Deucher 			j++;
19636596afd4SAlex Deucher 
196496d8df84SDan Carpenter 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19656596afd4SAlex Deucher 				return -EINVAL;
19666596afd4SAlex Deucher 			break;
19676596afd4SAlex Deucher 		default:
19686596afd4SAlex Deucher 			break;
19696596afd4SAlex Deucher 		}
19706596afd4SAlex Deucher 	}
19716596afd4SAlex Deucher 
19726596afd4SAlex Deucher 	table->last = j;
19736596afd4SAlex Deucher 
19746596afd4SAlex Deucher 	return 0;
19756596afd4SAlex Deucher }
19766596afd4SAlex Deucher 
19776596afd4SAlex Deucher static void btc_set_s0_mc_reg_index(struct evergreen_mc_reg_table *table)
19786596afd4SAlex Deucher {
19796596afd4SAlex Deucher 	u32 i;
19806596afd4SAlex Deucher 	u16 address;
19816596afd4SAlex Deucher 
19826596afd4SAlex Deucher 	for (i = 0; i < table->last; i++) {
19836596afd4SAlex Deucher 		table->mc_reg_address[i].s0 =
19846596afd4SAlex Deucher 			btc_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
19856596afd4SAlex Deucher 			address : table->mc_reg_address[i].s1;
19866596afd4SAlex Deucher 	}
19876596afd4SAlex Deucher }
19886596afd4SAlex Deucher 
19896596afd4SAlex Deucher static int btc_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table,
19906596afd4SAlex Deucher 				       struct evergreen_mc_reg_table *eg_table)
19916596afd4SAlex Deucher {
19926596afd4SAlex Deucher 	u8 i, j;
19936596afd4SAlex Deucher 
19946596afd4SAlex Deucher 	if (table->last > SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
19956596afd4SAlex Deucher 		return -EINVAL;
19966596afd4SAlex Deucher 
19976596afd4SAlex Deucher 	if (table->num_entries > MAX_AC_TIMING_ENTRIES)
19986596afd4SAlex Deucher 		return -EINVAL;
19996596afd4SAlex Deucher 
20006596afd4SAlex Deucher 	for (i = 0; i < table->last; i++)
20016596afd4SAlex Deucher 		eg_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
20026596afd4SAlex Deucher 	eg_table->last = table->last;
20036596afd4SAlex Deucher 
20046596afd4SAlex Deucher 	for (i = 0; i < table->num_entries; i++) {
20056596afd4SAlex Deucher 		eg_table->mc_reg_table_entry[i].mclk_max =
20066596afd4SAlex Deucher 			table->mc_reg_table_entry[i].mclk_max;
20076596afd4SAlex Deucher 		for(j = 0; j < table->last; j++)
20086596afd4SAlex Deucher 			eg_table->mc_reg_table_entry[i].mc_data[j] =
20096596afd4SAlex Deucher 				table->mc_reg_table_entry[i].mc_data[j];
20106596afd4SAlex Deucher 	}
20116596afd4SAlex Deucher 	eg_table->num_entries = table->num_entries;
20126596afd4SAlex Deucher 
20136596afd4SAlex Deucher 	return 0;
20146596afd4SAlex Deucher }
20156596afd4SAlex Deucher 
20166596afd4SAlex Deucher static int btc_initialize_mc_reg_table(struct radeon_device *rdev)
20176596afd4SAlex Deucher {
20186596afd4SAlex Deucher 	int ret;
20196596afd4SAlex Deucher 	struct atom_mc_reg_table *table;
20206596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
20216596afd4SAlex Deucher 	struct evergreen_mc_reg_table *eg_table = &eg_pi->mc_reg_table;
20226596afd4SAlex Deucher 	u8 module_index = rv770_get_memory_module_index(rdev);
20236596afd4SAlex Deucher 
20246596afd4SAlex Deucher 	table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
20256596afd4SAlex Deucher 	if (!table)
20266596afd4SAlex Deucher 		return -ENOMEM;
20276596afd4SAlex Deucher 
20286596afd4SAlex Deucher 	/* Program additional LP registers that are no longer programmed by VBIOS */
20296596afd4SAlex Deucher 	WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
20306596afd4SAlex Deucher 	WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
20316596afd4SAlex Deucher 	WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
20326596afd4SAlex Deucher 	WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
20336596afd4SAlex Deucher 	WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
20346596afd4SAlex Deucher 	WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
20356596afd4SAlex Deucher 	WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
20366596afd4SAlex Deucher 	WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
20376596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
20386596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
20396596afd4SAlex Deucher 	WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
20406596afd4SAlex Deucher 
20416596afd4SAlex Deucher 	ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
20426596afd4SAlex Deucher 
20436596afd4SAlex Deucher 	if (ret)
20446596afd4SAlex Deucher 		goto init_mc_done;
20456596afd4SAlex Deucher 
20466596afd4SAlex Deucher 	ret = btc_copy_vbios_mc_reg_table(table, eg_table);
20476596afd4SAlex Deucher 
20486596afd4SAlex Deucher 	if (ret)
20496596afd4SAlex Deucher 		goto init_mc_done;
20506596afd4SAlex Deucher 
20516596afd4SAlex Deucher 	btc_set_s0_mc_reg_index(eg_table);
20526596afd4SAlex Deucher 	ret = btc_set_mc_special_registers(rdev, eg_table);
20536596afd4SAlex Deucher 
20546596afd4SAlex Deucher 	if (ret)
20556596afd4SAlex Deucher 		goto init_mc_done;
20566596afd4SAlex Deucher 
20576596afd4SAlex Deucher 	btc_set_valid_flag(eg_table);
20586596afd4SAlex Deucher 
20596596afd4SAlex Deucher init_mc_done:
20606596afd4SAlex Deucher 	kfree(table);
20616596afd4SAlex Deucher 
20626596afd4SAlex Deucher 	return ret;
20636596afd4SAlex Deucher }
20646596afd4SAlex Deucher 
20656596afd4SAlex Deucher static void btc_init_stutter_mode(struct radeon_device *rdev)
20666596afd4SAlex Deucher {
20676596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
20686596afd4SAlex Deucher 	u32 tmp;
20696596afd4SAlex Deucher 
20706596afd4SAlex Deucher 	if (pi->mclk_stutter_mode_threshold) {
20716596afd4SAlex Deucher 		if (pi->mem_gddr5) {
20726596afd4SAlex Deucher 			tmp = RREG32(MC_PMG_AUTO_CFG);
20736596afd4SAlex Deucher 			if ((0x200 & tmp) == 0) {
20746596afd4SAlex Deucher 				tmp = (tmp & 0xfffffc0b) | 0x204;
20756596afd4SAlex Deucher 				WREG32(MC_PMG_AUTO_CFG, tmp);
20766596afd4SAlex Deucher 			}
20776596afd4SAlex Deucher 		}
20786596afd4SAlex Deucher 	}
20796596afd4SAlex Deucher }
20806596afd4SAlex Deucher 
2081a84301c6SAlex Deucher bool btc_dpm_vblank_too_short(struct radeon_device *rdev)
2082a84301c6SAlex Deucher {
2083a84301c6SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2084a84301c6SAlex Deucher 	u32 vblank_time = r600_dpm_get_vblank_time(rdev);
2085a84301c6SAlex Deucher 	u32 switch_limit = pi->mem_gddr5 ? 450 : 100;
2086a84301c6SAlex Deucher 
2087a84301c6SAlex Deucher 	if (vblank_time < switch_limit)
2088a84301c6SAlex Deucher 		return true;
2089a84301c6SAlex Deucher 	else
2090a84301c6SAlex Deucher 		return false;
2091a84301c6SAlex Deucher 
2092a84301c6SAlex Deucher }
2093a84301c6SAlex Deucher 
20944cb3a02fSAlex Deucher static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
20954cb3a02fSAlex Deucher 					 struct radeon_ps *rps)
2096d22b7e40SAlex Deucher {
2097d22b7e40SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
2098d22b7e40SAlex Deucher 	struct radeon_clock_and_voltage_limits *max_limits;
2099d22b7e40SAlex Deucher 	bool disable_mclk_switching;
2100d22b7e40SAlex Deucher 	u32 mclk, sclk;
2101d22b7e40SAlex Deucher 	u16 vddc, vddci;
21021f28fb92SAlex Deucher 	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
2103d22b7e40SAlex Deucher 
2104a84301c6SAlex Deucher 	if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
2105a84301c6SAlex Deucher 	    btc_dpm_vblank_too_short(rdev))
2106d22b7e40SAlex Deucher 		disable_mclk_switching = true;
2107d22b7e40SAlex Deucher 	else
2108d22b7e40SAlex Deucher 		disable_mclk_switching = false;
2109d22b7e40SAlex Deucher 
2110d22b7e40SAlex Deucher 	if (rdev->pm.dpm.ac_power)
2111d22b7e40SAlex Deucher 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
2112d22b7e40SAlex Deucher 	else
2113d22b7e40SAlex Deucher 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
2114d22b7e40SAlex Deucher 
2115d22b7e40SAlex Deucher 	if (rdev->pm.dpm.ac_power == false) {
2116d22b7e40SAlex Deucher 		if (ps->high.mclk > max_limits->mclk)
2117d22b7e40SAlex Deucher 			ps->high.mclk = max_limits->mclk;
2118d22b7e40SAlex Deucher 		if (ps->high.sclk > max_limits->sclk)
2119d22b7e40SAlex Deucher 			ps->high.sclk = max_limits->sclk;
2120d22b7e40SAlex Deucher 		if (ps->high.vddc > max_limits->vddc)
2121d22b7e40SAlex Deucher 			ps->high.vddc = max_limits->vddc;
2122d22b7e40SAlex Deucher 		if (ps->high.vddci > max_limits->vddci)
2123d22b7e40SAlex Deucher 			ps->high.vddci = max_limits->vddci;
2124d22b7e40SAlex Deucher 
2125d22b7e40SAlex Deucher 		if (ps->medium.mclk > max_limits->mclk)
2126d22b7e40SAlex Deucher 			ps->medium.mclk = max_limits->mclk;
2127d22b7e40SAlex Deucher 		if (ps->medium.sclk > max_limits->sclk)
2128d22b7e40SAlex Deucher 			ps->medium.sclk = max_limits->sclk;
2129d22b7e40SAlex Deucher 		if (ps->medium.vddc > max_limits->vddc)
2130d22b7e40SAlex Deucher 			ps->medium.vddc = max_limits->vddc;
2131d22b7e40SAlex Deucher 		if (ps->medium.vddci > max_limits->vddci)
2132d22b7e40SAlex Deucher 			ps->medium.vddci = max_limits->vddci;
2133d22b7e40SAlex Deucher 
2134d22b7e40SAlex Deucher 		if (ps->low.mclk > max_limits->mclk)
2135d22b7e40SAlex Deucher 			ps->low.mclk = max_limits->mclk;
2136d22b7e40SAlex Deucher 		if (ps->low.sclk > max_limits->sclk)
2137d22b7e40SAlex Deucher 			ps->low.sclk = max_limits->sclk;
2138d22b7e40SAlex Deucher 		if (ps->low.vddc > max_limits->vddc)
2139d22b7e40SAlex Deucher 			ps->low.vddc = max_limits->vddc;
2140d22b7e40SAlex Deucher 		if (ps->low.vddci > max_limits->vddci)
2141d22b7e40SAlex Deucher 			ps->low.vddci = max_limits->vddci;
2142d22b7e40SAlex Deucher 	}
2143d22b7e40SAlex Deucher 
21441f28fb92SAlex Deucher 	/* limit clocks to max supported clocks based on voltage dependency tables */
21451f28fb92SAlex Deucher 	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
21461f28fb92SAlex Deucher 							&max_sclk_vddc);
21471f28fb92SAlex Deucher 	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
21481f28fb92SAlex Deucher 							&max_mclk_vddci);
21491f28fb92SAlex Deucher 	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
21501f28fb92SAlex Deucher 							&max_mclk_vddc);
21511f28fb92SAlex Deucher 
21521f28fb92SAlex Deucher 	if (max_sclk_vddc) {
21531f28fb92SAlex Deucher 		if (ps->low.sclk > max_sclk_vddc)
21541f28fb92SAlex Deucher 			ps->low.sclk = max_sclk_vddc;
21551f28fb92SAlex Deucher 		if (ps->medium.sclk > max_sclk_vddc)
21561f28fb92SAlex Deucher 			ps->medium.sclk = max_sclk_vddc;
21571f28fb92SAlex Deucher 		if (ps->high.sclk > max_sclk_vddc)
21581f28fb92SAlex Deucher 			ps->high.sclk = max_sclk_vddc;
21591f28fb92SAlex Deucher 	}
21601f28fb92SAlex Deucher 	if (max_mclk_vddci) {
21611f28fb92SAlex Deucher 		if (ps->low.mclk > max_mclk_vddci)
21621f28fb92SAlex Deucher 			ps->low.mclk = max_mclk_vddci;
21631f28fb92SAlex Deucher 		if (ps->medium.mclk > max_mclk_vddci)
21641f28fb92SAlex Deucher 			ps->medium.mclk = max_mclk_vddci;
21651f28fb92SAlex Deucher 		if (ps->high.mclk > max_mclk_vddci)
21661f28fb92SAlex Deucher 			ps->high.mclk = max_mclk_vddci;
21671f28fb92SAlex Deucher 	}
21681f28fb92SAlex Deucher 	if (max_mclk_vddc) {
21691f28fb92SAlex Deucher 		if (ps->low.mclk > max_mclk_vddc)
21701f28fb92SAlex Deucher 			ps->low.mclk = max_mclk_vddc;
21711f28fb92SAlex Deucher 		if (ps->medium.mclk > max_mclk_vddc)
21721f28fb92SAlex Deucher 			ps->medium.mclk = max_mclk_vddc;
21731f28fb92SAlex Deucher 		if (ps->high.mclk > max_mclk_vddc)
21741f28fb92SAlex Deucher 			ps->high.mclk = max_mclk_vddc;
21751f28fb92SAlex Deucher 	}
21761f28fb92SAlex Deucher 
2177d22b7e40SAlex Deucher 	/* XXX validate the min clocks required for display */
2178d22b7e40SAlex Deucher 
2179d22b7e40SAlex Deucher 	if (disable_mclk_switching) {
2180d22b7e40SAlex Deucher 		sclk = ps->low.sclk;
2181d22b7e40SAlex Deucher 		mclk = ps->high.mclk;
2182d22b7e40SAlex Deucher 		vddc = ps->low.vddc;
2183d22b7e40SAlex Deucher 		vddci = ps->high.vddci;
2184d22b7e40SAlex Deucher 	} else {
2185d22b7e40SAlex Deucher 		sclk = ps->low.sclk;
2186d22b7e40SAlex Deucher 		mclk = ps->low.mclk;
2187d22b7e40SAlex Deucher 		vddc = ps->low.vddc;
2188d22b7e40SAlex Deucher 		vddci = ps->low.vddci;
2189d22b7e40SAlex Deucher 	}
2190d22b7e40SAlex Deucher 
2191d22b7e40SAlex Deucher 	/* adjusted low state */
2192d22b7e40SAlex Deucher 	ps->low.sclk = sclk;
2193d22b7e40SAlex Deucher 	ps->low.mclk = mclk;
2194d22b7e40SAlex Deucher 	ps->low.vddc = vddc;
2195d22b7e40SAlex Deucher 	ps->low.vddci = vddci;
2196d22b7e40SAlex Deucher 
2197d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2198d22b7e40SAlex Deucher 				  &ps->low.sclk, &ps->low.mclk);
2199d22b7e40SAlex Deucher 
2200d22b7e40SAlex Deucher 	/* adjusted medium, high states */
2201d22b7e40SAlex Deucher 	if (ps->medium.sclk < ps->low.sclk)
2202d22b7e40SAlex Deucher 		ps->medium.sclk = ps->low.sclk;
2203d22b7e40SAlex Deucher 	if (ps->medium.vddc < ps->low.vddc)
2204d22b7e40SAlex Deucher 		ps->medium.vddc = ps->low.vddc;
2205d22b7e40SAlex Deucher 	if (ps->high.sclk < ps->medium.sclk)
2206d22b7e40SAlex Deucher 		ps->high.sclk = ps->medium.sclk;
2207d22b7e40SAlex Deucher 	if (ps->high.vddc < ps->medium.vddc)
2208d22b7e40SAlex Deucher 		ps->high.vddc = ps->medium.vddc;
2209d22b7e40SAlex Deucher 
2210d22b7e40SAlex Deucher 	if (disable_mclk_switching) {
2211d22b7e40SAlex Deucher 		mclk = ps->low.mclk;
2212d22b7e40SAlex Deucher 		if (mclk < ps->medium.mclk)
2213d22b7e40SAlex Deucher 			mclk = ps->medium.mclk;
2214d22b7e40SAlex Deucher 		if (mclk < ps->high.mclk)
2215d22b7e40SAlex Deucher 			mclk = ps->high.mclk;
2216d22b7e40SAlex Deucher 		ps->low.mclk = mclk;
2217d22b7e40SAlex Deucher 		ps->low.vddci = vddci;
2218d22b7e40SAlex Deucher 		ps->medium.mclk = mclk;
2219d22b7e40SAlex Deucher 		ps->medium.vddci = vddci;
2220d22b7e40SAlex Deucher 		ps->high.mclk = mclk;
2221d22b7e40SAlex Deucher 		ps->high.vddci = vddci;
2222d22b7e40SAlex Deucher 	} else {
2223d22b7e40SAlex Deucher 		if (ps->medium.mclk < ps->low.mclk)
2224d22b7e40SAlex Deucher 			ps->medium.mclk = ps->low.mclk;
2225d22b7e40SAlex Deucher 		if (ps->medium.vddci < ps->low.vddci)
2226d22b7e40SAlex Deucher 			ps->medium.vddci = ps->low.vddci;
2227d22b7e40SAlex Deucher 		if (ps->high.mclk < ps->medium.mclk)
2228d22b7e40SAlex Deucher 			ps->high.mclk = ps->medium.mclk;
2229d22b7e40SAlex Deucher 		if (ps->high.vddci < ps->medium.vddci)
2230d22b7e40SAlex Deucher 			ps->high.vddci = ps->medium.vddci;
2231d22b7e40SAlex Deucher 	}
2232d22b7e40SAlex Deucher 
2233d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2234d22b7e40SAlex Deucher 				  &ps->medium.sclk, &ps->medium.mclk);
2235d22b7e40SAlex Deucher 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
2236d22b7e40SAlex Deucher 				  &ps->high.sclk, &ps->high.mclk);
2237d22b7e40SAlex Deucher 
2238d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->low);
2239d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->medium);
2240d22b7e40SAlex Deucher 	btc_adjust_clock_combinations(rdev, max_limits, &ps->high);
2241d22b7e40SAlex Deucher 
2242d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2243d22b7e40SAlex Deucher 					   ps->low.sclk, max_limits->vddc, &ps->low.vddc);
2244d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2245d22b7e40SAlex Deucher 					   ps->low.mclk, max_limits->vddci, &ps->low.vddci);
2246d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2247d22b7e40SAlex Deucher 					   ps->low.mclk, max_limits->vddc, &ps->low.vddc);
22484489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
22494489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->low.vddc);
22504489cd62SAlex Deucher 
2251d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2252d22b7e40SAlex Deucher 					   ps->medium.sclk, max_limits->vddc, &ps->medium.vddc);
2253d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2254d22b7e40SAlex Deucher 					   ps->medium.mclk, max_limits->vddci, &ps->medium.vddci);
2255d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2256d22b7e40SAlex Deucher 					   ps->medium.mclk, max_limits->vddc, &ps->medium.vddc);
22574489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
22584489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->medium.vddc);
22594489cd62SAlex Deucher 
2260d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2261d22b7e40SAlex Deucher 					   ps->high.sclk, max_limits->vddc, &ps->high.vddc);
2262d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2263d22b7e40SAlex Deucher 					   ps->high.mclk, max_limits->vddci, &ps->high.vddci);
2264d22b7e40SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2265d22b7e40SAlex Deucher 					   ps->high.mclk, max_limits->vddc, &ps->high.vddc);
22664489cd62SAlex Deucher 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
22674489cd62SAlex Deucher 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->high.vddc);
2268d22b7e40SAlex Deucher 
2269d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2270d22b7e40SAlex Deucher 				      &ps->low.vddc, &ps->low.vddci);
2271d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2272d22b7e40SAlex Deucher 				      &ps->medium.vddc, &ps->medium.vddci);
2273d22b7e40SAlex Deucher 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
2274d22b7e40SAlex Deucher 				      &ps->high.vddc, &ps->high.vddci);
2275d22b7e40SAlex Deucher 
2276d22b7e40SAlex Deucher 	if ((ps->high.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
2277d22b7e40SAlex Deucher 	    (ps->medium.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
2278d22b7e40SAlex Deucher 	    (ps->low.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc))
2279d22b7e40SAlex Deucher 		ps->dc_compatible = true;
2280d22b7e40SAlex Deucher 	else
2281d22b7e40SAlex Deucher 		ps->dc_compatible = false;
2282d22b7e40SAlex Deucher 
2283d22b7e40SAlex Deucher 	if (ps->low.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2284d22b7e40SAlex Deucher 		ps->low.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2285d22b7e40SAlex Deucher 	if (ps->medium.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2286d22b7e40SAlex Deucher 		ps->medium.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2287d22b7e40SAlex Deucher 	if (ps->high.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
2288d22b7e40SAlex Deucher 		ps->high.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
2289d22b7e40SAlex Deucher }
2290d22b7e40SAlex Deucher 
2291e8a9539fSAlex Deucher static void btc_update_current_ps(struct radeon_device *rdev,
2292e8a9539fSAlex Deucher 				  struct radeon_ps *rps)
2293e8a9539fSAlex Deucher {
2294e8a9539fSAlex Deucher 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
2295e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2296e8a9539fSAlex Deucher 
2297e8a9539fSAlex Deucher 	eg_pi->current_rps = *rps;
2298e8a9539fSAlex Deucher 	eg_pi->current_ps = *new_ps;
2299e8a9539fSAlex Deucher 	eg_pi->current_rps.ps_priv = &eg_pi->current_ps;
2300e8a9539fSAlex Deucher }
2301e8a9539fSAlex Deucher 
2302e8a9539fSAlex Deucher static void btc_update_requested_ps(struct radeon_device *rdev,
2303e8a9539fSAlex Deucher 				    struct radeon_ps *rps)
2304e8a9539fSAlex Deucher {
2305e8a9539fSAlex Deucher 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
2306e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2307e8a9539fSAlex Deucher 
2308e8a9539fSAlex Deucher 	eg_pi->requested_rps = *rps;
2309e8a9539fSAlex Deucher 	eg_pi->requested_ps = *new_ps;
2310e8a9539fSAlex Deucher 	eg_pi->requested_rps.ps_priv = &eg_pi->requested_ps;
2311e8a9539fSAlex Deucher }
2312e8a9539fSAlex Deucher 
23136596afd4SAlex Deucher void btc_dpm_reset_asic(struct radeon_device *rdev)
23146596afd4SAlex Deucher {
23156596afd4SAlex Deucher 	rv770_restrict_performance_levels_before_switch(rdev);
23166596afd4SAlex Deucher 	btc_disable_ulv(rdev);
23176596afd4SAlex Deucher 	btc_set_boot_state_timing(rdev);
23186596afd4SAlex Deucher 	rv770_set_boot_state(rdev);
23196596afd4SAlex Deucher }
23206596afd4SAlex Deucher 
2321e8a9539fSAlex Deucher int btc_dpm_pre_set_power_state(struct radeon_device *rdev)
2322e8a9539fSAlex Deucher {
2323e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2324e8a9539fSAlex Deucher 	struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
2325e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &requested_ps;
2326e8a9539fSAlex Deucher 
2327e8a9539fSAlex Deucher 	btc_update_requested_ps(rdev, new_ps);
2328e8a9539fSAlex Deucher 
2329e8a9539fSAlex Deucher 	btc_apply_state_adjust_rules(rdev, &eg_pi->requested_rps);
2330e8a9539fSAlex Deucher 
2331e8a9539fSAlex Deucher 	return 0;
2332e8a9539fSAlex Deucher }
2333e8a9539fSAlex Deucher 
23346596afd4SAlex Deucher int btc_dpm_set_power_state(struct radeon_device *rdev)
23356596afd4SAlex Deucher {
23366596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2337e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
2338e8a9539fSAlex Deucher 	struct radeon_ps *old_ps = &eg_pi->current_rps;
2339aafb3afaSAlex Deucher 	int ret;
2340d22b7e40SAlex Deucher 
2341aafb3afaSAlex Deucher 	ret = btc_disable_ulv(rdev);
23426596afd4SAlex Deucher 	btc_set_boot_state_timing(rdev);
2343aafb3afaSAlex Deucher 	ret = rv770_restrict_performance_levels_before_switch(rdev);
234472dd2c54SAlex Deucher 	if (ret) {
234572dd2c54SAlex Deucher 		DRM_ERROR("rv770_restrict_performance_levels_before_switch failed\n");
2346aafb3afaSAlex Deucher 		return ret;
234772dd2c54SAlex Deucher 	}
23486596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
2349dbc34160SAlex Deucher 		cypress_notify_link_speed_change_before_state_change(rdev, new_ps, old_ps);
23506596afd4SAlex Deucher 
23515d77d776SAlex Deucher 	rv770_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps);
2352aafb3afaSAlex Deucher 	ret = rv770_halt_smc(rdev);
235372dd2c54SAlex Deucher 	if (ret) {
235472dd2c54SAlex Deucher 		DRM_ERROR("rv770_halt_smc failed\n");
2355aafb3afaSAlex Deucher 		return ret;
235672dd2c54SAlex Deucher 	}
23574cb3a02fSAlex Deucher 	btc_set_at_for_uvd(rdev, new_ps);
2358f85392bcSAlex Deucher 	if (eg_pi->smu_uvd_hs)
23594cb3a02fSAlex Deucher 		btc_notify_uvd_to_smc(rdev, new_ps);
2360aafb3afaSAlex Deucher 	ret = cypress_upload_sw_state(rdev, new_ps);
236172dd2c54SAlex Deucher 	if (ret) {
236272dd2c54SAlex Deucher 		DRM_ERROR("cypress_upload_sw_state failed\n");
2363aafb3afaSAlex Deucher 		return ret;
236472dd2c54SAlex Deucher 	}
2365aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2366aafb3afaSAlex Deucher 		ret = cypress_upload_mc_reg_table(rdev, new_ps);
236772dd2c54SAlex Deucher 		if (ret) {
236872dd2c54SAlex Deucher 			DRM_ERROR("cypress_upload_mc_reg_table failed\n");
2369aafb3afaSAlex Deucher 			return ret;
2370aafb3afaSAlex Deucher 		}
237172dd2c54SAlex Deucher 	}
23726596afd4SAlex Deucher 
2373dbc34160SAlex Deucher 	cypress_program_memory_timing_parameters(rdev, new_ps);
23746596afd4SAlex Deucher 
2375aafb3afaSAlex Deucher 	ret = rv770_resume_smc(rdev);
237672dd2c54SAlex Deucher 	if (ret) {
237772dd2c54SAlex Deucher 		DRM_ERROR("rv770_resume_smc failed\n");
2378aafb3afaSAlex Deucher 		return ret;
237972dd2c54SAlex Deucher 	}
2380aafb3afaSAlex Deucher 	ret = rv770_set_sw_state(rdev);
238172dd2c54SAlex Deucher 	if (ret) {
238272dd2c54SAlex Deucher 		DRM_ERROR("rv770_set_sw_state failed\n");
2383aafb3afaSAlex Deucher 		return ret;
238472dd2c54SAlex Deucher 	}
23855d77d776SAlex Deucher 	rv770_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
23866596afd4SAlex Deucher 
23876596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
2388dbc34160SAlex Deucher 		cypress_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
23896596afd4SAlex Deucher 
2390aafb3afaSAlex Deucher 	ret = btc_set_power_state_conditionally_enable_ulv(rdev, new_ps);
239172dd2c54SAlex Deucher 	if (ret) {
239272dd2c54SAlex Deucher 		DRM_ERROR("btc_set_power_state_conditionally_enable_ulv failed\n");
2393aafb3afaSAlex Deucher 		return ret;
239472dd2c54SAlex Deucher 	}
23956596afd4SAlex Deucher 
23966596afd4SAlex Deucher 	return 0;
23976596afd4SAlex Deucher }
23986596afd4SAlex Deucher 
2399e8a9539fSAlex Deucher void btc_dpm_post_set_power_state(struct radeon_device *rdev)
2400e8a9539fSAlex Deucher {
2401e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2402e8a9539fSAlex Deucher 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
2403e8a9539fSAlex Deucher 
2404e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, new_ps);
2405e8a9539fSAlex Deucher }
2406e8a9539fSAlex Deucher 
24076596afd4SAlex Deucher int btc_dpm_enable(struct radeon_device *rdev)
24086596afd4SAlex Deucher {
24096596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
24106596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2411dbc34160SAlex Deucher 	struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
2412aafb3afaSAlex Deucher 	int ret;
24136596afd4SAlex Deucher 
24146596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
24156596afd4SAlex Deucher 		btc_cg_clock_gating_default(rdev);
24166596afd4SAlex Deucher 
24176596afd4SAlex Deucher 	if (btc_dpm_enabled(rdev))
24186596afd4SAlex Deucher 		return -EINVAL;
24196596afd4SAlex Deucher 
24206596afd4SAlex Deucher 	if (pi->mg_clock_gating)
24216596afd4SAlex Deucher 		btc_mg_clock_gating_default(rdev);
24226596afd4SAlex Deucher 
24236596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
24246596afd4SAlex Deucher 		btc_ls_clock_gating_default(rdev);
24256596afd4SAlex Deucher 
24266596afd4SAlex Deucher 	if (pi->voltage_control) {
24276596afd4SAlex Deucher 		rv770_enable_voltage_control(rdev, true);
2428aafb3afaSAlex Deucher 		ret = cypress_construct_voltage_tables(rdev);
2429fa4b5471SAlex Deucher 		if (ret) {
2430fa4b5471SAlex Deucher 			DRM_ERROR("cypress_construct_voltage_tables failed\n");
2431aafb3afaSAlex Deucher 			return ret;
24326596afd4SAlex Deucher 		}
2433fa4b5471SAlex Deucher 	}
24346596afd4SAlex Deucher 
2435aafb3afaSAlex Deucher 	if (pi->mvdd_control) {
2436aafb3afaSAlex Deucher 		ret = cypress_get_mvdd_configuration(rdev);
2437fa4b5471SAlex Deucher 		if (ret) {
2438fa4b5471SAlex Deucher 			DRM_ERROR("cypress_get_mvdd_configuration failed\n");
2439aafb3afaSAlex Deucher 			return ret;
2440aafb3afaSAlex Deucher 		}
2441fa4b5471SAlex Deucher 	}
24426596afd4SAlex Deucher 
2443aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2444aafb3afaSAlex Deucher 		ret = btc_initialize_mc_reg_table(rdev);
2445aafb3afaSAlex Deucher 		if (ret)
2446aafb3afaSAlex Deucher 			eg_pi->dynamic_ac_timing = false;
2447aafb3afaSAlex Deucher 	}
24486596afd4SAlex Deucher 
24496596afd4SAlex Deucher 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_BACKBIAS)
24506596afd4SAlex Deucher 		rv770_enable_backbias(rdev, true);
24516596afd4SAlex Deucher 
24526596afd4SAlex Deucher 	if (pi->dynamic_ss)
24536596afd4SAlex Deucher 		cypress_enable_spread_spectrum(rdev, true);
24546596afd4SAlex Deucher 
24556596afd4SAlex Deucher 	if (pi->thermal_protection)
24566596afd4SAlex Deucher 		rv770_enable_thermal_protection(rdev, true);
24576596afd4SAlex Deucher 
24586596afd4SAlex Deucher 	rv770_setup_bsp(rdev);
24596596afd4SAlex Deucher 	rv770_program_git(rdev);
24606596afd4SAlex Deucher 	rv770_program_tp(rdev);
24616596afd4SAlex Deucher 	rv770_program_tpp(rdev);
24626596afd4SAlex Deucher 	rv770_program_sstp(rdev);
24636596afd4SAlex Deucher 	rv770_program_engine_speed_parameters(rdev);
24646596afd4SAlex Deucher 	cypress_enable_display_gap(rdev);
24656596afd4SAlex Deucher 	rv770_program_vc(rdev);
24666596afd4SAlex Deucher 
24676596afd4SAlex Deucher 	if (pi->dynamic_pcie_gen2)
24686596afd4SAlex Deucher 		btc_enable_dynamic_pcie_gen2(rdev, true);
24696596afd4SAlex Deucher 
2470aafb3afaSAlex Deucher 	ret = rv770_upload_firmware(rdev);
2471fa4b5471SAlex Deucher 	if (ret) {
2472fa4b5471SAlex Deucher 		DRM_ERROR("rv770_upload_firmware failed\n");
2473aafb3afaSAlex Deucher 		return ret;
2474fa4b5471SAlex Deucher 	}
2475aafb3afaSAlex Deucher 	ret = cypress_get_table_locations(rdev);
2476fa4b5471SAlex Deucher 	if (ret) {
2477fa4b5471SAlex Deucher 		DRM_ERROR("cypress_get_table_locations failed\n");
2478aafb3afaSAlex Deucher 		return ret;
2479fa4b5471SAlex Deucher 	}
2480aafb3afaSAlex Deucher 	ret = btc_init_smc_table(rdev, boot_ps);
2481aafb3afaSAlex Deucher 	if (ret)
2482aafb3afaSAlex Deucher 		return ret;
24836596afd4SAlex Deucher 
2484aafb3afaSAlex Deucher 	if (eg_pi->dynamic_ac_timing) {
2485aafb3afaSAlex Deucher 		ret = cypress_populate_mc_reg_table(rdev, boot_ps);
2486fa4b5471SAlex Deucher 		if (ret) {
2487fa4b5471SAlex Deucher 			DRM_ERROR("cypress_populate_mc_reg_table failed\n");
2488aafb3afaSAlex Deucher 			return ret;
2489aafb3afaSAlex Deucher 		}
2490fa4b5471SAlex Deucher 	}
24916596afd4SAlex Deucher 
24926596afd4SAlex Deucher 	cypress_program_response_times(rdev);
24936596afd4SAlex Deucher 	r7xx_start_smc(rdev);
2494aafb3afaSAlex Deucher 	ret = cypress_notify_smc_display_change(rdev, false);
2495fa4b5471SAlex Deucher 	if (ret) {
2496fa4b5471SAlex Deucher 		DRM_ERROR("cypress_notify_smc_display_change failed\n");
2497aafb3afaSAlex Deucher 		return ret;
2498fa4b5471SAlex Deucher 	}
24996596afd4SAlex Deucher 	cypress_enable_sclk_control(rdev, true);
25006596afd4SAlex Deucher 
25016596afd4SAlex Deucher 	if (eg_pi->memory_transition)
25026596afd4SAlex Deucher 		cypress_enable_mclk_control(rdev, true);
25036596afd4SAlex Deucher 
25046596afd4SAlex Deucher 	cypress_start_dpm(rdev);
25056596afd4SAlex Deucher 
25066596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
25076596afd4SAlex Deucher 		btc_cg_clock_gating_enable(rdev, true);
25086596afd4SAlex Deucher 
25096596afd4SAlex Deucher 	if (pi->mg_clock_gating)
25106596afd4SAlex Deucher 		btc_mg_clock_gating_enable(rdev, true);
25116596afd4SAlex Deucher 
25126596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
25136596afd4SAlex Deucher 		btc_ls_clock_gating_enable(rdev, true);
25146596afd4SAlex Deucher 
25156596afd4SAlex Deucher 	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
25166596afd4SAlex Deucher 
25176596afd4SAlex Deucher 	btc_init_stutter_mode(rdev);
25186596afd4SAlex Deucher 
2519e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
2520e8a9539fSAlex Deucher 
25216596afd4SAlex Deucher 	return 0;
25226596afd4SAlex Deucher };
25236596afd4SAlex Deucher 
25246596afd4SAlex Deucher void btc_dpm_disable(struct radeon_device *rdev)
25256596afd4SAlex Deucher {
25266596afd4SAlex Deucher 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
25276596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
25286596afd4SAlex Deucher 
25296596afd4SAlex Deucher 	if (!btc_dpm_enabled(rdev))
25306596afd4SAlex Deucher 		return;
25316596afd4SAlex Deucher 
25326596afd4SAlex Deucher 	rv770_clear_vc(rdev);
25336596afd4SAlex Deucher 
25346596afd4SAlex Deucher 	if (pi->thermal_protection)
25356596afd4SAlex Deucher 		rv770_enable_thermal_protection(rdev, false);
25366596afd4SAlex Deucher 
25376596afd4SAlex Deucher 	if (pi->dynamic_pcie_gen2)
25386596afd4SAlex Deucher 		btc_enable_dynamic_pcie_gen2(rdev, false);
25396596afd4SAlex Deucher 
25406596afd4SAlex Deucher 	if (rdev->irq.installed &&
25416596afd4SAlex Deucher 	    r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
25426596afd4SAlex Deucher 		rdev->irq.dpm_thermal = false;
25436596afd4SAlex Deucher 		radeon_irq_set(rdev);
25446596afd4SAlex Deucher 	}
25456596afd4SAlex Deucher 
25466596afd4SAlex Deucher 	if (pi->gfx_clock_gating)
25476596afd4SAlex Deucher 		btc_cg_clock_gating_enable(rdev, false);
25486596afd4SAlex Deucher 
25496596afd4SAlex Deucher 	if (pi->mg_clock_gating)
25506596afd4SAlex Deucher 		btc_mg_clock_gating_enable(rdev, false);
25516596afd4SAlex Deucher 
25526596afd4SAlex Deucher 	if (eg_pi->ls_clock_gating)
25536596afd4SAlex Deucher 		btc_ls_clock_gating_enable(rdev, false);
25546596afd4SAlex Deucher 
25556596afd4SAlex Deucher 	rv770_stop_dpm(rdev);
25566596afd4SAlex Deucher 	btc_reset_to_default(rdev);
25576596afd4SAlex Deucher 	btc_stop_smc(rdev);
25586596afd4SAlex Deucher 	cypress_enable_spread_spectrum(rdev, false);
2559e8a9539fSAlex Deucher 
2560e8a9539fSAlex Deucher 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
25616596afd4SAlex Deucher }
25626596afd4SAlex Deucher 
25636596afd4SAlex Deucher void btc_dpm_setup_asic(struct radeon_device *rdev)
25646596afd4SAlex Deucher {
25656596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
25666c7bcceaSAlex Deucher 	int r;
25676596afd4SAlex Deucher 
25686c7bcceaSAlex Deucher 	r = ni_mc_load_microcode(rdev);
25696c7bcceaSAlex Deucher 	if (r)
25706c7bcceaSAlex Deucher 		DRM_ERROR("Failed to load MC firmware!\n");
25716596afd4SAlex Deucher 	rv770_get_memory_type(rdev);
25726596afd4SAlex Deucher 	rv740_read_clock_registers(rdev);
25736596afd4SAlex Deucher 	btc_read_arb_registers(rdev);
25746596afd4SAlex Deucher 	rv770_read_voltage_smio_registers(rdev);
25756596afd4SAlex Deucher 
25766596afd4SAlex Deucher 	if (eg_pi->pcie_performance_request)
25776596afd4SAlex Deucher 		cypress_advertise_gen2_capability(rdev);
25786596afd4SAlex Deucher 
25796596afd4SAlex Deucher 	rv770_get_pcie_gen2_status(rdev);
25806596afd4SAlex Deucher 	rv770_enable_acpi_pm(rdev);
25816596afd4SAlex Deucher }
25826596afd4SAlex Deucher 
25836596afd4SAlex Deucher int btc_dpm_init(struct radeon_device *rdev)
25846596afd4SAlex Deucher {
25856596afd4SAlex Deucher 	struct rv7xx_power_info *pi;
25866596afd4SAlex Deucher 	struct evergreen_power_info *eg_pi;
25876596afd4SAlex Deucher 	struct atom_clock_dividers dividers;
25886596afd4SAlex Deucher 	int ret;
25896596afd4SAlex Deucher 
25906596afd4SAlex Deucher 	eg_pi = kzalloc(sizeof(struct evergreen_power_info), GFP_KERNEL);
25916596afd4SAlex Deucher 	if (eg_pi == NULL)
25926596afd4SAlex Deucher 		return -ENOMEM;
25936596afd4SAlex Deucher 	rdev->pm.dpm.priv = eg_pi;
25946596afd4SAlex Deucher 	pi = &eg_pi->rv7xx;
25956596afd4SAlex Deucher 
25966596afd4SAlex Deucher 	rv770_get_max_vddc(rdev);
25976596afd4SAlex Deucher 
25986596afd4SAlex Deucher 	eg_pi->ulv.supported = false;
25996596afd4SAlex Deucher 	pi->acpi_vddc = 0;
26006596afd4SAlex Deucher 	eg_pi->acpi_vddci = 0;
26016596afd4SAlex Deucher 	pi->min_vddc_in_table = 0;
26026596afd4SAlex Deucher 	pi->max_vddc_in_table = 0;
26036596afd4SAlex Deucher 
26046596afd4SAlex Deucher 	ret = rv7xx_parse_power_table(rdev);
26056596afd4SAlex Deucher 	if (ret)
26066596afd4SAlex Deucher 		return ret;
2607d22b7e40SAlex Deucher 	ret = r600_parse_extended_power_table(rdev);
2608d22b7e40SAlex Deucher 	if (ret)
2609d22b7e40SAlex Deucher 		return ret;
26106596afd4SAlex Deucher 
26114489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
26124489cd62SAlex Deucher 		kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
26134489cd62SAlex Deucher 	if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
26144489cd62SAlex Deucher 		r600_free_extended_power_table(rdev);
26154489cd62SAlex Deucher 		return -ENOMEM;
26164489cd62SAlex Deucher 	}
26174489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
26184489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
26194489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
26204489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
26214489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 800;
26224489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
26234489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 800;
26244489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
26254489cd62SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 800;
26264489cd62SAlex Deucher 
26276596afd4SAlex Deucher 	if (rdev->pm.dpm.voltage_response_time == 0)
26286596afd4SAlex Deucher 		rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
26296596afd4SAlex Deucher 	if (rdev->pm.dpm.backbias_response_time == 0)
26306596afd4SAlex Deucher 		rdev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT;
26316596afd4SAlex Deucher 
26326596afd4SAlex Deucher 	ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
26336596afd4SAlex Deucher 					     0, false, &dividers);
26346596afd4SAlex Deucher 	if (ret)
26356596afd4SAlex Deucher 		pi->ref_div = dividers.ref_div + 1;
26366596afd4SAlex Deucher 	else
26376596afd4SAlex Deucher 		pi->ref_div = R600_REFERENCEDIVIDER_DFLT;
26386596afd4SAlex Deucher 
26396596afd4SAlex Deucher 	pi->mclk_strobe_mode_threshold = 40000;
26406596afd4SAlex Deucher 	pi->mclk_edc_enable_threshold = 40000;
26416596afd4SAlex Deucher 	eg_pi->mclk_edc_wr_enable_threshold = 40000;
26426596afd4SAlex Deucher 
2643f85392bcSAlex Deucher 	pi->rlp = RV770_RLP_DFLT;
2644f85392bcSAlex Deucher 	pi->rmp = RV770_RMP_DFLT;
2645f85392bcSAlex Deucher 	pi->lhp = RV770_LHP_DFLT;
2646f85392bcSAlex Deucher 	pi->lmp = RV770_LMP_DFLT;
2647f85392bcSAlex Deucher 
2648f85392bcSAlex Deucher 	eg_pi->ats[0].rlp = RV770_RLP_DFLT;
2649f85392bcSAlex Deucher 	eg_pi->ats[0].rmp = RV770_RMP_DFLT;
2650f85392bcSAlex Deucher 	eg_pi->ats[0].lhp = RV770_LHP_DFLT;
2651f85392bcSAlex Deucher 	eg_pi->ats[0].lmp = RV770_LMP_DFLT;
2652f85392bcSAlex Deucher 
2653f85392bcSAlex Deucher 	eg_pi->ats[1].rlp = BTC_RLP_UVD_DFLT;
2654f85392bcSAlex Deucher 	eg_pi->ats[1].rmp = BTC_RMP_UVD_DFLT;
2655f85392bcSAlex Deucher 	eg_pi->ats[1].lhp = BTC_LHP_UVD_DFLT;
2656f85392bcSAlex Deucher 	eg_pi->ats[1].lmp = BTC_LMP_UVD_DFLT;
2657f85392bcSAlex Deucher 
2658f85392bcSAlex Deucher 	eg_pi->smu_uvd_hs = true;
2659f85392bcSAlex Deucher 
26606596afd4SAlex Deucher 	pi->voltage_control =
266158653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
26626596afd4SAlex Deucher 
26636596afd4SAlex Deucher 	pi->mvdd_control =
266458653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
26656596afd4SAlex Deucher 
26666596afd4SAlex Deucher 	eg_pi->vddci_control =
266758653abdSAlex Deucher 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
26686596afd4SAlex Deucher 
2669b841ce7bSAlex Deucher 	rv770_get_engine_memory_ss(rdev);
26706596afd4SAlex Deucher 
26716596afd4SAlex Deucher 	pi->asi = RV770_ASI_DFLT;
26726596afd4SAlex Deucher 	pi->pasi = CYPRESS_HASI_DFLT;
26736596afd4SAlex Deucher 	pi->vrc = CYPRESS_VRC_DFLT;
26746596afd4SAlex Deucher 
26756596afd4SAlex Deucher 	pi->power_gating = false;
26766596afd4SAlex Deucher 
26776596afd4SAlex Deucher 	pi->gfx_clock_gating = true;
26786596afd4SAlex Deucher 
26796596afd4SAlex Deucher 	pi->mg_clock_gating = true;
26806596afd4SAlex Deucher 	pi->mgcgtssm = true;
26816596afd4SAlex Deucher 	eg_pi->ls_clock_gating = false;
26826596afd4SAlex Deucher 	eg_pi->sclk_deep_sleep = false;
26836596afd4SAlex Deucher 
26846596afd4SAlex Deucher 	pi->dynamic_pcie_gen2 = true;
26856596afd4SAlex Deucher 
2686fda83724SAlex Deucher 	if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
26876596afd4SAlex Deucher 		pi->thermal_protection = true;
26886596afd4SAlex Deucher 	else
26896596afd4SAlex Deucher 		pi->thermal_protection = false;
26906596afd4SAlex Deucher 
26916596afd4SAlex Deucher 	pi->display_gap = true;
26926596afd4SAlex Deucher 
26936596afd4SAlex Deucher 	if (rdev->flags & RADEON_IS_MOBILITY)
26946596afd4SAlex Deucher 		pi->dcodt = true;
26956596afd4SAlex Deucher 	else
26966596afd4SAlex Deucher 		pi->dcodt = false;
26976596afd4SAlex Deucher 
26986596afd4SAlex Deucher 	pi->ulps = true;
26996596afd4SAlex Deucher 
27006596afd4SAlex Deucher 	eg_pi->dynamic_ac_timing = true;
27016596afd4SAlex Deucher 	eg_pi->abm = true;
27026596afd4SAlex Deucher 	eg_pi->mcls = true;
27036596afd4SAlex Deucher 	eg_pi->light_sleep = true;
27046596afd4SAlex Deucher 	eg_pi->memory_transition = true;
27056596afd4SAlex Deucher #if defined(CONFIG_ACPI)
27066596afd4SAlex Deucher 	eg_pi->pcie_performance_request =
27076596afd4SAlex Deucher 		radeon_acpi_is_pcie_performance_request_supported(rdev);
27086596afd4SAlex Deucher #else
27096596afd4SAlex Deucher 	eg_pi->pcie_performance_request = false;
27106596afd4SAlex Deucher #endif
27116596afd4SAlex Deucher 
27126596afd4SAlex Deucher 	if (rdev->family == CHIP_BARTS)
27136596afd4SAlex Deucher 		eg_pi->dll_default_on = true;
27146596afd4SAlex Deucher 	else
27156596afd4SAlex Deucher 		eg_pi->dll_default_on = false;
27166596afd4SAlex Deucher 
27176596afd4SAlex Deucher 	eg_pi->sclk_deep_sleep = false;
27186596afd4SAlex Deucher 	if (ASIC_IS_LOMBOK(rdev))
27196596afd4SAlex Deucher 		pi->mclk_stutter_mode_threshold = 30000;
27206596afd4SAlex Deucher 	else
27216596afd4SAlex Deucher 		pi->mclk_stutter_mode_threshold = 0;
27226596afd4SAlex Deucher 
27236596afd4SAlex Deucher 	pi->sram_end = SMC_RAM_END;
27246596afd4SAlex Deucher 
2725d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
2726d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
2727d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2 = 900;
2728d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_sclk_values.count = ARRAY_SIZE(btc_valid_sclk);
2729d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_sclk_values.values = btc_valid_sclk;
2730d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
2731d22b7e40SAlex Deucher 	rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
2732d22b7e40SAlex Deucher 
2733d22b7e40SAlex Deucher 	if (rdev->family == CHIP_TURKS)
2734d22b7e40SAlex Deucher 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
2735d22b7e40SAlex Deucher 	else
2736d22b7e40SAlex Deucher 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000;
2737d22b7e40SAlex Deucher 
27381ff60ddbSAlex Deucher 	/* make sure dc limits are valid */
27391ff60ddbSAlex Deucher 	if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
27401ff60ddbSAlex Deucher 	    (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
27411ff60ddbSAlex Deucher 		rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
27421ff60ddbSAlex Deucher 			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
27431ff60ddbSAlex Deucher 
27446596afd4SAlex Deucher 	return 0;
27456596afd4SAlex Deucher }
27466596afd4SAlex Deucher 
27476596afd4SAlex Deucher void btc_dpm_fini(struct radeon_device *rdev)
27486596afd4SAlex Deucher {
27496596afd4SAlex Deucher 	int i;
27506596afd4SAlex Deucher 
27516596afd4SAlex Deucher 	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
27526596afd4SAlex Deucher 		kfree(rdev->pm.dpm.ps[i].ps_priv);
27536596afd4SAlex Deucher 	}
27546596afd4SAlex Deucher 	kfree(rdev->pm.dpm.ps);
27556596afd4SAlex Deucher 	kfree(rdev->pm.dpm.priv);
27564489cd62SAlex Deucher 	kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
2757d22b7e40SAlex Deucher 	r600_free_extended_power_table(rdev);
27586596afd4SAlex Deucher }
2759e8a9539fSAlex Deucher 
27609f3f63f2SAlex Deucher void btc_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
27619f3f63f2SAlex Deucher 						     struct seq_file *m)
27629f3f63f2SAlex Deucher {
27639f3f63f2SAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
27649f3f63f2SAlex Deucher 	struct radeon_ps *rps = &eg_pi->current_rps;
27659f3f63f2SAlex Deucher 	struct rv7xx_ps *ps = rv770_get_ps(rps);
27669f3f63f2SAlex Deucher 	struct rv7xx_pl *pl;
27679f3f63f2SAlex Deucher 	u32 current_index =
27689f3f63f2SAlex Deucher 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
27699f3f63f2SAlex Deucher 		CURRENT_PROFILE_INDEX_SHIFT;
27709f3f63f2SAlex Deucher 
27719f3f63f2SAlex Deucher 	if (current_index > 2) {
27729f3f63f2SAlex Deucher 		seq_printf(m, "invalid dpm profile %d\n", current_index);
27739f3f63f2SAlex Deucher 	} else {
27749f3f63f2SAlex Deucher 		if (current_index == 0)
27759f3f63f2SAlex Deucher 			pl = &ps->low;
27769f3f63f2SAlex Deucher 		else if (current_index == 1)
27779f3f63f2SAlex Deucher 			pl = &ps->medium;
27789f3f63f2SAlex Deucher 		else /* current_index == 2 */
27799f3f63f2SAlex Deucher 			pl = &ps->high;
27809f3f63f2SAlex Deucher 		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
27819f3f63f2SAlex Deucher 		if (rdev->family >= CHIP_CEDAR) {
27829f3f63f2SAlex Deucher 			seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u vddci: %u\n",
27839f3f63f2SAlex Deucher 				   current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
27849f3f63f2SAlex Deucher 		} else {
27859f3f63f2SAlex Deucher 			seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u\n",
27869f3f63f2SAlex Deucher 				   current_index, pl->sclk, pl->mclk, pl->vddc);
27879f3f63f2SAlex Deucher 		}
27889f3f63f2SAlex Deucher 	}
27899f3f63f2SAlex Deucher }
27909f3f63f2SAlex Deucher 
2791e8a9539fSAlex Deucher u32 btc_dpm_get_sclk(struct radeon_device *rdev, bool low)
2792e8a9539fSAlex Deucher {
2793e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2794e8a9539fSAlex Deucher 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
2795e8a9539fSAlex Deucher 
2796e8a9539fSAlex Deucher 	if (low)
2797e8a9539fSAlex Deucher 		return requested_state->low.sclk;
2798e8a9539fSAlex Deucher 	else
2799e8a9539fSAlex Deucher 		return requested_state->high.sclk;
2800e8a9539fSAlex Deucher }
2801e8a9539fSAlex Deucher 
2802e8a9539fSAlex Deucher u32 btc_dpm_get_mclk(struct radeon_device *rdev, bool low)
2803e8a9539fSAlex Deucher {
2804e8a9539fSAlex Deucher 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
2805e8a9539fSAlex Deucher 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
2806e8a9539fSAlex Deucher 
2807e8a9539fSAlex Deucher 	if (low)
2808e8a9539fSAlex Deucher 		return requested_state->low.mclk;
2809e8a9539fSAlex Deucher 	else
2810e8a9539fSAlex Deucher 		return requested_state->high.mclk;
2811e8a9539fSAlex Deucher }
2812