Home | History | Annotate | Line # | Download | only in radeon
      1  1.3       mrg /*	$NetBSD: radeon_btc_dpm.c,v 1.3 2022/07/15 06:42:08 mrg Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright 2011 Advanced Micro Devices, Inc.
      5  1.1  riastrad  *
      6  1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      7  1.1  riastrad  * copy of this software and associated documentation files (the "Software"),
      8  1.1  riastrad  * to deal in the Software without restriction, including without limitation
      9  1.1  riastrad  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  1.1  riastrad  * and/or sell copies of the Software, and to permit persons to whom the
     11  1.1  riastrad  * Software is furnished to do so, subject to the following conditions:
     12  1.1  riastrad  *
     13  1.1  riastrad  * The above copyright notice and this permission notice shall be included in
     14  1.1  riastrad  * all copies or substantial portions of the Software.
     15  1.1  riastrad  *
     16  1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  1.1  riastrad  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  1.1  riastrad  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  1.1  riastrad  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  1.1  riastrad  * OTHER DEALINGS IN THE SOFTWARE.
     23  1.1  riastrad  *
     24  1.1  riastrad  * Authors: Alex Deucher
     25  1.1  riastrad  */
     26  1.1  riastrad 
     27  1.1  riastrad #include <sys/cdefs.h>
     28  1.3       mrg __KERNEL_RCSID(0, "$NetBSD: radeon_btc_dpm.c,v 1.3 2022/07/15 06:42:08 mrg Exp $");
     29  1.1  riastrad 
     30  1.2  riastrad #include <linux/pci.h>
     31  1.2  riastrad #include <linux/seq_file.h>
     32  1.2  riastrad 
     33  1.2  riastrad #include "atom.h"
     34  1.2  riastrad #include "btc_dpm.h"
     35  1.2  riastrad #include "btcd.h"
     36  1.2  riastrad #include "cypress_dpm.h"
     37  1.2  riastrad #include "r600_dpm.h"
     38  1.1  riastrad #include "radeon.h"
     39  1.1  riastrad #include "radeon_asic.h"
     40  1.1  riastrad 
     41  1.1  riastrad #define MC_CG_ARB_FREQ_F0           0x0a
     42  1.1  riastrad #define MC_CG_ARB_FREQ_F1           0x0b
     43  1.1  riastrad #define MC_CG_ARB_FREQ_F2           0x0c
     44  1.1  riastrad #define MC_CG_ARB_FREQ_F3           0x0d
     45  1.1  riastrad 
     46  1.1  riastrad #define MC_CG_SEQ_DRAMCONF_S0       0x05
     47  1.1  riastrad #define MC_CG_SEQ_DRAMCONF_S1       0x06
     48  1.1  riastrad #define MC_CG_SEQ_YCLK_SUSPEND      0x04
     49  1.1  riastrad #define MC_CG_SEQ_YCLK_RESUME       0x0a
     50  1.1  riastrad 
     51  1.1  riastrad #define SMC_RAM_END 0x8000
     52  1.1  riastrad 
     53  1.1  riastrad #ifndef BTC_MGCG_SEQUENCE
     54  1.1  riastrad #define BTC_MGCG_SEQUENCE  300
     55  1.1  riastrad 
     56  1.1  riastrad struct rv7xx_ps *rv770_get_ps(struct radeon_ps *rps);
     57  1.1  riastrad struct rv7xx_power_info *rv770_get_pi(struct radeon_device *rdev);
     58  1.1  riastrad struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
     59  1.1  riastrad 
     60  1.1  riastrad extern int ni_mc_load_microcode(struct radeon_device *rdev);
     61  1.1  riastrad 
     62  1.1  riastrad //********* BARTS **************//
     63  1.1  riastrad static const u32 barts_cgcg_cgls_default[] =
     64  1.1  riastrad {
     65  1.1  riastrad 	/* Register,   Value,     Mask bits */
     66  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
     67  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     68  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
     69  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     70  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
     71  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     72  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
     73  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     74  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
     75  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     76  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
     77  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     78  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
     79  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     80  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
     81  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     82  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
     83  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     84  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
     85  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     86  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
     87  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     88  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
     89  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     90  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
     91  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     92  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
     93  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     94  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
     95  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     96  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
     97  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
     98  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
     99  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    100  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    101  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    102  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    103  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    104  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    105  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    106  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    107  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    108  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    109  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    110  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    111  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    112  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    113  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    114  1.1  riastrad };
    115  1.1  riastrad #define BARTS_CGCG_CGLS_DEFAULT_LENGTH sizeof(barts_cgcg_cgls_default) / (3 * sizeof(u32))
    116  1.1  riastrad 
    117  1.1  riastrad static const u32 barts_cgcg_cgls_disable[] =
    118  1.1  riastrad {
    119  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    120  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    121  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    122  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    123  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    124  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    125  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    126  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    127  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    128  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    129  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    130  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    131  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    132  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    133  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    134  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    135  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    136  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    137  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    138  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    139  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    140  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    141  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    142  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    143  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    144  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    145  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    146  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    147  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    148  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    149  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    150  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    151  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    152  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    153  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    154  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    155  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    156  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    157  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    158  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    159  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    160  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    161  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    162  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    163  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    164  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    165  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    166  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    167  1.1  riastrad 	0x00000644, 0x000f7912, 0x001f4180,
    168  1.1  riastrad 	0x00000644, 0x000f3812, 0x001f4180
    169  1.1  riastrad };
    170  1.1  riastrad #define BARTS_CGCG_CGLS_DISABLE_LENGTH sizeof(barts_cgcg_cgls_disable) / (3 * sizeof(u32))
    171  1.1  riastrad 
    172  1.1  riastrad static const u32 barts_cgcg_cgls_enable[] =
    173  1.1  riastrad {
    174  1.1  riastrad 	/* 0x0000c124, 0x84180000, 0x00180000, */
    175  1.1  riastrad 	0x00000644, 0x000f7892, 0x001f4080,
    176  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    177  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    178  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    179  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    180  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    181  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    182  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    183  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    184  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    185  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    186  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    187  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    188  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    189  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    190  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    191  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    192  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    193  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    194  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    195  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    196  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    197  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    198  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    199  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    200  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    201  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    202  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    203  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    204  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    205  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    206  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    207  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    208  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    209  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    210  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    211  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    212  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    213  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    214  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    215  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    216  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    217  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    218  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    219  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    220  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    221  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    222  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    223  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff
    224  1.1  riastrad };
    225  1.1  riastrad #define BARTS_CGCG_CGLS_ENABLE_LENGTH sizeof(barts_cgcg_cgls_enable) / (3 * sizeof(u32))
    226  1.1  riastrad 
    227  1.1  riastrad static const u32 barts_mgcg_default[] =
    228  1.1  riastrad {
    229  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    230  1.1  riastrad 	0x00005448, 0x00000100, 0xffffffff,
    231  1.1  riastrad 	0x000055e4, 0x00600100, 0xffffffff,
    232  1.1  riastrad 	0x0000160c, 0x00000100, 0xffffffff,
    233  1.1  riastrad 	0x0000c164, 0x00000100, 0xffffffff,
    234  1.1  riastrad 	0x00008a18, 0x00000100, 0xffffffff,
    235  1.1  riastrad 	0x0000897c, 0x06000100, 0xffffffff,
    236  1.1  riastrad 	0x00008b28, 0x00000100, 0xffffffff,
    237  1.1  riastrad 	0x00009144, 0x00000100, 0xffffffff,
    238  1.1  riastrad 	0x00009a60, 0x00000100, 0xffffffff,
    239  1.1  riastrad 	0x00009868, 0x00000100, 0xffffffff,
    240  1.1  riastrad 	0x00008d58, 0x00000100, 0xffffffff,
    241  1.1  riastrad 	0x00009510, 0x00000100, 0xffffffff,
    242  1.1  riastrad 	0x0000949c, 0x00000100, 0xffffffff,
    243  1.1  riastrad 	0x00009654, 0x00000100, 0xffffffff,
    244  1.1  riastrad 	0x00009030, 0x00000100, 0xffffffff,
    245  1.1  riastrad 	0x00009034, 0x00000100, 0xffffffff,
    246  1.1  riastrad 	0x00009038, 0x00000100, 0xffffffff,
    247  1.1  riastrad 	0x0000903c, 0x00000100, 0xffffffff,
    248  1.1  riastrad 	0x00009040, 0x00000100, 0xffffffff,
    249  1.1  riastrad 	0x0000a200, 0x00000100, 0xffffffff,
    250  1.1  riastrad 	0x0000a204, 0x00000100, 0xffffffff,
    251  1.1  riastrad 	0x0000a208, 0x00000100, 0xffffffff,
    252  1.1  riastrad 	0x0000a20c, 0x00000100, 0xffffffff,
    253  1.1  riastrad 	0x0000977c, 0x00000100, 0xffffffff,
    254  1.1  riastrad 	0x00003f80, 0x00000100, 0xffffffff,
    255  1.1  riastrad 	0x0000a210, 0x00000100, 0xffffffff,
    256  1.1  riastrad 	0x0000a214, 0x00000100, 0xffffffff,
    257  1.1  riastrad 	0x000004d8, 0x00000100, 0xffffffff,
    258  1.1  riastrad 	0x00009784, 0x00000100, 0xffffffff,
    259  1.1  riastrad 	0x00009698, 0x00000100, 0xffffffff,
    260  1.1  riastrad 	0x000004d4, 0x00000200, 0xffffffff,
    261  1.1  riastrad 	0x000004d0, 0x00000000, 0xffffffff,
    262  1.1  riastrad 	0x000030cc, 0x00000100, 0xffffffff,
    263  1.1  riastrad 	0x0000d0c0, 0xff000100, 0xffffffff,
    264  1.1  riastrad 	0x0000802c, 0x40000000, 0xffffffff,
    265  1.1  riastrad 	0x0000915c, 0x00010000, 0xffffffff,
    266  1.1  riastrad 	0x00009160, 0x00030002, 0xffffffff,
    267  1.1  riastrad 	0x00009164, 0x00050004, 0xffffffff,
    268  1.1  riastrad 	0x00009168, 0x00070006, 0xffffffff,
    269  1.1  riastrad 	0x00009178, 0x00070000, 0xffffffff,
    270  1.1  riastrad 	0x0000917c, 0x00030002, 0xffffffff,
    271  1.1  riastrad 	0x00009180, 0x00050004, 0xffffffff,
    272  1.1  riastrad 	0x0000918c, 0x00010006, 0xffffffff,
    273  1.1  riastrad 	0x00009190, 0x00090008, 0xffffffff,
    274  1.1  riastrad 	0x00009194, 0x00070000, 0xffffffff,
    275  1.1  riastrad 	0x00009198, 0x00030002, 0xffffffff,
    276  1.1  riastrad 	0x0000919c, 0x00050004, 0xffffffff,
    277  1.1  riastrad 	0x000091a8, 0x00010006, 0xffffffff,
    278  1.1  riastrad 	0x000091ac, 0x00090008, 0xffffffff,
    279  1.1  riastrad 	0x000091b0, 0x00070000, 0xffffffff,
    280  1.1  riastrad 	0x000091b4, 0x00030002, 0xffffffff,
    281  1.1  riastrad 	0x000091b8, 0x00050004, 0xffffffff,
    282  1.1  riastrad 	0x000091c4, 0x00010006, 0xffffffff,
    283  1.1  riastrad 	0x000091c8, 0x00090008, 0xffffffff,
    284  1.1  riastrad 	0x000091cc, 0x00070000, 0xffffffff,
    285  1.1  riastrad 	0x000091d0, 0x00030002, 0xffffffff,
    286  1.1  riastrad 	0x000091d4, 0x00050004, 0xffffffff,
    287  1.1  riastrad 	0x000091e0, 0x00010006, 0xffffffff,
    288  1.1  riastrad 	0x000091e4, 0x00090008, 0xffffffff,
    289  1.1  riastrad 	0x000091e8, 0x00000000, 0xffffffff,
    290  1.1  riastrad 	0x000091ec, 0x00070000, 0xffffffff,
    291  1.1  riastrad 	0x000091f0, 0x00030002, 0xffffffff,
    292  1.1  riastrad 	0x000091f4, 0x00050004, 0xffffffff,
    293  1.1  riastrad 	0x00009200, 0x00010006, 0xffffffff,
    294  1.1  riastrad 	0x00009204, 0x00090008, 0xffffffff,
    295  1.1  riastrad 	0x00009208, 0x00070000, 0xffffffff,
    296  1.1  riastrad 	0x0000920c, 0x00030002, 0xffffffff,
    297  1.1  riastrad 	0x00009210, 0x00050004, 0xffffffff,
    298  1.1  riastrad 	0x0000921c, 0x00010006, 0xffffffff,
    299  1.1  riastrad 	0x00009220, 0x00090008, 0xffffffff,
    300  1.1  riastrad 	0x00009224, 0x00070000, 0xffffffff,
    301  1.1  riastrad 	0x00009228, 0x00030002, 0xffffffff,
    302  1.1  riastrad 	0x0000922c, 0x00050004, 0xffffffff,
    303  1.1  riastrad 	0x00009238, 0x00010006, 0xffffffff,
    304  1.1  riastrad 	0x0000923c, 0x00090008, 0xffffffff,
    305  1.1  riastrad 	0x00009294, 0x00000000, 0xffffffff,
    306  1.1  riastrad 	0x0000802c, 0x40010000, 0xffffffff,
    307  1.1  riastrad 	0x0000915c, 0x00010000, 0xffffffff,
    308  1.1  riastrad 	0x00009160, 0x00030002, 0xffffffff,
    309  1.1  riastrad 	0x00009164, 0x00050004, 0xffffffff,
    310  1.1  riastrad 	0x00009168, 0x00070006, 0xffffffff,
    311  1.1  riastrad 	0x00009178, 0x00070000, 0xffffffff,
    312  1.1  riastrad 	0x0000917c, 0x00030002, 0xffffffff,
    313  1.1  riastrad 	0x00009180, 0x00050004, 0xffffffff,
    314  1.1  riastrad 	0x0000918c, 0x00010006, 0xffffffff,
    315  1.1  riastrad 	0x00009190, 0x00090008, 0xffffffff,
    316  1.1  riastrad 	0x00009194, 0x00070000, 0xffffffff,
    317  1.1  riastrad 	0x00009198, 0x00030002, 0xffffffff,
    318  1.1  riastrad 	0x0000919c, 0x00050004, 0xffffffff,
    319  1.1  riastrad 	0x000091a8, 0x00010006, 0xffffffff,
    320  1.1  riastrad 	0x000091ac, 0x00090008, 0xffffffff,
    321  1.1  riastrad 	0x000091b0, 0x00070000, 0xffffffff,
    322  1.1  riastrad 	0x000091b4, 0x00030002, 0xffffffff,
    323  1.1  riastrad 	0x000091b8, 0x00050004, 0xffffffff,
    324  1.1  riastrad 	0x000091c4, 0x00010006, 0xffffffff,
    325  1.1  riastrad 	0x000091c8, 0x00090008, 0xffffffff,
    326  1.1  riastrad 	0x000091cc, 0x00070000, 0xffffffff,
    327  1.1  riastrad 	0x000091d0, 0x00030002, 0xffffffff,
    328  1.1  riastrad 	0x000091d4, 0x00050004, 0xffffffff,
    329  1.1  riastrad 	0x000091e0, 0x00010006, 0xffffffff,
    330  1.1  riastrad 	0x000091e4, 0x00090008, 0xffffffff,
    331  1.1  riastrad 	0x000091e8, 0x00000000, 0xffffffff,
    332  1.1  riastrad 	0x000091ec, 0x00070000, 0xffffffff,
    333  1.1  riastrad 	0x000091f0, 0x00030002, 0xffffffff,
    334  1.1  riastrad 	0x000091f4, 0x00050004, 0xffffffff,
    335  1.1  riastrad 	0x00009200, 0x00010006, 0xffffffff,
    336  1.1  riastrad 	0x00009204, 0x00090008, 0xffffffff,
    337  1.1  riastrad 	0x00009208, 0x00070000, 0xffffffff,
    338  1.1  riastrad 	0x0000920c, 0x00030002, 0xffffffff,
    339  1.1  riastrad 	0x00009210, 0x00050004, 0xffffffff,
    340  1.1  riastrad 	0x0000921c, 0x00010006, 0xffffffff,
    341  1.1  riastrad 	0x00009220, 0x00090008, 0xffffffff,
    342  1.1  riastrad 	0x00009224, 0x00070000, 0xffffffff,
    343  1.1  riastrad 	0x00009228, 0x00030002, 0xffffffff,
    344  1.1  riastrad 	0x0000922c, 0x00050004, 0xffffffff,
    345  1.1  riastrad 	0x00009238, 0x00010006, 0xffffffff,
    346  1.1  riastrad 	0x0000923c, 0x00090008, 0xffffffff,
    347  1.1  riastrad 	0x00009294, 0x00000000, 0xffffffff,
    348  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    349  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    350  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    351  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    352  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    353  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    354  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    355  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    356  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    357  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    358  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    359  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    360  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    361  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    362  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    363  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    364  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    365  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    366  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    367  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    368  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    369  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    370  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    371  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    372  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    373  1.1  riastrad };
    374  1.1  riastrad #define BARTS_MGCG_DEFAULT_LENGTH sizeof(barts_mgcg_default) / (3 * sizeof(u32))
    375  1.1  riastrad 
    376  1.1  riastrad static const u32 barts_mgcg_disable[] =
    377  1.1  riastrad {
    378  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    379  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    380  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    381  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    382  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    383  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    384  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    385  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    386  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    387  1.1  riastrad 	0x00009150, 0x00600000, 0xffffffff
    388  1.1  riastrad };
    389  1.1  riastrad #define BARTS_MGCG_DISABLE_LENGTH sizeof(barts_mgcg_disable) / (3 * sizeof(u32))
    390  1.1  riastrad 
    391  1.1  riastrad static const u32 barts_mgcg_enable[] =
    392  1.1  riastrad {
    393  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    394  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    395  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    396  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    397  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    398  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    399  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    400  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    401  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    402  1.1  riastrad 	0x00009150, 0x81944000, 0xffffffff
    403  1.1  riastrad };
    404  1.1  riastrad #define BARTS_MGCG_ENABLE_LENGTH sizeof(barts_mgcg_enable) / (3 * sizeof(u32))
    405  1.1  riastrad 
    406  1.1  riastrad //********* CAICOS **************//
    407  1.1  riastrad static const u32 caicos_cgcg_cgls_default[] =
    408  1.1  riastrad {
    409  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    410  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    411  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    412  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    413  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    414  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    415  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    416  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    417  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    418  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    419  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    420  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    421  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    422  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    423  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    424  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    425  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    426  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    427  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    428  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    429  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    430  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    431  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    432  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    433  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    434  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    435  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    436  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    437  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    438  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    439  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    440  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    441  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    442  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    443  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    444  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    445  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    446  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    447  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    448  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    449  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    450  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    451  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    452  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    453  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    454  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    455  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    456  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    457  1.1  riastrad };
    458  1.1  riastrad #define CAICOS_CGCG_CGLS_DEFAULT_LENGTH sizeof(caicos_cgcg_cgls_default) / (3 * sizeof(u32))
    459  1.1  riastrad 
    460  1.1  riastrad static const u32 caicos_cgcg_cgls_disable[] =
    461  1.1  riastrad {
    462  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    463  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    464  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    465  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    466  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    467  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    468  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    469  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    470  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    471  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    472  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    473  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    474  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    475  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    476  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    477  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    478  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    479  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    480  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    481  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    482  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    483  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    484  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    485  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    486  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    487  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    488  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    489  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    490  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    491  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    492  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    493  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    494  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    495  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    496  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    497  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    498  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    499  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    500  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    501  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    502  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    503  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    504  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    505  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    506  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    507  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    508  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    509  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    510  1.1  riastrad 	0x00000644, 0x000f7912, 0x001f4180,
    511  1.1  riastrad 	0x00000644, 0x000f3812, 0x001f4180
    512  1.1  riastrad };
    513  1.1  riastrad #define CAICOS_CGCG_CGLS_DISABLE_LENGTH sizeof(caicos_cgcg_cgls_disable) / (3 * sizeof(u32))
    514  1.1  riastrad 
    515  1.1  riastrad static const u32 caicos_cgcg_cgls_enable[] =
    516  1.1  riastrad {
    517  1.1  riastrad 	/* 0x0000c124, 0x84180000, 0x00180000, */
    518  1.1  riastrad 	0x00000644, 0x000f7892, 0x001f4080,
    519  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    520  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    521  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    522  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    523  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    524  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    525  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    526  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    527  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    528  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    529  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    530  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    531  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    532  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    533  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    534  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    535  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    536  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    537  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    538  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    539  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    540  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    541  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    542  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    543  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    544  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    545  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    546  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    547  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    548  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    549  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    550  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    551  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    552  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    553  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    554  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    555  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    556  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    557  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    558  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    559  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    560  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    561  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    562  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    563  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    564  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    565  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    566  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff
    567  1.1  riastrad };
    568  1.1  riastrad #define CAICOS_CGCG_CGLS_ENABLE_LENGTH sizeof(caicos_cgcg_cgls_enable) / (3 * sizeof(u32))
    569  1.1  riastrad 
    570  1.1  riastrad static const u32 caicos_mgcg_default[] =
    571  1.1  riastrad {
    572  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    573  1.1  riastrad 	0x00005448, 0x00000100, 0xffffffff,
    574  1.1  riastrad 	0x000055e4, 0x00600100, 0xffffffff,
    575  1.1  riastrad 	0x0000160c, 0x00000100, 0xffffffff,
    576  1.1  riastrad 	0x0000c164, 0x00000100, 0xffffffff,
    577  1.1  riastrad 	0x00008a18, 0x00000100, 0xffffffff,
    578  1.1  riastrad 	0x0000897c, 0x06000100, 0xffffffff,
    579  1.1  riastrad 	0x00008b28, 0x00000100, 0xffffffff,
    580  1.1  riastrad 	0x00009144, 0x00000100, 0xffffffff,
    581  1.1  riastrad 	0x00009a60, 0x00000100, 0xffffffff,
    582  1.1  riastrad 	0x00009868, 0x00000100, 0xffffffff,
    583  1.1  riastrad 	0x00008d58, 0x00000100, 0xffffffff,
    584  1.1  riastrad 	0x00009510, 0x00000100, 0xffffffff,
    585  1.1  riastrad 	0x0000949c, 0x00000100, 0xffffffff,
    586  1.1  riastrad 	0x00009654, 0x00000100, 0xffffffff,
    587  1.1  riastrad 	0x00009030, 0x00000100, 0xffffffff,
    588  1.1  riastrad 	0x00009034, 0x00000100, 0xffffffff,
    589  1.1  riastrad 	0x00009038, 0x00000100, 0xffffffff,
    590  1.1  riastrad 	0x0000903c, 0x00000100, 0xffffffff,
    591  1.1  riastrad 	0x00009040, 0x00000100, 0xffffffff,
    592  1.1  riastrad 	0x0000a200, 0x00000100, 0xffffffff,
    593  1.1  riastrad 	0x0000a204, 0x00000100, 0xffffffff,
    594  1.1  riastrad 	0x0000a208, 0x00000100, 0xffffffff,
    595  1.1  riastrad 	0x0000a20c, 0x00000100, 0xffffffff,
    596  1.1  riastrad 	0x0000977c, 0x00000100, 0xffffffff,
    597  1.1  riastrad 	0x00003f80, 0x00000100, 0xffffffff,
    598  1.1  riastrad 	0x0000a210, 0x00000100, 0xffffffff,
    599  1.1  riastrad 	0x0000a214, 0x00000100, 0xffffffff,
    600  1.1  riastrad 	0x000004d8, 0x00000100, 0xffffffff,
    601  1.1  riastrad 	0x00009784, 0x00000100, 0xffffffff,
    602  1.1  riastrad 	0x00009698, 0x00000100, 0xffffffff,
    603  1.1  riastrad 	0x000004d4, 0x00000200, 0xffffffff,
    604  1.1  riastrad 	0x000004d0, 0x00000000, 0xffffffff,
    605  1.1  riastrad 	0x000030cc, 0x00000100, 0xffffffff,
    606  1.1  riastrad 	0x0000d0c0, 0xff000100, 0xffffffff,
    607  1.1  riastrad 	0x0000915c, 0x00010000, 0xffffffff,
    608  1.1  riastrad 	0x00009160, 0x00030002, 0xffffffff,
    609  1.1  riastrad 	0x00009164, 0x00050004, 0xffffffff,
    610  1.1  riastrad 	0x00009168, 0x00070006, 0xffffffff,
    611  1.1  riastrad 	0x00009178, 0x00070000, 0xffffffff,
    612  1.1  riastrad 	0x0000917c, 0x00030002, 0xffffffff,
    613  1.1  riastrad 	0x00009180, 0x00050004, 0xffffffff,
    614  1.1  riastrad 	0x0000918c, 0x00010006, 0xffffffff,
    615  1.1  riastrad 	0x00009190, 0x00090008, 0xffffffff,
    616  1.1  riastrad 	0x00009194, 0x00070000, 0xffffffff,
    617  1.1  riastrad 	0x00009198, 0x00030002, 0xffffffff,
    618  1.1  riastrad 	0x0000919c, 0x00050004, 0xffffffff,
    619  1.1  riastrad 	0x000091a8, 0x00010006, 0xffffffff,
    620  1.1  riastrad 	0x000091ac, 0x00090008, 0xffffffff,
    621  1.1  riastrad 	0x000091e8, 0x00000000, 0xffffffff,
    622  1.1  riastrad 	0x00009294, 0x00000000, 0xffffffff,
    623  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    624  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    625  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    626  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    627  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    628  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    629  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    630  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    631  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    632  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    633  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    634  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    635  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    636  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    637  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    638  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    639  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    640  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    641  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    642  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    643  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    644  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    645  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    646  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    647  1.1  riastrad };
    648  1.1  riastrad #define CAICOS_MGCG_DEFAULT_LENGTH sizeof(caicos_mgcg_default) / (3 * sizeof(u32))
    649  1.1  riastrad 
    650  1.1  riastrad static const u32 caicos_mgcg_disable[] =
    651  1.1  riastrad {
    652  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    653  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    654  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    655  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    656  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    657  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    658  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    659  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    660  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    661  1.1  riastrad 	0x00009150, 0x00600000, 0xffffffff
    662  1.1  riastrad };
    663  1.1  riastrad #define CAICOS_MGCG_DISABLE_LENGTH sizeof(caicos_mgcg_disable) / (3 * sizeof(u32))
    664  1.1  riastrad 
    665  1.1  riastrad static const u32 caicos_mgcg_enable[] =
    666  1.1  riastrad {
    667  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    668  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    669  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    670  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    671  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    672  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    673  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    674  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    675  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    676  1.1  riastrad 	0x00009150, 0x46944040, 0xffffffff
    677  1.1  riastrad };
    678  1.1  riastrad #define CAICOS_MGCG_ENABLE_LENGTH sizeof(caicos_mgcg_enable) / (3 * sizeof(u32))
    679  1.1  riastrad 
    680  1.1  riastrad //********* TURKS **************//
    681  1.1  riastrad static const u32 turks_cgcg_cgls_default[] =
    682  1.1  riastrad {
    683  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    684  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    685  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    686  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    687  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    688  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    689  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    690  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    691  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    692  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    693  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    694  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    695  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    696  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    697  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    698  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    699  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    700  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    701  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    702  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    703  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    704  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    705  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    706  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    707  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    708  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    709  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    710  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    711  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    712  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    713  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    714  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    715  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    716  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    717  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    718  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    719  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    720  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    721  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    722  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    723  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    724  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    725  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    726  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    727  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    728  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    729  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    730  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    731  1.1  riastrad };
    732  1.1  riastrad #define TURKS_CGCG_CGLS_DEFAULT_LENGTH  sizeof(turks_cgcg_cgls_default) / (3 * sizeof(u32))
    733  1.1  riastrad 
    734  1.1  riastrad static const u32 turks_cgcg_cgls_disable[] =
    735  1.1  riastrad {
    736  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    737  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    738  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    739  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    740  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    741  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    742  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    743  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    744  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    745  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    746  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    747  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    748  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    749  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    750  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    751  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    752  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    753  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    754  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    755  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    756  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    757  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    758  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    759  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    760  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    761  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    762  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    763  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    764  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    765  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    766  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    767  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    768  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    769  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    770  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    771  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    772  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    773  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    774  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    775  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    776  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    777  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    778  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    779  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    780  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    781  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    782  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    783  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    784  1.1  riastrad 	0x00000644, 0x000f7912, 0x001f4180,
    785  1.1  riastrad 	0x00000644, 0x000f3812, 0x001f4180
    786  1.1  riastrad };
    787  1.1  riastrad #define TURKS_CGCG_CGLS_DISABLE_LENGTH sizeof(turks_cgcg_cgls_disable) / (3 * sizeof(u32))
    788  1.1  riastrad 
    789  1.1  riastrad static const u32 turks_cgcg_cgls_enable[] =
    790  1.1  riastrad {
    791  1.1  riastrad 	/* 0x0000c124, 0x84180000, 0x00180000, */
    792  1.1  riastrad 	0x00000644, 0x000f7892, 0x001f4080,
    793  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    794  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    795  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    796  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    797  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    798  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    799  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    800  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    801  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    802  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    803  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    804  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    805  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    806  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    807  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    808  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    809  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    810  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    811  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    812  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    813  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    814  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    815  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    816  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    817  1.1  riastrad 	0x000008f8, 0x00000020, 0xffffffff,
    818  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    819  1.1  riastrad 	0x000008f8, 0x00000021, 0xffffffff,
    820  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    821  1.1  riastrad 	0x000008f8, 0x00000022, 0xffffffff,
    822  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    823  1.1  riastrad 	0x000008f8, 0x00000023, 0xffffffff,
    824  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    825  1.1  riastrad 	0x000008f8, 0x00000024, 0xffffffff,
    826  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    827  1.1  riastrad 	0x000008f8, 0x00000025, 0xffffffff,
    828  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    829  1.1  riastrad 	0x000008f8, 0x00000026, 0xffffffff,
    830  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    831  1.1  riastrad 	0x000008f8, 0x00000027, 0xffffffff,
    832  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    833  1.1  riastrad 	0x000008f8, 0x00000028, 0xffffffff,
    834  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    835  1.1  riastrad 	0x000008f8, 0x00000029, 0xffffffff,
    836  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    837  1.1  riastrad 	0x000008f8, 0x0000002a, 0xffffffff,
    838  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    839  1.1  riastrad 	0x000008f8, 0x0000002b, 0xffffffff,
    840  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff
    841  1.1  riastrad };
    842  1.1  riastrad #define TURKS_CGCG_CGLS_ENABLE_LENGTH sizeof(turks_cgcg_cgls_enable) / (3 * sizeof(u32))
    843  1.1  riastrad 
    844  1.1  riastrad // These are the sequences for turks_mgcg_shls
    845  1.1  riastrad static const u32 turks_mgcg_default[] =
    846  1.1  riastrad {
    847  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    848  1.1  riastrad 	0x00005448, 0x00000100, 0xffffffff,
    849  1.1  riastrad 	0x000055e4, 0x00600100, 0xffffffff,
    850  1.1  riastrad 	0x0000160c, 0x00000100, 0xffffffff,
    851  1.1  riastrad 	0x0000c164, 0x00000100, 0xffffffff,
    852  1.1  riastrad 	0x00008a18, 0x00000100, 0xffffffff,
    853  1.1  riastrad 	0x0000897c, 0x06000100, 0xffffffff,
    854  1.1  riastrad 	0x00008b28, 0x00000100, 0xffffffff,
    855  1.1  riastrad 	0x00009144, 0x00000100, 0xffffffff,
    856  1.1  riastrad 	0x00009a60, 0x00000100, 0xffffffff,
    857  1.1  riastrad 	0x00009868, 0x00000100, 0xffffffff,
    858  1.1  riastrad 	0x00008d58, 0x00000100, 0xffffffff,
    859  1.1  riastrad 	0x00009510, 0x00000100, 0xffffffff,
    860  1.1  riastrad 	0x0000949c, 0x00000100, 0xffffffff,
    861  1.1  riastrad 	0x00009654, 0x00000100, 0xffffffff,
    862  1.1  riastrad 	0x00009030, 0x00000100, 0xffffffff,
    863  1.1  riastrad 	0x00009034, 0x00000100, 0xffffffff,
    864  1.1  riastrad 	0x00009038, 0x00000100, 0xffffffff,
    865  1.1  riastrad 	0x0000903c, 0x00000100, 0xffffffff,
    866  1.1  riastrad 	0x00009040, 0x00000100, 0xffffffff,
    867  1.1  riastrad 	0x0000a200, 0x00000100, 0xffffffff,
    868  1.1  riastrad 	0x0000a204, 0x00000100, 0xffffffff,
    869  1.1  riastrad 	0x0000a208, 0x00000100, 0xffffffff,
    870  1.1  riastrad 	0x0000a20c, 0x00000100, 0xffffffff,
    871  1.1  riastrad 	0x0000977c, 0x00000100, 0xffffffff,
    872  1.1  riastrad 	0x00003f80, 0x00000100, 0xffffffff,
    873  1.1  riastrad 	0x0000a210, 0x00000100, 0xffffffff,
    874  1.1  riastrad 	0x0000a214, 0x00000100, 0xffffffff,
    875  1.1  riastrad 	0x000004d8, 0x00000100, 0xffffffff,
    876  1.1  riastrad 	0x00009784, 0x00000100, 0xffffffff,
    877  1.1  riastrad 	0x00009698, 0x00000100, 0xffffffff,
    878  1.1  riastrad 	0x000004d4, 0x00000200, 0xffffffff,
    879  1.1  riastrad 	0x000004d0, 0x00000000, 0xffffffff,
    880  1.1  riastrad 	0x000030cc, 0x00000100, 0xffffffff,
    881  1.1  riastrad 	0x0000d0c0, 0x00000100, 0xffffffff,
    882  1.1  riastrad 	0x0000915c, 0x00010000, 0xffffffff,
    883  1.1  riastrad 	0x00009160, 0x00030002, 0xffffffff,
    884  1.1  riastrad 	0x00009164, 0x00050004, 0xffffffff,
    885  1.1  riastrad 	0x00009168, 0x00070006, 0xffffffff,
    886  1.1  riastrad 	0x00009178, 0x00070000, 0xffffffff,
    887  1.1  riastrad 	0x0000917c, 0x00030002, 0xffffffff,
    888  1.1  riastrad 	0x00009180, 0x00050004, 0xffffffff,
    889  1.1  riastrad 	0x0000918c, 0x00010006, 0xffffffff,
    890  1.1  riastrad 	0x00009190, 0x00090008, 0xffffffff,
    891  1.1  riastrad 	0x00009194, 0x00070000, 0xffffffff,
    892  1.1  riastrad 	0x00009198, 0x00030002, 0xffffffff,
    893  1.1  riastrad 	0x0000919c, 0x00050004, 0xffffffff,
    894  1.1  riastrad 	0x000091a8, 0x00010006, 0xffffffff,
    895  1.1  riastrad 	0x000091ac, 0x00090008, 0xffffffff,
    896  1.1  riastrad 	0x000091b0, 0x00070000, 0xffffffff,
    897  1.1  riastrad 	0x000091b4, 0x00030002, 0xffffffff,
    898  1.1  riastrad 	0x000091b8, 0x00050004, 0xffffffff,
    899  1.1  riastrad 	0x000091c4, 0x00010006, 0xffffffff,
    900  1.1  riastrad 	0x000091c8, 0x00090008, 0xffffffff,
    901  1.1  riastrad 	0x000091cc, 0x00070000, 0xffffffff,
    902  1.1  riastrad 	0x000091d0, 0x00030002, 0xffffffff,
    903  1.1  riastrad 	0x000091d4, 0x00050004, 0xffffffff,
    904  1.1  riastrad 	0x000091e0, 0x00010006, 0xffffffff,
    905  1.1  riastrad 	0x000091e4, 0x00090008, 0xffffffff,
    906  1.1  riastrad 	0x000091e8, 0x00000000, 0xffffffff,
    907  1.1  riastrad 	0x000091ec, 0x00070000, 0xffffffff,
    908  1.1  riastrad 	0x000091f0, 0x00030002, 0xffffffff,
    909  1.1  riastrad 	0x000091f4, 0x00050004, 0xffffffff,
    910  1.1  riastrad 	0x00009200, 0x00010006, 0xffffffff,
    911  1.1  riastrad 	0x00009204, 0x00090008, 0xffffffff,
    912  1.1  riastrad 	0x00009208, 0x00070000, 0xffffffff,
    913  1.1  riastrad 	0x0000920c, 0x00030002, 0xffffffff,
    914  1.1  riastrad 	0x00009210, 0x00050004, 0xffffffff,
    915  1.1  riastrad 	0x0000921c, 0x00010006, 0xffffffff,
    916  1.1  riastrad 	0x00009220, 0x00090008, 0xffffffff,
    917  1.1  riastrad 	0x00009294, 0x00000000, 0xffffffff,
    918  1.1  riastrad 	0x000008f8, 0x00000010, 0xffffffff,
    919  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    920  1.1  riastrad 	0x000008f8, 0x00000011, 0xffffffff,
    921  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    922  1.1  riastrad 	0x000008f8, 0x00000012, 0xffffffff,
    923  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    924  1.1  riastrad 	0x000008f8, 0x00000013, 0xffffffff,
    925  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    926  1.1  riastrad 	0x000008f8, 0x00000014, 0xffffffff,
    927  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    928  1.1  riastrad 	0x000008f8, 0x00000015, 0xffffffff,
    929  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    930  1.1  riastrad 	0x000008f8, 0x00000016, 0xffffffff,
    931  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    932  1.1  riastrad 	0x000008f8, 0x00000017, 0xffffffff,
    933  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    934  1.1  riastrad 	0x000008f8, 0x00000018, 0xffffffff,
    935  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    936  1.1  riastrad 	0x000008f8, 0x00000019, 0xffffffff,
    937  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    938  1.1  riastrad 	0x000008f8, 0x0000001a, 0xffffffff,
    939  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    940  1.1  riastrad 	0x000008f8, 0x0000001b, 0xffffffff,
    941  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff
    942  1.1  riastrad };
    943  1.1  riastrad #define TURKS_MGCG_DEFAULT_LENGTH sizeof(turks_mgcg_default) / (3 * sizeof(u32))
    944  1.1  riastrad 
    945  1.1  riastrad static const u32 turks_mgcg_disable[] =
    946  1.1  riastrad {
    947  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    948  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    949  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    950  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    951  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    952  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    953  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    954  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    955  1.1  riastrad 	0x000008fc, 0xffffffff, 0xffffffff,
    956  1.1  riastrad 	0x00009150, 0x00600000, 0xffffffff
    957  1.1  riastrad };
    958  1.1  riastrad #define TURKS_MGCG_DISABLE_LENGTH sizeof(turks_mgcg_disable) / (3 * sizeof(u32))
    959  1.1  riastrad 
    960  1.1  riastrad static const u32 turks_mgcg_enable[] =
    961  1.1  riastrad {
    962  1.1  riastrad 	0x0000802c, 0xc0000000, 0xffffffff,
    963  1.1  riastrad 	0x000008f8, 0x00000000, 0xffffffff,
    964  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    965  1.1  riastrad 	0x000008f8, 0x00000001, 0xffffffff,
    966  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    967  1.1  riastrad 	0x000008f8, 0x00000002, 0xffffffff,
    968  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    969  1.1  riastrad 	0x000008f8, 0x00000003, 0xffffffff,
    970  1.1  riastrad 	0x000008fc, 0x00000000, 0xffffffff,
    971  1.1  riastrad 	0x00009150, 0x6e944000, 0xffffffff
    972  1.1  riastrad };
    973  1.1  riastrad #define TURKS_MGCG_ENABLE_LENGTH sizeof(turks_mgcg_enable) / (3 * sizeof(u32))
    974  1.1  riastrad 
    975  1.1  riastrad #endif
    976  1.1  riastrad 
    977  1.1  riastrad #ifndef BTC_SYSLS_SEQUENCE
    978  1.1  riastrad #define BTC_SYSLS_SEQUENCE  100
    979  1.1  riastrad 
    980  1.1  riastrad 
    981  1.1  riastrad //********* BARTS **************//
    982  1.1  riastrad static const u32 barts_sysls_default[] =
    983  1.1  riastrad {
    984  1.1  riastrad 	/* Register,   Value,     Mask bits */
    985  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
    986  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
    987  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
    988  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
    989  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
    990  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
    991  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
    992  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
    993  1.1  riastrad 	0x000020c0, 0x000c0c80, 0xffffffff,
    994  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
    995  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
    996  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
    997  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
    998  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
    999  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff
   1000  1.1  riastrad };
   1001  1.1  riastrad #define BARTS_SYSLS_DEFAULT_LENGTH sizeof(barts_sysls_default) / (3 * sizeof(u32))
   1002  1.1  riastrad 
   1003  1.1  riastrad static const u32 barts_sysls_disable[] =
   1004  1.1  riastrad {
   1005  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
   1006  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
   1007  1.1  riastrad 	0x000015c0, 0x00041401, 0xffffffff,
   1008  1.1  riastrad 	0x0000264c, 0x00040400, 0xffffffff,
   1009  1.1  riastrad 	0x00002648, 0x00040400, 0xffffffff,
   1010  1.1  riastrad 	0x00002650, 0x00040400, 0xffffffff,
   1011  1.1  riastrad 	0x000020b8, 0x00040400, 0xffffffff,
   1012  1.1  riastrad 	0x000020bc, 0x00040400, 0xffffffff,
   1013  1.1  riastrad 	0x000020c0, 0x00040c80, 0xffffffff,
   1014  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1015  1.1  riastrad 	0x0000f4a4, 0x00680000, 0xffffffff,
   1016  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
   1017  1.1  riastrad 	0x000064ec, 0x00007ffd, 0xffffffff,
   1018  1.1  riastrad 	0x00000c7c, 0x0000ff00, 0xffffffff,
   1019  1.1  riastrad 	0x00006dfc, 0x0000007f, 0xffffffff
   1020  1.1  riastrad };
   1021  1.1  riastrad #define BARTS_SYSLS_DISABLE_LENGTH sizeof(barts_sysls_disable) / (3 * sizeof(u32))
   1022  1.1  riastrad 
   1023  1.1  riastrad static const u32 barts_sysls_enable[] =
   1024  1.1  riastrad {
   1025  1.1  riastrad 	0x000055e8, 0x00000001, 0xffffffff,
   1026  1.1  riastrad 	0x0000d0bc, 0x00000100, 0xffffffff,
   1027  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
   1028  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
   1029  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
   1030  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
   1031  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
   1032  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
   1033  1.1  riastrad 	0x000020c0, 0x000c0c80, 0xffffffff,
   1034  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1035  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
   1036  1.1  riastrad 	0x000004c8, 0x00000000, 0xffffffff,
   1037  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
   1038  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
   1039  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff
   1040  1.1  riastrad };
   1041  1.1  riastrad #define BARTS_SYSLS_ENABLE_LENGTH sizeof(barts_sysls_enable) / (3 * sizeof(u32))
   1042  1.1  riastrad 
   1043  1.1  riastrad //********* CAICOS **************//
   1044  1.1  riastrad static const u32 caicos_sysls_default[] =
   1045  1.1  riastrad {
   1046  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
   1047  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
   1048  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
   1049  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
   1050  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
   1051  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
   1052  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
   1053  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
   1054  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1055  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
   1056  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
   1057  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
   1058  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
   1059  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff
   1060  1.1  riastrad };
   1061  1.1  riastrad #define CAICOS_SYSLS_DEFAULT_LENGTH sizeof(caicos_sysls_default) / (3 * sizeof(u32))
   1062  1.1  riastrad 
   1063  1.1  riastrad static const u32 caicos_sysls_disable[] =
   1064  1.1  riastrad {
   1065  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
   1066  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
   1067  1.1  riastrad 	0x000015c0, 0x00041401, 0xffffffff,
   1068  1.1  riastrad 	0x0000264c, 0x00040400, 0xffffffff,
   1069  1.1  riastrad 	0x00002648, 0x00040400, 0xffffffff,
   1070  1.1  riastrad 	0x00002650, 0x00040400, 0xffffffff,
   1071  1.1  riastrad 	0x000020b8, 0x00040400, 0xffffffff,
   1072  1.1  riastrad 	0x000020bc, 0x00040400, 0xffffffff,
   1073  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1074  1.1  riastrad 	0x0000f4a4, 0x00680000, 0xffffffff,
   1075  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
   1076  1.1  riastrad 	0x000064ec, 0x00007ffd, 0xffffffff,
   1077  1.1  riastrad 	0x00000c7c, 0x0000ff00, 0xffffffff,
   1078  1.1  riastrad 	0x00006dfc, 0x0000007f, 0xffffffff
   1079  1.1  riastrad };
   1080  1.1  riastrad #define CAICOS_SYSLS_DISABLE_LENGTH sizeof(caicos_sysls_disable) / (3 * sizeof(u32))
   1081  1.1  riastrad 
   1082  1.1  riastrad static const u32 caicos_sysls_enable[] =
   1083  1.1  riastrad {
   1084  1.1  riastrad 	0x000055e8, 0x00000001, 0xffffffff,
   1085  1.1  riastrad 	0x0000d0bc, 0x00000100, 0xffffffff,
   1086  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
   1087  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
   1088  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
   1089  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
   1090  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
   1091  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
   1092  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1093  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
   1094  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
   1095  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
   1096  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff,
   1097  1.1  riastrad 	0x000004c8, 0x00000000, 0xffffffff
   1098  1.1  riastrad };
   1099  1.1  riastrad #define CAICOS_SYSLS_ENABLE_LENGTH sizeof(caicos_sysls_enable) / (3 * sizeof(u32))
   1100  1.1  riastrad 
   1101  1.1  riastrad //********* TURKS **************//
   1102  1.1  riastrad static const u32 turks_sysls_default[] =
   1103  1.1  riastrad {
   1104  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
   1105  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
   1106  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
   1107  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
   1108  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
   1109  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
   1110  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
   1111  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
   1112  1.1  riastrad 	0x000020c0, 0x000c0c80, 0xffffffff,
   1113  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1114  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
   1115  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
   1116  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
   1117  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
   1118  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff
   1119  1.1  riastrad };
   1120  1.1  riastrad #define TURKS_SYSLS_DEFAULT_LENGTH sizeof(turks_sysls_default) / (3 * sizeof(u32))
   1121  1.1  riastrad 
   1122  1.1  riastrad static const u32 turks_sysls_disable[] =
   1123  1.1  riastrad {
   1124  1.1  riastrad 	0x000055e8, 0x00000000, 0xffffffff,
   1125  1.1  riastrad 	0x0000d0bc, 0x00000000, 0xffffffff,
   1126  1.1  riastrad 	0x000015c0, 0x00041401, 0xffffffff,
   1127  1.1  riastrad 	0x0000264c, 0x00040400, 0xffffffff,
   1128  1.1  riastrad 	0x00002648, 0x00040400, 0xffffffff,
   1129  1.1  riastrad 	0x00002650, 0x00040400, 0xffffffff,
   1130  1.1  riastrad 	0x000020b8, 0x00040400, 0xffffffff,
   1131  1.1  riastrad 	0x000020bc, 0x00040400, 0xffffffff,
   1132  1.1  riastrad 	0x000020c0, 0x00040c80, 0xffffffff,
   1133  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1134  1.1  riastrad 	0x0000f4a4, 0x00680000, 0xffffffff,
   1135  1.1  riastrad 	0x000004c8, 0x00000001, 0xffffffff,
   1136  1.1  riastrad 	0x000064ec, 0x00007ffd, 0xffffffff,
   1137  1.1  riastrad 	0x00000c7c, 0x0000ff00, 0xffffffff,
   1138  1.1  riastrad 	0x00006dfc, 0x0000007f, 0xffffffff
   1139  1.1  riastrad };
   1140  1.1  riastrad #define TURKS_SYSLS_DISABLE_LENGTH sizeof(turks_sysls_disable) / (3 * sizeof(u32))
   1141  1.1  riastrad 
   1142  1.1  riastrad static const u32 turks_sysls_enable[] =
   1143  1.1  riastrad {
   1144  1.1  riastrad 	0x000055e8, 0x00000001, 0xffffffff,
   1145  1.1  riastrad 	0x0000d0bc, 0x00000100, 0xffffffff,
   1146  1.1  riastrad 	0x000015c0, 0x000c1401, 0xffffffff,
   1147  1.1  riastrad 	0x0000264c, 0x000c0400, 0xffffffff,
   1148  1.1  riastrad 	0x00002648, 0x000c0400, 0xffffffff,
   1149  1.1  riastrad 	0x00002650, 0x000c0400, 0xffffffff,
   1150  1.1  riastrad 	0x000020b8, 0x000c0400, 0xffffffff,
   1151  1.1  riastrad 	0x000020bc, 0x000c0400, 0xffffffff,
   1152  1.1  riastrad 	0x000020c0, 0x000c0c80, 0xffffffff,
   1153  1.1  riastrad 	0x0000f4a0, 0x000000c0, 0xffffffff,
   1154  1.1  riastrad 	0x0000f4a4, 0x00680fff, 0xffffffff,
   1155  1.1  riastrad 	0x000004c8, 0x00000000, 0xffffffff,
   1156  1.1  riastrad 	0x000064ec, 0x00000000, 0xffffffff,
   1157  1.1  riastrad 	0x00000c7c, 0x00000000, 0xffffffff,
   1158  1.1  riastrad 	0x00006dfc, 0x00000000, 0xffffffff
   1159  1.1  riastrad };
   1160  1.1  riastrad #define TURKS_SYSLS_ENABLE_LENGTH sizeof(turks_sysls_enable) / (3 * sizeof(u32))
   1161  1.1  riastrad 
   1162  1.1  riastrad #endif
   1163  1.1  riastrad 
   1164  1.1  riastrad u32 btc_valid_sclk[40] =
   1165  1.1  riastrad {
   1166  1.1  riastrad 	5000,   10000,  15000,  20000,  25000,  30000,  35000,  40000,  45000,  50000,
   1167  1.1  riastrad 	55000,  60000,  65000,  70000,  75000,  80000,  85000,  90000,  95000,  100000,
   1168  1.1  riastrad 	105000, 110000, 11500,  120000, 125000, 130000, 135000, 140000, 145000, 150000,
   1169  1.1  riastrad 	155000, 160000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000
   1170  1.1  riastrad };
   1171  1.1  riastrad 
   1172  1.2  riastrad static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = {
   1173  1.2  riastrad 	{ 10000, 30000, RADEON_SCLK_UP },
   1174  1.2  riastrad 	{ 15000, 30000, RADEON_SCLK_UP },
   1175  1.2  riastrad 	{ 20000, 30000, RADEON_SCLK_UP },
   1176  1.2  riastrad 	{ 25000, 30000, RADEON_SCLK_UP }
   1177  1.1  riastrad };
   1178  1.1  riastrad 
   1179  1.1  riastrad void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table,
   1180  1.1  riastrad 						     u32 *max_clock)
   1181  1.1  riastrad {
   1182  1.1  riastrad 	u32 i, clock = 0;
   1183  1.1  riastrad 
   1184  1.1  riastrad 	if ((table == NULL) || (table->count == 0)) {
   1185  1.1  riastrad 		*max_clock = clock;
   1186  1.1  riastrad 		return;
   1187  1.1  riastrad 	}
   1188  1.1  riastrad 
   1189  1.1  riastrad 	for (i = 0; i < table->count; i++) {
   1190  1.1  riastrad 		if (clock < table->entries[i].clk)
   1191  1.1  riastrad 			clock = table->entries[i].clk;
   1192  1.1  riastrad 	}
   1193  1.1  riastrad 	*max_clock = clock;
   1194  1.1  riastrad }
   1195  1.1  riastrad 
   1196  1.1  riastrad void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,
   1197  1.1  riastrad 					u32 clock, u16 max_voltage, u16 *voltage)
   1198  1.1  riastrad {
   1199  1.1  riastrad 	u32 i;
   1200  1.1  riastrad 
   1201  1.1  riastrad 	if ((table == NULL) || (table->count == 0))
   1202  1.1  riastrad 		return;
   1203  1.1  riastrad 
   1204  1.1  riastrad 	for (i= 0; i < table->count; i++) {
   1205  1.1  riastrad 		if (clock <= table->entries[i].clk) {
   1206  1.1  riastrad 			if (*voltage < table->entries[i].v)
   1207  1.1  riastrad 				*voltage = (u16)((table->entries[i].v < max_voltage) ?
   1208  1.1  riastrad 						  table->entries[i].v : max_voltage);
   1209  1.1  riastrad 			return;
   1210  1.1  riastrad 		}
   1211  1.1  riastrad 	}
   1212  1.1  riastrad 
   1213  1.1  riastrad 	*voltage = (*voltage > max_voltage) ? *voltage : max_voltage;
   1214  1.1  riastrad }
   1215  1.1  riastrad 
   1216  1.1  riastrad static u32 btc_find_valid_clock(struct radeon_clock_array *clocks,
   1217  1.1  riastrad 				u32 max_clock, u32 requested_clock)
   1218  1.1  riastrad {
   1219  1.1  riastrad 	unsigned int i;
   1220  1.1  riastrad 
   1221  1.1  riastrad 	if ((clocks == NULL) || (clocks->count == 0))
   1222  1.1  riastrad 		return (requested_clock < max_clock) ? requested_clock : max_clock;
   1223  1.1  riastrad 
   1224  1.1  riastrad 	for (i = 0; i < clocks->count; i++) {
   1225  1.1  riastrad 		if (clocks->values[i] >= requested_clock)
   1226  1.1  riastrad 			return (clocks->values[i] < max_clock) ? clocks->values[i] : max_clock;
   1227  1.1  riastrad 	}
   1228  1.1  riastrad 
   1229  1.1  riastrad 	return (clocks->values[clocks->count - 1] < max_clock) ?
   1230  1.1  riastrad 		clocks->values[clocks->count - 1] : max_clock;
   1231  1.1  riastrad }
   1232  1.1  riastrad 
   1233  1.1  riastrad static u32 btc_get_valid_mclk(struct radeon_device *rdev,
   1234  1.1  riastrad 			      u32 max_mclk, u32 requested_mclk)
   1235  1.1  riastrad {
   1236  1.1  riastrad 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_mclk_values,
   1237  1.1  riastrad 				    max_mclk, requested_mclk);
   1238  1.1  riastrad }
   1239  1.1  riastrad 
   1240  1.1  riastrad static u32 btc_get_valid_sclk(struct radeon_device *rdev,
   1241  1.1  riastrad 			      u32 max_sclk, u32 requested_sclk)
   1242  1.1  riastrad {
   1243  1.1  riastrad 	return btc_find_valid_clock(&rdev->pm.dpm.dyn_state.valid_sclk_values,
   1244  1.1  riastrad 				    max_sclk, requested_sclk);
   1245  1.1  riastrad }
   1246  1.1  riastrad 
   1247  1.1  riastrad void btc_skip_blacklist_clocks(struct radeon_device *rdev,
   1248  1.1  riastrad 			       const u32 max_sclk, const u32 max_mclk,
   1249  1.1  riastrad 			       u32 *sclk, u32 *mclk)
   1250  1.1  riastrad {
   1251  1.1  riastrad 	int i, num_blacklist_clocks;
   1252  1.1  riastrad 
   1253  1.1  riastrad 	if ((sclk == NULL) || (mclk == NULL))
   1254  1.1  riastrad 		return;
   1255  1.1  riastrad 
   1256  1.1  riastrad 	num_blacklist_clocks = ARRAY_SIZE(btc_blacklist_clocks);
   1257  1.1  riastrad 
   1258  1.1  riastrad 	for (i = 0; i < num_blacklist_clocks; i++) {
   1259  1.1  riastrad 		if ((btc_blacklist_clocks[i].sclk == *sclk) &&
   1260  1.1  riastrad 		    (btc_blacklist_clocks[i].mclk == *mclk))
   1261  1.1  riastrad 			break;
   1262  1.1  riastrad 	}
   1263  1.1  riastrad 
   1264  1.1  riastrad 	if (i < num_blacklist_clocks) {
   1265  1.1  riastrad 		if (btc_blacklist_clocks[i].action == RADEON_SCLK_UP) {
   1266  1.1  riastrad 			*sclk = btc_get_valid_sclk(rdev, max_sclk, *sclk + 1);
   1267  1.1  riastrad 
   1268  1.1  riastrad 			if (*sclk < max_sclk)
   1269  1.1  riastrad 				btc_skip_blacklist_clocks(rdev, max_sclk, max_mclk, sclk, mclk);
   1270  1.1  riastrad 		}
   1271  1.1  riastrad 	}
   1272  1.1  riastrad }
   1273  1.1  riastrad 
   1274  1.1  riastrad void btc_adjust_clock_combinations(struct radeon_device *rdev,
   1275  1.1  riastrad 				   const struct radeon_clock_and_voltage_limits *max_limits,
   1276  1.1  riastrad 				   struct rv7xx_pl *pl)
   1277  1.1  riastrad {
   1278  1.1  riastrad 
   1279  1.1  riastrad 	if ((pl->mclk == 0) || (pl->sclk == 0))
   1280  1.1  riastrad 		return;
   1281  1.1  riastrad 
   1282  1.1  riastrad 	if (pl->mclk == pl->sclk)
   1283  1.1  riastrad 		return;
   1284  1.1  riastrad 
   1285  1.1  riastrad 	if (pl->mclk > pl->sclk) {
   1286  1.1  riastrad 		if (((pl->mclk + (pl->sclk - 1)) / pl->sclk) > rdev->pm.dpm.dyn_state.mclk_sclk_ratio)
   1287  1.1  riastrad 			pl->sclk = btc_get_valid_sclk(rdev,
   1288  1.1  riastrad 						      max_limits->sclk,
   1289  1.1  riastrad 						      (pl->mclk +
   1290  1.1  riastrad 						       (rdev->pm.dpm.dyn_state.mclk_sclk_ratio - 1)) /
   1291  1.1  riastrad 						      rdev->pm.dpm.dyn_state.mclk_sclk_ratio);
   1292  1.1  riastrad 	} else {
   1293  1.1  riastrad 		if ((pl->sclk - pl->mclk) > rdev->pm.dpm.dyn_state.sclk_mclk_delta)
   1294  1.1  riastrad 			pl->mclk = btc_get_valid_mclk(rdev,
   1295  1.1  riastrad 						      max_limits->mclk,
   1296  1.1  riastrad 						      pl->sclk -
   1297  1.1  riastrad 						      rdev->pm.dpm.dyn_state.sclk_mclk_delta);
   1298  1.1  riastrad 	}
   1299  1.1  riastrad }
   1300  1.1  riastrad 
   1301  1.1  riastrad static u16 btc_find_voltage(struct atom_voltage_table *table, u16 voltage)
   1302  1.1  riastrad {
   1303  1.1  riastrad 	unsigned int i;
   1304  1.1  riastrad 
   1305  1.1  riastrad 	for (i = 0; i < table->count; i++) {
   1306  1.1  riastrad 		if (voltage <= table->entries[i].value)
   1307  1.1  riastrad 			return table->entries[i].value;
   1308  1.1  riastrad 	}
   1309  1.1  riastrad 
   1310  1.1  riastrad 	return table->entries[table->count - 1].value;
   1311  1.1  riastrad }
   1312  1.1  riastrad 
   1313  1.1  riastrad void btc_apply_voltage_delta_rules(struct radeon_device *rdev,
   1314  1.1  riastrad 				   u16 max_vddc, u16 max_vddci,
   1315  1.1  riastrad 				   u16 *vddc, u16 *vddci)
   1316  1.1  riastrad {
   1317  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1318  1.1  riastrad 	u16 new_voltage;
   1319  1.1  riastrad 
   1320  1.1  riastrad 	if ((0 == *vddc) || (0 == *vddci))
   1321  1.1  riastrad 		return;
   1322  1.1  riastrad 
   1323  1.1  riastrad 	if (*vddc > *vddci) {
   1324  1.1  riastrad 		if ((*vddc - *vddci) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
   1325  1.1  riastrad 			new_voltage = btc_find_voltage(&eg_pi->vddci_voltage_table,
   1326  1.1  riastrad 						       (*vddc - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
   1327  1.1  riastrad 			*vddci = (new_voltage < max_vddci) ? new_voltage : max_vddci;
   1328  1.1  riastrad 		}
   1329  1.1  riastrad 	} else {
   1330  1.1  riastrad 		if ((*vddci - *vddc) > rdev->pm.dpm.dyn_state.vddc_vddci_delta) {
   1331  1.1  riastrad 			new_voltage = btc_find_voltage(&eg_pi->vddc_voltage_table,
   1332  1.1  riastrad 						       (*vddci - rdev->pm.dpm.dyn_state.vddc_vddci_delta));
   1333  1.1  riastrad 			*vddc = (new_voltage < max_vddc) ? new_voltage : max_vddc;
   1334  1.1  riastrad 		}
   1335  1.1  riastrad 	}
   1336  1.1  riastrad }
   1337  1.1  riastrad 
   1338  1.1  riastrad static void btc_enable_bif_dynamic_pcie_gen2(struct radeon_device *rdev,
   1339  1.1  riastrad 					     bool enable)
   1340  1.1  riastrad {
   1341  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   1342  1.1  riastrad 	u32 tmp, bif;
   1343  1.1  riastrad 
   1344  1.1  riastrad 	tmp = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
   1345  1.1  riastrad 	if (enable) {
   1346  1.1  riastrad 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
   1347  1.1  riastrad 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
   1348  1.1  riastrad 			if (!pi->boot_in_gen2) {
   1349  1.1  riastrad 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
   1350  1.1  riastrad 				bif |= CG_CLIENT_REQ(0xd);
   1351  1.1  riastrad 				WREG32(CG_BIF_REQ_AND_RSP, bif);
   1352  1.1  riastrad 
   1353  1.1  riastrad 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
   1354  1.1  riastrad 				tmp |= LC_HW_VOLTAGE_IF_CONTROL(1);
   1355  1.1  riastrad 				tmp |= LC_GEN2_EN_STRAP;
   1356  1.1  riastrad 
   1357  1.1  riastrad 				tmp |= LC_CLR_FAILED_SPD_CHANGE_CNT;
   1358  1.1  riastrad 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
   1359  1.1  riastrad 				udelay(10);
   1360  1.1  riastrad 				tmp &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
   1361  1.1  riastrad 				WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
   1362  1.1  riastrad 			}
   1363  1.1  riastrad 		}
   1364  1.1  riastrad 	} else {
   1365  1.1  riastrad 		if ((tmp & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
   1366  1.1  riastrad 		    (tmp & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
   1367  1.1  riastrad 			if (!pi->boot_in_gen2) {
   1368  1.1  riastrad 				bif = RREG32(CG_BIF_REQ_AND_RSP) & ~CG_CLIENT_REQ_MASK;
   1369  1.1  riastrad 				bif |= CG_CLIENT_REQ(0xd);
   1370  1.1  riastrad 				WREG32(CG_BIF_REQ_AND_RSP, bif);
   1371  1.1  riastrad 
   1372  1.1  riastrad 				tmp &= ~LC_HW_VOLTAGE_IF_CONTROL_MASK;
   1373  1.1  riastrad 				tmp &= ~LC_GEN2_EN_STRAP;
   1374  1.1  riastrad 			}
   1375  1.1  riastrad 			WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, tmp);
   1376  1.1  riastrad 		}
   1377  1.1  riastrad 	}
   1378  1.1  riastrad }
   1379  1.1  riastrad 
   1380  1.1  riastrad static void btc_enable_dynamic_pcie_gen2(struct radeon_device *rdev,
   1381  1.1  riastrad 					 bool enable)
   1382  1.1  riastrad {
   1383  1.1  riastrad 	btc_enable_bif_dynamic_pcie_gen2(rdev, enable);
   1384  1.1  riastrad 
   1385  1.1  riastrad 	if (enable)
   1386  1.1  riastrad 		WREG32_P(GENERAL_PWRMGT, ENABLE_GEN2PCIE, ~ENABLE_GEN2PCIE);
   1387  1.1  riastrad 	else
   1388  1.1  riastrad 		WREG32_P(GENERAL_PWRMGT, 0, ~ENABLE_GEN2PCIE);
   1389  1.1  riastrad }
   1390  1.1  riastrad 
   1391  1.1  riastrad static int btc_disable_ulv(struct radeon_device *rdev)
   1392  1.1  riastrad {
   1393  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1394  1.1  riastrad 
   1395  1.1  riastrad 	if (eg_pi->ulv.supported) {
   1396  1.1  riastrad 		if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) != PPSMC_Result_OK)
   1397  1.1  riastrad 			return -EINVAL;
   1398  1.1  riastrad 	}
   1399  1.1  riastrad 	return 0;
   1400  1.1  riastrad }
   1401  1.1  riastrad 
   1402  1.1  riastrad static int btc_populate_ulv_state(struct radeon_device *rdev,
   1403  1.1  riastrad 				  RV770_SMC_STATETABLE *table)
   1404  1.1  riastrad {
   1405  1.1  riastrad 	int ret = -EINVAL;
   1406  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1407  1.1  riastrad 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
   1408  1.1  riastrad 
   1409  1.1  riastrad 	if (ulv_pl->vddc) {
   1410  1.1  riastrad 		ret = cypress_convert_power_level_to_smc(rdev,
   1411  1.1  riastrad 							 ulv_pl,
   1412  1.1  riastrad 							 &table->ULVState.levels[0],
   1413  1.1  riastrad 							 PPSMC_DISPLAY_WATERMARK_LOW);
   1414  1.1  riastrad 		if (ret == 0) {
   1415  1.1  riastrad 			table->ULVState.levels[0].arbValue = MC_CG_ARB_FREQ_F0;
   1416  1.1  riastrad 			table->ULVState.levels[0].ACIndex = 1;
   1417  1.1  riastrad 
   1418  1.1  riastrad 			table->ULVState.levels[1] = table->ULVState.levels[0];
   1419  1.1  riastrad 			table->ULVState.levels[2] = table->ULVState.levels[0];
   1420  1.1  riastrad 
   1421  1.1  riastrad 			table->ULVState.flags |= PPSMC_SWSTATE_FLAG_DC;
   1422  1.1  riastrad 
   1423  1.1  riastrad 			WREG32(CG_ULV_CONTROL, BTC_CGULVCONTROL_DFLT);
   1424  1.1  riastrad 			WREG32(CG_ULV_PARAMETER, BTC_CGULVPARAMETER_DFLT);
   1425  1.1  riastrad 		}
   1426  1.1  riastrad 	}
   1427  1.1  riastrad 
   1428  1.1  riastrad 	return ret;
   1429  1.1  riastrad }
   1430  1.1  riastrad 
   1431  1.1  riastrad static int btc_populate_smc_acpi_state(struct radeon_device *rdev,
   1432  1.1  riastrad 				       RV770_SMC_STATETABLE *table)
   1433  1.1  riastrad {
   1434  1.1  riastrad 	int ret = cypress_populate_smc_acpi_state(rdev, table);
   1435  1.1  riastrad 
   1436  1.1  riastrad 	if (ret == 0) {
   1437  1.1  riastrad 		table->ACPIState.levels[0].ACIndex = 0;
   1438  1.1  riastrad 		table->ACPIState.levels[1].ACIndex = 0;
   1439  1.1  riastrad 		table->ACPIState.levels[2].ACIndex = 0;
   1440  1.1  riastrad 	}
   1441  1.1  riastrad 
   1442  1.1  riastrad 	return ret;
   1443  1.1  riastrad }
   1444  1.1  riastrad 
   1445  1.1  riastrad void btc_program_mgcg_hw_sequence(struct radeon_device *rdev,
   1446  1.1  riastrad 				  const u32 *sequence, u32 count)
   1447  1.1  riastrad {
   1448  1.1  riastrad 	u32 i, length = count * 3;
   1449  1.1  riastrad 	u32 tmp;
   1450  1.1  riastrad 
   1451  1.1  riastrad 	for (i = 0; i < length; i+=3) {
   1452  1.1  riastrad 		tmp = RREG32(sequence[i]);
   1453  1.1  riastrad 		tmp &= ~sequence[i+2];
   1454  1.1  riastrad 		tmp |= sequence[i+1] & sequence[i+2];
   1455  1.1  riastrad 		WREG32(sequence[i], tmp);
   1456  1.1  riastrad 	}
   1457  1.1  riastrad }
   1458  1.1  riastrad 
   1459  1.1  riastrad static void btc_cg_clock_gating_default(struct radeon_device *rdev)
   1460  1.1  riastrad {
   1461  1.1  riastrad 	u32 count;
   1462  1.1  riastrad 	const u32 *p = NULL;
   1463  1.1  riastrad 
   1464  1.1  riastrad 	if (rdev->family == CHIP_BARTS) {
   1465  1.1  riastrad 		p = (const u32 *)&barts_cgcg_cgls_default;
   1466  1.1  riastrad 		count = BARTS_CGCG_CGLS_DEFAULT_LENGTH;
   1467  1.1  riastrad 	} else if (rdev->family == CHIP_TURKS) {
   1468  1.1  riastrad 		p = (const u32 *)&turks_cgcg_cgls_default;
   1469  1.1  riastrad 		count = TURKS_CGCG_CGLS_DEFAULT_LENGTH;
   1470  1.1  riastrad 	} else if (rdev->family == CHIP_CAICOS) {
   1471  1.1  riastrad 		p = (const u32 *)&caicos_cgcg_cgls_default;
   1472  1.1  riastrad 		count = CAICOS_CGCG_CGLS_DEFAULT_LENGTH;
   1473  1.1  riastrad 	} else
   1474  1.1  riastrad 		return;
   1475  1.1  riastrad 
   1476  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1477  1.1  riastrad }
   1478  1.1  riastrad 
   1479  1.1  riastrad static void btc_cg_clock_gating_enable(struct radeon_device *rdev,
   1480  1.1  riastrad 				       bool enable)
   1481  1.1  riastrad {
   1482  1.1  riastrad 	u32 count;
   1483  1.1  riastrad 	const u32 *p = NULL;
   1484  1.1  riastrad 
   1485  1.1  riastrad 	if (enable) {
   1486  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1487  1.1  riastrad 			p = (const u32 *)&barts_cgcg_cgls_enable;
   1488  1.1  riastrad 			count = BARTS_CGCG_CGLS_ENABLE_LENGTH;
   1489  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1490  1.1  riastrad 			p = (const u32 *)&turks_cgcg_cgls_enable;
   1491  1.1  riastrad 			count = TURKS_CGCG_CGLS_ENABLE_LENGTH;
   1492  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1493  1.1  riastrad 			p = (const u32 *)&caicos_cgcg_cgls_enable;
   1494  1.1  riastrad 			count = CAICOS_CGCG_CGLS_ENABLE_LENGTH;
   1495  1.1  riastrad 		} else
   1496  1.1  riastrad 			return;
   1497  1.1  riastrad 	} else {
   1498  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1499  1.1  riastrad 			p = (const u32 *)&barts_cgcg_cgls_disable;
   1500  1.1  riastrad 			count = BARTS_CGCG_CGLS_DISABLE_LENGTH;
   1501  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1502  1.1  riastrad 			p = (const u32 *)&turks_cgcg_cgls_disable;
   1503  1.1  riastrad 			count = TURKS_CGCG_CGLS_DISABLE_LENGTH;
   1504  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1505  1.1  riastrad 			p = (const u32 *)&caicos_cgcg_cgls_disable;
   1506  1.1  riastrad 			count = CAICOS_CGCG_CGLS_DISABLE_LENGTH;
   1507  1.1  riastrad 		} else
   1508  1.1  riastrad 			return;
   1509  1.1  riastrad 	}
   1510  1.1  riastrad 
   1511  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1512  1.1  riastrad }
   1513  1.1  riastrad 
   1514  1.1  riastrad static void btc_mg_clock_gating_default(struct radeon_device *rdev)
   1515  1.1  riastrad {
   1516  1.1  riastrad 	u32 count;
   1517  1.1  riastrad 	const u32 *p = NULL;
   1518  1.1  riastrad 
   1519  1.1  riastrad 	if (rdev->family == CHIP_BARTS) {
   1520  1.1  riastrad 		p = (const u32 *)&barts_mgcg_default;
   1521  1.1  riastrad 		count = BARTS_MGCG_DEFAULT_LENGTH;
   1522  1.1  riastrad 	} else if (rdev->family == CHIP_TURKS) {
   1523  1.1  riastrad 		p = (const u32 *)&turks_mgcg_default;
   1524  1.1  riastrad 		count = TURKS_MGCG_DEFAULT_LENGTH;
   1525  1.1  riastrad 	} else if (rdev->family == CHIP_CAICOS) {
   1526  1.1  riastrad 		p = (const u32 *)&caicos_mgcg_default;
   1527  1.1  riastrad 		count = CAICOS_MGCG_DEFAULT_LENGTH;
   1528  1.1  riastrad 	} else
   1529  1.1  riastrad 		return;
   1530  1.1  riastrad 
   1531  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1532  1.1  riastrad }
   1533  1.1  riastrad 
   1534  1.1  riastrad static void btc_mg_clock_gating_enable(struct radeon_device *rdev,
   1535  1.1  riastrad 				       bool enable)
   1536  1.1  riastrad {
   1537  1.1  riastrad 	u32 count;
   1538  1.1  riastrad 	const u32 *p = NULL;
   1539  1.1  riastrad 
   1540  1.1  riastrad 	if (enable) {
   1541  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1542  1.1  riastrad 			p = (const u32 *)&barts_mgcg_enable;
   1543  1.1  riastrad 			count = BARTS_MGCG_ENABLE_LENGTH;
   1544  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1545  1.1  riastrad 			p = (const u32 *)&turks_mgcg_enable;
   1546  1.1  riastrad 			count = TURKS_MGCG_ENABLE_LENGTH;
   1547  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1548  1.1  riastrad 			p = (const u32 *)&caicos_mgcg_enable;
   1549  1.1  riastrad 			count = CAICOS_MGCG_ENABLE_LENGTH;
   1550  1.1  riastrad 		} else
   1551  1.1  riastrad 			return;
   1552  1.1  riastrad 	} else {
   1553  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1554  1.1  riastrad 			p = (const u32 *)&barts_mgcg_disable[0];
   1555  1.1  riastrad 			count = BARTS_MGCG_DISABLE_LENGTH;
   1556  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1557  1.1  riastrad 			p = (const u32 *)&turks_mgcg_disable[0];
   1558  1.1  riastrad 			count = TURKS_MGCG_DISABLE_LENGTH;
   1559  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1560  1.1  riastrad 			p = (const u32 *)&caicos_mgcg_disable[0];
   1561  1.1  riastrad 			count = CAICOS_MGCG_DISABLE_LENGTH;
   1562  1.1  riastrad 		} else
   1563  1.1  riastrad 			return;
   1564  1.1  riastrad 	}
   1565  1.1  riastrad 
   1566  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1567  1.1  riastrad }
   1568  1.1  riastrad 
   1569  1.1  riastrad static void btc_ls_clock_gating_default(struct radeon_device *rdev)
   1570  1.1  riastrad {
   1571  1.1  riastrad 	u32 count;
   1572  1.1  riastrad 	const u32 *p = NULL;
   1573  1.1  riastrad 
   1574  1.1  riastrad 	if (rdev->family == CHIP_BARTS) {
   1575  1.1  riastrad 		p = (const u32 *)&barts_sysls_default;
   1576  1.1  riastrad 		count = BARTS_SYSLS_DEFAULT_LENGTH;
   1577  1.1  riastrad 	} else if (rdev->family == CHIP_TURKS) {
   1578  1.1  riastrad 		p = (const u32 *)&turks_sysls_default;
   1579  1.1  riastrad 		count = TURKS_SYSLS_DEFAULT_LENGTH;
   1580  1.1  riastrad 	} else if (rdev->family == CHIP_CAICOS) {
   1581  1.1  riastrad 		p = (const u32 *)&caicos_sysls_default;
   1582  1.1  riastrad 		count = CAICOS_SYSLS_DEFAULT_LENGTH;
   1583  1.1  riastrad 	} else
   1584  1.1  riastrad 		return;
   1585  1.1  riastrad 
   1586  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1587  1.1  riastrad }
   1588  1.1  riastrad 
   1589  1.1  riastrad static void btc_ls_clock_gating_enable(struct radeon_device *rdev,
   1590  1.1  riastrad 				       bool enable)
   1591  1.1  riastrad {
   1592  1.1  riastrad 	u32 count;
   1593  1.1  riastrad 	const u32 *p = NULL;
   1594  1.1  riastrad 
   1595  1.1  riastrad 	if (enable) {
   1596  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1597  1.1  riastrad 			p = (const u32 *)&barts_sysls_enable;
   1598  1.1  riastrad 			count = BARTS_SYSLS_ENABLE_LENGTH;
   1599  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1600  1.1  riastrad 			p = (const u32 *)&turks_sysls_enable;
   1601  1.1  riastrad 			count = TURKS_SYSLS_ENABLE_LENGTH;
   1602  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1603  1.1  riastrad 			p = (const u32 *)&caicos_sysls_enable;
   1604  1.1  riastrad 			count = CAICOS_SYSLS_ENABLE_LENGTH;
   1605  1.1  riastrad 		} else
   1606  1.1  riastrad 			return;
   1607  1.1  riastrad 	} else {
   1608  1.1  riastrad 		if (rdev->family == CHIP_BARTS) {
   1609  1.1  riastrad 			p = (const u32 *)&barts_sysls_disable;
   1610  1.1  riastrad 			count = BARTS_SYSLS_DISABLE_LENGTH;
   1611  1.1  riastrad 		} else if (rdev->family == CHIP_TURKS) {
   1612  1.1  riastrad 			p = (const u32 *)&turks_sysls_disable;
   1613  1.1  riastrad 			count = TURKS_SYSLS_DISABLE_LENGTH;
   1614  1.1  riastrad 		} else if (rdev->family == CHIP_CAICOS) {
   1615  1.1  riastrad 			p = (const u32 *)&caicos_sysls_disable;
   1616  1.1  riastrad 			count = CAICOS_SYSLS_DISABLE_LENGTH;
   1617  1.1  riastrad 		} else
   1618  1.1  riastrad 			return;
   1619  1.1  riastrad 	}
   1620  1.1  riastrad 
   1621  1.1  riastrad 	btc_program_mgcg_hw_sequence(rdev, p, count);
   1622  1.1  riastrad }
   1623  1.1  riastrad 
   1624  1.1  riastrad bool btc_dpm_enabled(struct radeon_device *rdev)
   1625  1.1  riastrad {
   1626  1.1  riastrad 	if (rv770_is_smc_running(rdev))
   1627  1.1  riastrad 		return true;
   1628  1.1  riastrad 	else
   1629  1.1  riastrad 		return false;
   1630  1.1  riastrad }
   1631  1.1  riastrad 
   1632  1.1  riastrad static int btc_init_smc_table(struct radeon_device *rdev,
   1633  1.1  riastrad 			      struct radeon_ps *radeon_boot_state)
   1634  1.1  riastrad {
   1635  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   1636  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1637  1.1  riastrad 	RV770_SMC_STATETABLE *table = &pi->smc_statetable;
   1638  1.1  riastrad 	int ret;
   1639  1.1  riastrad 
   1640  1.1  riastrad 	memset(table, 0, sizeof(RV770_SMC_STATETABLE));
   1641  1.1  riastrad 
   1642  1.1  riastrad 	cypress_populate_smc_voltage_tables(rdev, table);
   1643  1.1  riastrad 
   1644  1.1  riastrad 	switch (rdev->pm.int_thermal_type) {
   1645  1.2  riastrad 	case THERMAL_TYPE_EVERGREEN:
   1646  1.2  riastrad 	case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
   1647  1.1  riastrad 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
   1648  1.1  riastrad 		break;
   1649  1.2  riastrad 	case THERMAL_TYPE_NONE:
   1650  1.1  riastrad 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
   1651  1.1  riastrad 		break;
   1652  1.2  riastrad 	default:
   1653  1.1  riastrad 		table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
   1654  1.1  riastrad 		break;
   1655  1.1  riastrad 	}
   1656  1.1  riastrad 
   1657  1.1  riastrad 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
   1658  1.1  riastrad 		table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
   1659  1.1  riastrad 
   1660  1.1  riastrad 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
   1661  1.1  riastrad 		table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT;
   1662  1.1  riastrad 
   1663  1.1  riastrad 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
   1664  1.1  riastrad 		table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
   1665  1.1  riastrad 
   1666  1.1  riastrad 	if (pi->mem_gddr5)
   1667  1.1  riastrad 		table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
   1668  1.1  riastrad 
   1669  1.1  riastrad 	ret = cypress_populate_smc_initial_state(rdev, radeon_boot_state, table);
   1670  1.1  riastrad 	if (ret)
   1671  1.1  riastrad 		return ret;
   1672  1.1  riastrad 
   1673  1.1  riastrad 	if (eg_pi->sclk_deep_sleep)
   1674  1.1  riastrad 		WREG32_P(SCLK_PSKIP_CNTL, PSKIP_ON_ALLOW_STOP_HI(32),
   1675  1.1  riastrad 			 ~PSKIP_ON_ALLOW_STOP_HI_MASK);
   1676  1.1  riastrad 
   1677  1.1  riastrad 	ret = btc_populate_smc_acpi_state(rdev, table);
   1678  1.1  riastrad 	if (ret)
   1679  1.1  riastrad 		return ret;
   1680  1.1  riastrad 
   1681  1.1  riastrad 	if (eg_pi->ulv.supported) {
   1682  1.1  riastrad 		ret = btc_populate_ulv_state(rdev, table);
   1683  1.1  riastrad 		if (ret)
   1684  1.1  riastrad 			eg_pi->ulv.supported = false;
   1685  1.1  riastrad 	}
   1686  1.1  riastrad 
   1687  1.1  riastrad 	table->driverState = table->initialState;
   1688  1.1  riastrad 
   1689  1.1  riastrad 	return rv770_copy_bytes_to_smc(rdev,
   1690  1.1  riastrad 				       pi->state_table_start,
   1691  1.1  riastrad 				       (u8 *)table,
   1692  1.1  riastrad 				       sizeof(RV770_SMC_STATETABLE),
   1693  1.1  riastrad 				       pi->sram_end);
   1694  1.1  riastrad }
   1695  1.1  riastrad 
   1696  1.1  riastrad static void btc_set_at_for_uvd(struct radeon_device *rdev,
   1697  1.1  riastrad 			       struct radeon_ps *radeon_new_state)
   1698  1.1  riastrad {
   1699  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   1700  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1701  1.1  riastrad 	int idx = 0;
   1702  1.1  riastrad 
   1703  1.1  riastrad 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2))
   1704  1.1  riastrad 		idx = 1;
   1705  1.1  riastrad 
   1706  1.1  riastrad 	if ((idx == 1) && !eg_pi->smu_uvd_hs) {
   1707  1.1  riastrad 		pi->rlp = 10;
   1708  1.1  riastrad 		pi->rmp = 100;
   1709  1.1  riastrad 		pi->lhp = 100;
   1710  1.1  riastrad 		pi->lmp = 10;
   1711  1.1  riastrad 	} else {
   1712  1.1  riastrad 		pi->rlp = eg_pi->ats[idx].rlp;
   1713  1.1  riastrad 		pi->rmp = eg_pi->ats[idx].rmp;
   1714  1.1  riastrad 		pi->lhp = eg_pi->ats[idx].lhp;
   1715  1.1  riastrad 		pi->lmp = eg_pi->ats[idx].lmp;
   1716  1.1  riastrad 	}
   1717  1.1  riastrad 
   1718  1.1  riastrad }
   1719  1.1  riastrad 
   1720  1.1  riastrad void btc_notify_uvd_to_smc(struct radeon_device *rdev,
   1721  1.1  riastrad 			   struct radeon_ps *radeon_new_state)
   1722  1.1  riastrad {
   1723  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1724  1.1  riastrad 
   1725  1.1  riastrad 	if (r600_is_uvd_state(radeon_new_state->class, radeon_new_state->class2)) {
   1726  1.1  riastrad 		rv770_write_smc_soft_register(rdev,
   1727  1.1  riastrad 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 1);
   1728  1.1  riastrad 		eg_pi->uvd_enabled = true;
   1729  1.1  riastrad 	} else {
   1730  1.1  riastrad 		rv770_write_smc_soft_register(rdev,
   1731  1.1  riastrad 					      RV770_SMC_SOFT_REGISTER_uvd_enabled, 0);
   1732  1.1  riastrad 		eg_pi->uvd_enabled = false;
   1733  1.1  riastrad 	}
   1734  1.1  riastrad }
   1735  1.1  riastrad 
   1736  1.1  riastrad int btc_reset_to_default(struct radeon_device *rdev)
   1737  1.1  riastrad {
   1738  1.1  riastrad 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) != PPSMC_Result_OK)
   1739  1.1  riastrad 		return -EINVAL;
   1740  1.1  riastrad 
   1741  1.1  riastrad 	return 0;
   1742  1.1  riastrad }
   1743  1.1  riastrad 
   1744  1.1  riastrad static void btc_stop_smc(struct radeon_device *rdev)
   1745  1.1  riastrad {
   1746  1.1  riastrad 	int i;
   1747  1.1  riastrad 
   1748  1.1  riastrad 	for (i = 0; i < rdev->usec_timeout; i++) {
   1749  1.1  riastrad 		if (((RREG32(LB_SYNC_RESET_SEL) & LB_SYNC_RESET_SEL_MASK) >> LB_SYNC_RESET_SEL_SHIFT) != 1)
   1750  1.1  riastrad 			break;
   1751  1.1  riastrad 		udelay(1);
   1752  1.1  riastrad 	}
   1753  1.1  riastrad 	udelay(100);
   1754  1.1  riastrad 
   1755  1.1  riastrad 	r7xx_stop_smc(rdev);
   1756  1.1  riastrad }
   1757  1.1  riastrad 
   1758  1.1  riastrad void btc_read_arb_registers(struct radeon_device *rdev)
   1759  1.1  riastrad {
   1760  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1761  1.1  riastrad 	struct evergreen_arb_registers *arb_registers =
   1762  1.1  riastrad 		&eg_pi->bootup_arb_registers;
   1763  1.1  riastrad 
   1764  1.1  riastrad 	arb_registers->mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
   1765  1.1  riastrad 	arb_registers->mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
   1766  1.1  riastrad 	arb_registers->mc_arb_rfsh_rate = RREG32(MC_ARB_RFSH_RATE);
   1767  1.1  riastrad 	arb_registers->mc_arb_burst_time = RREG32(MC_ARB_BURST_TIME);
   1768  1.1  riastrad }
   1769  1.1  riastrad 
   1770  1.1  riastrad 
   1771  1.1  riastrad static void btc_set_arb0_registers(struct radeon_device *rdev,
   1772  1.1  riastrad 				   struct evergreen_arb_registers *arb_registers)
   1773  1.1  riastrad {
   1774  1.1  riastrad 	u32 val;
   1775  1.1  riastrad 
   1776  1.1  riastrad 	WREG32(MC_ARB_DRAM_TIMING,  arb_registers->mc_arb_dram_timing);
   1777  1.1  riastrad 	WREG32(MC_ARB_DRAM_TIMING2, arb_registers->mc_arb_dram_timing2);
   1778  1.1  riastrad 
   1779  1.1  riastrad 	val = (arb_registers->mc_arb_rfsh_rate & POWERMODE0_MASK) >>
   1780  1.1  riastrad 		POWERMODE0_SHIFT;
   1781  1.1  riastrad 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
   1782  1.1  riastrad 
   1783  1.1  riastrad 	val = (arb_registers->mc_arb_burst_time & STATE0_MASK) >>
   1784  1.1  riastrad 		STATE0_SHIFT;
   1785  1.1  riastrad 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
   1786  1.1  riastrad }
   1787  1.1  riastrad 
   1788  1.1  riastrad static void btc_set_boot_state_timing(struct radeon_device *rdev)
   1789  1.1  riastrad {
   1790  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1791  1.1  riastrad 
   1792  1.1  riastrad 	if (eg_pi->ulv.supported)
   1793  1.1  riastrad 		btc_set_arb0_registers(rdev, &eg_pi->bootup_arb_registers);
   1794  1.1  riastrad }
   1795  1.1  riastrad 
   1796  1.1  riastrad static bool btc_is_state_ulv_compatible(struct radeon_device *rdev,
   1797  1.1  riastrad 					struct radeon_ps *radeon_state)
   1798  1.1  riastrad {
   1799  1.1  riastrad 	struct rv7xx_ps *state = rv770_get_ps(radeon_state);
   1800  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1801  1.1  riastrad 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
   1802  1.1  riastrad 
   1803  1.1  riastrad 	if (state->low.mclk != ulv_pl->mclk)
   1804  1.1  riastrad 		return false;
   1805  1.1  riastrad 
   1806  1.1  riastrad 	if (state->low.vddci != ulv_pl->vddci)
   1807  1.1  riastrad 		return false;
   1808  1.1  riastrad 
   1809  1.1  riastrad 	/* XXX check minclocks, etc. */
   1810  1.1  riastrad 
   1811  1.1  riastrad 	return true;
   1812  1.1  riastrad }
   1813  1.1  riastrad 
   1814  1.1  riastrad 
   1815  1.1  riastrad static int btc_set_ulv_dram_timing(struct radeon_device *rdev)
   1816  1.1  riastrad {
   1817  1.1  riastrad 	u32 val;
   1818  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1819  1.1  riastrad 	struct rv7xx_pl *ulv_pl = eg_pi->ulv.pl;
   1820  1.1  riastrad 
   1821  1.1  riastrad 	radeon_atom_set_engine_dram_timings(rdev,
   1822  1.1  riastrad 					    ulv_pl->sclk,
   1823  1.1  riastrad 					    ulv_pl->mclk);
   1824  1.1  riastrad 
   1825  1.1  riastrad 	val = rv770_calculate_memory_refresh_rate(rdev, ulv_pl->sclk);
   1826  1.1  riastrad 	WREG32_P(MC_ARB_RFSH_RATE, POWERMODE0(val), ~POWERMODE0_MASK);
   1827  1.1  riastrad 
   1828  1.1  riastrad 	val = cypress_calculate_burst_time(rdev, ulv_pl->sclk, ulv_pl->mclk);
   1829  1.1  riastrad 	WREG32_P(MC_ARB_BURST_TIME, STATE0(val), ~STATE0_MASK);
   1830  1.1  riastrad 
   1831  1.1  riastrad 	return 0;
   1832  1.1  riastrad }
   1833  1.1  riastrad 
   1834  1.1  riastrad static int btc_enable_ulv(struct radeon_device *rdev)
   1835  1.1  riastrad {
   1836  1.1  riastrad 	if (rv770_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) != PPSMC_Result_OK)
   1837  1.1  riastrad 		return -EINVAL;
   1838  1.1  riastrad 
   1839  1.1  riastrad 	return 0;
   1840  1.1  riastrad }
   1841  1.1  riastrad 
   1842  1.1  riastrad static int btc_set_power_state_conditionally_enable_ulv(struct radeon_device *rdev,
   1843  1.1  riastrad 							struct radeon_ps *radeon_new_state)
   1844  1.1  riastrad {
   1845  1.1  riastrad 	int ret = 0;
   1846  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   1847  1.1  riastrad 
   1848  1.1  riastrad 	if (eg_pi->ulv.supported) {
   1849  1.1  riastrad 		if (btc_is_state_ulv_compatible(rdev, radeon_new_state)) {
   1850  1.1  riastrad 			// Set ARB[0] to reflect the DRAM timing needed for ULV.
   1851  1.1  riastrad 			ret = btc_set_ulv_dram_timing(rdev);
   1852  1.1  riastrad 			if (ret == 0)
   1853  1.1  riastrad 				ret = btc_enable_ulv(rdev);
   1854  1.1  riastrad 		}
   1855  1.1  riastrad 	}
   1856  1.1  riastrad 
   1857  1.1  riastrad 	return ret;
   1858  1.1  riastrad }
   1859  1.1  riastrad 
   1860  1.1  riastrad static bool btc_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
   1861  1.1  riastrad {
   1862  1.1  riastrad 	bool result = true;
   1863  1.1  riastrad 
   1864  1.1  riastrad 	switch (in_reg) {
   1865  1.1  riastrad 	case MC_SEQ_RAS_TIMING >> 2:
   1866  1.1  riastrad 		*out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
   1867  1.1  riastrad 		break;
   1868  1.2  riastrad 	case MC_SEQ_CAS_TIMING >> 2:
   1869  1.1  riastrad 		*out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
   1870  1.1  riastrad 		break;
   1871  1.2  riastrad 	case MC_SEQ_MISC_TIMING >> 2:
   1872  1.1  riastrad 		*out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
   1873  1.1  riastrad 		break;
   1874  1.2  riastrad 	case MC_SEQ_MISC_TIMING2 >> 2:
   1875  1.1  riastrad 		*out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
   1876  1.1  riastrad 		break;
   1877  1.2  riastrad 	case MC_SEQ_RD_CTL_D0 >> 2:
   1878  1.1  riastrad 		*out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
   1879  1.1  riastrad 		break;
   1880  1.2  riastrad 	case MC_SEQ_RD_CTL_D1 >> 2:
   1881  1.1  riastrad 		*out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
   1882  1.1  riastrad 		break;
   1883  1.2  riastrad 	case MC_SEQ_WR_CTL_D0 >> 2:
   1884  1.1  riastrad 		*out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
   1885  1.1  riastrad 		break;
   1886  1.2  riastrad 	case MC_SEQ_WR_CTL_D1 >> 2:
   1887  1.1  riastrad 		*out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
   1888  1.1  riastrad 		break;
   1889  1.2  riastrad 	case MC_PMG_CMD_EMRS >> 2:
   1890  1.1  riastrad 		*out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
   1891  1.1  riastrad 		break;
   1892  1.2  riastrad 	case MC_PMG_CMD_MRS >> 2:
   1893  1.1  riastrad 		*out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
   1894  1.1  riastrad 		break;
   1895  1.2  riastrad 	case MC_PMG_CMD_MRS1 >> 2:
   1896  1.1  riastrad 		*out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
   1897  1.1  riastrad 		break;
   1898  1.2  riastrad 	default:
   1899  1.1  riastrad 		result = false;
   1900  1.1  riastrad 		break;
   1901  1.1  riastrad 	}
   1902  1.1  riastrad 
   1903  1.1  riastrad 	return result;
   1904  1.1  riastrad }
   1905  1.1  riastrad 
   1906  1.1  riastrad static void btc_set_valid_flag(struct evergreen_mc_reg_table *table)
   1907  1.1  riastrad {
   1908  1.1  riastrad 	u8 i, j;
   1909  1.1  riastrad 
   1910  1.1  riastrad 	for (i = 0; i < table->last; i++) {
   1911  1.1  riastrad 		for (j = 1; j < table->num_entries; j++) {
   1912  1.1  riastrad 			if (table->mc_reg_table_entry[j-1].mc_data[i] !=
   1913  1.1  riastrad 			    table->mc_reg_table_entry[j].mc_data[i]) {
   1914  1.1  riastrad 				table->valid_flag |= (1 << i);
   1915  1.1  riastrad 				break;
   1916  1.1  riastrad 			}
   1917  1.1  riastrad 		}
   1918  1.1  riastrad 	}
   1919  1.1  riastrad }
   1920  1.1  riastrad 
   1921  1.1  riastrad static int btc_set_mc_special_registers(struct radeon_device *rdev,
   1922  1.1  riastrad 					struct evergreen_mc_reg_table *table)
   1923  1.1  riastrad {
   1924  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   1925  1.1  riastrad 	u8 i, j, k;
   1926  1.1  riastrad 	u32 tmp;
   1927  1.1  riastrad 
   1928  1.1  riastrad 	for (i = 0, j = table->last; i < table->last; i++) {
   1929  1.1  riastrad 		switch (table->mc_reg_address[i].s1) {
   1930  1.1  riastrad 		case MC_SEQ_MISC1 >> 2:
   1931  1.1  riastrad 			tmp = RREG32(MC_PMG_CMD_EMRS);
   1932  1.1  riastrad 			table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
   1933  1.1  riastrad 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
   1934  1.1  riastrad 			for (k = 0; k < table->num_entries; k++) {
   1935  1.1  riastrad 				table->mc_reg_table_entry[k].mc_data[j] =
   1936  1.1  riastrad 					((tmp & 0xffff0000)) |
   1937  1.1  riastrad 					((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
   1938  1.1  riastrad 			}
   1939  1.1  riastrad 			j++;
   1940  1.1  riastrad 
   1941  1.1  riastrad 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
   1942  1.1  riastrad 				return -EINVAL;
   1943  1.1  riastrad 
   1944  1.1  riastrad 			tmp = RREG32(MC_PMG_CMD_MRS);
   1945  1.1  riastrad 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
   1946  1.1  riastrad 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
   1947  1.1  riastrad 			for (k = 0; k < table->num_entries; k++) {
   1948  1.1  riastrad 				table->mc_reg_table_entry[k].mc_data[j] =
   1949  1.1  riastrad 					(tmp & 0xffff0000) |
   1950  1.1  riastrad 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
   1951  1.1  riastrad 				if (!pi->mem_gddr5)
   1952  1.1  riastrad 					table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
   1953  1.1  riastrad 			}
   1954  1.1  riastrad 			j++;
   1955  1.1  riastrad 
   1956  1.1  riastrad 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
   1957  1.1  riastrad 				return -EINVAL;
   1958  1.1  riastrad 			break;
   1959  1.1  riastrad 		case MC_SEQ_RESERVE_M >> 2:
   1960  1.1  riastrad 			tmp = RREG32(MC_PMG_CMD_MRS1);
   1961  1.1  riastrad 			table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
   1962  1.1  riastrad 			table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
   1963  1.1  riastrad 			for (k = 0; k < table->num_entries; k++) {
   1964  1.1  riastrad 				table->mc_reg_table_entry[k].mc_data[j] =
   1965  1.1  riastrad 					(tmp & 0xffff0000) |
   1966  1.1  riastrad 					(table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
   1967  1.1  riastrad 			}
   1968  1.1  riastrad 			j++;
   1969  1.1  riastrad 
   1970  1.1  riastrad 			if (j >= SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
   1971  1.1  riastrad 				return -EINVAL;
   1972  1.1  riastrad 			break;
   1973  1.1  riastrad 		default:
   1974  1.1  riastrad 			break;
   1975  1.1  riastrad 		}
   1976  1.1  riastrad 	}
   1977  1.1  riastrad 
   1978  1.1  riastrad 	table->last = j;
   1979  1.1  riastrad 
   1980  1.1  riastrad 	return 0;
   1981  1.1  riastrad }
   1982  1.1  riastrad 
   1983  1.1  riastrad static void btc_set_s0_mc_reg_index(struct evergreen_mc_reg_table *table)
   1984  1.1  riastrad {
   1985  1.1  riastrad 	u32 i;
   1986  1.1  riastrad 	u16 address;
   1987  1.1  riastrad 
   1988  1.1  riastrad 	for (i = 0; i < table->last; i++) {
   1989  1.1  riastrad 		table->mc_reg_address[i].s0 =
   1990  1.1  riastrad 			btc_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
   1991  1.1  riastrad 			address : table->mc_reg_address[i].s1;
   1992  1.1  riastrad 	}
   1993  1.1  riastrad }
   1994  1.1  riastrad 
   1995  1.1  riastrad static int btc_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table,
   1996  1.1  riastrad 				       struct evergreen_mc_reg_table *eg_table)
   1997  1.1  riastrad {
   1998  1.1  riastrad 	u8 i, j;
   1999  1.1  riastrad 
   2000  1.1  riastrad 	if (table->last > SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE)
   2001  1.1  riastrad 		return -EINVAL;
   2002  1.1  riastrad 
   2003  1.1  riastrad 	if (table->num_entries > MAX_AC_TIMING_ENTRIES)
   2004  1.1  riastrad 		return -EINVAL;
   2005  1.1  riastrad 
   2006  1.1  riastrad 	for (i = 0; i < table->last; i++)
   2007  1.1  riastrad 		eg_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
   2008  1.1  riastrad 	eg_table->last = table->last;
   2009  1.1  riastrad 
   2010  1.1  riastrad 	for (i = 0; i < table->num_entries; i++) {
   2011  1.1  riastrad 		eg_table->mc_reg_table_entry[i].mclk_max =
   2012  1.1  riastrad 			table->mc_reg_table_entry[i].mclk_max;
   2013  1.1  riastrad 		for(j = 0; j < table->last; j++)
   2014  1.1  riastrad 			eg_table->mc_reg_table_entry[i].mc_data[j] =
   2015  1.1  riastrad 				table->mc_reg_table_entry[i].mc_data[j];
   2016  1.1  riastrad 	}
   2017  1.1  riastrad 	eg_table->num_entries = table->num_entries;
   2018  1.1  riastrad 
   2019  1.1  riastrad 	return 0;
   2020  1.1  riastrad }
   2021  1.1  riastrad 
   2022  1.1  riastrad static int btc_initialize_mc_reg_table(struct radeon_device *rdev)
   2023  1.1  riastrad {
   2024  1.1  riastrad 	int ret;
   2025  1.1  riastrad 	struct atom_mc_reg_table *table;
   2026  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2027  1.1  riastrad 	struct evergreen_mc_reg_table *eg_table = &eg_pi->mc_reg_table;
   2028  1.1  riastrad 	u8 module_index = rv770_get_memory_module_index(rdev);
   2029  1.1  riastrad 
   2030  1.1  riastrad 	table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
   2031  1.1  riastrad 	if (!table)
   2032  1.1  riastrad 		return -ENOMEM;
   2033  1.1  riastrad 
   2034  1.1  riastrad 	/* Program additional LP registers that are no longer programmed by VBIOS */
   2035  1.1  riastrad 	WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
   2036  1.1  riastrad 	WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
   2037  1.1  riastrad 	WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
   2038  1.1  riastrad 	WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
   2039  1.1  riastrad 	WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
   2040  1.1  riastrad 	WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
   2041  1.1  riastrad 	WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
   2042  1.1  riastrad 	WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
   2043  1.1  riastrad 	WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
   2044  1.1  riastrad 	WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
   2045  1.1  riastrad 	WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
   2046  1.1  riastrad 
   2047  1.1  riastrad 	ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
   2048  1.1  riastrad 
   2049  1.1  riastrad 	if (ret)
   2050  1.1  riastrad 		goto init_mc_done;
   2051  1.1  riastrad 
   2052  1.1  riastrad 	ret = btc_copy_vbios_mc_reg_table(table, eg_table);
   2053  1.1  riastrad 
   2054  1.1  riastrad 	if (ret)
   2055  1.1  riastrad 		goto init_mc_done;
   2056  1.1  riastrad 
   2057  1.1  riastrad 	btc_set_s0_mc_reg_index(eg_table);
   2058  1.1  riastrad 	ret = btc_set_mc_special_registers(rdev, eg_table);
   2059  1.1  riastrad 
   2060  1.1  riastrad 	if (ret)
   2061  1.1  riastrad 		goto init_mc_done;
   2062  1.1  riastrad 
   2063  1.1  riastrad 	btc_set_valid_flag(eg_table);
   2064  1.1  riastrad 
   2065  1.1  riastrad init_mc_done:
   2066  1.1  riastrad 	kfree(table);
   2067  1.1  riastrad 
   2068  1.1  riastrad 	return ret;
   2069  1.1  riastrad }
   2070  1.1  riastrad 
   2071  1.1  riastrad static void btc_init_stutter_mode(struct radeon_device *rdev)
   2072  1.1  riastrad {
   2073  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   2074  1.1  riastrad 	u32 tmp;
   2075  1.1  riastrad 
   2076  1.1  riastrad 	if (pi->mclk_stutter_mode_threshold) {
   2077  1.1  riastrad 		if (pi->mem_gddr5) {
   2078  1.1  riastrad 			tmp = RREG32(MC_PMG_AUTO_CFG);
   2079  1.1  riastrad 			if ((0x200 & tmp) == 0) {
   2080  1.1  riastrad 				tmp = (tmp & 0xfffffc0b) | 0x204;
   2081  1.1  riastrad 				WREG32(MC_PMG_AUTO_CFG, tmp);
   2082  1.1  riastrad 			}
   2083  1.1  riastrad 		}
   2084  1.1  riastrad 	}
   2085  1.1  riastrad }
   2086  1.1  riastrad 
   2087  1.1  riastrad bool btc_dpm_vblank_too_short(struct radeon_device *rdev)
   2088  1.1  riastrad {
   2089  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   2090  1.1  riastrad 	u32 vblank_time = r600_dpm_get_vblank_time(rdev);
   2091  1.1  riastrad 	u32 switch_limit = pi->mem_gddr5 ? 450 : 100;
   2092  1.1  riastrad 
   2093  1.1  riastrad 	if (vblank_time < switch_limit)
   2094  1.1  riastrad 		return true;
   2095  1.1  riastrad 	else
   2096  1.1  riastrad 		return false;
   2097  1.1  riastrad 
   2098  1.1  riastrad }
   2099  1.1  riastrad 
   2100  1.1  riastrad static void btc_apply_state_adjust_rules(struct radeon_device *rdev,
   2101  1.1  riastrad 					 struct radeon_ps *rps)
   2102  1.1  riastrad {
   2103  1.1  riastrad 	struct rv7xx_ps *ps = rv770_get_ps(rps);
   2104  1.1  riastrad 	struct radeon_clock_and_voltage_limits *max_limits;
   2105  1.1  riastrad 	bool disable_mclk_switching;
   2106  1.1  riastrad 	u32 mclk, sclk;
   2107  1.1  riastrad 	u16 vddc, vddci;
   2108  1.1  riastrad 
   2109  1.1  riastrad 	if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
   2110  1.1  riastrad 	    btc_dpm_vblank_too_short(rdev))
   2111  1.1  riastrad 		disable_mclk_switching = true;
   2112  1.1  riastrad 	else
   2113  1.1  riastrad 		disable_mclk_switching = false;
   2114  1.1  riastrad 
   2115  1.1  riastrad 	if (rdev->pm.dpm.ac_power)
   2116  1.1  riastrad 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
   2117  1.1  riastrad 	else
   2118  1.1  riastrad 		max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
   2119  1.1  riastrad 
   2120  1.1  riastrad 	if (rdev->pm.dpm.ac_power == false) {
   2121  1.1  riastrad 		if (ps->high.mclk > max_limits->mclk)
   2122  1.1  riastrad 			ps->high.mclk = max_limits->mclk;
   2123  1.1  riastrad 		if (ps->high.sclk > max_limits->sclk)
   2124  1.1  riastrad 			ps->high.sclk = max_limits->sclk;
   2125  1.1  riastrad 		if (ps->high.vddc > max_limits->vddc)
   2126  1.1  riastrad 			ps->high.vddc = max_limits->vddc;
   2127  1.1  riastrad 		if (ps->high.vddci > max_limits->vddci)
   2128  1.1  riastrad 			ps->high.vddci = max_limits->vddci;
   2129  1.1  riastrad 
   2130  1.1  riastrad 		if (ps->medium.mclk > max_limits->mclk)
   2131  1.1  riastrad 			ps->medium.mclk = max_limits->mclk;
   2132  1.1  riastrad 		if (ps->medium.sclk > max_limits->sclk)
   2133  1.1  riastrad 			ps->medium.sclk = max_limits->sclk;
   2134  1.1  riastrad 		if (ps->medium.vddc > max_limits->vddc)
   2135  1.1  riastrad 			ps->medium.vddc = max_limits->vddc;
   2136  1.1  riastrad 		if (ps->medium.vddci > max_limits->vddci)
   2137  1.1  riastrad 			ps->medium.vddci = max_limits->vddci;
   2138  1.1  riastrad 
   2139  1.1  riastrad 		if (ps->low.mclk > max_limits->mclk)
   2140  1.1  riastrad 			ps->low.mclk = max_limits->mclk;
   2141  1.1  riastrad 		if (ps->low.sclk > max_limits->sclk)
   2142  1.1  riastrad 			ps->low.sclk = max_limits->sclk;
   2143  1.1  riastrad 		if (ps->low.vddc > max_limits->vddc)
   2144  1.1  riastrad 			ps->low.vddc = max_limits->vddc;
   2145  1.1  riastrad 		if (ps->low.vddci > max_limits->vddci)
   2146  1.1  riastrad 			ps->low.vddci = max_limits->vddci;
   2147  1.1  riastrad 	}
   2148  1.1  riastrad 
   2149  1.1  riastrad 	/* XXX validate the min clocks required for display */
   2150  1.1  riastrad 
   2151  1.1  riastrad 	if (disable_mclk_switching) {
   2152  1.1  riastrad 		sclk = ps->low.sclk;
   2153  1.1  riastrad 		mclk = ps->high.mclk;
   2154  1.1  riastrad 		vddc = ps->low.vddc;
   2155  1.1  riastrad 		vddci = ps->high.vddci;
   2156  1.1  riastrad 	} else {
   2157  1.1  riastrad 		sclk = ps->low.sclk;
   2158  1.1  riastrad 		mclk = ps->low.mclk;
   2159  1.1  riastrad 		vddc = ps->low.vddc;
   2160  1.1  riastrad 		vddci = ps->low.vddci;
   2161  1.1  riastrad 	}
   2162  1.1  riastrad 
   2163  1.1  riastrad 	/* adjusted low state */
   2164  1.1  riastrad 	ps->low.sclk = sclk;
   2165  1.1  riastrad 	ps->low.mclk = mclk;
   2166  1.1  riastrad 	ps->low.vddc = vddc;
   2167  1.1  riastrad 	ps->low.vddci = vddci;
   2168  1.1  riastrad 
   2169  1.1  riastrad 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
   2170  1.1  riastrad 				  &ps->low.sclk, &ps->low.mclk);
   2171  1.1  riastrad 
   2172  1.1  riastrad 	/* adjusted medium, high states */
   2173  1.1  riastrad 	if (ps->medium.sclk < ps->low.sclk)
   2174  1.1  riastrad 		ps->medium.sclk = ps->low.sclk;
   2175  1.1  riastrad 	if (ps->medium.vddc < ps->low.vddc)
   2176  1.1  riastrad 		ps->medium.vddc = ps->low.vddc;
   2177  1.1  riastrad 	if (ps->high.sclk < ps->medium.sclk)
   2178  1.1  riastrad 		ps->high.sclk = ps->medium.sclk;
   2179  1.1  riastrad 	if (ps->high.vddc < ps->medium.vddc)
   2180  1.1  riastrad 		ps->high.vddc = ps->medium.vddc;
   2181  1.1  riastrad 
   2182  1.1  riastrad 	if (disable_mclk_switching) {
   2183  1.1  riastrad 		mclk = ps->low.mclk;
   2184  1.1  riastrad 		if (mclk < ps->medium.mclk)
   2185  1.1  riastrad 			mclk = ps->medium.mclk;
   2186  1.1  riastrad 		if (mclk < ps->high.mclk)
   2187  1.1  riastrad 			mclk = ps->high.mclk;
   2188  1.1  riastrad 		ps->low.mclk = mclk;
   2189  1.1  riastrad 		ps->low.vddci = vddci;
   2190  1.1  riastrad 		ps->medium.mclk = mclk;
   2191  1.1  riastrad 		ps->medium.vddci = vddci;
   2192  1.1  riastrad 		ps->high.mclk = mclk;
   2193  1.1  riastrad 		ps->high.vddci = vddci;
   2194  1.1  riastrad 	} else {
   2195  1.1  riastrad 		if (ps->medium.mclk < ps->low.mclk)
   2196  1.1  riastrad 			ps->medium.mclk = ps->low.mclk;
   2197  1.1  riastrad 		if (ps->medium.vddci < ps->low.vddci)
   2198  1.1  riastrad 			ps->medium.vddci = ps->low.vddci;
   2199  1.1  riastrad 		if (ps->high.mclk < ps->medium.mclk)
   2200  1.1  riastrad 			ps->high.mclk = ps->medium.mclk;
   2201  1.1  riastrad 		if (ps->high.vddci < ps->medium.vddci)
   2202  1.1  riastrad 			ps->high.vddci = ps->medium.vddci;
   2203  1.1  riastrad 	}
   2204  1.1  riastrad 
   2205  1.1  riastrad 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
   2206  1.1  riastrad 				  &ps->medium.sclk, &ps->medium.mclk);
   2207  1.1  riastrad 	btc_skip_blacklist_clocks(rdev, max_limits->sclk, max_limits->mclk,
   2208  1.1  riastrad 				  &ps->high.sclk, &ps->high.mclk);
   2209  1.1  riastrad 
   2210  1.1  riastrad 	btc_adjust_clock_combinations(rdev, max_limits, &ps->low);
   2211  1.1  riastrad 	btc_adjust_clock_combinations(rdev, max_limits, &ps->medium);
   2212  1.1  riastrad 	btc_adjust_clock_combinations(rdev, max_limits, &ps->high);
   2213  1.1  riastrad 
   2214  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
   2215  1.1  riastrad 					   ps->low.sclk, max_limits->vddc, &ps->low.vddc);
   2216  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
   2217  1.1  riastrad 					   ps->low.mclk, max_limits->vddci, &ps->low.vddci);
   2218  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
   2219  1.1  riastrad 					   ps->low.mclk, max_limits->vddc, &ps->low.vddc);
   2220  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
   2221  1.1  riastrad 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->low.vddc);
   2222  1.1  riastrad 
   2223  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
   2224  1.1  riastrad 					   ps->medium.sclk, max_limits->vddc, &ps->medium.vddc);
   2225  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
   2226  1.1  riastrad 					   ps->medium.mclk, max_limits->vddci, &ps->medium.vddci);
   2227  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
   2228  1.1  riastrad 					   ps->medium.mclk, max_limits->vddc, &ps->medium.vddc);
   2229  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
   2230  1.1  riastrad 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->medium.vddc);
   2231  1.1  riastrad 
   2232  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
   2233  1.1  riastrad 					   ps->high.sclk, max_limits->vddc, &ps->high.vddc);
   2234  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
   2235  1.1  riastrad 					   ps->high.mclk, max_limits->vddci, &ps->high.vddci);
   2236  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
   2237  1.1  riastrad 					   ps->high.mclk, max_limits->vddc, &ps->high.vddc);
   2238  1.1  riastrad 	btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
   2239  1.1  riastrad 					   rdev->clock.current_dispclk, max_limits->vddc, &ps->high.vddc);
   2240  1.1  riastrad 
   2241  1.1  riastrad 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
   2242  1.1  riastrad 				      &ps->low.vddc, &ps->low.vddci);
   2243  1.1  riastrad 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
   2244  1.1  riastrad 				      &ps->medium.vddc, &ps->medium.vddci);
   2245  1.1  riastrad 	btc_apply_voltage_delta_rules(rdev, max_limits->vddc, max_limits->vddci,
   2246  1.1  riastrad 				      &ps->high.vddc, &ps->high.vddci);
   2247  1.1  riastrad 
   2248  1.1  riastrad 	if ((ps->high.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
   2249  1.1  riastrad 	    (ps->medium.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) &&
   2250  1.1  riastrad 	    (ps->low.vddc <= rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc))
   2251  1.1  riastrad 		ps->dc_compatible = true;
   2252  1.1  riastrad 	else
   2253  1.1  riastrad 		ps->dc_compatible = false;
   2254  1.1  riastrad 
   2255  1.1  riastrad 	if (ps->low.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
   2256  1.1  riastrad 		ps->low.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
   2257  1.1  riastrad 	if (ps->medium.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
   2258  1.1  riastrad 		ps->medium.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
   2259  1.1  riastrad 	if (ps->high.vddc < rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2)
   2260  1.1  riastrad 		ps->high.flags &= ~ATOM_PPLIB_R600_FLAGS_PCIEGEN2;
   2261  1.1  riastrad }
   2262  1.1  riastrad 
   2263  1.1  riastrad static void btc_update_current_ps(struct radeon_device *rdev,
   2264  1.1  riastrad 				  struct radeon_ps *rps)
   2265  1.1  riastrad {
   2266  1.1  riastrad 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
   2267  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2268  1.1  riastrad 
   2269  1.1  riastrad 	eg_pi->current_rps = *rps;
   2270  1.1  riastrad 	eg_pi->current_ps = *new_ps;
   2271  1.1  riastrad 	eg_pi->current_rps.ps_priv = &eg_pi->current_ps;
   2272  1.1  riastrad }
   2273  1.1  riastrad 
   2274  1.1  riastrad static void btc_update_requested_ps(struct radeon_device *rdev,
   2275  1.1  riastrad 				    struct radeon_ps *rps)
   2276  1.1  riastrad {
   2277  1.1  riastrad 	struct rv7xx_ps *new_ps = rv770_get_ps(rps);
   2278  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2279  1.1  riastrad 
   2280  1.1  riastrad 	eg_pi->requested_rps = *rps;
   2281  1.1  riastrad 	eg_pi->requested_ps = *new_ps;
   2282  1.1  riastrad 	eg_pi->requested_rps.ps_priv = &eg_pi->requested_ps;
   2283  1.1  riastrad }
   2284  1.1  riastrad 
   2285  1.1  riastrad #if 0
   2286  1.1  riastrad void btc_dpm_reset_asic(struct radeon_device *rdev)
   2287  1.1  riastrad {
   2288  1.1  riastrad 	rv770_restrict_performance_levels_before_switch(rdev);
   2289  1.1  riastrad 	btc_disable_ulv(rdev);
   2290  1.1  riastrad 	btc_set_boot_state_timing(rdev);
   2291  1.1  riastrad 	rv770_set_boot_state(rdev);
   2292  1.1  riastrad }
   2293  1.1  riastrad #endif
   2294  1.1  riastrad 
   2295  1.1  riastrad int btc_dpm_pre_set_power_state(struct radeon_device *rdev)
   2296  1.1  riastrad {
   2297  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2298  1.1  riastrad 	struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
   2299  1.1  riastrad 	struct radeon_ps *new_ps = &requested_ps;
   2300  1.1  riastrad 
   2301  1.1  riastrad 	btc_update_requested_ps(rdev, new_ps);
   2302  1.1  riastrad 
   2303  1.1  riastrad 	btc_apply_state_adjust_rules(rdev, &eg_pi->requested_rps);
   2304  1.1  riastrad 
   2305  1.1  riastrad 	return 0;
   2306  1.1  riastrad }
   2307  1.1  riastrad 
   2308  1.1  riastrad int btc_dpm_set_power_state(struct radeon_device *rdev)
   2309  1.1  riastrad {
   2310  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2311  1.1  riastrad 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
   2312  1.1  riastrad 	struct radeon_ps *old_ps = &eg_pi->current_rps;
   2313  1.1  riastrad 	int ret;
   2314  1.1  riastrad 
   2315  1.1  riastrad 	ret = btc_disable_ulv(rdev);
   2316  1.1  riastrad 	btc_set_boot_state_timing(rdev);
   2317  1.1  riastrad 	ret = rv770_restrict_performance_levels_before_switch(rdev);
   2318  1.1  riastrad 	if (ret) {
   2319  1.3       mrg 		DRM_ERROR("rv770_restrict_performance_levels_before_switch failed: %d\n", ret);
   2320  1.1  riastrad 		return ret;
   2321  1.1  riastrad 	}
   2322  1.1  riastrad 	if (eg_pi->pcie_performance_request)
   2323  1.1  riastrad 		cypress_notify_link_speed_change_before_state_change(rdev, new_ps, old_ps);
   2324  1.1  riastrad 
   2325  1.1  riastrad 	rv770_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps);
   2326  1.1  riastrad 	ret = rv770_halt_smc(rdev);
   2327  1.1  riastrad 	if (ret) {
   2328  1.1  riastrad 		DRM_ERROR("rv770_halt_smc failed\n");
   2329  1.1  riastrad 		return ret;
   2330  1.1  riastrad 	}
   2331  1.1  riastrad 	btc_set_at_for_uvd(rdev, new_ps);
   2332  1.1  riastrad 	if (eg_pi->smu_uvd_hs)
   2333  1.1  riastrad 		btc_notify_uvd_to_smc(rdev, new_ps);
   2334  1.1  riastrad 	ret = cypress_upload_sw_state(rdev, new_ps);
   2335  1.1  riastrad 	if (ret) {
   2336  1.1  riastrad 		DRM_ERROR("cypress_upload_sw_state failed\n");
   2337  1.1  riastrad 		return ret;
   2338  1.1  riastrad 	}
   2339  1.1  riastrad 	if (eg_pi->dynamic_ac_timing) {
   2340  1.1  riastrad 		ret = cypress_upload_mc_reg_table(rdev, new_ps);
   2341  1.1  riastrad 		if (ret) {
   2342  1.1  riastrad 			DRM_ERROR("cypress_upload_mc_reg_table failed\n");
   2343  1.1  riastrad 			return ret;
   2344  1.1  riastrad 		}
   2345  1.1  riastrad 	}
   2346  1.1  riastrad 
   2347  1.1  riastrad 	cypress_program_memory_timing_parameters(rdev, new_ps);
   2348  1.1  riastrad 
   2349  1.1  riastrad 	ret = rv770_resume_smc(rdev);
   2350  1.1  riastrad 	if (ret) {
   2351  1.1  riastrad 		DRM_ERROR("rv770_resume_smc failed\n");
   2352  1.1  riastrad 		return ret;
   2353  1.1  riastrad 	}
   2354  1.1  riastrad 	ret = rv770_set_sw_state(rdev);
   2355  1.1  riastrad 	if (ret) {
   2356  1.1  riastrad 		DRM_ERROR("rv770_set_sw_state failed\n");
   2357  1.1  riastrad 		return ret;
   2358  1.1  riastrad 	}
   2359  1.1  riastrad 	rv770_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps);
   2360  1.1  riastrad 
   2361  1.1  riastrad 	if (eg_pi->pcie_performance_request)
   2362  1.1  riastrad 		cypress_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
   2363  1.1  riastrad 
   2364  1.1  riastrad 	ret = btc_set_power_state_conditionally_enable_ulv(rdev, new_ps);
   2365  1.1  riastrad 	if (ret) {
   2366  1.1  riastrad 		DRM_ERROR("btc_set_power_state_conditionally_enable_ulv failed\n");
   2367  1.1  riastrad 		return ret;
   2368  1.1  riastrad 	}
   2369  1.1  riastrad 
   2370  1.1  riastrad 	return 0;
   2371  1.1  riastrad }
   2372  1.1  riastrad 
   2373  1.1  riastrad void btc_dpm_post_set_power_state(struct radeon_device *rdev)
   2374  1.1  riastrad {
   2375  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2376  1.1  riastrad 	struct radeon_ps *new_ps = &eg_pi->requested_rps;
   2377  1.1  riastrad 
   2378  1.1  riastrad 	btc_update_current_ps(rdev, new_ps);
   2379  1.1  riastrad }
   2380  1.1  riastrad 
   2381  1.1  riastrad int btc_dpm_enable(struct radeon_device *rdev)
   2382  1.1  riastrad {
   2383  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   2384  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2385  1.1  riastrad 	struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
   2386  1.1  riastrad 	int ret;
   2387  1.1  riastrad 
   2388  1.1  riastrad 	if (pi->gfx_clock_gating)
   2389  1.1  riastrad 		btc_cg_clock_gating_default(rdev);
   2390  1.1  riastrad 
   2391  1.1  riastrad 	if (btc_dpm_enabled(rdev))
   2392  1.1  riastrad 		return -EINVAL;
   2393  1.1  riastrad 
   2394  1.1  riastrad 	if (pi->mg_clock_gating)
   2395  1.1  riastrad 		btc_mg_clock_gating_default(rdev);
   2396  1.1  riastrad 
   2397  1.1  riastrad 	if (eg_pi->ls_clock_gating)
   2398  1.1  riastrad 		btc_ls_clock_gating_default(rdev);
   2399  1.1  riastrad 
   2400  1.1  riastrad 	if (pi->voltage_control) {
   2401  1.1  riastrad 		rv770_enable_voltage_control(rdev, true);
   2402  1.1  riastrad 		ret = cypress_construct_voltage_tables(rdev);
   2403  1.1  riastrad 		if (ret) {
   2404  1.1  riastrad 			DRM_ERROR("cypress_construct_voltage_tables failed\n");
   2405  1.1  riastrad 			return ret;
   2406  1.1  riastrad 		}
   2407  1.1  riastrad 	}
   2408  1.1  riastrad 
   2409  1.1  riastrad 	if (pi->mvdd_control) {
   2410  1.1  riastrad 		ret = cypress_get_mvdd_configuration(rdev);
   2411  1.1  riastrad 		if (ret) {
   2412  1.1  riastrad 			DRM_ERROR("cypress_get_mvdd_configuration failed\n");
   2413  1.1  riastrad 			return ret;
   2414  1.1  riastrad 		}
   2415  1.1  riastrad 	}
   2416  1.1  riastrad 
   2417  1.1  riastrad 	if (eg_pi->dynamic_ac_timing) {
   2418  1.1  riastrad 		ret = btc_initialize_mc_reg_table(rdev);
   2419  1.1  riastrad 		if (ret)
   2420  1.1  riastrad 			eg_pi->dynamic_ac_timing = false;
   2421  1.1  riastrad 	}
   2422  1.1  riastrad 
   2423  1.1  riastrad 	if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_BACKBIAS)
   2424  1.1  riastrad 		rv770_enable_backbias(rdev, true);
   2425  1.1  riastrad 
   2426  1.1  riastrad 	if (pi->dynamic_ss)
   2427  1.1  riastrad 		cypress_enable_spread_spectrum(rdev, true);
   2428  1.1  riastrad 
   2429  1.1  riastrad 	if (pi->thermal_protection)
   2430  1.1  riastrad 		rv770_enable_thermal_protection(rdev, true);
   2431  1.1  riastrad 
   2432  1.1  riastrad 	rv770_setup_bsp(rdev);
   2433  1.1  riastrad 	rv770_program_git(rdev);
   2434  1.1  riastrad 	rv770_program_tp(rdev);
   2435  1.1  riastrad 	rv770_program_tpp(rdev);
   2436  1.1  riastrad 	rv770_program_sstp(rdev);
   2437  1.1  riastrad 	rv770_program_engine_speed_parameters(rdev);
   2438  1.1  riastrad 	cypress_enable_display_gap(rdev);
   2439  1.1  riastrad 	rv770_program_vc(rdev);
   2440  1.1  riastrad 
   2441  1.1  riastrad 	if (pi->dynamic_pcie_gen2)
   2442  1.1  riastrad 		btc_enable_dynamic_pcie_gen2(rdev, true);
   2443  1.1  riastrad 
   2444  1.1  riastrad 	ret = rv770_upload_firmware(rdev);
   2445  1.1  riastrad 	if (ret) {
   2446  1.1  riastrad 		DRM_ERROR("rv770_upload_firmware failed\n");
   2447  1.1  riastrad 		return ret;
   2448  1.1  riastrad 	}
   2449  1.1  riastrad 	ret = cypress_get_table_locations(rdev);
   2450  1.1  riastrad 	if (ret) {
   2451  1.1  riastrad 		DRM_ERROR("cypress_get_table_locations failed\n");
   2452  1.1  riastrad 		return ret;
   2453  1.1  riastrad 	}
   2454  1.1  riastrad 	ret = btc_init_smc_table(rdev, boot_ps);
   2455  1.1  riastrad 	if (ret)
   2456  1.1  riastrad 		return ret;
   2457  1.1  riastrad 
   2458  1.1  riastrad 	if (eg_pi->dynamic_ac_timing) {
   2459  1.1  riastrad 		ret = cypress_populate_mc_reg_table(rdev, boot_ps);
   2460  1.1  riastrad 		if (ret) {
   2461  1.1  riastrad 			DRM_ERROR("cypress_populate_mc_reg_table failed\n");
   2462  1.1  riastrad 			return ret;
   2463  1.1  riastrad 		}
   2464  1.1  riastrad 	}
   2465  1.1  riastrad 
   2466  1.1  riastrad 	cypress_program_response_times(rdev);
   2467  1.1  riastrad 	r7xx_start_smc(rdev);
   2468  1.1  riastrad 	ret = cypress_notify_smc_display_change(rdev, false);
   2469  1.1  riastrad 	if (ret) {
   2470  1.1  riastrad 		DRM_ERROR("cypress_notify_smc_display_change failed\n");
   2471  1.1  riastrad 		return ret;
   2472  1.1  riastrad 	}
   2473  1.1  riastrad 	cypress_enable_sclk_control(rdev, true);
   2474  1.1  riastrad 
   2475  1.1  riastrad 	if (eg_pi->memory_transition)
   2476  1.1  riastrad 		cypress_enable_mclk_control(rdev, true);
   2477  1.1  riastrad 
   2478  1.1  riastrad 	cypress_start_dpm(rdev);
   2479  1.1  riastrad 
   2480  1.1  riastrad 	if (pi->gfx_clock_gating)
   2481  1.1  riastrad 		btc_cg_clock_gating_enable(rdev, true);
   2482  1.1  riastrad 
   2483  1.1  riastrad 	if (pi->mg_clock_gating)
   2484  1.1  riastrad 		btc_mg_clock_gating_enable(rdev, true);
   2485  1.1  riastrad 
   2486  1.1  riastrad 	if (eg_pi->ls_clock_gating)
   2487  1.1  riastrad 		btc_ls_clock_gating_enable(rdev, true);
   2488  1.1  riastrad 
   2489  1.1  riastrad 	rv770_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
   2490  1.1  riastrad 
   2491  1.1  riastrad 	btc_init_stutter_mode(rdev);
   2492  1.1  riastrad 
   2493  1.1  riastrad 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
   2494  1.1  riastrad 
   2495  1.1  riastrad 	return 0;
   2496  1.1  riastrad };
   2497  1.1  riastrad 
   2498  1.1  riastrad void btc_dpm_disable(struct radeon_device *rdev)
   2499  1.1  riastrad {
   2500  1.1  riastrad 	struct rv7xx_power_info *pi = rv770_get_pi(rdev);
   2501  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2502  1.1  riastrad 
   2503  1.1  riastrad 	if (!btc_dpm_enabled(rdev))
   2504  1.1  riastrad 		return;
   2505  1.1  riastrad 
   2506  1.1  riastrad 	rv770_clear_vc(rdev);
   2507  1.1  riastrad 
   2508  1.1  riastrad 	if (pi->thermal_protection)
   2509  1.1  riastrad 		rv770_enable_thermal_protection(rdev, false);
   2510  1.1  riastrad 
   2511  1.1  riastrad 	if (pi->dynamic_pcie_gen2)
   2512  1.1  riastrad 		btc_enable_dynamic_pcie_gen2(rdev, false);
   2513  1.1  riastrad 
   2514  1.1  riastrad 	if (rdev->irq.installed &&
   2515  1.1  riastrad 	    r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
   2516  1.1  riastrad 		rdev->irq.dpm_thermal = false;
   2517  1.1  riastrad 		radeon_irq_set(rdev);
   2518  1.1  riastrad 	}
   2519  1.1  riastrad 
   2520  1.1  riastrad 	if (pi->gfx_clock_gating)
   2521  1.1  riastrad 		btc_cg_clock_gating_enable(rdev, false);
   2522  1.1  riastrad 
   2523  1.1  riastrad 	if (pi->mg_clock_gating)
   2524  1.1  riastrad 		btc_mg_clock_gating_enable(rdev, false);
   2525  1.1  riastrad 
   2526  1.1  riastrad 	if (eg_pi->ls_clock_gating)
   2527  1.1  riastrad 		btc_ls_clock_gating_enable(rdev, false);
   2528  1.1  riastrad 
   2529  1.1  riastrad 	rv770_stop_dpm(rdev);
   2530  1.1  riastrad 	btc_reset_to_default(rdev);
   2531  1.1  riastrad 	btc_stop_smc(rdev);
   2532  1.1  riastrad 	cypress_enable_spread_spectrum(rdev, false);
   2533  1.1  riastrad 
   2534  1.1  riastrad 	btc_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
   2535  1.1  riastrad }
   2536  1.1  riastrad 
   2537  1.1  riastrad void btc_dpm_setup_asic(struct radeon_device *rdev)
   2538  1.1  riastrad {
   2539  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2540  1.1  riastrad 	int r;
   2541  1.1  riastrad 
   2542  1.1  riastrad 	r = ni_mc_load_microcode(rdev);
   2543  1.1  riastrad 	if (r)
   2544  1.1  riastrad 		DRM_ERROR("Failed to load MC firmware!\n");
   2545  1.1  riastrad 	rv770_get_memory_type(rdev);
   2546  1.1  riastrad 	rv740_read_clock_registers(rdev);
   2547  1.1  riastrad 	btc_read_arb_registers(rdev);
   2548  1.1  riastrad 	rv770_read_voltage_smio_registers(rdev);
   2549  1.1  riastrad 
   2550  1.1  riastrad 	if (eg_pi->pcie_performance_request)
   2551  1.1  riastrad 		cypress_advertise_gen2_capability(rdev);
   2552  1.1  riastrad 
   2553  1.1  riastrad 	rv770_get_pcie_gen2_status(rdev);
   2554  1.1  riastrad 	rv770_enable_acpi_pm(rdev);
   2555  1.1  riastrad }
   2556  1.1  riastrad 
   2557  1.1  riastrad int btc_dpm_init(struct radeon_device *rdev)
   2558  1.1  riastrad {
   2559  1.1  riastrad 	struct rv7xx_power_info *pi;
   2560  1.1  riastrad 	struct evergreen_power_info *eg_pi;
   2561  1.1  riastrad 	struct atom_clock_dividers dividers;
   2562  1.1  riastrad 	int ret;
   2563  1.1  riastrad 
   2564  1.1  riastrad 	eg_pi = kzalloc(sizeof(struct evergreen_power_info), GFP_KERNEL);
   2565  1.1  riastrad 	if (eg_pi == NULL)
   2566  1.1  riastrad 		return -ENOMEM;
   2567  1.1  riastrad 	rdev->pm.dpm.priv = eg_pi;
   2568  1.1  riastrad 	pi = &eg_pi->rv7xx;
   2569  1.1  riastrad 
   2570  1.1  riastrad 	rv770_get_max_vddc(rdev);
   2571  1.1  riastrad 
   2572  1.1  riastrad 	eg_pi->ulv.supported = false;
   2573  1.1  riastrad 	pi->acpi_vddc = 0;
   2574  1.1  riastrad 	eg_pi->acpi_vddci = 0;
   2575  1.1  riastrad 	pi->min_vddc_in_table = 0;
   2576  1.1  riastrad 	pi->max_vddc_in_table = 0;
   2577  1.1  riastrad 
   2578  1.1  riastrad 	ret = r600_get_platform_caps(rdev);
   2579  1.1  riastrad 	if (ret)
   2580  1.1  riastrad 		return ret;
   2581  1.1  riastrad 
   2582  1.1  riastrad 	ret = rv7xx_parse_power_table(rdev);
   2583  1.1  riastrad 	if (ret)
   2584  1.1  riastrad 		return ret;
   2585  1.1  riastrad 	ret = r600_parse_extended_power_table(rdev);
   2586  1.1  riastrad 	if (ret)
   2587  1.1  riastrad 		return ret;
   2588  1.1  riastrad 
   2589  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
   2590  1.2  riastrad 		kcalloc(4,
   2591  1.2  riastrad 			sizeof(struct radeon_clock_voltage_dependency_entry),
   2592  1.2  riastrad 			GFP_KERNEL);
   2593  1.1  riastrad 	if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
   2594  1.1  riastrad 		r600_free_extended_power_table(rdev);
   2595  1.1  riastrad 		return -ENOMEM;
   2596  1.1  riastrad 	}
   2597  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
   2598  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
   2599  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
   2600  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
   2601  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 800;
   2602  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
   2603  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 800;
   2604  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
   2605  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 800;
   2606  1.1  riastrad 
   2607  1.1  riastrad 	if (rdev->pm.dpm.voltage_response_time == 0)
   2608  1.1  riastrad 		rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
   2609  1.1  riastrad 	if (rdev->pm.dpm.backbias_response_time == 0)
   2610  1.1  riastrad 		rdev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT;
   2611  1.1  riastrad 
   2612  1.1  riastrad 	ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
   2613  1.1  riastrad 					     0, false, &dividers);
   2614  1.1  riastrad 	if (ret)
   2615  1.1  riastrad 		pi->ref_div = dividers.ref_div + 1;
   2616  1.1  riastrad 	else
   2617  1.1  riastrad 		pi->ref_div = R600_REFERENCEDIVIDER_DFLT;
   2618  1.1  riastrad 
   2619  1.1  riastrad 	pi->mclk_strobe_mode_threshold = 40000;
   2620  1.1  riastrad 	pi->mclk_edc_enable_threshold = 40000;
   2621  1.1  riastrad 	eg_pi->mclk_edc_wr_enable_threshold = 40000;
   2622  1.1  riastrad 
   2623  1.1  riastrad 	pi->rlp = RV770_RLP_DFLT;
   2624  1.1  riastrad 	pi->rmp = RV770_RMP_DFLT;
   2625  1.1  riastrad 	pi->lhp = RV770_LHP_DFLT;
   2626  1.1  riastrad 	pi->lmp = RV770_LMP_DFLT;
   2627  1.1  riastrad 
   2628  1.1  riastrad 	eg_pi->ats[0].rlp = RV770_RLP_DFLT;
   2629  1.1  riastrad 	eg_pi->ats[0].rmp = RV770_RMP_DFLT;
   2630  1.1  riastrad 	eg_pi->ats[0].lhp = RV770_LHP_DFLT;
   2631  1.1  riastrad 	eg_pi->ats[0].lmp = RV770_LMP_DFLT;
   2632  1.1  riastrad 
   2633  1.1  riastrad 	eg_pi->ats[1].rlp = BTC_RLP_UVD_DFLT;
   2634  1.1  riastrad 	eg_pi->ats[1].rmp = BTC_RMP_UVD_DFLT;
   2635  1.1  riastrad 	eg_pi->ats[1].lhp = BTC_LHP_UVD_DFLT;
   2636  1.1  riastrad 	eg_pi->ats[1].lmp = BTC_LMP_UVD_DFLT;
   2637  1.1  riastrad 
   2638  1.1  riastrad 	eg_pi->smu_uvd_hs = true;
   2639  1.1  riastrad 
   2640  1.1  riastrad 	pi->voltage_control =
   2641  1.1  riastrad 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 0);
   2642  1.1  riastrad 
   2643  1.1  riastrad 	pi->mvdd_control =
   2644  1.1  riastrad 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
   2645  1.1  riastrad 
   2646  1.1  riastrad 	eg_pi->vddci_control =
   2647  1.1  riastrad 		radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
   2648  1.1  riastrad 
   2649  1.1  riastrad 	rv770_get_engine_memory_ss(rdev);
   2650  1.1  riastrad 
   2651  1.1  riastrad 	pi->asi = RV770_ASI_DFLT;
   2652  1.1  riastrad 	pi->pasi = CYPRESS_HASI_DFLT;
   2653  1.1  riastrad 	pi->vrc = CYPRESS_VRC_DFLT;
   2654  1.1  riastrad 
   2655  1.1  riastrad 	pi->power_gating = false;
   2656  1.1  riastrad 
   2657  1.1  riastrad 	pi->gfx_clock_gating = true;
   2658  1.1  riastrad 
   2659  1.1  riastrad 	pi->mg_clock_gating = true;
   2660  1.1  riastrad 	pi->mgcgtssm = true;
   2661  1.1  riastrad 	eg_pi->ls_clock_gating = false;
   2662  1.1  riastrad 	eg_pi->sclk_deep_sleep = false;
   2663  1.1  riastrad 
   2664  1.1  riastrad 	pi->dynamic_pcie_gen2 = true;
   2665  1.1  riastrad 
   2666  1.1  riastrad 	if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
   2667  1.1  riastrad 		pi->thermal_protection = true;
   2668  1.1  riastrad 	else
   2669  1.1  riastrad 		pi->thermal_protection = false;
   2670  1.1  riastrad 
   2671  1.1  riastrad 	pi->display_gap = true;
   2672  1.1  riastrad 
   2673  1.1  riastrad 	if (rdev->flags & RADEON_IS_MOBILITY)
   2674  1.1  riastrad 		pi->dcodt = true;
   2675  1.1  riastrad 	else
   2676  1.1  riastrad 		pi->dcodt = false;
   2677  1.1  riastrad 
   2678  1.1  riastrad 	pi->ulps = true;
   2679  1.1  riastrad 
   2680  1.1  riastrad 	eg_pi->dynamic_ac_timing = true;
   2681  1.1  riastrad 	eg_pi->abm = true;
   2682  1.1  riastrad 	eg_pi->mcls = true;
   2683  1.1  riastrad 	eg_pi->light_sleep = true;
   2684  1.1  riastrad 	eg_pi->memory_transition = true;
   2685  1.1  riastrad #if defined(CONFIG_ACPI)
   2686  1.1  riastrad 	eg_pi->pcie_performance_request =
   2687  1.1  riastrad 		radeon_acpi_is_pcie_performance_request_supported(rdev);
   2688  1.1  riastrad #else
   2689  1.1  riastrad 	eg_pi->pcie_performance_request = false;
   2690  1.1  riastrad #endif
   2691  1.1  riastrad 
   2692  1.1  riastrad 	if (rdev->family == CHIP_BARTS)
   2693  1.1  riastrad 		eg_pi->dll_default_on = true;
   2694  1.1  riastrad 	else
   2695  1.1  riastrad 		eg_pi->dll_default_on = false;
   2696  1.1  riastrad 
   2697  1.1  riastrad 	eg_pi->sclk_deep_sleep = false;
   2698  1.1  riastrad 	if (ASIC_IS_LOMBOK(rdev))
   2699  1.1  riastrad 		pi->mclk_stutter_mode_threshold = 30000;
   2700  1.1  riastrad 	else
   2701  1.1  riastrad 		pi->mclk_stutter_mode_threshold = 0;
   2702  1.1  riastrad 
   2703  1.1  riastrad 	pi->sram_end = SMC_RAM_END;
   2704  1.1  riastrad 
   2705  1.1  riastrad 	rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
   2706  1.1  riastrad 	rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
   2707  1.1  riastrad 	rdev->pm.dpm.dyn_state.min_vddc_for_pcie_gen2 = 900;
   2708  1.1  riastrad 	rdev->pm.dpm.dyn_state.valid_sclk_values.count = ARRAY_SIZE(btc_valid_sclk);
   2709  1.1  riastrad 	rdev->pm.dpm.dyn_state.valid_sclk_values.values = btc_valid_sclk;
   2710  1.1  riastrad 	rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
   2711  1.1  riastrad 	rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
   2712  1.1  riastrad 
   2713  1.1  riastrad 	if (rdev->family == CHIP_TURKS)
   2714  1.1  riastrad 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
   2715  1.1  riastrad 	else
   2716  1.1  riastrad 		rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000;
   2717  1.1  riastrad 
   2718  1.1  riastrad 	/* make sure dc limits are valid */
   2719  1.1  riastrad 	if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
   2720  1.1  riastrad 	    (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
   2721  1.1  riastrad 		rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
   2722  1.1  riastrad 			rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
   2723  1.1  riastrad 
   2724  1.1  riastrad 	return 0;
   2725  1.1  riastrad }
   2726  1.1  riastrad 
   2727  1.1  riastrad void btc_dpm_fini(struct radeon_device *rdev)
   2728  1.1  riastrad {
   2729  1.1  riastrad 	int i;
   2730  1.1  riastrad 
   2731  1.1  riastrad 	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
   2732  1.1  riastrad 		kfree(rdev->pm.dpm.ps[i].ps_priv);
   2733  1.1  riastrad 	}
   2734  1.1  riastrad 	kfree(rdev->pm.dpm.ps);
   2735  1.1  riastrad 	kfree(rdev->pm.dpm.priv);
   2736  1.1  riastrad 	kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
   2737  1.1  riastrad 	r600_free_extended_power_table(rdev);
   2738  1.1  riastrad }
   2739  1.1  riastrad 
   2740  1.1  riastrad #ifdef CONFIG_DEBUG_FS
   2741  1.1  riastrad void btc_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
   2742  1.1  riastrad 						     struct seq_file *m)
   2743  1.1  riastrad {
   2744  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2745  1.1  riastrad 	struct radeon_ps *rps = &eg_pi->current_rps;
   2746  1.1  riastrad 	struct rv7xx_ps *ps = rv770_get_ps(rps);
   2747  1.1  riastrad 	struct rv7xx_pl *pl;
   2748  1.1  riastrad 	u32 current_index =
   2749  1.1  riastrad 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
   2750  1.1  riastrad 		CURRENT_PROFILE_INDEX_SHIFT;
   2751  1.1  riastrad 
   2752  1.1  riastrad 	if (current_index > 2) {
   2753  1.1  riastrad 		seq_printf(m, "invalid dpm profile %d\n", current_index);
   2754  1.1  riastrad 	} else {
   2755  1.1  riastrad 		if (current_index == 0)
   2756  1.1  riastrad 			pl = &ps->low;
   2757  1.1  riastrad 		else if (current_index == 1)
   2758  1.1  riastrad 			pl = &ps->medium;
   2759  1.1  riastrad 		else /* current_index == 2 */
   2760  1.1  riastrad 			pl = &ps->high;
   2761  1.1  riastrad 		seq_printf(m, "uvd    vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
   2762  1.1  riastrad 		seq_printf(m, "power level %d    sclk: %u mclk: %u vddc: %u vddci: %u\n",
   2763  1.1  riastrad 			   current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
   2764  1.1  riastrad 	}
   2765  1.1  riastrad }
   2766  1.1  riastrad #endif	/* CONFIG_DEBUG_FS */
   2767  1.1  riastrad 
   2768  1.1  riastrad u32 btc_dpm_get_current_sclk(struct radeon_device *rdev)
   2769  1.1  riastrad {
   2770  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2771  1.1  riastrad 	struct radeon_ps *rps = &eg_pi->current_rps;
   2772  1.1  riastrad 	struct rv7xx_ps *ps = rv770_get_ps(rps);
   2773  1.1  riastrad 	struct rv7xx_pl *pl;
   2774  1.1  riastrad 	u32 current_index =
   2775  1.1  riastrad 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
   2776  1.1  riastrad 		CURRENT_PROFILE_INDEX_SHIFT;
   2777  1.1  riastrad 
   2778  1.1  riastrad 	if (current_index > 2) {
   2779  1.1  riastrad 		return 0;
   2780  1.1  riastrad 	} else {
   2781  1.1  riastrad 		if (current_index == 0)
   2782  1.1  riastrad 			pl = &ps->low;
   2783  1.1  riastrad 		else if (current_index == 1)
   2784  1.1  riastrad 			pl = &ps->medium;
   2785  1.1  riastrad 		else /* current_index == 2 */
   2786  1.1  riastrad 			pl = &ps->high;
   2787  1.1  riastrad 		return pl->sclk;
   2788  1.1  riastrad 	}
   2789  1.1  riastrad }
   2790  1.1  riastrad 
   2791  1.1  riastrad u32 btc_dpm_get_current_mclk(struct radeon_device *rdev)
   2792  1.1  riastrad {
   2793  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2794  1.1  riastrad 	struct radeon_ps *rps = &eg_pi->current_rps;
   2795  1.1  riastrad 	struct rv7xx_ps *ps = rv770_get_ps(rps);
   2796  1.1  riastrad 	struct rv7xx_pl *pl;
   2797  1.1  riastrad 	u32 current_index =
   2798  1.1  riastrad 		(RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_PROFILE_INDEX_MASK) >>
   2799  1.1  riastrad 		CURRENT_PROFILE_INDEX_SHIFT;
   2800  1.1  riastrad 
   2801  1.1  riastrad 	if (current_index > 2) {
   2802  1.1  riastrad 		return 0;
   2803  1.1  riastrad 	} else {
   2804  1.1  riastrad 		if (current_index == 0)
   2805  1.1  riastrad 			pl = &ps->low;
   2806  1.1  riastrad 		else if (current_index == 1)
   2807  1.1  riastrad 			pl = &ps->medium;
   2808  1.1  riastrad 		else /* current_index == 2 */
   2809  1.1  riastrad 			pl = &ps->high;
   2810  1.1  riastrad 		return pl->mclk;
   2811  1.1  riastrad 	}
   2812  1.1  riastrad }
   2813  1.1  riastrad 
   2814  1.1  riastrad u32 btc_dpm_get_sclk(struct radeon_device *rdev, bool low)
   2815  1.1  riastrad {
   2816  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2817  1.1  riastrad 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
   2818  1.1  riastrad 
   2819  1.1  riastrad 	if (low)
   2820  1.1  riastrad 		return requested_state->low.sclk;
   2821  1.1  riastrad 	else
   2822  1.1  riastrad 		return requested_state->high.sclk;
   2823  1.1  riastrad }
   2824  1.1  riastrad 
   2825  1.1  riastrad u32 btc_dpm_get_mclk(struct radeon_device *rdev, bool low)
   2826  1.1  riastrad {
   2827  1.1  riastrad 	struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
   2828  1.1  riastrad 	struct rv7xx_ps *requested_state = rv770_get_ps(&eg_pi->requested_rps);
   2829  1.1  riastrad 
   2830  1.1  riastrad 	if (low)
   2831  1.1  riastrad 		return requested_state->low.mclk;
   2832  1.1  riastrad 	else
   2833  1.1  riastrad 		return requested_state->high.mclk;
   2834  1.1  riastrad }
   2835