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, ÷rs); 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