162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright 2013 Advanced Micro Devices, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation 762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 1262306a36Sopenharmony_ci * all copies or substantial portions of the Software. 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <linux/math64.h> 2562306a36Sopenharmony_ci#include <linux/pci.h> 2662306a36Sopenharmony_ci#include <linux/seq_file.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "atom.h" 2962306a36Sopenharmony_ci#include "evergreen.h" 3062306a36Sopenharmony_ci#include "r600_dpm.h" 3162306a36Sopenharmony_ci#include "rv770.h" 3262306a36Sopenharmony_ci#include "radeon.h" 3362306a36Sopenharmony_ci#include "radeon_asic.h" 3462306a36Sopenharmony_ci#include "ni_dpm.h" 3562306a36Sopenharmony_ci#include "si_dpm.h" 3662306a36Sopenharmony_ci#include "si.h" 3762306a36Sopenharmony_ci#include "sid.h" 3862306a36Sopenharmony_ci#include "vce.h" 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define MC_CG_ARB_FREQ_F0 0x0a 4162306a36Sopenharmony_ci#define MC_CG_ARB_FREQ_F1 0x0b 4262306a36Sopenharmony_ci#define MC_CG_ARB_FREQ_F2 0x0c 4362306a36Sopenharmony_ci#define MC_CG_ARB_FREQ_F3 0x0d 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define SMC_RAM_END 0x20000 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define SCLK_MIN_DEEPSLEEP_FREQ 1350 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_tahiti[] = 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0xc, SISLANDS_CACCONFIG_CGIND }, 5262306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 5362306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x101, SISLANDS_CACCONFIG_CGIND }, 5462306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0xc, SISLANDS_CACCONFIG_CGIND }, 5562306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 5662306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 5762306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 5862306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 5962306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 6062306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x8fc, SISLANDS_CACCONFIG_CGIND }, 6162306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 6262306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x95, SISLANDS_CACCONFIG_CGIND }, 6362306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x34e, SISLANDS_CACCONFIG_CGIND }, 6462306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x1a1, SISLANDS_CACCONFIG_CGIND }, 6562306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0xda, SISLANDS_CACCONFIG_CGIND }, 6662306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 6762306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 6862306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x46, SISLANDS_CACCONFIG_CGIND }, 6962306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 7062306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x208, SISLANDS_CACCONFIG_CGIND }, 7162306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0xe7, SISLANDS_CACCONFIG_CGIND }, 7262306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x948, SISLANDS_CACCONFIG_CGIND }, 7362306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 7462306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 7562306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 7662306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 7762306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 7862306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 7962306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 8062306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 8162306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x167, SISLANDS_CACCONFIG_CGIND }, 8262306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 8362306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 8462306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 8562306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 8662306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 8762306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 8862306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND }, 8962306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 9062306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x31, SISLANDS_CACCONFIG_CGIND }, 9162306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 9262306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 9362306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 9462306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 9562306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 9662306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 9762306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 9862306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 9962306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 10062306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 10162306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 10262306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 10362306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 10462306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 10562306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 10662306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 10762306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 10862306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 10962306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 11062306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x18e, SISLANDS_CACCONFIG_CGIND }, 11162306a36Sopenharmony_ci { 0xFFFFFFFF } 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistatic const struct si_cac_config_reg lcac_tahiti[] = 11562306a36Sopenharmony_ci{ 11662306a36Sopenharmony_ci { 0x143, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND }, 11762306a36Sopenharmony_ci { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 11862306a36Sopenharmony_ci { 0x146, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND }, 11962306a36Sopenharmony_ci { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 12062306a36Sopenharmony_ci { 0x149, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND }, 12162306a36Sopenharmony_ci { 0x149, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 12262306a36Sopenharmony_ci { 0x14c, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND }, 12362306a36Sopenharmony_ci { 0x14c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 12462306a36Sopenharmony_ci { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 12562306a36Sopenharmony_ci { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 12662306a36Sopenharmony_ci { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 12762306a36Sopenharmony_ci { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 12862306a36Sopenharmony_ci { 0x9e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 12962306a36Sopenharmony_ci { 0x9e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 13062306a36Sopenharmony_ci { 0x101, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 13162306a36Sopenharmony_ci { 0x101, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 13262306a36Sopenharmony_ci { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 13362306a36Sopenharmony_ci { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 13462306a36Sopenharmony_ci { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 13562306a36Sopenharmony_ci { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 13662306a36Sopenharmony_ci { 0x10a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 13762306a36Sopenharmony_ci { 0x10a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 13862306a36Sopenharmony_ci { 0x10d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 13962306a36Sopenharmony_ci { 0x10d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 14062306a36Sopenharmony_ci { 0x8c, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 14162306a36Sopenharmony_ci { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 14262306a36Sopenharmony_ci { 0x8f, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 14362306a36Sopenharmony_ci { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 14462306a36Sopenharmony_ci { 0x92, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 14562306a36Sopenharmony_ci { 0x92, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 14662306a36Sopenharmony_ci { 0x95, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 14762306a36Sopenharmony_ci { 0x95, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 14862306a36Sopenharmony_ci { 0x14f, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 14962306a36Sopenharmony_ci { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 15062306a36Sopenharmony_ci { 0x152, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 15162306a36Sopenharmony_ci { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 15262306a36Sopenharmony_ci { 0x155, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 15362306a36Sopenharmony_ci { 0x155, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 15462306a36Sopenharmony_ci { 0x158, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 15562306a36Sopenharmony_ci { 0x158, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 15662306a36Sopenharmony_ci { 0x110, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 15762306a36Sopenharmony_ci { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 15862306a36Sopenharmony_ci { 0x113, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 15962306a36Sopenharmony_ci { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 16062306a36Sopenharmony_ci { 0x116, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 16162306a36Sopenharmony_ci { 0x116, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 16262306a36Sopenharmony_ci { 0x119, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND }, 16362306a36Sopenharmony_ci { 0x119, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 16462306a36Sopenharmony_ci { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 16562306a36Sopenharmony_ci { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 16662306a36Sopenharmony_ci { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 16762306a36Sopenharmony_ci { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 16862306a36Sopenharmony_ci { 0x122, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 16962306a36Sopenharmony_ci { 0x122, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 17062306a36Sopenharmony_ci { 0x125, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 17162306a36Sopenharmony_ci { 0x125, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 17262306a36Sopenharmony_ci { 0x128, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 17362306a36Sopenharmony_ci { 0x128, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 17462306a36Sopenharmony_ci { 0x12b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 17562306a36Sopenharmony_ci { 0x12b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 17662306a36Sopenharmony_ci { 0x15b, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 17762306a36Sopenharmony_ci { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 17862306a36Sopenharmony_ci { 0x15e, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 17962306a36Sopenharmony_ci { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 18062306a36Sopenharmony_ci { 0x161, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 18162306a36Sopenharmony_ci { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 18262306a36Sopenharmony_ci { 0x164, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 18362306a36Sopenharmony_ci { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 18462306a36Sopenharmony_ci { 0x167, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 18562306a36Sopenharmony_ci { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 18662306a36Sopenharmony_ci { 0x16a, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 18762306a36Sopenharmony_ci { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 18862306a36Sopenharmony_ci { 0x16d, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 18962306a36Sopenharmony_ci { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 19062306a36Sopenharmony_ci { 0x170, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 19162306a36Sopenharmony_ci { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 19262306a36Sopenharmony_ci { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 19362306a36Sopenharmony_ci { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 19462306a36Sopenharmony_ci { 0x176, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 19562306a36Sopenharmony_ci { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 19662306a36Sopenharmony_ci { 0x179, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 19762306a36Sopenharmony_ci { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 19862306a36Sopenharmony_ci { 0x17c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 19962306a36Sopenharmony_ci { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 20062306a36Sopenharmony_ci { 0x17f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 20162306a36Sopenharmony_ci { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 20262306a36Sopenharmony_ci { 0xFFFFFFFF } 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_override_tahiti[] = 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci { 0xFFFFFFFF } 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_tahiti = 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci ((1 << 16) | 27027), 21462306a36Sopenharmony_ci 6, 21562306a36Sopenharmony_ci 0, 21662306a36Sopenharmony_ci 4, 21762306a36Sopenharmony_ci 95, 21862306a36Sopenharmony_ci { 21962306a36Sopenharmony_ci 0UL, 22062306a36Sopenharmony_ci 0UL, 22162306a36Sopenharmony_ci 4521550UL, 22262306a36Sopenharmony_ci 309631529UL, 22362306a36Sopenharmony_ci -1270850L, 22462306a36Sopenharmony_ci 4513710L, 22562306a36Sopenharmony_ci 40 22662306a36Sopenharmony_ci }, 22762306a36Sopenharmony_ci 595000000UL, 22862306a36Sopenharmony_ci 12, 22962306a36Sopenharmony_ci { 23062306a36Sopenharmony_ci 0, 23162306a36Sopenharmony_ci 0, 23262306a36Sopenharmony_ci 0, 23362306a36Sopenharmony_ci 0, 23462306a36Sopenharmony_ci 0, 23562306a36Sopenharmony_ci 0, 23662306a36Sopenharmony_ci 0, 23762306a36Sopenharmony_ci 0 23862306a36Sopenharmony_ci }, 23962306a36Sopenharmony_ci true 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic const struct si_dte_data dte_data_tahiti = 24362306a36Sopenharmony_ci{ 24462306a36Sopenharmony_ci { 1159409, 0, 0, 0, 0 }, 24562306a36Sopenharmony_ci { 777, 0, 0, 0, 0 }, 24662306a36Sopenharmony_ci 2, 24762306a36Sopenharmony_ci 54000, 24862306a36Sopenharmony_ci 127000, 24962306a36Sopenharmony_ci 25, 25062306a36Sopenharmony_ci 2, 25162306a36Sopenharmony_ci 10, 25262306a36Sopenharmony_ci 13, 25362306a36Sopenharmony_ci { 27, 31, 35, 39, 43, 47, 54, 61, 67, 74, 81, 88, 95, 0, 0, 0 }, 25462306a36Sopenharmony_ci { 240888759, 221057860, 235370597, 162287531, 158510299, 131423027, 116673180, 103067515, 87941937, 76209048, 68209175, 64090048, 58301890, 0, 0, 0 }, 25562306a36Sopenharmony_ci { 12024, 11189, 11451, 8411, 7939, 6666, 5681, 4905, 4241, 3720, 3354, 3122, 2890, 0, 0, 0 }, 25662306a36Sopenharmony_ci 85, 25762306a36Sopenharmony_ci false 25862306a36Sopenharmony_ci}; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic const struct si_dte_data dte_data_tahiti_pro = 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 26362306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 26462306a36Sopenharmony_ci 5, 26562306a36Sopenharmony_ci 45000, 26662306a36Sopenharmony_ci 100, 26762306a36Sopenharmony_ci 0xA, 26862306a36Sopenharmony_ci 1, 26962306a36Sopenharmony_ci 0, 27062306a36Sopenharmony_ci 0x10, 27162306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 27262306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 27362306a36Sopenharmony_ci { 0x7D0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 27462306a36Sopenharmony_ci 90, 27562306a36Sopenharmony_ci true 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistatic const struct si_dte_data dte_data_new_zealand = 27962306a36Sopenharmony_ci{ 28062306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0 }, 28162306a36Sopenharmony_ci { 0x29B, 0x3E9, 0x537, 0x7D2, 0 }, 28262306a36Sopenharmony_ci 0x5, 28362306a36Sopenharmony_ci 0xAFC8, 28462306a36Sopenharmony_ci 0x69, 28562306a36Sopenharmony_ci 0x32, 28662306a36Sopenharmony_ci 1, 28762306a36Sopenharmony_ci 0, 28862306a36Sopenharmony_ci 0x10, 28962306a36Sopenharmony_ci { 0x82, 0xA0, 0xB4, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, 29062306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 29162306a36Sopenharmony_ci { 0xDAC, 0x1388, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685 }, 29262306a36Sopenharmony_ci 85, 29362306a36Sopenharmony_ci true 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic const struct si_dte_data dte_data_aruba_pro = 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 29962306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 30062306a36Sopenharmony_ci 5, 30162306a36Sopenharmony_ci 45000, 30262306a36Sopenharmony_ci 100, 30362306a36Sopenharmony_ci 0xA, 30462306a36Sopenharmony_ci 1, 30562306a36Sopenharmony_ci 0, 30662306a36Sopenharmony_ci 0x10, 30762306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 30862306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 30962306a36Sopenharmony_ci { 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 31062306a36Sopenharmony_ci 90, 31162306a36Sopenharmony_ci true 31262306a36Sopenharmony_ci}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic const struct si_dte_data dte_data_malta = 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 31762306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 31862306a36Sopenharmony_ci 5, 31962306a36Sopenharmony_ci 45000, 32062306a36Sopenharmony_ci 100, 32162306a36Sopenharmony_ci 0xA, 32262306a36Sopenharmony_ci 1, 32362306a36Sopenharmony_ci 0, 32462306a36Sopenharmony_ci 0x10, 32562306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 32662306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 32762306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 32862306a36Sopenharmony_ci 90, 32962306a36Sopenharmony_ci true 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic struct si_cac_config_reg cac_weights_pitcairn[] = 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x8a, SISLANDS_CACCONFIG_CGIND }, 33562306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 33662306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 33762306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x24d, SISLANDS_CACCONFIG_CGIND }, 33862306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x19, SISLANDS_CACCONFIG_CGIND }, 33962306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 34062306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 34162306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND }, 34262306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 34362306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0xc11, SISLANDS_CACCONFIG_CGIND }, 34462306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x7f3, SISLANDS_CACCONFIG_CGIND }, 34562306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x403, SISLANDS_CACCONFIG_CGIND }, 34662306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x367, SISLANDS_CACCONFIG_CGIND }, 34762306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x4c9, SISLANDS_CACCONFIG_CGIND }, 34862306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 34962306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 35062306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 35162306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x45d, SISLANDS_CACCONFIG_CGIND }, 35262306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x36d, SISLANDS_CACCONFIG_CGIND }, 35362306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x534, SISLANDS_CACCONFIG_CGIND }, 35462306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x5da, SISLANDS_CACCONFIG_CGIND }, 35562306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x880, SISLANDS_CACCONFIG_CGIND }, 35662306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0x201, SISLANDS_CACCONFIG_CGIND }, 35762306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 35862306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 35962306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x9f, SISLANDS_CACCONFIG_CGIND }, 36062306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x1f, SISLANDS_CACCONFIG_CGIND }, 36162306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 36262306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 36362306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 36462306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5de, SISLANDS_CACCONFIG_CGIND }, 36562306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 36662306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x7b, SISLANDS_CACCONFIG_CGIND }, 36762306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 36862306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x13, SISLANDS_CACCONFIG_CGIND }, 36962306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0xf9, SISLANDS_CACCONFIG_CGIND }, 37062306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x66, SISLANDS_CACCONFIG_CGIND }, 37162306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 37262306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x13, SISLANDS_CACCONFIG_CGIND }, 37362306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 37462306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 37562306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 37662306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 37762306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 37862306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 37962306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 38062306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 38162306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 38262306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 38362306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 38462306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 38562306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 38662306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 38762306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 38862306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 38962306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 39062306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 39162306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 39262306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 39362306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x186, SISLANDS_CACCONFIG_CGIND }, 39462306a36Sopenharmony_ci { 0xFFFFFFFF } 39562306a36Sopenharmony_ci}; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic const struct si_cac_config_reg lcac_pitcairn[] = 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 40062306a36Sopenharmony_ci { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 40162306a36Sopenharmony_ci { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 40262306a36Sopenharmony_ci { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 40362306a36Sopenharmony_ci { 0x110, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 40462306a36Sopenharmony_ci { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 40562306a36Sopenharmony_ci { 0x14f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 40662306a36Sopenharmony_ci { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 40762306a36Sopenharmony_ci { 0x8c, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 40862306a36Sopenharmony_ci { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 40962306a36Sopenharmony_ci { 0x143, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 41062306a36Sopenharmony_ci { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 41162306a36Sopenharmony_ci { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 41262306a36Sopenharmony_ci { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 41362306a36Sopenharmony_ci { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 41462306a36Sopenharmony_ci { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 41562306a36Sopenharmony_ci { 0x113, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 41662306a36Sopenharmony_ci { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 41762306a36Sopenharmony_ci { 0x152, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 41862306a36Sopenharmony_ci { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 41962306a36Sopenharmony_ci { 0x8f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 42062306a36Sopenharmony_ci { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 42162306a36Sopenharmony_ci { 0x146, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 42262306a36Sopenharmony_ci { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 42362306a36Sopenharmony_ci { 0x9e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 42462306a36Sopenharmony_ci { 0x9e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 42562306a36Sopenharmony_ci { 0x10a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 42662306a36Sopenharmony_ci { 0x10a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 42762306a36Sopenharmony_ci { 0x116, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 42862306a36Sopenharmony_ci { 0x116, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 42962306a36Sopenharmony_ci { 0x155, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 43062306a36Sopenharmony_ci { 0x155, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 43162306a36Sopenharmony_ci { 0x92, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 43262306a36Sopenharmony_ci { 0x92, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 43362306a36Sopenharmony_ci { 0x149, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 43462306a36Sopenharmony_ci { 0x149, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 43562306a36Sopenharmony_ci { 0x101, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 43662306a36Sopenharmony_ci { 0x101, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 43762306a36Sopenharmony_ci { 0x10d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 43862306a36Sopenharmony_ci { 0x10d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 43962306a36Sopenharmony_ci { 0x119, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 44062306a36Sopenharmony_ci { 0x119, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 44162306a36Sopenharmony_ci { 0x158, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 44262306a36Sopenharmony_ci { 0x158, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 44362306a36Sopenharmony_ci { 0x95, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 44462306a36Sopenharmony_ci { 0x95, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 44562306a36Sopenharmony_ci { 0x14c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 44662306a36Sopenharmony_ci { 0x14c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 44762306a36Sopenharmony_ci { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 44862306a36Sopenharmony_ci { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 44962306a36Sopenharmony_ci { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 45062306a36Sopenharmony_ci { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 45162306a36Sopenharmony_ci { 0x122, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 45262306a36Sopenharmony_ci { 0x122, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 45362306a36Sopenharmony_ci { 0x125, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 45462306a36Sopenharmony_ci { 0x125, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 45562306a36Sopenharmony_ci { 0x128, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 45662306a36Sopenharmony_ci { 0x128, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 45762306a36Sopenharmony_ci { 0x12b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 45862306a36Sopenharmony_ci { 0x12b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 45962306a36Sopenharmony_ci { 0x164, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 46062306a36Sopenharmony_ci { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 46162306a36Sopenharmony_ci { 0x167, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 46262306a36Sopenharmony_ci { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 46362306a36Sopenharmony_ci { 0x16a, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 46462306a36Sopenharmony_ci { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 46562306a36Sopenharmony_ci { 0x15e, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 46662306a36Sopenharmony_ci { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 46762306a36Sopenharmony_ci { 0x161, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 46862306a36Sopenharmony_ci { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 46962306a36Sopenharmony_ci { 0x15b, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 47062306a36Sopenharmony_ci { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 47162306a36Sopenharmony_ci { 0x16d, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 47262306a36Sopenharmony_ci { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 47362306a36Sopenharmony_ci { 0x170, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 47462306a36Sopenharmony_ci { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 47562306a36Sopenharmony_ci { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 47662306a36Sopenharmony_ci { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 47762306a36Sopenharmony_ci { 0x176, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 47862306a36Sopenharmony_ci { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 47962306a36Sopenharmony_ci { 0x179, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 48062306a36Sopenharmony_ci { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 48162306a36Sopenharmony_ci { 0x17c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 48262306a36Sopenharmony_ci { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 48362306a36Sopenharmony_ci { 0x17f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 48462306a36Sopenharmony_ci { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 48562306a36Sopenharmony_ci { 0xFFFFFFFF } 48662306a36Sopenharmony_ci}; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_override_pitcairn[] = 48962306a36Sopenharmony_ci{ 49062306a36Sopenharmony_ci { 0xFFFFFFFF } 49162306a36Sopenharmony_ci}; 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_pitcairn = 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci ((1 << 16) | 27027), 49662306a36Sopenharmony_ci 5, 49762306a36Sopenharmony_ci 0, 49862306a36Sopenharmony_ci 6, 49962306a36Sopenharmony_ci 100, 50062306a36Sopenharmony_ci { 50162306a36Sopenharmony_ci 51600000UL, 50262306a36Sopenharmony_ci 1800000UL, 50362306a36Sopenharmony_ci 7194395UL, 50462306a36Sopenharmony_ci 309631529UL, 50562306a36Sopenharmony_ci -1270850L, 50662306a36Sopenharmony_ci 4513710L, 50762306a36Sopenharmony_ci 100 50862306a36Sopenharmony_ci }, 50962306a36Sopenharmony_ci 117830498UL, 51062306a36Sopenharmony_ci 12, 51162306a36Sopenharmony_ci { 51262306a36Sopenharmony_ci 0, 51362306a36Sopenharmony_ci 0, 51462306a36Sopenharmony_ci 0, 51562306a36Sopenharmony_ci 0, 51662306a36Sopenharmony_ci 0, 51762306a36Sopenharmony_ci 0, 51862306a36Sopenharmony_ci 0, 51962306a36Sopenharmony_ci 0 52062306a36Sopenharmony_ci }, 52162306a36Sopenharmony_ci true 52262306a36Sopenharmony_ci}; 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_cistatic const struct si_dte_data dte_data_pitcairn = 52562306a36Sopenharmony_ci{ 52662306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 52762306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 52862306a36Sopenharmony_ci 0, 52962306a36Sopenharmony_ci 0, 53062306a36Sopenharmony_ci 0, 53162306a36Sopenharmony_ci 0, 53262306a36Sopenharmony_ci 0, 53362306a36Sopenharmony_ci 0, 53462306a36Sopenharmony_ci 0, 53562306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 53662306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 53762306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 53862306a36Sopenharmony_ci 0, 53962306a36Sopenharmony_ci false 54062306a36Sopenharmony_ci}; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_cistatic const struct si_dte_data dte_data_curacao_xt = 54362306a36Sopenharmony_ci{ 54462306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 54562306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 54662306a36Sopenharmony_ci 5, 54762306a36Sopenharmony_ci 45000, 54862306a36Sopenharmony_ci 100, 54962306a36Sopenharmony_ci 0xA, 55062306a36Sopenharmony_ci 1, 55162306a36Sopenharmony_ci 0, 55262306a36Sopenharmony_ci 0x10, 55362306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 55462306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 55562306a36Sopenharmony_ci { 0x1D17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 55662306a36Sopenharmony_ci 90, 55762306a36Sopenharmony_ci true 55862306a36Sopenharmony_ci}; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_cistatic const struct si_dte_data dte_data_curacao_pro = 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 56362306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 56462306a36Sopenharmony_ci 5, 56562306a36Sopenharmony_ci 45000, 56662306a36Sopenharmony_ci 100, 56762306a36Sopenharmony_ci 0xA, 56862306a36Sopenharmony_ci 1, 56962306a36Sopenharmony_ci 0, 57062306a36Sopenharmony_ci 0x10, 57162306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 57262306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 57362306a36Sopenharmony_ci { 0x1D17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 57462306a36Sopenharmony_ci 90, 57562306a36Sopenharmony_ci true 57662306a36Sopenharmony_ci}; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_cistatic const struct si_dte_data dte_data_neptune_xt = 57962306a36Sopenharmony_ci{ 58062306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 58162306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 58262306a36Sopenharmony_ci 5, 58362306a36Sopenharmony_ci 45000, 58462306a36Sopenharmony_ci 100, 58562306a36Sopenharmony_ci 0xA, 58662306a36Sopenharmony_ci 1, 58762306a36Sopenharmony_ci 0, 58862306a36Sopenharmony_ci 0x10, 58962306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 59062306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 59162306a36Sopenharmony_ci { 0x3A2F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 59262306a36Sopenharmony_ci 90, 59362306a36Sopenharmony_ci true 59462306a36Sopenharmony_ci}; 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_chelsea_pro[] = 59762306a36Sopenharmony_ci{ 59862306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 59962306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 60062306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 60162306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 60262306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 60362306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 60462306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 60562306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 60662306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 60762306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 60862306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 60962306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 61062306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 61162306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 61262306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 61362306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 61462306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 61562306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 61662306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 61762306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 61862306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 61962306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 62062306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 62162306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 62262306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 62362306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 62462306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 62562306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 62662306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 62762306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 62862306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 62962306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 63062306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 63162306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 63262306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 63362306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x2BD, SISLANDS_CACCONFIG_CGIND }, 63462306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 63562306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 63662306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 63762306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 63862306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 63962306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 64062306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 64162306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 64262306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 64362306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 64462306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 64562306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 64662306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 64762306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 64862306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 64962306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 65062306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 65162306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 65262306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 65362306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 65462306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 65562306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 65662306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 65762306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 65862306a36Sopenharmony_ci { 0xFFFFFFFF } 65962306a36Sopenharmony_ci}; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_chelsea_xt[] = 66262306a36Sopenharmony_ci{ 66362306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 66462306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 66562306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 66662306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 66762306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 66862306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 66962306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 67062306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 67162306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 67262306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 67362306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 67462306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 67562306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 67662306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 67762306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 67862306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 67962306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 68062306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 68162306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 68262306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 68362306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 68462306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 68562306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 68662306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 68762306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 68862306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 68962306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 69062306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 69162306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 69262306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 69362306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 69462306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 69562306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 69662306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 69762306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 69862306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x30A, SISLANDS_CACCONFIG_CGIND }, 69962306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 70062306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 70162306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 70262306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 70362306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 70462306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 70562306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 70662306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 70762306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 70862306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 70962306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 71062306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 71162306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 71262306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 71362306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 71462306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 71562306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 71662306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 71762306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 71862306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 71962306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 72062306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 72162306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 72262306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 72362306a36Sopenharmony_ci { 0xFFFFFFFF } 72462306a36Sopenharmony_ci}; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_heathrow[] = 72762306a36Sopenharmony_ci{ 72862306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 72962306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 73062306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 73162306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 73262306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 73362306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 73462306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 73562306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 73662306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 73762306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 73862306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 73962306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 74062306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 74162306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 74262306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 74362306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 74462306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 74562306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 74662306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 74762306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 74862306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 74962306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 75062306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 75162306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 75262306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 75362306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 75462306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 75562306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 75662306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 75762306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 75862306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 75962306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 76062306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 76162306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 76262306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 76362306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x362, SISLANDS_CACCONFIG_CGIND }, 76462306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 76562306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 76662306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 76762306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 76862306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 76962306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 77062306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 77162306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 77262306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 77362306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 77462306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 77562306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 77662306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 77762306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 77862306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 77962306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 78062306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 78162306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 78262306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 78362306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 78462306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 78562306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 78662306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 78762306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 78862306a36Sopenharmony_ci { 0xFFFFFFFF } 78962306a36Sopenharmony_ci}; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_cape_verde_pro[] = 79262306a36Sopenharmony_ci{ 79362306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 79462306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 79562306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 79662306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 79762306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 79862306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 79962306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 80062306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 80162306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 80262306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 80362306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 80462306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 80562306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 80662306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 80762306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 80862306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 80962306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 81062306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 81162306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 81262306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 81362306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 81462306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 81562306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 81662306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 81762306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 81862306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 81962306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 82062306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 82162306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 82262306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 82362306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 82462306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 82562306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 82662306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 82762306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 82862306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x315, SISLANDS_CACCONFIG_CGIND }, 82962306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 83062306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 83162306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 83262306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 83362306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 83462306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 83562306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 83662306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 83762306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 83862306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 83962306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 84062306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 84162306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 84262306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 84362306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 84462306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 84562306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 84662306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 84762306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 84862306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 84962306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 85062306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 85162306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 85262306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 85362306a36Sopenharmony_ci { 0xFFFFFFFF } 85462306a36Sopenharmony_ci}; 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_cape_verde[] = 85762306a36Sopenharmony_ci{ 85862306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 85962306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 86062306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 86162306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 86262306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 86362306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 86462306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 86562306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 86662306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 86762306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 86862306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 86962306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 87062306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 87162306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 87262306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 87362306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 87462306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 87562306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 87662306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 87762306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 87862306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 87962306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 88062306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 88162306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 88262306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 88362306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 88462306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 88562306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 88662306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 88762306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 88862306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 88962306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 89062306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 89162306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 89262306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 89362306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x3BA, SISLANDS_CACCONFIG_CGIND }, 89462306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 89562306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 89662306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 89762306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 89862306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 89962306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 90062306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 90162306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 90262306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 90362306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 90462306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 90562306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 90662306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 90762306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 90862306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 90962306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 91062306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 91162306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 91262306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 91362306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 91462306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 91562306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 91662306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 91762306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 91862306a36Sopenharmony_ci { 0xFFFFFFFF } 91962306a36Sopenharmony_ci}; 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_cistatic const struct si_cac_config_reg lcac_cape_verde[] = 92262306a36Sopenharmony_ci{ 92362306a36Sopenharmony_ci { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 92462306a36Sopenharmony_ci { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 92562306a36Sopenharmony_ci { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 92662306a36Sopenharmony_ci { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 92762306a36Sopenharmony_ci { 0x110, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 92862306a36Sopenharmony_ci { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 92962306a36Sopenharmony_ci { 0x14f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 93062306a36Sopenharmony_ci { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 93162306a36Sopenharmony_ci { 0x8c, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 93262306a36Sopenharmony_ci { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 93362306a36Sopenharmony_ci { 0x143, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 93462306a36Sopenharmony_ci { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 93562306a36Sopenharmony_ci { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 93662306a36Sopenharmony_ci { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 93762306a36Sopenharmony_ci { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 93862306a36Sopenharmony_ci { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 93962306a36Sopenharmony_ci { 0x113, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 94062306a36Sopenharmony_ci { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 94162306a36Sopenharmony_ci { 0x152, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND }, 94262306a36Sopenharmony_ci { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 94362306a36Sopenharmony_ci { 0x8f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 94462306a36Sopenharmony_ci { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 94562306a36Sopenharmony_ci { 0x146, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 94662306a36Sopenharmony_ci { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 94762306a36Sopenharmony_ci { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 94862306a36Sopenharmony_ci { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 94962306a36Sopenharmony_ci { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 95062306a36Sopenharmony_ci { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 95162306a36Sopenharmony_ci { 0x164, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 95262306a36Sopenharmony_ci { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 95362306a36Sopenharmony_ci { 0x167, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 95462306a36Sopenharmony_ci { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 95562306a36Sopenharmony_ci { 0x16a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 95662306a36Sopenharmony_ci { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 95762306a36Sopenharmony_ci { 0x15e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 95862306a36Sopenharmony_ci { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 95962306a36Sopenharmony_ci { 0x161, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 96062306a36Sopenharmony_ci { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 96162306a36Sopenharmony_ci { 0x15b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 96262306a36Sopenharmony_ci { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 96362306a36Sopenharmony_ci { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 96462306a36Sopenharmony_ci { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 96562306a36Sopenharmony_ci { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 96662306a36Sopenharmony_ci { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 96762306a36Sopenharmony_ci { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 96862306a36Sopenharmony_ci { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 96962306a36Sopenharmony_ci { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 97062306a36Sopenharmony_ci { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 97162306a36Sopenharmony_ci { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 97262306a36Sopenharmony_ci { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 97362306a36Sopenharmony_ci { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 97462306a36Sopenharmony_ci { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 97562306a36Sopenharmony_ci { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 97662306a36Sopenharmony_ci { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 97762306a36Sopenharmony_ci { 0xFFFFFFFF } 97862306a36Sopenharmony_ci}; 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_override_cape_verde[] = 98162306a36Sopenharmony_ci{ 98262306a36Sopenharmony_ci { 0xFFFFFFFF } 98362306a36Sopenharmony_ci}; 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_cape_verde = 98662306a36Sopenharmony_ci{ 98762306a36Sopenharmony_ci ((1 << 16) | 0x6993), 98862306a36Sopenharmony_ci 5, 98962306a36Sopenharmony_ci 0, 99062306a36Sopenharmony_ci 7, 99162306a36Sopenharmony_ci 105, 99262306a36Sopenharmony_ci { 99362306a36Sopenharmony_ci 0UL, 99462306a36Sopenharmony_ci 0UL, 99562306a36Sopenharmony_ci 7194395UL, 99662306a36Sopenharmony_ci 309631529UL, 99762306a36Sopenharmony_ci -1270850L, 99862306a36Sopenharmony_ci 4513710L, 99962306a36Sopenharmony_ci 100 100062306a36Sopenharmony_ci }, 100162306a36Sopenharmony_ci 117830498UL, 100262306a36Sopenharmony_ci 12, 100362306a36Sopenharmony_ci { 100462306a36Sopenharmony_ci 0, 100562306a36Sopenharmony_ci 0, 100662306a36Sopenharmony_ci 0, 100762306a36Sopenharmony_ci 0, 100862306a36Sopenharmony_ci 0, 100962306a36Sopenharmony_ci 0, 101062306a36Sopenharmony_ci 0, 101162306a36Sopenharmony_ci 0 101262306a36Sopenharmony_ci }, 101362306a36Sopenharmony_ci true 101462306a36Sopenharmony_ci}; 101562306a36Sopenharmony_ci 101662306a36Sopenharmony_cistatic const struct si_dte_data dte_data_cape_verde = 101762306a36Sopenharmony_ci{ 101862306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 101962306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 102062306a36Sopenharmony_ci 0, 102162306a36Sopenharmony_ci 0, 102262306a36Sopenharmony_ci 0, 102362306a36Sopenharmony_ci 0, 102462306a36Sopenharmony_ci 0, 102562306a36Sopenharmony_ci 0, 102662306a36Sopenharmony_ci 0, 102762306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 102862306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 102962306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 103062306a36Sopenharmony_ci 0, 103162306a36Sopenharmony_ci false 103262306a36Sopenharmony_ci}; 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_cistatic const struct si_dte_data dte_data_venus_xtx = 103562306a36Sopenharmony_ci{ 103662306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 103762306a36Sopenharmony_ci { 0x71C, 0xAAB, 0xE39, 0x11C7, 0x0 }, 103862306a36Sopenharmony_ci 5, 103962306a36Sopenharmony_ci 55000, 104062306a36Sopenharmony_ci 0x69, 104162306a36Sopenharmony_ci 0xA, 104262306a36Sopenharmony_ci 1, 104362306a36Sopenharmony_ci 0, 104462306a36Sopenharmony_ci 0x3, 104562306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 104662306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 104762306a36Sopenharmony_ci { 0xD6D8, 0x88B8, 0x1555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 104862306a36Sopenharmony_ci 90, 104962306a36Sopenharmony_ci true 105062306a36Sopenharmony_ci}; 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_cistatic const struct si_dte_data dte_data_venus_xt = 105362306a36Sopenharmony_ci{ 105462306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 105562306a36Sopenharmony_ci { 0xBDA, 0x11C7, 0x17B4, 0x1DA1, 0x0 }, 105662306a36Sopenharmony_ci 5, 105762306a36Sopenharmony_ci 55000, 105862306a36Sopenharmony_ci 0x69, 105962306a36Sopenharmony_ci 0xA, 106062306a36Sopenharmony_ci 1, 106162306a36Sopenharmony_ci 0, 106262306a36Sopenharmony_ci 0x3, 106362306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 106462306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 106562306a36Sopenharmony_ci { 0xAFC8, 0x88B8, 0x238E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 106662306a36Sopenharmony_ci 90, 106762306a36Sopenharmony_ci true 106862306a36Sopenharmony_ci}; 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_cistatic const struct si_dte_data dte_data_venus_pro = 107162306a36Sopenharmony_ci{ 107262306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 107362306a36Sopenharmony_ci { 0x11C7, 0x1AAB, 0x238E, 0x2C72, 0x0 }, 107462306a36Sopenharmony_ci 5, 107562306a36Sopenharmony_ci 55000, 107662306a36Sopenharmony_ci 0x69, 107762306a36Sopenharmony_ci 0xA, 107862306a36Sopenharmony_ci 1, 107962306a36Sopenharmony_ci 0, 108062306a36Sopenharmony_ci 0x3, 108162306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 108262306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 108362306a36Sopenharmony_ci { 0x88B8, 0x88B8, 0x3555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 108462306a36Sopenharmony_ci 90, 108562306a36Sopenharmony_ci true 108662306a36Sopenharmony_ci}; 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic struct si_cac_config_reg cac_weights_oland[] = 108962306a36Sopenharmony_ci{ 109062306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND }, 109162306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 109262306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND }, 109362306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND }, 109462306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 109562306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 109662306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND }, 109762306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND }, 109862306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND }, 109962306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND }, 110062306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND }, 110162306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND }, 110262306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND }, 110362306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 110462306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND }, 110562306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND }, 110662306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND }, 110762306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND }, 110862306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND }, 110962306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND }, 111062306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND }, 111162306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND }, 111262306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND }, 111362306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND }, 111462306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND }, 111562306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 111662306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 111762306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 111862306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 111962306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND }, 112062306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 112162306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND }, 112262306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND }, 112362306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND }, 112462306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 112562306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x3BA, SISLANDS_CACCONFIG_CGIND }, 112662306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 112762306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 112862306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 112962306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND }, 113062306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND }, 113162306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 113262306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 113362306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 113462306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 113562306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 113662306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 113762306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 113862306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 113962306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 114062306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 114162306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 114262306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 114362306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 114462306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 114562306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 114662306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 114762306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 114862306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 114962306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND }, 115062306a36Sopenharmony_ci { 0xFFFFFFFF } 115162306a36Sopenharmony_ci}; 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_mars_pro[] = 115462306a36Sopenharmony_ci{ 115562306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND }, 115662306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 115762306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND }, 115862306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND }, 115962306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 116062306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 116162306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 116262306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 116362306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND }, 116462306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND }, 116562306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND }, 116662306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND }, 116762306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND }, 116862306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND }, 116962306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND }, 117062306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND }, 117162306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND }, 117262306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND }, 117362306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND }, 117462306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND }, 117562306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND }, 117662306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND }, 117762306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND }, 117862306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 117962306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND }, 118062306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND }, 118162306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 118262306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND }, 118362306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 118462306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 118562306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND }, 118662306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 118762306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND }, 118862306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND }, 118962306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND }, 119062306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x2, SISLANDS_CACCONFIG_CGIND }, 119162306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 119262306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 119362306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 119462306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND }, 119562306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND }, 119662306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 119762306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 119862306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 119962306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 120062306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 120162306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND }, 120262306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 120362306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 120462306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 120562306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND }, 120662306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND }, 120762306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 120862306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 120962306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 121062306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 121162306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 121262306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 121362306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 121462306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND }, 121562306a36Sopenharmony_ci { 0xFFFFFFFF } 121662306a36Sopenharmony_ci}; 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_mars_xt[] = 121962306a36Sopenharmony_ci{ 122062306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND }, 122162306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 122262306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND }, 122362306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND }, 122462306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 122562306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 122662306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 122762306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 122862306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND }, 122962306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND }, 123062306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND }, 123162306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND }, 123262306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND }, 123362306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND }, 123462306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND }, 123562306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND }, 123662306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND }, 123762306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND }, 123862306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND }, 123962306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND }, 124062306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND }, 124162306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND }, 124262306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND }, 124362306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 124462306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND }, 124562306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND }, 124662306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 124762306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND }, 124862306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 124962306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 125062306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND }, 125162306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 125262306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND }, 125362306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND }, 125462306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND }, 125562306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x60, SISLANDS_CACCONFIG_CGIND }, 125662306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 125762306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 125862306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 125962306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND }, 126062306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND }, 126162306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 126262306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 126362306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 126462306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 126562306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 126662306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND }, 126762306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 126862306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 126962306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 127062306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND }, 127162306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND }, 127262306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 127362306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 127462306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 127562306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 127662306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 127762306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 127862306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 127962306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND }, 128062306a36Sopenharmony_ci { 0xFFFFFFFF } 128162306a36Sopenharmony_ci}; 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_oland_pro[] = 128462306a36Sopenharmony_ci{ 128562306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND }, 128662306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 128762306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND }, 128862306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND }, 128962306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 129062306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 129162306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 129262306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 129362306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND }, 129462306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND }, 129562306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND }, 129662306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND }, 129762306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND }, 129862306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND }, 129962306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND }, 130062306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND }, 130162306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND }, 130262306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND }, 130362306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND }, 130462306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND }, 130562306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND }, 130662306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND }, 130762306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND }, 130862306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 130962306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND }, 131062306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND }, 131162306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 131262306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND }, 131362306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 131462306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 131562306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND }, 131662306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 131762306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND }, 131862306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND }, 131962306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND }, 132062306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x90, SISLANDS_CACCONFIG_CGIND }, 132162306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 132262306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 132362306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 132462306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND }, 132562306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND }, 132662306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 132762306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 132862306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 132962306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 133062306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 133162306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND }, 133262306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 133362306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 133462306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 133562306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND }, 133662306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND }, 133762306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 133862306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 133962306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 134062306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 134162306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 134262306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 134362306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 134462306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND }, 134562306a36Sopenharmony_ci { 0xFFFFFFFF } 134662306a36Sopenharmony_ci}; 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_oland_xt[] = 134962306a36Sopenharmony_ci{ 135062306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND }, 135162306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 135262306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND }, 135362306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND }, 135462306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 135562306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 135662306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND }, 135762306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND }, 135862306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND }, 135962306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND }, 136062306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND }, 136162306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND }, 136262306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND }, 136362306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND }, 136462306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND }, 136562306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND }, 136662306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND }, 136762306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND }, 136862306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND }, 136962306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND }, 137062306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND }, 137162306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND }, 137262306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND }, 137362306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND }, 137462306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND }, 137562306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND }, 137662306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND }, 137762306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND }, 137862306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 137962306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND }, 138062306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND }, 138162306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 138262306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND }, 138362306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND }, 138462306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND }, 138562306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x120, SISLANDS_CACCONFIG_CGIND }, 138662306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 138762306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND }, 138862306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 138962306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND }, 139062306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND }, 139162306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 139262306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 139362306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 139462306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 139562306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 139662306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND }, 139762306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND }, 139862306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 139962306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 140062306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND }, 140162306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND }, 140262306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 140362306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 140462306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 140562306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 140662306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 140762306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 140862306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 140962306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND }, 141062306a36Sopenharmony_ci { 0xFFFFFFFF } 141162306a36Sopenharmony_ci}; 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_cistatic const struct si_cac_config_reg lcac_oland[] = 141462306a36Sopenharmony_ci{ 141562306a36Sopenharmony_ci { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 141662306a36Sopenharmony_ci { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 141762306a36Sopenharmony_ci { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 141862306a36Sopenharmony_ci { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 141962306a36Sopenharmony_ci { 0x110, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 142062306a36Sopenharmony_ci { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 142162306a36Sopenharmony_ci { 0x14f, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 142262306a36Sopenharmony_ci { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 142362306a36Sopenharmony_ci { 0x8c, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 142462306a36Sopenharmony_ci { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 142562306a36Sopenharmony_ci { 0x143, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND }, 142662306a36Sopenharmony_ci { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 142762306a36Sopenharmony_ci { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 142862306a36Sopenharmony_ci { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 142962306a36Sopenharmony_ci { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 143062306a36Sopenharmony_ci { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 143162306a36Sopenharmony_ci { 0x164, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 143262306a36Sopenharmony_ci { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 143362306a36Sopenharmony_ci { 0x167, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 143462306a36Sopenharmony_ci { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 143562306a36Sopenharmony_ci { 0x16a, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 143662306a36Sopenharmony_ci { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 143762306a36Sopenharmony_ci { 0x15e, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 143862306a36Sopenharmony_ci { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 143962306a36Sopenharmony_ci { 0x161, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 144062306a36Sopenharmony_ci { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 144162306a36Sopenharmony_ci { 0x15b, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 144262306a36Sopenharmony_ci { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 144362306a36Sopenharmony_ci { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 144462306a36Sopenharmony_ci { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 144562306a36Sopenharmony_ci { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 144662306a36Sopenharmony_ci { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 144762306a36Sopenharmony_ci { 0x173, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 144862306a36Sopenharmony_ci { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 144962306a36Sopenharmony_ci { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 145062306a36Sopenharmony_ci { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 145162306a36Sopenharmony_ci { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 145262306a36Sopenharmony_ci { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 145362306a36Sopenharmony_ci { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 145462306a36Sopenharmony_ci { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 145562306a36Sopenharmony_ci { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 145662306a36Sopenharmony_ci { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 145762306a36Sopenharmony_ci { 0xFFFFFFFF } 145862306a36Sopenharmony_ci}; 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_cistatic const struct si_cac_config_reg lcac_mars_pro[] = 146162306a36Sopenharmony_ci{ 146262306a36Sopenharmony_ci { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 146362306a36Sopenharmony_ci { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 146462306a36Sopenharmony_ci { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 146562306a36Sopenharmony_ci { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 146662306a36Sopenharmony_ci { 0x110, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 146762306a36Sopenharmony_ci { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 146862306a36Sopenharmony_ci { 0x14f, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 146962306a36Sopenharmony_ci { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 147062306a36Sopenharmony_ci { 0x8c, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND }, 147162306a36Sopenharmony_ci { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 147262306a36Sopenharmony_ci { 0x143, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 147362306a36Sopenharmony_ci { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 147462306a36Sopenharmony_ci { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 147562306a36Sopenharmony_ci { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 147662306a36Sopenharmony_ci { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 147762306a36Sopenharmony_ci { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 147862306a36Sopenharmony_ci { 0x164, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 147962306a36Sopenharmony_ci { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 148062306a36Sopenharmony_ci { 0x167, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 148162306a36Sopenharmony_ci { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 148262306a36Sopenharmony_ci { 0x16a, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 148362306a36Sopenharmony_ci { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 148462306a36Sopenharmony_ci { 0x15e, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 148562306a36Sopenharmony_ci { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 148662306a36Sopenharmony_ci { 0x161, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 148762306a36Sopenharmony_ci { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 148862306a36Sopenharmony_ci { 0x15b, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 148962306a36Sopenharmony_ci { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 149062306a36Sopenharmony_ci { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND }, 149162306a36Sopenharmony_ci { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 149262306a36Sopenharmony_ci { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 149362306a36Sopenharmony_ci { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 149462306a36Sopenharmony_ci { 0x173, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 149562306a36Sopenharmony_ci { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 149662306a36Sopenharmony_ci { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 149762306a36Sopenharmony_ci { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 149862306a36Sopenharmony_ci { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 149962306a36Sopenharmony_ci { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 150062306a36Sopenharmony_ci { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 150162306a36Sopenharmony_ci { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 150262306a36Sopenharmony_ci { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND }, 150362306a36Sopenharmony_ci { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND }, 150462306a36Sopenharmony_ci { 0xFFFFFFFF } 150562306a36Sopenharmony_ci}; 150662306a36Sopenharmony_ci 150762306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_override_oland[] = 150862306a36Sopenharmony_ci{ 150962306a36Sopenharmony_ci { 0xFFFFFFFF } 151062306a36Sopenharmony_ci}; 151162306a36Sopenharmony_ci 151262306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_oland = 151362306a36Sopenharmony_ci{ 151462306a36Sopenharmony_ci ((1 << 16) | 0x6993), 151562306a36Sopenharmony_ci 5, 151662306a36Sopenharmony_ci 0, 151762306a36Sopenharmony_ci 7, 151862306a36Sopenharmony_ci 105, 151962306a36Sopenharmony_ci { 152062306a36Sopenharmony_ci 0UL, 152162306a36Sopenharmony_ci 0UL, 152262306a36Sopenharmony_ci 7194395UL, 152362306a36Sopenharmony_ci 309631529UL, 152462306a36Sopenharmony_ci -1270850L, 152562306a36Sopenharmony_ci 4513710L, 152662306a36Sopenharmony_ci 100 152762306a36Sopenharmony_ci }, 152862306a36Sopenharmony_ci 117830498UL, 152962306a36Sopenharmony_ci 12, 153062306a36Sopenharmony_ci { 153162306a36Sopenharmony_ci 0, 153262306a36Sopenharmony_ci 0, 153362306a36Sopenharmony_ci 0, 153462306a36Sopenharmony_ci 0, 153562306a36Sopenharmony_ci 0, 153662306a36Sopenharmony_ci 0, 153762306a36Sopenharmony_ci 0, 153862306a36Sopenharmony_ci 0 153962306a36Sopenharmony_ci }, 154062306a36Sopenharmony_ci true 154162306a36Sopenharmony_ci}; 154262306a36Sopenharmony_ci 154362306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_mars_pro = 154462306a36Sopenharmony_ci{ 154562306a36Sopenharmony_ci ((1 << 16) | 0x6993), 154662306a36Sopenharmony_ci 5, 154762306a36Sopenharmony_ci 0, 154862306a36Sopenharmony_ci 7, 154962306a36Sopenharmony_ci 105, 155062306a36Sopenharmony_ci { 155162306a36Sopenharmony_ci 0UL, 155262306a36Sopenharmony_ci 0UL, 155362306a36Sopenharmony_ci 7194395UL, 155462306a36Sopenharmony_ci 309631529UL, 155562306a36Sopenharmony_ci -1270850L, 155662306a36Sopenharmony_ci 4513710L, 155762306a36Sopenharmony_ci 100 155862306a36Sopenharmony_ci }, 155962306a36Sopenharmony_ci 117830498UL, 156062306a36Sopenharmony_ci 12, 156162306a36Sopenharmony_ci { 156262306a36Sopenharmony_ci 0, 156362306a36Sopenharmony_ci 0, 156462306a36Sopenharmony_ci 0, 156562306a36Sopenharmony_ci 0, 156662306a36Sopenharmony_ci 0, 156762306a36Sopenharmony_ci 0, 156862306a36Sopenharmony_ci 0, 156962306a36Sopenharmony_ci 0 157062306a36Sopenharmony_ci }, 157162306a36Sopenharmony_ci true 157262306a36Sopenharmony_ci}; 157362306a36Sopenharmony_ci 157462306a36Sopenharmony_cistatic const struct si_dte_data dte_data_oland = 157562306a36Sopenharmony_ci{ 157662306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 157762306a36Sopenharmony_ci { 0, 0, 0, 0, 0 }, 157862306a36Sopenharmony_ci 0, 157962306a36Sopenharmony_ci 0, 158062306a36Sopenharmony_ci 0, 158162306a36Sopenharmony_ci 0, 158262306a36Sopenharmony_ci 0, 158362306a36Sopenharmony_ci 0, 158462306a36Sopenharmony_ci 0, 158562306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 158662306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 158762306a36Sopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 158862306a36Sopenharmony_ci 0, 158962306a36Sopenharmony_ci false 159062306a36Sopenharmony_ci}; 159162306a36Sopenharmony_ci 159262306a36Sopenharmony_cistatic const struct si_dte_data dte_data_mars_pro = 159362306a36Sopenharmony_ci{ 159462306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 159562306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 159662306a36Sopenharmony_ci 5, 159762306a36Sopenharmony_ci 55000, 159862306a36Sopenharmony_ci 105, 159962306a36Sopenharmony_ci 0xA, 160062306a36Sopenharmony_ci 1, 160162306a36Sopenharmony_ci 0, 160262306a36Sopenharmony_ci 0x10, 160362306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 160462306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 160562306a36Sopenharmony_ci { 0xF627, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 160662306a36Sopenharmony_ci 90, 160762306a36Sopenharmony_ci true 160862306a36Sopenharmony_ci}; 160962306a36Sopenharmony_ci 161062306a36Sopenharmony_cistatic const struct si_dte_data dte_data_sun_xt = 161162306a36Sopenharmony_ci{ 161262306a36Sopenharmony_ci { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, 161362306a36Sopenharmony_ci { 0x0, 0x0, 0x0, 0x0, 0x0 }, 161462306a36Sopenharmony_ci 5, 161562306a36Sopenharmony_ci 55000, 161662306a36Sopenharmony_ci 105, 161762306a36Sopenharmony_ci 0xA, 161862306a36Sopenharmony_ci 1, 161962306a36Sopenharmony_ci 0, 162062306a36Sopenharmony_ci 0x10, 162162306a36Sopenharmony_ci { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, 162262306a36Sopenharmony_ci { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 }, 162362306a36Sopenharmony_ci { 0xD555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }, 162462306a36Sopenharmony_ci 90, 162562306a36Sopenharmony_ci true 162662306a36Sopenharmony_ci}; 162762306a36Sopenharmony_ci 162862306a36Sopenharmony_ci 162962306a36Sopenharmony_cistatic const struct si_cac_config_reg cac_weights_hainan[] = 163062306a36Sopenharmony_ci{ 163162306a36Sopenharmony_ci { 0x0, 0x0000ffff, 0, 0x2d9, SISLANDS_CACCONFIG_CGIND }, 163262306a36Sopenharmony_ci { 0x0, 0xffff0000, 16, 0x22b, SISLANDS_CACCONFIG_CGIND }, 163362306a36Sopenharmony_ci { 0x1, 0x0000ffff, 0, 0x21c, SISLANDS_CACCONFIG_CGIND }, 163462306a36Sopenharmony_ci { 0x1, 0xffff0000, 16, 0x1dc, SISLANDS_CACCONFIG_CGIND }, 163562306a36Sopenharmony_ci { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 163662306a36Sopenharmony_ci { 0x3, 0x0000ffff, 0, 0x24e, SISLANDS_CACCONFIG_CGIND }, 163762306a36Sopenharmony_ci { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 163862306a36Sopenharmony_ci { 0x4, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 163962306a36Sopenharmony_ci { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 164062306a36Sopenharmony_ci { 0x5, 0x0000ffff, 0, 0x35e, SISLANDS_CACCONFIG_CGIND }, 164162306a36Sopenharmony_ci { 0x5, 0xffff0000, 16, 0x1143, SISLANDS_CACCONFIG_CGIND }, 164262306a36Sopenharmony_ci { 0x6, 0x0000ffff, 0, 0xe17, SISLANDS_CACCONFIG_CGIND }, 164362306a36Sopenharmony_ci { 0x6, 0xffff0000, 16, 0x441, SISLANDS_CACCONFIG_CGIND }, 164462306a36Sopenharmony_ci { 0x18f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 164562306a36Sopenharmony_ci { 0x7, 0x0000ffff, 0, 0x28b, SISLANDS_CACCONFIG_CGIND }, 164662306a36Sopenharmony_ci { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 164762306a36Sopenharmony_ci { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 164862306a36Sopenharmony_ci { 0x8, 0xffff0000, 16, 0xabe, SISLANDS_CACCONFIG_CGIND }, 164962306a36Sopenharmony_ci { 0x9, 0x0000ffff, 0, 0xf11, SISLANDS_CACCONFIG_CGIND }, 165062306a36Sopenharmony_ci { 0xa, 0x0000ffff, 0, 0x907, SISLANDS_CACCONFIG_CGIND }, 165162306a36Sopenharmony_ci { 0xb, 0x0000ffff, 0, 0xb45, SISLANDS_CACCONFIG_CGIND }, 165262306a36Sopenharmony_ci { 0xb, 0xffff0000, 16, 0xd1e, SISLANDS_CACCONFIG_CGIND }, 165362306a36Sopenharmony_ci { 0xc, 0x0000ffff, 0, 0xa2c, SISLANDS_CACCONFIG_CGIND }, 165462306a36Sopenharmony_ci { 0xd, 0x0000ffff, 0, 0x62, SISLANDS_CACCONFIG_CGIND }, 165562306a36Sopenharmony_ci { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 165662306a36Sopenharmony_ci { 0xe, 0x0000ffff, 0, 0x1f3, SISLANDS_CACCONFIG_CGIND }, 165762306a36Sopenharmony_ci { 0xf, 0x0000ffff, 0, 0x42, SISLANDS_CACCONFIG_CGIND }, 165862306a36Sopenharmony_ci { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 165962306a36Sopenharmony_ci { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 166062306a36Sopenharmony_ci { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 166162306a36Sopenharmony_ci { 0x11, 0x0000ffff, 0, 0x709, SISLANDS_CACCONFIG_CGIND }, 166262306a36Sopenharmony_ci { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 166362306a36Sopenharmony_ci { 0x12, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 166462306a36Sopenharmony_ci { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 166562306a36Sopenharmony_ci { 0x13, 0xffff0000, 16, 0x3a, SISLANDS_CACCONFIG_CGIND }, 166662306a36Sopenharmony_ci { 0x14, 0x0000ffff, 0, 0x357, SISLANDS_CACCONFIG_CGIND }, 166762306a36Sopenharmony_ci { 0x15, 0x0000ffff, 0, 0x9f, SISLANDS_CACCONFIG_CGIND }, 166862306a36Sopenharmony_ci { 0x15, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 166962306a36Sopenharmony_ci { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 167062306a36Sopenharmony_ci { 0x16, 0x0000ffff, 0, 0x314, SISLANDS_CACCONFIG_CGIND }, 167162306a36Sopenharmony_ci { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 167262306a36Sopenharmony_ci { 0x17, 0x0000ffff, 0, 0x6d, SISLANDS_CACCONFIG_CGIND }, 167362306a36Sopenharmony_ci { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 167462306a36Sopenharmony_ci { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 167562306a36Sopenharmony_ci { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND }, 167662306a36Sopenharmony_ci { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND }, 167762306a36Sopenharmony_ci { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 167862306a36Sopenharmony_ci { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 167962306a36Sopenharmony_ci { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 168062306a36Sopenharmony_ci { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 168162306a36Sopenharmony_ci { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 168262306a36Sopenharmony_ci { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 168362306a36Sopenharmony_ci { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 168462306a36Sopenharmony_ci { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 168562306a36Sopenharmony_ci { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 168662306a36Sopenharmony_ci { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 168762306a36Sopenharmony_ci { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 168862306a36Sopenharmony_ci { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND }, 168962306a36Sopenharmony_ci { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND }, 169062306a36Sopenharmony_ci { 0x6d, 0x0000ffff, 0, 0x1b9, SISLANDS_CACCONFIG_CGIND }, 169162306a36Sopenharmony_ci { 0xFFFFFFFF } 169262306a36Sopenharmony_ci}; 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_cistatic const struct si_powertune_data powertune_data_hainan = 169562306a36Sopenharmony_ci{ 169662306a36Sopenharmony_ci ((1 << 16) | 0x6993), 169762306a36Sopenharmony_ci 5, 169862306a36Sopenharmony_ci 0, 169962306a36Sopenharmony_ci 9, 170062306a36Sopenharmony_ci 105, 170162306a36Sopenharmony_ci { 170262306a36Sopenharmony_ci 0UL, 170362306a36Sopenharmony_ci 0UL, 170462306a36Sopenharmony_ci 7194395UL, 170562306a36Sopenharmony_ci 309631529UL, 170662306a36Sopenharmony_ci -1270850L, 170762306a36Sopenharmony_ci 4513710L, 170862306a36Sopenharmony_ci 100 170962306a36Sopenharmony_ci }, 171062306a36Sopenharmony_ci 117830498UL, 171162306a36Sopenharmony_ci 12, 171262306a36Sopenharmony_ci { 171362306a36Sopenharmony_ci 0, 171462306a36Sopenharmony_ci 0, 171562306a36Sopenharmony_ci 0, 171662306a36Sopenharmony_ci 0, 171762306a36Sopenharmony_ci 0, 171862306a36Sopenharmony_ci 0, 171962306a36Sopenharmony_ci 0, 172062306a36Sopenharmony_ci 0 172162306a36Sopenharmony_ci }, 172262306a36Sopenharmony_ci true 172362306a36Sopenharmony_ci}; 172462306a36Sopenharmony_ci 172562306a36Sopenharmony_cistatic int si_populate_voltage_value(struct radeon_device *rdev, 172662306a36Sopenharmony_ci const struct atom_voltage_table *table, 172762306a36Sopenharmony_ci u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage); 172862306a36Sopenharmony_cistatic int si_get_std_voltage_value(struct radeon_device *rdev, 172962306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE *voltage, 173062306a36Sopenharmony_ci u16 *std_voltage); 173162306a36Sopenharmony_cistatic int si_write_smc_soft_register(struct radeon_device *rdev, 173262306a36Sopenharmony_ci u16 reg_offset, u32 value); 173362306a36Sopenharmony_cistatic int si_convert_power_level_to_smc(struct radeon_device *rdev, 173462306a36Sopenharmony_ci struct rv7xx_pl *pl, 173562306a36Sopenharmony_ci SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level); 173662306a36Sopenharmony_cistatic int si_calculate_sclk_params(struct radeon_device *rdev, 173762306a36Sopenharmony_ci u32 engine_clock, 173862306a36Sopenharmony_ci SISLANDS_SMC_SCLK_VALUE *sclk); 173962306a36Sopenharmony_ci 174062306a36Sopenharmony_cistatic void si_thermal_start_smc_fan_control(struct radeon_device *rdev); 174162306a36Sopenharmony_cistatic void si_fan_ctrl_set_default_mode(struct radeon_device *rdev); 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_cistatic struct si_power_info *si_get_pi(struct radeon_device *rdev) 174462306a36Sopenharmony_ci{ 174562306a36Sopenharmony_ci struct si_power_info *pi = rdev->pm.dpm.priv; 174662306a36Sopenharmony_ci 174762306a36Sopenharmony_ci return pi; 174862306a36Sopenharmony_ci} 174962306a36Sopenharmony_ci 175062306a36Sopenharmony_cistatic void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coeffients *coeff, 175162306a36Sopenharmony_ci u16 v, s32 t, u32 ileakage, u32 *leakage) 175262306a36Sopenharmony_ci{ 175362306a36Sopenharmony_ci s64 kt, kv, leakage_w, i_leakage, vddc; 175462306a36Sopenharmony_ci s64 temperature, t_slope, t_intercept, av, bv, t_ref; 175562306a36Sopenharmony_ci s64 tmp; 175662306a36Sopenharmony_ci 175762306a36Sopenharmony_ci i_leakage = div64_s64(drm_int2fixp(ileakage), 100); 175862306a36Sopenharmony_ci vddc = div64_s64(drm_int2fixp(v), 1000); 175962306a36Sopenharmony_ci temperature = div64_s64(drm_int2fixp(t), 1000); 176062306a36Sopenharmony_ci 176162306a36Sopenharmony_ci t_slope = div64_s64(drm_int2fixp(coeff->t_slope), 100000000); 176262306a36Sopenharmony_ci t_intercept = div64_s64(drm_int2fixp(coeff->t_intercept), 100000000); 176362306a36Sopenharmony_ci av = div64_s64(drm_int2fixp(coeff->av), 100000000); 176462306a36Sopenharmony_ci bv = div64_s64(drm_int2fixp(coeff->bv), 100000000); 176562306a36Sopenharmony_ci t_ref = drm_int2fixp(coeff->t_ref); 176662306a36Sopenharmony_ci 176762306a36Sopenharmony_ci tmp = drm_fixp_mul(t_slope, vddc) + t_intercept; 176862306a36Sopenharmony_ci kt = drm_fixp_exp(drm_fixp_mul(tmp, temperature)); 176962306a36Sopenharmony_ci kt = drm_fixp_div(kt, drm_fixp_exp(drm_fixp_mul(tmp, t_ref))); 177062306a36Sopenharmony_ci kv = drm_fixp_mul(av, drm_fixp_exp(drm_fixp_mul(bv, vddc))); 177162306a36Sopenharmony_ci 177262306a36Sopenharmony_ci leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc); 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci *leakage = drm_fixp2int(leakage_w * 1000); 177562306a36Sopenharmony_ci} 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_cistatic void si_calculate_leakage_for_v_and_t(struct radeon_device *rdev, 177862306a36Sopenharmony_ci const struct ni_leakage_coeffients *coeff, 177962306a36Sopenharmony_ci u16 v, 178062306a36Sopenharmony_ci s32 t, 178162306a36Sopenharmony_ci u32 i_leakage, 178262306a36Sopenharmony_ci u32 *leakage) 178362306a36Sopenharmony_ci{ 178462306a36Sopenharmony_ci si_calculate_leakage_for_v_and_t_formula(coeff, v, t, i_leakage, leakage); 178562306a36Sopenharmony_ci} 178662306a36Sopenharmony_ci 178762306a36Sopenharmony_cistatic void si_calculate_leakage_for_v_formula(const struct ni_leakage_coeffients *coeff, 178862306a36Sopenharmony_ci const u32 fixed_kt, u16 v, 178962306a36Sopenharmony_ci u32 ileakage, u32 *leakage) 179062306a36Sopenharmony_ci{ 179162306a36Sopenharmony_ci s64 kt, kv, leakage_w, i_leakage, vddc; 179262306a36Sopenharmony_ci 179362306a36Sopenharmony_ci i_leakage = div64_s64(drm_int2fixp(ileakage), 100); 179462306a36Sopenharmony_ci vddc = div64_s64(drm_int2fixp(v), 1000); 179562306a36Sopenharmony_ci 179662306a36Sopenharmony_ci kt = div64_s64(drm_int2fixp(fixed_kt), 100000000); 179762306a36Sopenharmony_ci kv = drm_fixp_mul(div64_s64(drm_int2fixp(coeff->av), 100000000), 179862306a36Sopenharmony_ci drm_fixp_exp(drm_fixp_mul(div64_s64(drm_int2fixp(coeff->bv), 100000000), vddc))); 179962306a36Sopenharmony_ci 180062306a36Sopenharmony_ci leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc); 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_ci *leakage = drm_fixp2int(leakage_w * 1000); 180362306a36Sopenharmony_ci} 180462306a36Sopenharmony_ci 180562306a36Sopenharmony_cistatic void si_calculate_leakage_for_v(struct radeon_device *rdev, 180662306a36Sopenharmony_ci const struct ni_leakage_coeffients *coeff, 180762306a36Sopenharmony_ci const u32 fixed_kt, 180862306a36Sopenharmony_ci u16 v, 180962306a36Sopenharmony_ci u32 i_leakage, 181062306a36Sopenharmony_ci u32 *leakage) 181162306a36Sopenharmony_ci{ 181262306a36Sopenharmony_ci si_calculate_leakage_for_v_formula(coeff, fixed_kt, v, i_leakage, leakage); 181362306a36Sopenharmony_ci} 181462306a36Sopenharmony_ci 181562306a36Sopenharmony_ci 181662306a36Sopenharmony_cistatic void si_update_dte_from_pl2(struct radeon_device *rdev, 181762306a36Sopenharmony_ci struct si_dte_data *dte_data) 181862306a36Sopenharmony_ci{ 181962306a36Sopenharmony_ci u32 p_limit1 = rdev->pm.dpm.tdp_limit; 182062306a36Sopenharmony_ci u32 p_limit2 = rdev->pm.dpm.near_tdp_limit; 182162306a36Sopenharmony_ci u32 k = dte_data->k; 182262306a36Sopenharmony_ci u32 t_max = dte_data->max_t; 182362306a36Sopenharmony_ci u32 t_split[5] = { 10, 15, 20, 25, 30 }; 182462306a36Sopenharmony_ci u32 t_0 = dte_data->t0; 182562306a36Sopenharmony_ci u32 i; 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_ci if (p_limit2 != 0 && p_limit2 <= p_limit1) { 182862306a36Sopenharmony_ci dte_data->tdep_count = 3; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci for (i = 0; i < k; i++) { 183162306a36Sopenharmony_ci dte_data->r[i] = 183262306a36Sopenharmony_ci (t_split[i] * (t_max - t_0/(u32)1000) * (1 << 14)) / 183362306a36Sopenharmony_ci (p_limit2 * (u32)100); 183462306a36Sopenharmony_ci } 183562306a36Sopenharmony_ci 183662306a36Sopenharmony_ci dte_data->tdep_r[1] = dte_data->r[4] * 2; 183762306a36Sopenharmony_ci 183862306a36Sopenharmony_ci for (i = 2; i < SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE; i++) { 183962306a36Sopenharmony_ci dte_data->tdep_r[i] = dte_data->r[4]; 184062306a36Sopenharmony_ci } 184162306a36Sopenharmony_ci } else { 184262306a36Sopenharmony_ci DRM_ERROR("Invalid PL2! DTE will not be updated.\n"); 184362306a36Sopenharmony_ci } 184462306a36Sopenharmony_ci} 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_cistatic void si_initialize_powertune_defaults(struct radeon_device *rdev) 184762306a36Sopenharmony_ci{ 184862306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 184962306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 185062306a36Sopenharmony_ci bool update_dte_from_pl2 = false; 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci if (rdev->family == CHIP_TAHITI) { 185362306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_tahiti; 185462306a36Sopenharmony_ci si_pi->lcac_config = lcac_tahiti; 185562306a36Sopenharmony_ci si_pi->cac_override = cac_override_tahiti; 185662306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_tahiti; 185762306a36Sopenharmony_ci si_pi->dte_data = dte_data_tahiti; 185862306a36Sopenharmony_ci 185962306a36Sopenharmony_ci switch (rdev->pdev->device) { 186062306a36Sopenharmony_ci case 0x6798: 186162306a36Sopenharmony_ci si_pi->dte_data.enable_dte_by_default = true; 186262306a36Sopenharmony_ci break; 186362306a36Sopenharmony_ci case 0x6799: 186462306a36Sopenharmony_ci si_pi->dte_data = dte_data_new_zealand; 186562306a36Sopenharmony_ci break; 186662306a36Sopenharmony_ci case 0x6790: 186762306a36Sopenharmony_ci case 0x6791: 186862306a36Sopenharmony_ci case 0x6792: 186962306a36Sopenharmony_ci case 0x679E: 187062306a36Sopenharmony_ci si_pi->dte_data = dte_data_aruba_pro; 187162306a36Sopenharmony_ci update_dte_from_pl2 = true; 187262306a36Sopenharmony_ci break; 187362306a36Sopenharmony_ci case 0x679B: 187462306a36Sopenharmony_ci si_pi->dte_data = dte_data_malta; 187562306a36Sopenharmony_ci update_dte_from_pl2 = true; 187662306a36Sopenharmony_ci break; 187762306a36Sopenharmony_ci case 0x679A: 187862306a36Sopenharmony_ci si_pi->dte_data = dte_data_tahiti_pro; 187962306a36Sopenharmony_ci update_dte_from_pl2 = true; 188062306a36Sopenharmony_ci break; 188162306a36Sopenharmony_ci default: 188262306a36Sopenharmony_ci if (si_pi->dte_data.enable_dte_by_default == true) 188362306a36Sopenharmony_ci DRM_ERROR("DTE is not enabled!\n"); 188462306a36Sopenharmony_ci break; 188562306a36Sopenharmony_ci } 188662306a36Sopenharmony_ci } else if (rdev->family == CHIP_PITCAIRN) { 188762306a36Sopenharmony_ci switch (rdev->pdev->device) { 188862306a36Sopenharmony_ci case 0x6810: 188962306a36Sopenharmony_ci case 0x6818: 189062306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_pitcairn; 189162306a36Sopenharmony_ci si_pi->lcac_config = lcac_pitcairn; 189262306a36Sopenharmony_ci si_pi->cac_override = cac_override_pitcairn; 189362306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_pitcairn; 189462306a36Sopenharmony_ci si_pi->dte_data = dte_data_curacao_xt; 189562306a36Sopenharmony_ci update_dte_from_pl2 = true; 189662306a36Sopenharmony_ci break; 189762306a36Sopenharmony_ci case 0x6819: 189862306a36Sopenharmony_ci case 0x6811: 189962306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_pitcairn; 190062306a36Sopenharmony_ci si_pi->lcac_config = lcac_pitcairn; 190162306a36Sopenharmony_ci si_pi->cac_override = cac_override_pitcairn; 190262306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_pitcairn; 190362306a36Sopenharmony_ci si_pi->dte_data = dte_data_curacao_pro; 190462306a36Sopenharmony_ci update_dte_from_pl2 = true; 190562306a36Sopenharmony_ci break; 190662306a36Sopenharmony_ci case 0x6800: 190762306a36Sopenharmony_ci case 0x6806: 190862306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_pitcairn; 190962306a36Sopenharmony_ci si_pi->lcac_config = lcac_pitcairn; 191062306a36Sopenharmony_ci si_pi->cac_override = cac_override_pitcairn; 191162306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_pitcairn; 191262306a36Sopenharmony_ci si_pi->dte_data = dte_data_neptune_xt; 191362306a36Sopenharmony_ci update_dte_from_pl2 = true; 191462306a36Sopenharmony_ci break; 191562306a36Sopenharmony_ci default: 191662306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_pitcairn; 191762306a36Sopenharmony_ci si_pi->lcac_config = lcac_pitcairn; 191862306a36Sopenharmony_ci si_pi->cac_override = cac_override_pitcairn; 191962306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_pitcairn; 192062306a36Sopenharmony_ci si_pi->dte_data = dte_data_pitcairn; 192162306a36Sopenharmony_ci break; 192262306a36Sopenharmony_ci } 192362306a36Sopenharmony_ci } else if (rdev->family == CHIP_VERDE) { 192462306a36Sopenharmony_ci si_pi->lcac_config = lcac_cape_verde; 192562306a36Sopenharmony_ci si_pi->cac_override = cac_override_cape_verde; 192662306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_cape_verde; 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_ci switch (rdev->pdev->device) { 192962306a36Sopenharmony_ci case 0x683B: 193062306a36Sopenharmony_ci case 0x683F: 193162306a36Sopenharmony_ci case 0x6829: 193262306a36Sopenharmony_ci case 0x6835: 193362306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_cape_verde_pro; 193462306a36Sopenharmony_ci si_pi->dte_data = dte_data_cape_verde; 193562306a36Sopenharmony_ci break; 193662306a36Sopenharmony_ci case 0x682C: 193762306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_cape_verde_pro; 193862306a36Sopenharmony_ci si_pi->dte_data = dte_data_sun_xt; 193962306a36Sopenharmony_ci update_dte_from_pl2 = true; 194062306a36Sopenharmony_ci break; 194162306a36Sopenharmony_ci case 0x6825: 194262306a36Sopenharmony_ci case 0x6827: 194362306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_heathrow; 194462306a36Sopenharmony_ci si_pi->dte_data = dte_data_cape_verde; 194562306a36Sopenharmony_ci break; 194662306a36Sopenharmony_ci case 0x6824: 194762306a36Sopenharmony_ci case 0x682D: 194862306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_chelsea_xt; 194962306a36Sopenharmony_ci si_pi->dte_data = dte_data_cape_verde; 195062306a36Sopenharmony_ci break; 195162306a36Sopenharmony_ci case 0x682F: 195262306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_chelsea_pro; 195362306a36Sopenharmony_ci si_pi->dte_data = dte_data_cape_verde; 195462306a36Sopenharmony_ci break; 195562306a36Sopenharmony_ci case 0x6820: 195662306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_heathrow; 195762306a36Sopenharmony_ci si_pi->dte_data = dte_data_venus_xtx; 195862306a36Sopenharmony_ci break; 195962306a36Sopenharmony_ci case 0x6821: 196062306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_heathrow; 196162306a36Sopenharmony_ci si_pi->dte_data = dte_data_venus_xt; 196262306a36Sopenharmony_ci break; 196362306a36Sopenharmony_ci case 0x6823: 196462306a36Sopenharmony_ci case 0x682B: 196562306a36Sopenharmony_ci case 0x6822: 196662306a36Sopenharmony_ci case 0x682A: 196762306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_chelsea_pro; 196862306a36Sopenharmony_ci si_pi->dte_data = dte_data_venus_pro; 196962306a36Sopenharmony_ci break; 197062306a36Sopenharmony_ci default: 197162306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_cape_verde; 197262306a36Sopenharmony_ci si_pi->dte_data = dte_data_cape_verde; 197362306a36Sopenharmony_ci break; 197462306a36Sopenharmony_ci } 197562306a36Sopenharmony_ci } else if (rdev->family == CHIP_OLAND) { 197662306a36Sopenharmony_ci switch (rdev->pdev->device) { 197762306a36Sopenharmony_ci case 0x6601: 197862306a36Sopenharmony_ci case 0x6621: 197962306a36Sopenharmony_ci case 0x6603: 198062306a36Sopenharmony_ci case 0x6605: 198162306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_mars_pro; 198262306a36Sopenharmony_ci si_pi->lcac_config = lcac_mars_pro; 198362306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 198462306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_mars_pro; 198562306a36Sopenharmony_ci si_pi->dte_data = dte_data_mars_pro; 198662306a36Sopenharmony_ci update_dte_from_pl2 = true; 198762306a36Sopenharmony_ci break; 198862306a36Sopenharmony_ci case 0x6600: 198962306a36Sopenharmony_ci case 0x6606: 199062306a36Sopenharmony_ci case 0x6620: 199162306a36Sopenharmony_ci case 0x6604: 199262306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_mars_xt; 199362306a36Sopenharmony_ci si_pi->lcac_config = lcac_mars_pro; 199462306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 199562306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_mars_pro; 199662306a36Sopenharmony_ci si_pi->dte_data = dte_data_mars_pro; 199762306a36Sopenharmony_ci update_dte_from_pl2 = true; 199862306a36Sopenharmony_ci break; 199962306a36Sopenharmony_ci case 0x6611: 200062306a36Sopenharmony_ci case 0x6613: 200162306a36Sopenharmony_ci case 0x6608: 200262306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_oland_pro; 200362306a36Sopenharmony_ci si_pi->lcac_config = lcac_mars_pro; 200462306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 200562306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_mars_pro; 200662306a36Sopenharmony_ci si_pi->dte_data = dte_data_mars_pro; 200762306a36Sopenharmony_ci update_dte_from_pl2 = true; 200862306a36Sopenharmony_ci break; 200962306a36Sopenharmony_ci case 0x6610: 201062306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_oland_xt; 201162306a36Sopenharmony_ci si_pi->lcac_config = lcac_mars_pro; 201262306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 201362306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_mars_pro; 201462306a36Sopenharmony_ci si_pi->dte_data = dte_data_mars_pro; 201562306a36Sopenharmony_ci update_dte_from_pl2 = true; 201662306a36Sopenharmony_ci break; 201762306a36Sopenharmony_ci default: 201862306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_oland; 201962306a36Sopenharmony_ci si_pi->lcac_config = lcac_oland; 202062306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 202162306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_oland; 202262306a36Sopenharmony_ci si_pi->dte_data = dte_data_oland; 202362306a36Sopenharmony_ci break; 202462306a36Sopenharmony_ci } 202562306a36Sopenharmony_ci } else if (rdev->family == CHIP_HAINAN) { 202662306a36Sopenharmony_ci si_pi->cac_weights = cac_weights_hainan; 202762306a36Sopenharmony_ci si_pi->lcac_config = lcac_oland; 202862306a36Sopenharmony_ci si_pi->cac_override = cac_override_oland; 202962306a36Sopenharmony_ci si_pi->powertune_data = &powertune_data_hainan; 203062306a36Sopenharmony_ci si_pi->dte_data = dte_data_sun_xt; 203162306a36Sopenharmony_ci update_dte_from_pl2 = true; 203262306a36Sopenharmony_ci } else { 203362306a36Sopenharmony_ci DRM_ERROR("Unknown SI asic revision, failed to initialize PowerTune!\n"); 203462306a36Sopenharmony_ci return; 203562306a36Sopenharmony_ci } 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci ni_pi->enable_power_containment = false; 203862306a36Sopenharmony_ci ni_pi->enable_cac = false; 203962306a36Sopenharmony_ci ni_pi->enable_sq_ramping = false; 204062306a36Sopenharmony_ci si_pi->enable_dte = false; 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci if (si_pi->powertune_data->enable_powertune_by_default) { 204362306a36Sopenharmony_ci ni_pi->enable_power_containment= true; 204462306a36Sopenharmony_ci ni_pi->enable_cac = true; 204562306a36Sopenharmony_ci if (si_pi->dte_data.enable_dte_by_default) { 204662306a36Sopenharmony_ci si_pi->enable_dte = true; 204762306a36Sopenharmony_ci if (update_dte_from_pl2) 204862306a36Sopenharmony_ci si_update_dte_from_pl2(rdev, &si_pi->dte_data); 204962306a36Sopenharmony_ci 205062306a36Sopenharmony_ci } 205162306a36Sopenharmony_ci ni_pi->enable_sq_ramping = true; 205262306a36Sopenharmony_ci } 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci ni_pi->driver_calculate_cac_leakage = true; 205562306a36Sopenharmony_ci ni_pi->cac_configuration_required = true; 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_ci if (ni_pi->cac_configuration_required) { 205862306a36Sopenharmony_ci ni_pi->support_cac_long_term_average = true; 205962306a36Sopenharmony_ci si_pi->dyn_powertune_data.l2_lta_window_size = 206062306a36Sopenharmony_ci si_pi->powertune_data->l2_lta_window_size_default; 206162306a36Sopenharmony_ci si_pi->dyn_powertune_data.lts_truncate = 206262306a36Sopenharmony_ci si_pi->powertune_data->lts_truncate_default; 206362306a36Sopenharmony_ci } else { 206462306a36Sopenharmony_ci ni_pi->support_cac_long_term_average = false; 206562306a36Sopenharmony_ci si_pi->dyn_powertune_data.l2_lta_window_size = 0; 206662306a36Sopenharmony_ci si_pi->dyn_powertune_data.lts_truncate = 0; 206762306a36Sopenharmony_ci } 206862306a36Sopenharmony_ci 206962306a36Sopenharmony_ci si_pi->dyn_powertune_data.disable_uvd_powertune = false; 207062306a36Sopenharmony_ci} 207162306a36Sopenharmony_ci 207262306a36Sopenharmony_cistatic u32 si_get_smc_power_scaling_factor(struct radeon_device *rdev) 207362306a36Sopenharmony_ci{ 207462306a36Sopenharmony_ci return 1; 207562306a36Sopenharmony_ci} 207662306a36Sopenharmony_ci 207762306a36Sopenharmony_cistatic u32 si_calculate_cac_wintime(struct radeon_device *rdev) 207862306a36Sopenharmony_ci{ 207962306a36Sopenharmony_ci u32 xclk; 208062306a36Sopenharmony_ci u32 wintime; 208162306a36Sopenharmony_ci u32 cac_window; 208262306a36Sopenharmony_ci u32 cac_window_size; 208362306a36Sopenharmony_ci 208462306a36Sopenharmony_ci xclk = radeon_get_xclk(rdev); 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci if (xclk == 0) 208762306a36Sopenharmony_ci return 0; 208862306a36Sopenharmony_ci 208962306a36Sopenharmony_ci cac_window = RREG32(CG_CAC_CTRL) & CAC_WINDOW_MASK; 209062306a36Sopenharmony_ci cac_window_size = ((cac_window & 0xFFFF0000) >> 16) * (cac_window & 0x0000FFFF); 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_ci wintime = (cac_window_size * 100) / xclk; 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_ci return wintime; 209562306a36Sopenharmony_ci} 209662306a36Sopenharmony_ci 209762306a36Sopenharmony_cistatic u32 si_scale_power_for_smc(u32 power_in_watts, u32 scaling_factor) 209862306a36Sopenharmony_ci{ 209962306a36Sopenharmony_ci return power_in_watts; 210062306a36Sopenharmony_ci} 210162306a36Sopenharmony_ci 210262306a36Sopenharmony_cistatic int si_calculate_adjusted_tdp_limits(struct radeon_device *rdev, 210362306a36Sopenharmony_ci bool adjust_polarity, 210462306a36Sopenharmony_ci u32 tdp_adjustment, 210562306a36Sopenharmony_ci u32 *tdp_limit, 210662306a36Sopenharmony_ci u32 *near_tdp_limit) 210762306a36Sopenharmony_ci{ 210862306a36Sopenharmony_ci u32 adjustment_delta, max_tdp_limit; 210962306a36Sopenharmony_ci 211062306a36Sopenharmony_ci if (tdp_adjustment > (u32)rdev->pm.dpm.tdp_od_limit) 211162306a36Sopenharmony_ci return -EINVAL; 211262306a36Sopenharmony_ci 211362306a36Sopenharmony_ci max_tdp_limit = ((100 + 100) * rdev->pm.dpm.tdp_limit) / 100; 211462306a36Sopenharmony_ci 211562306a36Sopenharmony_ci if (adjust_polarity) { 211662306a36Sopenharmony_ci *tdp_limit = ((100 + tdp_adjustment) * rdev->pm.dpm.tdp_limit) / 100; 211762306a36Sopenharmony_ci *near_tdp_limit = rdev->pm.dpm.near_tdp_limit_adjusted + (*tdp_limit - rdev->pm.dpm.tdp_limit); 211862306a36Sopenharmony_ci } else { 211962306a36Sopenharmony_ci *tdp_limit = ((100 - tdp_adjustment) * rdev->pm.dpm.tdp_limit) / 100; 212062306a36Sopenharmony_ci adjustment_delta = rdev->pm.dpm.tdp_limit - *tdp_limit; 212162306a36Sopenharmony_ci if (adjustment_delta < rdev->pm.dpm.near_tdp_limit_adjusted) 212262306a36Sopenharmony_ci *near_tdp_limit = rdev->pm.dpm.near_tdp_limit_adjusted - adjustment_delta; 212362306a36Sopenharmony_ci else 212462306a36Sopenharmony_ci *near_tdp_limit = 0; 212562306a36Sopenharmony_ci } 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_ci if ((*tdp_limit <= 0) || (*tdp_limit > max_tdp_limit)) 212862306a36Sopenharmony_ci return -EINVAL; 212962306a36Sopenharmony_ci if ((*near_tdp_limit <= 0) || (*near_tdp_limit > *tdp_limit)) 213062306a36Sopenharmony_ci return -EINVAL; 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_ci return 0; 213362306a36Sopenharmony_ci} 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_cistatic int si_populate_smc_tdp_limits(struct radeon_device *rdev, 213662306a36Sopenharmony_ci struct radeon_ps *radeon_state) 213762306a36Sopenharmony_ci{ 213862306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 213962306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 214062306a36Sopenharmony_ci 214162306a36Sopenharmony_ci if (ni_pi->enable_power_containment) { 214262306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *smc_table = &si_pi->smc_statetable; 214362306a36Sopenharmony_ci PP_SIslands_PAPMParameters *papm_parm; 214462306a36Sopenharmony_ci struct radeon_ppm_table *ppm = rdev->pm.dpm.dyn_state.ppm_table; 214562306a36Sopenharmony_ci u32 scaling_factor = si_get_smc_power_scaling_factor(rdev); 214662306a36Sopenharmony_ci u32 tdp_limit; 214762306a36Sopenharmony_ci u32 near_tdp_limit; 214862306a36Sopenharmony_ci int ret; 214962306a36Sopenharmony_ci 215062306a36Sopenharmony_ci if (scaling_factor == 0) 215162306a36Sopenharmony_ci return -EINVAL; 215262306a36Sopenharmony_ci 215362306a36Sopenharmony_ci memset(smc_table, 0, sizeof(SISLANDS_SMC_STATETABLE)); 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci ret = si_calculate_adjusted_tdp_limits(rdev, 215662306a36Sopenharmony_ci false, /* ??? */ 215762306a36Sopenharmony_ci rdev->pm.dpm.tdp_adjustment, 215862306a36Sopenharmony_ci &tdp_limit, 215962306a36Sopenharmony_ci &near_tdp_limit); 216062306a36Sopenharmony_ci if (ret) 216162306a36Sopenharmony_ci return ret; 216262306a36Sopenharmony_ci 216362306a36Sopenharmony_ci smc_table->dpm2Params.TDPLimit = 216462306a36Sopenharmony_ci cpu_to_be32(si_scale_power_for_smc(tdp_limit, scaling_factor) * 1000); 216562306a36Sopenharmony_ci smc_table->dpm2Params.NearTDPLimit = 216662306a36Sopenharmony_ci cpu_to_be32(si_scale_power_for_smc(near_tdp_limit, scaling_factor) * 1000); 216762306a36Sopenharmony_ci smc_table->dpm2Params.SafePowerLimit = 216862306a36Sopenharmony_ci cpu_to_be32(si_scale_power_for_smc((near_tdp_limit * SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT) / 100, scaling_factor) * 1000); 216962306a36Sopenharmony_ci 217062306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, 217162306a36Sopenharmony_ci (si_pi->state_table_start + offsetof(SISLANDS_SMC_STATETABLE, dpm2Params) + 217262306a36Sopenharmony_ci offsetof(PP_SIslands_DPM2Parameters, TDPLimit)), 217362306a36Sopenharmony_ci (u8 *)(&(smc_table->dpm2Params.TDPLimit)), 217462306a36Sopenharmony_ci sizeof(u32) * 3, 217562306a36Sopenharmony_ci si_pi->sram_end); 217662306a36Sopenharmony_ci if (ret) 217762306a36Sopenharmony_ci return ret; 217862306a36Sopenharmony_ci 217962306a36Sopenharmony_ci if (si_pi->enable_ppm) { 218062306a36Sopenharmony_ci papm_parm = &si_pi->papm_parm; 218162306a36Sopenharmony_ci memset(papm_parm, 0, sizeof(PP_SIslands_PAPMParameters)); 218262306a36Sopenharmony_ci papm_parm->NearTDPLimitTherm = cpu_to_be32(ppm->dgpu_tdp); 218362306a36Sopenharmony_ci papm_parm->dGPU_T_Limit = cpu_to_be32(ppm->tj_max); 218462306a36Sopenharmony_ci papm_parm->dGPU_T_Warning = cpu_to_be32(95); 218562306a36Sopenharmony_ci papm_parm->dGPU_T_Hysteresis = cpu_to_be32(5); 218662306a36Sopenharmony_ci papm_parm->PlatformPowerLimit = 0xffffffff; 218762306a36Sopenharmony_ci papm_parm->NearTDPLimitPAPM = 0xffffffff; 218862306a36Sopenharmony_ci 218962306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, si_pi->papm_cfg_table_start, 219062306a36Sopenharmony_ci (u8 *)papm_parm, 219162306a36Sopenharmony_ci sizeof(PP_SIslands_PAPMParameters), 219262306a36Sopenharmony_ci si_pi->sram_end); 219362306a36Sopenharmony_ci if (ret) 219462306a36Sopenharmony_ci return ret; 219562306a36Sopenharmony_ci } 219662306a36Sopenharmony_ci } 219762306a36Sopenharmony_ci return 0; 219862306a36Sopenharmony_ci} 219962306a36Sopenharmony_ci 220062306a36Sopenharmony_cistatic int si_populate_smc_tdp_limits_2(struct radeon_device *rdev, 220162306a36Sopenharmony_ci struct radeon_ps *radeon_state) 220262306a36Sopenharmony_ci{ 220362306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 220462306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci if (ni_pi->enable_power_containment) { 220762306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *smc_table = &si_pi->smc_statetable; 220862306a36Sopenharmony_ci u32 scaling_factor = si_get_smc_power_scaling_factor(rdev); 220962306a36Sopenharmony_ci int ret; 221062306a36Sopenharmony_ci 221162306a36Sopenharmony_ci memset(smc_table, 0, sizeof(SISLANDS_SMC_STATETABLE)); 221262306a36Sopenharmony_ci 221362306a36Sopenharmony_ci smc_table->dpm2Params.NearTDPLimit = 221462306a36Sopenharmony_ci cpu_to_be32(si_scale_power_for_smc(rdev->pm.dpm.near_tdp_limit_adjusted, scaling_factor) * 1000); 221562306a36Sopenharmony_ci smc_table->dpm2Params.SafePowerLimit = 221662306a36Sopenharmony_ci cpu_to_be32(si_scale_power_for_smc((rdev->pm.dpm.near_tdp_limit_adjusted * SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT) / 100, scaling_factor) * 1000); 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, 221962306a36Sopenharmony_ci (si_pi->state_table_start + 222062306a36Sopenharmony_ci offsetof(SISLANDS_SMC_STATETABLE, dpm2Params) + 222162306a36Sopenharmony_ci offsetof(PP_SIslands_DPM2Parameters, NearTDPLimit)), 222262306a36Sopenharmony_ci (u8 *)(&(smc_table->dpm2Params.NearTDPLimit)), 222362306a36Sopenharmony_ci sizeof(u32) * 2, 222462306a36Sopenharmony_ci si_pi->sram_end); 222562306a36Sopenharmony_ci if (ret) 222662306a36Sopenharmony_ci return ret; 222762306a36Sopenharmony_ci } 222862306a36Sopenharmony_ci 222962306a36Sopenharmony_ci return 0; 223062306a36Sopenharmony_ci} 223162306a36Sopenharmony_ci 223262306a36Sopenharmony_cistatic u16 si_calculate_power_efficiency_ratio(struct radeon_device *rdev, 223362306a36Sopenharmony_ci const u16 prev_std_vddc, 223462306a36Sopenharmony_ci const u16 curr_std_vddc) 223562306a36Sopenharmony_ci{ 223662306a36Sopenharmony_ci u64 margin = (u64)SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN; 223762306a36Sopenharmony_ci u64 prev_vddc = (u64)prev_std_vddc; 223862306a36Sopenharmony_ci u64 curr_vddc = (u64)curr_std_vddc; 223962306a36Sopenharmony_ci u64 pwr_efficiency_ratio, n, d; 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci if ((prev_vddc == 0) || (curr_vddc == 0)) 224262306a36Sopenharmony_ci return 0; 224362306a36Sopenharmony_ci 224462306a36Sopenharmony_ci n = div64_u64((u64)1024 * curr_vddc * curr_vddc * ((u64)1000 + margin), (u64)1000); 224562306a36Sopenharmony_ci d = prev_vddc * prev_vddc; 224662306a36Sopenharmony_ci pwr_efficiency_ratio = div64_u64(n, d); 224762306a36Sopenharmony_ci 224862306a36Sopenharmony_ci if (pwr_efficiency_ratio > (u64)0xFFFF) 224962306a36Sopenharmony_ci return 0; 225062306a36Sopenharmony_ci 225162306a36Sopenharmony_ci return (u16)pwr_efficiency_ratio; 225262306a36Sopenharmony_ci} 225362306a36Sopenharmony_ci 225462306a36Sopenharmony_cistatic bool si_should_disable_uvd_powertune(struct radeon_device *rdev, 225562306a36Sopenharmony_ci struct radeon_ps *radeon_state) 225662306a36Sopenharmony_ci{ 225762306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 225862306a36Sopenharmony_ci 225962306a36Sopenharmony_ci if (si_pi->dyn_powertune_data.disable_uvd_powertune && 226062306a36Sopenharmony_ci radeon_state->vclk && radeon_state->dclk) 226162306a36Sopenharmony_ci return true; 226262306a36Sopenharmony_ci 226362306a36Sopenharmony_ci return false; 226462306a36Sopenharmony_ci} 226562306a36Sopenharmony_ci 226662306a36Sopenharmony_cistatic int si_populate_power_containment_values(struct radeon_device *rdev, 226762306a36Sopenharmony_ci struct radeon_ps *radeon_state, 226862306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state) 226962306a36Sopenharmony_ci{ 227062306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 227162306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 227262306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 227362306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE vddc; 227462306a36Sopenharmony_ci u32 prev_sclk; 227562306a36Sopenharmony_ci u32 max_sclk; 227662306a36Sopenharmony_ci u32 min_sclk; 227762306a36Sopenharmony_ci u16 prev_std_vddc; 227862306a36Sopenharmony_ci u16 curr_std_vddc; 227962306a36Sopenharmony_ci int i; 228062306a36Sopenharmony_ci u16 pwr_efficiency_ratio; 228162306a36Sopenharmony_ci u8 max_ps_percent; 228262306a36Sopenharmony_ci bool disable_uvd_power_tune; 228362306a36Sopenharmony_ci int ret; 228462306a36Sopenharmony_ci 228562306a36Sopenharmony_ci if (ni_pi->enable_power_containment == false) 228662306a36Sopenharmony_ci return 0; 228762306a36Sopenharmony_ci 228862306a36Sopenharmony_ci if (state->performance_level_count == 0) 228962306a36Sopenharmony_ci return -EINVAL; 229062306a36Sopenharmony_ci 229162306a36Sopenharmony_ci if (smc_state->levelCount != state->performance_level_count) 229262306a36Sopenharmony_ci return -EINVAL; 229362306a36Sopenharmony_ci 229462306a36Sopenharmony_ci disable_uvd_power_tune = si_should_disable_uvd_powertune(rdev, radeon_state); 229562306a36Sopenharmony_ci 229662306a36Sopenharmony_ci smc_state->levels[0].dpm2.MaxPS = 0; 229762306a36Sopenharmony_ci smc_state->levels[0].dpm2.NearTDPDec = 0; 229862306a36Sopenharmony_ci smc_state->levels[0].dpm2.AboveSafeInc = 0; 229962306a36Sopenharmony_ci smc_state->levels[0].dpm2.BelowSafeInc = 0; 230062306a36Sopenharmony_ci smc_state->levels[0].dpm2.PwrEfficiencyRatio = 0; 230162306a36Sopenharmony_ci 230262306a36Sopenharmony_ci for (i = 1; i < state->performance_level_count; i++) { 230362306a36Sopenharmony_ci prev_sclk = state->performance_levels[i-1].sclk; 230462306a36Sopenharmony_ci max_sclk = state->performance_levels[i].sclk; 230562306a36Sopenharmony_ci if (i == 1) 230662306a36Sopenharmony_ci max_ps_percent = SISLANDS_DPM2_MAXPS_PERCENT_M; 230762306a36Sopenharmony_ci else 230862306a36Sopenharmony_ci max_ps_percent = SISLANDS_DPM2_MAXPS_PERCENT_H; 230962306a36Sopenharmony_ci 231062306a36Sopenharmony_ci if (prev_sclk > max_sclk) 231162306a36Sopenharmony_ci return -EINVAL; 231262306a36Sopenharmony_ci 231362306a36Sopenharmony_ci if ((max_ps_percent == 0) || 231462306a36Sopenharmony_ci (prev_sclk == max_sclk) || 231562306a36Sopenharmony_ci disable_uvd_power_tune) { 231662306a36Sopenharmony_ci min_sclk = max_sclk; 231762306a36Sopenharmony_ci } else if (i == 1) { 231862306a36Sopenharmony_ci min_sclk = prev_sclk; 231962306a36Sopenharmony_ci } else { 232062306a36Sopenharmony_ci min_sclk = (prev_sclk * (u32)max_ps_percent) / 100; 232162306a36Sopenharmony_ci } 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_ci if (min_sclk < state->performance_levels[0].sclk) 232462306a36Sopenharmony_ci min_sclk = state->performance_levels[0].sclk; 232562306a36Sopenharmony_ci 232662306a36Sopenharmony_ci if (min_sclk == 0) 232762306a36Sopenharmony_ci return -EINVAL; 232862306a36Sopenharmony_ci 232962306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table, 233062306a36Sopenharmony_ci state->performance_levels[i-1].vddc, &vddc); 233162306a36Sopenharmony_ci if (ret) 233262306a36Sopenharmony_ci return ret; 233362306a36Sopenharmony_ci 233462306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, &vddc, &prev_std_vddc); 233562306a36Sopenharmony_ci if (ret) 233662306a36Sopenharmony_ci return ret; 233762306a36Sopenharmony_ci 233862306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table, 233962306a36Sopenharmony_ci state->performance_levels[i].vddc, &vddc); 234062306a36Sopenharmony_ci if (ret) 234162306a36Sopenharmony_ci return ret; 234262306a36Sopenharmony_ci 234362306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, &vddc, &curr_std_vddc); 234462306a36Sopenharmony_ci if (ret) 234562306a36Sopenharmony_ci return ret; 234662306a36Sopenharmony_ci 234762306a36Sopenharmony_ci pwr_efficiency_ratio = si_calculate_power_efficiency_ratio(rdev, 234862306a36Sopenharmony_ci prev_std_vddc, curr_std_vddc); 234962306a36Sopenharmony_ci 235062306a36Sopenharmony_ci smc_state->levels[i].dpm2.MaxPS = (u8)((SISLANDS_DPM2_MAX_PULSE_SKIP * (max_sclk - min_sclk)) / max_sclk); 235162306a36Sopenharmony_ci smc_state->levels[i].dpm2.NearTDPDec = SISLANDS_DPM2_NEAR_TDP_DEC; 235262306a36Sopenharmony_ci smc_state->levels[i].dpm2.AboveSafeInc = SISLANDS_DPM2_ABOVE_SAFE_INC; 235362306a36Sopenharmony_ci smc_state->levels[i].dpm2.BelowSafeInc = SISLANDS_DPM2_BELOW_SAFE_INC; 235462306a36Sopenharmony_ci smc_state->levels[i].dpm2.PwrEfficiencyRatio = cpu_to_be16(pwr_efficiency_ratio); 235562306a36Sopenharmony_ci } 235662306a36Sopenharmony_ci 235762306a36Sopenharmony_ci return 0; 235862306a36Sopenharmony_ci} 235962306a36Sopenharmony_ci 236062306a36Sopenharmony_cistatic int si_populate_sq_ramping_values(struct radeon_device *rdev, 236162306a36Sopenharmony_ci struct radeon_ps *radeon_state, 236262306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state) 236362306a36Sopenharmony_ci{ 236462306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 236562306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 236662306a36Sopenharmony_ci u32 sq_power_throttle, sq_power_throttle2; 236762306a36Sopenharmony_ci bool enable_sq_ramping = ni_pi->enable_sq_ramping; 236862306a36Sopenharmony_ci int i; 236962306a36Sopenharmony_ci 237062306a36Sopenharmony_ci if (state->performance_level_count == 0) 237162306a36Sopenharmony_ci return -EINVAL; 237262306a36Sopenharmony_ci 237362306a36Sopenharmony_ci if (smc_state->levelCount != state->performance_level_count) 237462306a36Sopenharmony_ci return -EINVAL; 237562306a36Sopenharmony_ci 237662306a36Sopenharmony_ci if (rdev->pm.dpm.sq_ramping_threshold == 0) 237762306a36Sopenharmony_ci return -EINVAL; 237862306a36Sopenharmony_ci 237962306a36Sopenharmony_ci if (SISLANDS_DPM2_SQ_RAMP_MAX_POWER > (MAX_POWER_MASK >> MAX_POWER_SHIFT)) 238062306a36Sopenharmony_ci enable_sq_ramping = false; 238162306a36Sopenharmony_ci 238262306a36Sopenharmony_ci if (SISLANDS_DPM2_SQ_RAMP_MIN_POWER > (MIN_POWER_MASK >> MIN_POWER_SHIFT)) 238362306a36Sopenharmony_ci enable_sq_ramping = false; 238462306a36Sopenharmony_ci 238562306a36Sopenharmony_ci if (SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA > (MAX_POWER_DELTA_MASK >> MAX_POWER_DELTA_SHIFT)) 238662306a36Sopenharmony_ci enable_sq_ramping = false; 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_ci if (SISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT)) 238962306a36Sopenharmony_ci enable_sq_ramping = false; 239062306a36Sopenharmony_ci 239162306a36Sopenharmony_ci if (SISLANDS_DPM2_SQ_RAMP_LTI_RATIO > (LTI_RATIO_MASK >> LTI_RATIO_SHIFT)) 239262306a36Sopenharmony_ci enable_sq_ramping = false; 239362306a36Sopenharmony_ci 239462306a36Sopenharmony_ci for (i = 0; i < state->performance_level_count; i++) { 239562306a36Sopenharmony_ci sq_power_throttle = 0; 239662306a36Sopenharmony_ci sq_power_throttle2 = 0; 239762306a36Sopenharmony_ci 239862306a36Sopenharmony_ci if ((state->performance_levels[i].sclk >= rdev->pm.dpm.sq_ramping_threshold) && 239962306a36Sopenharmony_ci enable_sq_ramping) { 240062306a36Sopenharmony_ci sq_power_throttle |= MAX_POWER(SISLANDS_DPM2_SQ_RAMP_MAX_POWER); 240162306a36Sopenharmony_ci sq_power_throttle |= MIN_POWER(SISLANDS_DPM2_SQ_RAMP_MIN_POWER); 240262306a36Sopenharmony_ci sq_power_throttle2 |= MAX_POWER_DELTA(SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA); 240362306a36Sopenharmony_ci sq_power_throttle2 |= STI_SIZE(SISLANDS_DPM2_SQ_RAMP_STI_SIZE); 240462306a36Sopenharmony_ci sq_power_throttle2 |= LTI_RATIO(SISLANDS_DPM2_SQ_RAMP_LTI_RATIO); 240562306a36Sopenharmony_ci } else { 240662306a36Sopenharmony_ci sq_power_throttle |= MAX_POWER_MASK | MIN_POWER_MASK; 240762306a36Sopenharmony_ci sq_power_throttle2 |= MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK; 240862306a36Sopenharmony_ci } 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci smc_state->levels[i].SQPowerThrottle = cpu_to_be32(sq_power_throttle); 241162306a36Sopenharmony_ci smc_state->levels[i].SQPowerThrottle_2 = cpu_to_be32(sq_power_throttle2); 241262306a36Sopenharmony_ci } 241362306a36Sopenharmony_ci 241462306a36Sopenharmony_ci return 0; 241562306a36Sopenharmony_ci} 241662306a36Sopenharmony_ci 241762306a36Sopenharmony_cistatic int si_enable_power_containment(struct radeon_device *rdev, 241862306a36Sopenharmony_ci struct radeon_ps *radeon_new_state, 241962306a36Sopenharmony_ci bool enable) 242062306a36Sopenharmony_ci{ 242162306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 242262306a36Sopenharmony_ci PPSMC_Result smc_result; 242362306a36Sopenharmony_ci int ret = 0; 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_ci if (ni_pi->enable_power_containment) { 242662306a36Sopenharmony_ci if (enable) { 242762306a36Sopenharmony_ci if (!si_should_disable_uvd_powertune(rdev, radeon_new_state)) { 242862306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_TDPClampingActive); 242962306a36Sopenharmony_ci if (smc_result != PPSMC_Result_OK) { 243062306a36Sopenharmony_ci ret = -EINVAL; 243162306a36Sopenharmony_ci ni_pi->pc_enabled = false; 243262306a36Sopenharmony_ci } else { 243362306a36Sopenharmony_ci ni_pi->pc_enabled = true; 243462306a36Sopenharmony_ci } 243562306a36Sopenharmony_ci } 243662306a36Sopenharmony_ci } else { 243762306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_TDPClampingInactive); 243862306a36Sopenharmony_ci if (smc_result != PPSMC_Result_OK) 243962306a36Sopenharmony_ci ret = -EINVAL; 244062306a36Sopenharmony_ci ni_pi->pc_enabled = false; 244162306a36Sopenharmony_ci } 244262306a36Sopenharmony_ci } 244362306a36Sopenharmony_ci 244462306a36Sopenharmony_ci return ret; 244562306a36Sopenharmony_ci} 244662306a36Sopenharmony_ci 244762306a36Sopenharmony_cistatic int si_initialize_smc_dte_tables(struct radeon_device *rdev) 244862306a36Sopenharmony_ci{ 244962306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 245062306a36Sopenharmony_ci int ret = 0; 245162306a36Sopenharmony_ci struct si_dte_data *dte_data = &si_pi->dte_data; 245262306a36Sopenharmony_ci Smc_SIslands_DTE_Configuration *dte_tables = NULL; 245362306a36Sopenharmony_ci u32 table_size; 245462306a36Sopenharmony_ci u8 tdep_count; 245562306a36Sopenharmony_ci u32 i; 245662306a36Sopenharmony_ci 245762306a36Sopenharmony_ci if (dte_data == NULL) 245862306a36Sopenharmony_ci si_pi->enable_dte = false; 245962306a36Sopenharmony_ci 246062306a36Sopenharmony_ci if (si_pi->enable_dte == false) 246162306a36Sopenharmony_ci return 0; 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci if (dte_data->k <= 0) 246462306a36Sopenharmony_ci return -EINVAL; 246562306a36Sopenharmony_ci 246662306a36Sopenharmony_ci dte_tables = kzalloc(sizeof(Smc_SIslands_DTE_Configuration), GFP_KERNEL); 246762306a36Sopenharmony_ci if (dte_tables == NULL) { 246862306a36Sopenharmony_ci si_pi->enable_dte = false; 246962306a36Sopenharmony_ci return -ENOMEM; 247062306a36Sopenharmony_ci } 247162306a36Sopenharmony_ci 247262306a36Sopenharmony_ci table_size = dte_data->k; 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci if (table_size > SMC_SISLANDS_DTE_MAX_FILTER_STAGES) 247562306a36Sopenharmony_ci table_size = SMC_SISLANDS_DTE_MAX_FILTER_STAGES; 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_ci tdep_count = dte_data->tdep_count; 247862306a36Sopenharmony_ci if (tdep_count > SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE) 247962306a36Sopenharmony_ci tdep_count = SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE; 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci dte_tables->K = cpu_to_be32(table_size); 248262306a36Sopenharmony_ci dte_tables->T0 = cpu_to_be32(dte_data->t0); 248362306a36Sopenharmony_ci dte_tables->MaxT = cpu_to_be32(dte_data->max_t); 248462306a36Sopenharmony_ci dte_tables->WindowSize = dte_data->window_size; 248562306a36Sopenharmony_ci dte_tables->temp_select = dte_data->temp_select; 248662306a36Sopenharmony_ci dte_tables->DTE_mode = dte_data->dte_mode; 248762306a36Sopenharmony_ci dte_tables->Tthreshold = cpu_to_be32(dte_data->t_threshold); 248862306a36Sopenharmony_ci 248962306a36Sopenharmony_ci if (tdep_count > 0) 249062306a36Sopenharmony_ci table_size--; 249162306a36Sopenharmony_ci 249262306a36Sopenharmony_ci for (i = 0; i < table_size; i++) { 249362306a36Sopenharmony_ci dte_tables->tau[i] = cpu_to_be32(dte_data->tau[i]); 249462306a36Sopenharmony_ci dte_tables->R[i] = cpu_to_be32(dte_data->r[i]); 249562306a36Sopenharmony_ci } 249662306a36Sopenharmony_ci 249762306a36Sopenharmony_ci dte_tables->Tdep_count = tdep_count; 249862306a36Sopenharmony_ci 249962306a36Sopenharmony_ci for (i = 0; i < (u32)tdep_count; i++) { 250062306a36Sopenharmony_ci dte_tables->T_limits[i] = dte_data->t_limits[i]; 250162306a36Sopenharmony_ci dte_tables->Tdep_tau[i] = cpu_to_be32(dte_data->tdep_tau[i]); 250262306a36Sopenharmony_ci dte_tables->Tdep_R[i] = cpu_to_be32(dte_data->tdep_r[i]); 250362306a36Sopenharmony_ci } 250462306a36Sopenharmony_ci 250562306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, si_pi->dte_table_start, (u8 *)dte_tables, 250662306a36Sopenharmony_ci sizeof(Smc_SIslands_DTE_Configuration), si_pi->sram_end); 250762306a36Sopenharmony_ci kfree(dte_tables); 250862306a36Sopenharmony_ci 250962306a36Sopenharmony_ci return ret; 251062306a36Sopenharmony_ci} 251162306a36Sopenharmony_ci 251262306a36Sopenharmony_cistatic int si_get_cac_std_voltage_max_min(struct radeon_device *rdev, 251362306a36Sopenharmony_ci u16 *max, u16 *min) 251462306a36Sopenharmony_ci{ 251562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 251662306a36Sopenharmony_ci struct radeon_cac_leakage_table *table = 251762306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.cac_leakage_table; 251862306a36Sopenharmony_ci u32 i; 251962306a36Sopenharmony_ci u32 v0_loadline; 252062306a36Sopenharmony_ci 252162306a36Sopenharmony_ci 252262306a36Sopenharmony_ci if (table == NULL) 252362306a36Sopenharmony_ci return -EINVAL; 252462306a36Sopenharmony_ci 252562306a36Sopenharmony_ci *max = 0; 252662306a36Sopenharmony_ci *min = 0xFFFF; 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_ci for (i = 0; i < table->count; i++) { 252962306a36Sopenharmony_ci if (table->entries[i].vddc > *max) 253062306a36Sopenharmony_ci *max = table->entries[i].vddc; 253162306a36Sopenharmony_ci if (table->entries[i].vddc < *min) 253262306a36Sopenharmony_ci *min = table->entries[i].vddc; 253362306a36Sopenharmony_ci } 253462306a36Sopenharmony_ci 253562306a36Sopenharmony_ci if (si_pi->powertune_data->lkge_lut_v0_percent > 100) 253662306a36Sopenharmony_ci return -EINVAL; 253762306a36Sopenharmony_ci 253862306a36Sopenharmony_ci v0_loadline = (*min) * (100 - si_pi->powertune_data->lkge_lut_v0_percent) / 100; 253962306a36Sopenharmony_ci 254062306a36Sopenharmony_ci if (v0_loadline > 0xFFFFUL) 254162306a36Sopenharmony_ci return -EINVAL; 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci *min = (u16)v0_loadline; 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_ci if ((*min > *max) || (*max == 0) || (*min == 0)) 254662306a36Sopenharmony_ci return -EINVAL; 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_ci return 0; 254962306a36Sopenharmony_ci} 255062306a36Sopenharmony_ci 255162306a36Sopenharmony_cistatic u16 si_get_cac_std_voltage_step(u16 max, u16 min) 255262306a36Sopenharmony_ci{ 255362306a36Sopenharmony_ci return ((max - min) + (SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES - 1)) / 255462306a36Sopenharmony_ci SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; 255562306a36Sopenharmony_ci} 255662306a36Sopenharmony_ci 255762306a36Sopenharmony_cistatic int si_init_dte_leakage_table(struct radeon_device *rdev, 255862306a36Sopenharmony_ci PP_SIslands_CacConfig *cac_tables, 255962306a36Sopenharmony_ci u16 vddc_max, u16 vddc_min, u16 vddc_step, 256062306a36Sopenharmony_ci u16 t0, u16 t_step) 256162306a36Sopenharmony_ci{ 256262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 256362306a36Sopenharmony_ci u32 leakage; 256462306a36Sopenharmony_ci unsigned int i, j; 256562306a36Sopenharmony_ci s32 t; 256662306a36Sopenharmony_ci u32 smc_leakage; 256762306a36Sopenharmony_ci u32 scaling_factor; 256862306a36Sopenharmony_ci u16 voltage; 256962306a36Sopenharmony_ci 257062306a36Sopenharmony_ci scaling_factor = si_get_smc_power_scaling_factor(rdev); 257162306a36Sopenharmony_ci 257262306a36Sopenharmony_ci for (i = 0; i < SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES ; i++) { 257362306a36Sopenharmony_ci t = (1000 * (i * t_step + t0)); 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_ci for (j = 0; j < SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) { 257662306a36Sopenharmony_ci voltage = vddc_max - (vddc_step * j); 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci si_calculate_leakage_for_v_and_t(rdev, 257962306a36Sopenharmony_ci &si_pi->powertune_data->leakage_coefficients, 258062306a36Sopenharmony_ci voltage, 258162306a36Sopenharmony_ci t, 258262306a36Sopenharmony_ci si_pi->dyn_powertune_data.cac_leakage, 258362306a36Sopenharmony_ci &leakage); 258462306a36Sopenharmony_ci 258562306a36Sopenharmony_ci smc_leakage = si_scale_power_for_smc(leakage, scaling_factor) / 4; 258662306a36Sopenharmony_ci 258762306a36Sopenharmony_ci if (smc_leakage > 0xFFFF) 258862306a36Sopenharmony_ci smc_leakage = 0xFFFF; 258962306a36Sopenharmony_ci 259062306a36Sopenharmony_ci cac_tables->cac_lkge_lut[i][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES-1-j] = 259162306a36Sopenharmony_ci cpu_to_be16((u16)smc_leakage); 259262306a36Sopenharmony_ci } 259362306a36Sopenharmony_ci } 259462306a36Sopenharmony_ci return 0; 259562306a36Sopenharmony_ci} 259662306a36Sopenharmony_ci 259762306a36Sopenharmony_cistatic int si_init_simplified_leakage_table(struct radeon_device *rdev, 259862306a36Sopenharmony_ci PP_SIslands_CacConfig *cac_tables, 259962306a36Sopenharmony_ci u16 vddc_max, u16 vddc_min, u16 vddc_step) 260062306a36Sopenharmony_ci{ 260162306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 260262306a36Sopenharmony_ci u32 leakage; 260362306a36Sopenharmony_ci unsigned int i, j; 260462306a36Sopenharmony_ci u32 smc_leakage; 260562306a36Sopenharmony_ci u32 scaling_factor; 260662306a36Sopenharmony_ci u16 voltage; 260762306a36Sopenharmony_ci 260862306a36Sopenharmony_ci scaling_factor = si_get_smc_power_scaling_factor(rdev); 260962306a36Sopenharmony_ci 261062306a36Sopenharmony_ci for (j = 0; j < SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) { 261162306a36Sopenharmony_ci voltage = vddc_max - (vddc_step * j); 261262306a36Sopenharmony_ci 261362306a36Sopenharmony_ci si_calculate_leakage_for_v(rdev, 261462306a36Sopenharmony_ci &si_pi->powertune_data->leakage_coefficients, 261562306a36Sopenharmony_ci si_pi->powertune_data->fixed_kt, 261662306a36Sopenharmony_ci voltage, 261762306a36Sopenharmony_ci si_pi->dyn_powertune_data.cac_leakage, 261862306a36Sopenharmony_ci &leakage); 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ci smc_leakage = si_scale_power_for_smc(leakage, scaling_factor) / 4; 262162306a36Sopenharmony_ci 262262306a36Sopenharmony_ci if (smc_leakage > 0xFFFF) 262362306a36Sopenharmony_ci smc_leakage = 0xFFFF; 262462306a36Sopenharmony_ci 262562306a36Sopenharmony_ci for (i = 0; i < SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES ; i++) 262662306a36Sopenharmony_ci cac_tables->cac_lkge_lut[i][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES-1-j] = 262762306a36Sopenharmony_ci cpu_to_be16((u16)smc_leakage); 262862306a36Sopenharmony_ci } 262962306a36Sopenharmony_ci return 0; 263062306a36Sopenharmony_ci} 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_cistatic int si_initialize_smc_cac_tables(struct radeon_device *rdev) 263362306a36Sopenharmony_ci{ 263462306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 263562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 263662306a36Sopenharmony_ci PP_SIslands_CacConfig *cac_tables = NULL; 263762306a36Sopenharmony_ci u16 vddc_max, vddc_min, vddc_step; 263862306a36Sopenharmony_ci u16 t0, t_step; 263962306a36Sopenharmony_ci u32 load_line_slope, reg; 264062306a36Sopenharmony_ci int ret = 0; 264162306a36Sopenharmony_ci u32 ticks_per_us = radeon_get_xclk(rdev) / 100; 264262306a36Sopenharmony_ci 264362306a36Sopenharmony_ci if (ni_pi->enable_cac == false) 264462306a36Sopenharmony_ci return 0; 264562306a36Sopenharmony_ci 264662306a36Sopenharmony_ci cac_tables = kzalloc(sizeof(PP_SIslands_CacConfig), GFP_KERNEL); 264762306a36Sopenharmony_ci if (!cac_tables) 264862306a36Sopenharmony_ci return -ENOMEM; 264962306a36Sopenharmony_ci 265062306a36Sopenharmony_ci reg = RREG32(CG_CAC_CTRL) & ~CAC_WINDOW_MASK; 265162306a36Sopenharmony_ci reg |= CAC_WINDOW(si_pi->powertune_data->cac_window); 265262306a36Sopenharmony_ci WREG32(CG_CAC_CTRL, reg); 265362306a36Sopenharmony_ci 265462306a36Sopenharmony_ci si_pi->dyn_powertune_data.cac_leakage = rdev->pm.dpm.cac_leakage; 265562306a36Sopenharmony_ci si_pi->dyn_powertune_data.dc_pwr_value = 265662306a36Sopenharmony_ci si_pi->powertune_data->dc_cac[NISLANDS_DCCAC_LEVEL_0]; 265762306a36Sopenharmony_ci si_pi->dyn_powertune_data.wintime = si_calculate_cac_wintime(rdev); 265862306a36Sopenharmony_ci si_pi->dyn_powertune_data.shift_n = si_pi->powertune_data->shift_n_default; 265962306a36Sopenharmony_ci 266062306a36Sopenharmony_ci si_pi->dyn_powertune_data.leakage_minimum_temperature = 80 * 1000; 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci ret = si_get_cac_std_voltage_max_min(rdev, &vddc_max, &vddc_min); 266362306a36Sopenharmony_ci if (ret) 266462306a36Sopenharmony_ci goto done_free; 266562306a36Sopenharmony_ci 266662306a36Sopenharmony_ci vddc_step = si_get_cac_std_voltage_step(vddc_max, vddc_min); 266762306a36Sopenharmony_ci vddc_min = vddc_max - (vddc_step * (SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES - 1)); 266862306a36Sopenharmony_ci t_step = 4; 266962306a36Sopenharmony_ci t0 = 60; 267062306a36Sopenharmony_ci 267162306a36Sopenharmony_ci if (si_pi->enable_dte || ni_pi->driver_calculate_cac_leakage) 267262306a36Sopenharmony_ci ret = si_init_dte_leakage_table(rdev, cac_tables, 267362306a36Sopenharmony_ci vddc_max, vddc_min, vddc_step, 267462306a36Sopenharmony_ci t0, t_step); 267562306a36Sopenharmony_ci else 267662306a36Sopenharmony_ci ret = si_init_simplified_leakage_table(rdev, cac_tables, 267762306a36Sopenharmony_ci vddc_max, vddc_min, vddc_step); 267862306a36Sopenharmony_ci if (ret) 267962306a36Sopenharmony_ci goto done_free; 268062306a36Sopenharmony_ci 268162306a36Sopenharmony_ci load_line_slope = ((u32)rdev->pm.dpm.load_line_slope << SMC_SISLANDS_SCALE_R) / 100; 268262306a36Sopenharmony_ci 268362306a36Sopenharmony_ci cac_tables->l2numWin_TDP = cpu_to_be32(si_pi->dyn_powertune_data.l2_lta_window_size); 268462306a36Sopenharmony_ci cac_tables->lts_truncate_n = si_pi->dyn_powertune_data.lts_truncate; 268562306a36Sopenharmony_ci cac_tables->SHIFT_N = si_pi->dyn_powertune_data.shift_n; 268662306a36Sopenharmony_ci cac_tables->lkge_lut_V0 = cpu_to_be32((u32)vddc_min); 268762306a36Sopenharmony_ci cac_tables->lkge_lut_Vstep = cpu_to_be32((u32)vddc_step); 268862306a36Sopenharmony_ci cac_tables->R_LL = cpu_to_be32(load_line_slope); 268962306a36Sopenharmony_ci cac_tables->WinTime = cpu_to_be32(si_pi->dyn_powertune_data.wintime); 269062306a36Sopenharmony_ci cac_tables->calculation_repeats = cpu_to_be32(2); 269162306a36Sopenharmony_ci cac_tables->dc_cac = cpu_to_be32(0); 269262306a36Sopenharmony_ci cac_tables->log2_PG_LKG_SCALE = 12; 269362306a36Sopenharmony_ci cac_tables->cac_temp = si_pi->powertune_data->operating_temp; 269462306a36Sopenharmony_ci cac_tables->lkge_lut_T0 = cpu_to_be32((u32)t0); 269562306a36Sopenharmony_ci cac_tables->lkge_lut_Tstep = cpu_to_be32((u32)t_step); 269662306a36Sopenharmony_ci 269762306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, si_pi->cac_table_start, (u8 *)cac_tables, 269862306a36Sopenharmony_ci sizeof(PP_SIslands_CacConfig), si_pi->sram_end); 269962306a36Sopenharmony_ci 270062306a36Sopenharmony_ci if (ret) 270162306a36Sopenharmony_ci goto done_free; 270262306a36Sopenharmony_ci 270362306a36Sopenharmony_ci ret = si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_ticks_per_us, ticks_per_us); 270462306a36Sopenharmony_ci 270562306a36Sopenharmony_cidone_free: 270662306a36Sopenharmony_ci if (ret) { 270762306a36Sopenharmony_ci ni_pi->enable_cac = false; 270862306a36Sopenharmony_ci ni_pi->enable_power_containment = false; 270962306a36Sopenharmony_ci } 271062306a36Sopenharmony_ci 271162306a36Sopenharmony_ci kfree(cac_tables); 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_ci return 0; 271462306a36Sopenharmony_ci} 271562306a36Sopenharmony_ci 271662306a36Sopenharmony_cistatic int si_program_cac_config_registers(struct radeon_device *rdev, 271762306a36Sopenharmony_ci const struct si_cac_config_reg *cac_config_regs) 271862306a36Sopenharmony_ci{ 271962306a36Sopenharmony_ci const struct si_cac_config_reg *config_regs = cac_config_regs; 272062306a36Sopenharmony_ci u32 data = 0, offset; 272162306a36Sopenharmony_ci 272262306a36Sopenharmony_ci if (!config_regs) 272362306a36Sopenharmony_ci return -EINVAL; 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_ci while (config_regs->offset != 0xFFFFFFFF) { 272662306a36Sopenharmony_ci switch (config_regs->type) { 272762306a36Sopenharmony_ci case SISLANDS_CACCONFIG_CGIND: 272862306a36Sopenharmony_ci offset = SMC_CG_IND_START + config_regs->offset; 272962306a36Sopenharmony_ci if (offset < SMC_CG_IND_END) 273062306a36Sopenharmony_ci data = RREG32_SMC(offset); 273162306a36Sopenharmony_ci break; 273262306a36Sopenharmony_ci default: 273362306a36Sopenharmony_ci data = RREG32(config_regs->offset << 2); 273462306a36Sopenharmony_ci break; 273562306a36Sopenharmony_ci } 273662306a36Sopenharmony_ci 273762306a36Sopenharmony_ci data &= ~config_regs->mask; 273862306a36Sopenharmony_ci data |= ((config_regs->value << config_regs->shift) & config_regs->mask); 273962306a36Sopenharmony_ci 274062306a36Sopenharmony_ci switch (config_regs->type) { 274162306a36Sopenharmony_ci case SISLANDS_CACCONFIG_CGIND: 274262306a36Sopenharmony_ci offset = SMC_CG_IND_START + config_regs->offset; 274362306a36Sopenharmony_ci if (offset < SMC_CG_IND_END) 274462306a36Sopenharmony_ci WREG32_SMC(offset, data); 274562306a36Sopenharmony_ci break; 274662306a36Sopenharmony_ci default: 274762306a36Sopenharmony_ci WREG32(config_regs->offset << 2, data); 274862306a36Sopenharmony_ci break; 274962306a36Sopenharmony_ci } 275062306a36Sopenharmony_ci config_regs++; 275162306a36Sopenharmony_ci } 275262306a36Sopenharmony_ci return 0; 275362306a36Sopenharmony_ci} 275462306a36Sopenharmony_ci 275562306a36Sopenharmony_cistatic int si_initialize_hardware_cac_manager(struct radeon_device *rdev) 275662306a36Sopenharmony_ci{ 275762306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 275862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 275962306a36Sopenharmony_ci int ret; 276062306a36Sopenharmony_ci 276162306a36Sopenharmony_ci if ((ni_pi->enable_cac == false) || 276262306a36Sopenharmony_ci (ni_pi->cac_configuration_required == false)) 276362306a36Sopenharmony_ci return 0; 276462306a36Sopenharmony_ci 276562306a36Sopenharmony_ci ret = si_program_cac_config_registers(rdev, si_pi->lcac_config); 276662306a36Sopenharmony_ci if (ret) 276762306a36Sopenharmony_ci return ret; 276862306a36Sopenharmony_ci ret = si_program_cac_config_registers(rdev, si_pi->cac_override); 276962306a36Sopenharmony_ci if (ret) 277062306a36Sopenharmony_ci return ret; 277162306a36Sopenharmony_ci ret = si_program_cac_config_registers(rdev, si_pi->cac_weights); 277262306a36Sopenharmony_ci if (ret) 277362306a36Sopenharmony_ci return ret; 277462306a36Sopenharmony_ci 277562306a36Sopenharmony_ci return 0; 277662306a36Sopenharmony_ci} 277762306a36Sopenharmony_ci 277862306a36Sopenharmony_cistatic int si_enable_smc_cac(struct radeon_device *rdev, 277962306a36Sopenharmony_ci struct radeon_ps *radeon_new_state, 278062306a36Sopenharmony_ci bool enable) 278162306a36Sopenharmony_ci{ 278262306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 278362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 278462306a36Sopenharmony_ci PPSMC_Result smc_result; 278562306a36Sopenharmony_ci int ret = 0; 278662306a36Sopenharmony_ci 278762306a36Sopenharmony_ci if (ni_pi->enable_cac) { 278862306a36Sopenharmony_ci if (enable) { 278962306a36Sopenharmony_ci if (!si_should_disable_uvd_powertune(rdev, radeon_new_state)) { 279062306a36Sopenharmony_ci if (ni_pi->support_cac_long_term_average) { 279162306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_CACLongTermAvgEnable); 279262306a36Sopenharmony_ci if (smc_result != PPSMC_Result_OK) 279362306a36Sopenharmony_ci ni_pi->support_cac_long_term_average = false; 279462306a36Sopenharmony_ci } 279562306a36Sopenharmony_ci 279662306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableCac); 279762306a36Sopenharmony_ci if (smc_result != PPSMC_Result_OK) { 279862306a36Sopenharmony_ci ret = -EINVAL; 279962306a36Sopenharmony_ci ni_pi->cac_enabled = false; 280062306a36Sopenharmony_ci } else { 280162306a36Sopenharmony_ci ni_pi->cac_enabled = true; 280262306a36Sopenharmony_ci } 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_ci if (si_pi->enable_dte) { 280562306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableDTE); 280662306a36Sopenharmony_ci if (smc_result != PPSMC_Result_OK) 280762306a36Sopenharmony_ci ret = -EINVAL; 280862306a36Sopenharmony_ci } 280962306a36Sopenharmony_ci } 281062306a36Sopenharmony_ci } else if (ni_pi->cac_enabled) { 281162306a36Sopenharmony_ci if (si_pi->enable_dte) 281262306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_MSG_DisableDTE); 281362306a36Sopenharmony_ci 281462306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_MSG_DisableCac); 281562306a36Sopenharmony_ci 281662306a36Sopenharmony_ci ni_pi->cac_enabled = false; 281762306a36Sopenharmony_ci 281862306a36Sopenharmony_ci if (ni_pi->support_cac_long_term_average) 281962306a36Sopenharmony_ci smc_result = si_send_msg_to_smc(rdev, PPSMC_CACLongTermAvgDisable); 282062306a36Sopenharmony_ci } 282162306a36Sopenharmony_ci } 282262306a36Sopenharmony_ci return ret; 282362306a36Sopenharmony_ci} 282462306a36Sopenharmony_ci 282562306a36Sopenharmony_cistatic int si_init_smc_spll_table(struct radeon_device *rdev) 282662306a36Sopenharmony_ci{ 282762306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 282862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 282962306a36Sopenharmony_ci SMC_SISLANDS_SPLL_DIV_TABLE *spll_table; 283062306a36Sopenharmony_ci SISLANDS_SMC_SCLK_VALUE sclk_params; 283162306a36Sopenharmony_ci u32 fb_div, p_div; 283262306a36Sopenharmony_ci u32 clk_s, clk_v; 283362306a36Sopenharmony_ci u32 sclk = 0; 283462306a36Sopenharmony_ci int ret = 0; 283562306a36Sopenharmony_ci u32 tmp; 283662306a36Sopenharmony_ci int i; 283762306a36Sopenharmony_ci 283862306a36Sopenharmony_ci if (si_pi->spll_table_start == 0) 283962306a36Sopenharmony_ci return -EINVAL; 284062306a36Sopenharmony_ci 284162306a36Sopenharmony_ci spll_table = kzalloc(sizeof(SMC_SISLANDS_SPLL_DIV_TABLE), GFP_KERNEL); 284262306a36Sopenharmony_ci if (spll_table == NULL) 284362306a36Sopenharmony_ci return -ENOMEM; 284462306a36Sopenharmony_ci 284562306a36Sopenharmony_ci for (i = 0; i < 256; i++) { 284662306a36Sopenharmony_ci ret = si_calculate_sclk_params(rdev, sclk, &sclk_params); 284762306a36Sopenharmony_ci if (ret) 284862306a36Sopenharmony_ci break; 284962306a36Sopenharmony_ci 285062306a36Sopenharmony_ci p_div = (sclk_params.vCG_SPLL_FUNC_CNTL & SPLL_PDIV_A_MASK) >> SPLL_PDIV_A_SHIFT; 285162306a36Sopenharmony_ci fb_div = (sclk_params.vCG_SPLL_FUNC_CNTL_3 & SPLL_FB_DIV_MASK) >> SPLL_FB_DIV_SHIFT; 285262306a36Sopenharmony_ci clk_s = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM & CLK_S_MASK) >> CLK_S_SHIFT; 285362306a36Sopenharmony_ci clk_v = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM_2 & CLK_V_MASK) >> CLK_V_SHIFT; 285462306a36Sopenharmony_ci 285562306a36Sopenharmony_ci fb_div &= ~0x00001FFF; 285662306a36Sopenharmony_ci fb_div >>= 1; 285762306a36Sopenharmony_ci clk_v >>= 6; 285862306a36Sopenharmony_ci 285962306a36Sopenharmony_ci if (p_div & ~(SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT)) 286062306a36Sopenharmony_ci ret = -EINVAL; 286162306a36Sopenharmony_ci if (fb_div & ~(SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT)) 286262306a36Sopenharmony_ci ret = -EINVAL; 286362306a36Sopenharmony_ci if (clk_s & ~(SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT)) 286462306a36Sopenharmony_ci ret = -EINVAL; 286562306a36Sopenharmony_ci if (clk_v & ~(SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT)) 286662306a36Sopenharmony_ci ret = -EINVAL; 286762306a36Sopenharmony_ci 286862306a36Sopenharmony_ci if (ret) 286962306a36Sopenharmony_ci break; 287062306a36Sopenharmony_ci 287162306a36Sopenharmony_ci tmp = ((fb_div << SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK) | 287262306a36Sopenharmony_ci ((p_div << SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK); 287362306a36Sopenharmony_ci spll_table->freq[i] = cpu_to_be32(tmp); 287462306a36Sopenharmony_ci 287562306a36Sopenharmony_ci tmp = ((clk_v << SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK) | 287662306a36Sopenharmony_ci ((clk_s << SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK); 287762306a36Sopenharmony_ci spll_table->ss[i] = cpu_to_be32(tmp); 287862306a36Sopenharmony_ci 287962306a36Sopenharmony_ci sclk += 512; 288062306a36Sopenharmony_ci } 288162306a36Sopenharmony_ci 288262306a36Sopenharmony_ci 288362306a36Sopenharmony_ci if (!ret) 288462306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, si_pi->spll_table_start, 288562306a36Sopenharmony_ci (u8 *)spll_table, sizeof(SMC_SISLANDS_SPLL_DIV_TABLE), 288662306a36Sopenharmony_ci si_pi->sram_end); 288762306a36Sopenharmony_ci 288862306a36Sopenharmony_ci if (ret) 288962306a36Sopenharmony_ci ni_pi->enable_power_containment = false; 289062306a36Sopenharmony_ci 289162306a36Sopenharmony_ci kfree(spll_table); 289262306a36Sopenharmony_ci 289362306a36Sopenharmony_ci return ret; 289462306a36Sopenharmony_ci} 289562306a36Sopenharmony_ci 289662306a36Sopenharmony_cistatic u16 si_get_lower_of_leakage_and_vce_voltage(struct radeon_device *rdev, 289762306a36Sopenharmony_ci u16 vce_voltage) 289862306a36Sopenharmony_ci{ 289962306a36Sopenharmony_ci u16 highest_leakage = 0; 290062306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 290162306a36Sopenharmony_ci int i; 290262306a36Sopenharmony_ci 290362306a36Sopenharmony_ci for (i = 0; i < si_pi->leakage_voltage.count; i++){ 290462306a36Sopenharmony_ci if (highest_leakage < si_pi->leakage_voltage.entries[i].voltage) 290562306a36Sopenharmony_ci highest_leakage = si_pi->leakage_voltage.entries[i].voltage; 290662306a36Sopenharmony_ci } 290762306a36Sopenharmony_ci 290862306a36Sopenharmony_ci if (si_pi->leakage_voltage.count && (highest_leakage < vce_voltage)) 290962306a36Sopenharmony_ci return highest_leakage; 291062306a36Sopenharmony_ci 291162306a36Sopenharmony_ci return vce_voltage; 291262306a36Sopenharmony_ci} 291362306a36Sopenharmony_ci 291462306a36Sopenharmony_cistatic int si_get_vce_clock_voltage(struct radeon_device *rdev, 291562306a36Sopenharmony_ci u32 evclk, u32 ecclk, u16 *voltage) 291662306a36Sopenharmony_ci{ 291762306a36Sopenharmony_ci u32 i; 291862306a36Sopenharmony_ci int ret = -EINVAL; 291962306a36Sopenharmony_ci struct radeon_vce_clock_voltage_dependency_table *table = 292062306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table; 292162306a36Sopenharmony_ci 292262306a36Sopenharmony_ci if (((evclk == 0) && (ecclk == 0)) || 292362306a36Sopenharmony_ci (table && (table->count == 0))) { 292462306a36Sopenharmony_ci *voltage = 0; 292562306a36Sopenharmony_ci return 0; 292662306a36Sopenharmony_ci } 292762306a36Sopenharmony_ci 292862306a36Sopenharmony_ci for (i = 0; i < table->count; i++) { 292962306a36Sopenharmony_ci if ((evclk <= table->entries[i].evclk) && 293062306a36Sopenharmony_ci (ecclk <= table->entries[i].ecclk)) { 293162306a36Sopenharmony_ci *voltage = table->entries[i].v; 293262306a36Sopenharmony_ci ret = 0; 293362306a36Sopenharmony_ci break; 293462306a36Sopenharmony_ci } 293562306a36Sopenharmony_ci } 293662306a36Sopenharmony_ci 293762306a36Sopenharmony_ci /* if no match return the highest voltage */ 293862306a36Sopenharmony_ci if (ret) 293962306a36Sopenharmony_ci *voltage = table->entries[table->count - 1].v; 294062306a36Sopenharmony_ci 294162306a36Sopenharmony_ci *voltage = si_get_lower_of_leakage_and_vce_voltage(rdev, *voltage); 294262306a36Sopenharmony_ci 294362306a36Sopenharmony_ci return ret; 294462306a36Sopenharmony_ci} 294562306a36Sopenharmony_ci 294662306a36Sopenharmony_cistatic void si_apply_state_adjust_rules(struct radeon_device *rdev, 294762306a36Sopenharmony_ci struct radeon_ps *rps) 294862306a36Sopenharmony_ci{ 294962306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 295062306a36Sopenharmony_ci struct radeon_clock_and_voltage_limits *max_limits; 295162306a36Sopenharmony_ci bool disable_mclk_switching = false; 295262306a36Sopenharmony_ci bool disable_sclk_switching = false; 295362306a36Sopenharmony_ci u32 mclk, sclk; 295462306a36Sopenharmony_ci u16 vddc, vddci, min_vce_voltage = 0; 295562306a36Sopenharmony_ci u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; 295662306a36Sopenharmony_ci u32 max_sclk = 0, max_mclk = 0; 295762306a36Sopenharmony_ci int i; 295862306a36Sopenharmony_ci 295962306a36Sopenharmony_ci if (rdev->family == CHIP_HAINAN) { 296062306a36Sopenharmony_ci if ((rdev->pdev->revision == 0x81) || 296162306a36Sopenharmony_ci (rdev->pdev->revision == 0xC3) || 296262306a36Sopenharmony_ci (rdev->pdev->device == 0x6664) || 296362306a36Sopenharmony_ci (rdev->pdev->device == 0x6665) || 296462306a36Sopenharmony_ci (rdev->pdev->device == 0x6667)) { 296562306a36Sopenharmony_ci max_sclk = 75000; 296662306a36Sopenharmony_ci } 296762306a36Sopenharmony_ci if ((rdev->pdev->revision == 0xC3) || 296862306a36Sopenharmony_ci (rdev->pdev->device == 0x6665)) { 296962306a36Sopenharmony_ci max_sclk = 60000; 297062306a36Sopenharmony_ci max_mclk = 80000; 297162306a36Sopenharmony_ci } 297262306a36Sopenharmony_ci } else if (rdev->family == CHIP_OLAND) { 297362306a36Sopenharmony_ci if ((rdev->pdev->revision == 0xC7) || 297462306a36Sopenharmony_ci (rdev->pdev->revision == 0x80) || 297562306a36Sopenharmony_ci (rdev->pdev->revision == 0x81) || 297662306a36Sopenharmony_ci (rdev->pdev->revision == 0x83) || 297762306a36Sopenharmony_ci (rdev->pdev->revision == 0x87) || 297862306a36Sopenharmony_ci (rdev->pdev->device == 0x6604) || 297962306a36Sopenharmony_ci (rdev->pdev->device == 0x6605)) { 298062306a36Sopenharmony_ci max_sclk = 75000; 298162306a36Sopenharmony_ci } 298262306a36Sopenharmony_ci 298362306a36Sopenharmony_ci if (rdev->pm.dpm.high_pixelclock_count > 1) 298462306a36Sopenharmony_ci disable_sclk_switching = true; 298562306a36Sopenharmony_ci } 298662306a36Sopenharmony_ci 298762306a36Sopenharmony_ci if (rps->vce_active) { 298862306a36Sopenharmony_ci rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk; 298962306a36Sopenharmony_ci rps->ecclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].ecclk; 299062306a36Sopenharmony_ci si_get_vce_clock_voltage(rdev, rps->evclk, rps->ecclk, 299162306a36Sopenharmony_ci &min_vce_voltage); 299262306a36Sopenharmony_ci } else { 299362306a36Sopenharmony_ci rps->evclk = 0; 299462306a36Sopenharmony_ci rps->ecclk = 0; 299562306a36Sopenharmony_ci } 299662306a36Sopenharmony_ci 299762306a36Sopenharmony_ci if ((rdev->pm.dpm.new_active_crtc_count > 1) || 299862306a36Sopenharmony_ci ni_dpm_vblank_too_short(rdev)) 299962306a36Sopenharmony_ci disable_mclk_switching = true; 300062306a36Sopenharmony_ci 300162306a36Sopenharmony_ci if (rps->vclk || rps->dclk) { 300262306a36Sopenharmony_ci disable_mclk_switching = true; 300362306a36Sopenharmony_ci disable_sclk_switching = true; 300462306a36Sopenharmony_ci } 300562306a36Sopenharmony_ci 300662306a36Sopenharmony_ci if (rdev->pm.dpm.ac_power) 300762306a36Sopenharmony_ci max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; 300862306a36Sopenharmony_ci else 300962306a36Sopenharmony_ci max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc; 301062306a36Sopenharmony_ci 301162306a36Sopenharmony_ci for (i = ps->performance_level_count - 2; i >= 0; i--) { 301262306a36Sopenharmony_ci if (ps->performance_levels[i].vddc > ps->performance_levels[i+1].vddc) 301362306a36Sopenharmony_ci ps->performance_levels[i].vddc = ps->performance_levels[i+1].vddc; 301462306a36Sopenharmony_ci } 301562306a36Sopenharmony_ci if (rdev->pm.dpm.ac_power == false) { 301662306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 301762306a36Sopenharmony_ci if (ps->performance_levels[i].mclk > max_limits->mclk) 301862306a36Sopenharmony_ci ps->performance_levels[i].mclk = max_limits->mclk; 301962306a36Sopenharmony_ci if (ps->performance_levels[i].sclk > max_limits->sclk) 302062306a36Sopenharmony_ci ps->performance_levels[i].sclk = max_limits->sclk; 302162306a36Sopenharmony_ci if (ps->performance_levels[i].vddc > max_limits->vddc) 302262306a36Sopenharmony_ci ps->performance_levels[i].vddc = max_limits->vddc; 302362306a36Sopenharmony_ci if (ps->performance_levels[i].vddci > max_limits->vddci) 302462306a36Sopenharmony_ci ps->performance_levels[i].vddci = max_limits->vddci; 302562306a36Sopenharmony_ci } 302662306a36Sopenharmony_ci } 302762306a36Sopenharmony_ci 302862306a36Sopenharmony_ci /* limit clocks to max supported clocks based on voltage dependency tables */ 302962306a36Sopenharmony_ci btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 303062306a36Sopenharmony_ci &max_sclk_vddc); 303162306a36Sopenharmony_ci btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 303262306a36Sopenharmony_ci &max_mclk_vddci); 303362306a36Sopenharmony_ci btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 303462306a36Sopenharmony_ci &max_mclk_vddc); 303562306a36Sopenharmony_ci 303662306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 303762306a36Sopenharmony_ci if (max_sclk_vddc) { 303862306a36Sopenharmony_ci if (ps->performance_levels[i].sclk > max_sclk_vddc) 303962306a36Sopenharmony_ci ps->performance_levels[i].sclk = max_sclk_vddc; 304062306a36Sopenharmony_ci } 304162306a36Sopenharmony_ci if (max_mclk_vddci) { 304262306a36Sopenharmony_ci if (ps->performance_levels[i].mclk > max_mclk_vddci) 304362306a36Sopenharmony_ci ps->performance_levels[i].mclk = max_mclk_vddci; 304462306a36Sopenharmony_ci } 304562306a36Sopenharmony_ci if (max_mclk_vddc) { 304662306a36Sopenharmony_ci if (ps->performance_levels[i].mclk > max_mclk_vddc) 304762306a36Sopenharmony_ci ps->performance_levels[i].mclk = max_mclk_vddc; 304862306a36Sopenharmony_ci } 304962306a36Sopenharmony_ci if (max_mclk) { 305062306a36Sopenharmony_ci if (ps->performance_levels[i].mclk > max_mclk) 305162306a36Sopenharmony_ci ps->performance_levels[i].mclk = max_mclk; 305262306a36Sopenharmony_ci } 305362306a36Sopenharmony_ci if (max_sclk) { 305462306a36Sopenharmony_ci if (ps->performance_levels[i].sclk > max_sclk) 305562306a36Sopenharmony_ci ps->performance_levels[i].sclk = max_sclk; 305662306a36Sopenharmony_ci } 305762306a36Sopenharmony_ci } 305862306a36Sopenharmony_ci 305962306a36Sopenharmony_ci /* XXX validate the min clocks required for display */ 306062306a36Sopenharmony_ci 306162306a36Sopenharmony_ci if (disable_mclk_switching) { 306262306a36Sopenharmony_ci mclk = ps->performance_levels[ps->performance_level_count - 1].mclk; 306362306a36Sopenharmony_ci vddci = ps->performance_levels[ps->performance_level_count - 1].vddci; 306462306a36Sopenharmony_ci } else { 306562306a36Sopenharmony_ci mclk = ps->performance_levels[0].mclk; 306662306a36Sopenharmony_ci vddci = ps->performance_levels[0].vddci; 306762306a36Sopenharmony_ci } 306862306a36Sopenharmony_ci 306962306a36Sopenharmony_ci if (disable_sclk_switching) { 307062306a36Sopenharmony_ci sclk = ps->performance_levels[ps->performance_level_count - 1].sclk; 307162306a36Sopenharmony_ci vddc = ps->performance_levels[ps->performance_level_count - 1].vddc; 307262306a36Sopenharmony_ci } else { 307362306a36Sopenharmony_ci sclk = ps->performance_levels[0].sclk; 307462306a36Sopenharmony_ci vddc = ps->performance_levels[0].vddc; 307562306a36Sopenharmony_ci } 307662306a36Sopenharmony_ci 307762306a36Sopenharmony_ci if (rps->vce_active) { 307862306a36Sopenharmony_ci if (sclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk) 307962306a36Sopenharmony_ci sclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].sclk; 308062306a36Sopenharmony_ci if (mclk < rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk) 308162306a36Sopenharmony_ci mclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].mclk; 308262306a36Sopenharmony_ci } 308362306a36Sopenharmony_ci 308462306a36Sopenharmony_ci /* adjusted low state */ 308562306a36Sopenharmony_ci ps->performance_levels[0].sclk = sclk; 308662306a36Sopenharmony_ci ps->performance_levels[0].mclk = mclk; 308762306a36Sopenharmony_ci ps->performance_levels[0].vddc = vddc; 308862306a36Sopenharmony_ci ps->performance_levels[0].vddci = vddci; 308962306a36Sopenharmony_ci 309062306a36Sopenharmony_ci if (disable_sclk_switching) { 309162306a36Sopenharmony_ci sclk = ps->performance_levels[0].sclk; 309262306a36Sopenharmony_ci for (i = 1; i < ps->performance_level_count; i++) { 309362306a36Sopenharmony_ci if (sclk < ps->performance_levels[i].sclk) 309462306a36Sopenharmony_ci sclk = ps->performance_levels[i].sclk; 309562306a36Sopenharmony_ci } 309662306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 309762306a36Sopenharmony_ci ps->performance_levels[i].sclk = sclk; 309862306a36Sopenharmony_ci ps->performance_levels[i].vddc = vddc; 309962306a36Sopenharmony_ci } 310062306a36Sopenharmony_ci } else { 310162306a36Sopenharmony_ci for (i = 1; i < ps->performance_level_count; i++) { 310262306a36Sopenharmony_ci if (ps->performance_levels[i].sclk < ps->performance_levels[i - 1].sclk) 310362306a36Sopenharmony_ci ps->performance_levels[i].sclk = ps->performance_levels[i - 1].sclk; 310462306a36Sopenharmony_ci if (ps->performance_levels[i].vddc < ps->performance_levels[i - 1].vddc) 310562306a36Sopenharmony_ci ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc; 310662306a36Sopenharmony_ci } 310762306a36Sopenharmony_ci } 310862306a36Sopenharmony_ci 310962306a36Sopenharmony_ci if (disable_mclk_switching) { 311062306a36Sopenharmony_ci mclk = ps->performance_levels[0].mclk; 311162306a36Sopenharmony_ci for (i = 1; i < ps->performance_level_count; i++) { 311262306a36Sopenharmony_ci if (mclk < ps->performance_levels[i].mclk) 311362306a36Sopenharmony_ci mclk = ps->performance_levels[i].mclk; 311462306a36Sopenharmony_ci } 311562306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 311662306a36Sopenharmony_ci ps->performance_levels[i].mclk = mclk; 311762306a36Sopenharmony_ci ps->performance_levels[i].vddci = vddci; 311862306a36Sopenharmony_ci } 311962306a36Sopenharmony_ci } else { 312062306a36Sopenharmony_ci for (i = 1; i < ps->performance_level_count; i++) { 312162306a36Sopenharmony_ci if (ps->performance_levels[i].mclk < ps->performance_levels[i - 1].mclk) 312262306a36Sopenharmony_ci ps->performance_levels[i].mclk = ps->performance_levels[i - 1].mclk; 312362306a36Sopenharmony_ci if (ps->performance_levels[i].vddci < ps->performance_levels[i - 1].vddci) 312462306a36Sopenharmony_ci ps->performance_levels[i].vddci = ps->performance_levels[i - 1].vddci; 312562306a36Sopenharmony_ci } 312662306a36Sopenharmony_ci } 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) 312962306a36Sopenharmony_ci btc_adjust_clock_combinations(rdev, max_limits, 313062306a36Sopenharmony_ci &ps->performance_levels[i]); 313162306a36Sopenharmony_ci 313262306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 313362306a36Sopenharmony_ci if (ps->performance_levels[i].vddc < min_vce_voltage) 313462306a36Sopenharmony_ci ps->performance_levels[i].vddc = min_vce_voltage; 313562306a36Sopenharmony_ci btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, 313662306a36Sopenharmony_ci ps->performance_levels[i].sclk, 313762306a36Sopenharmony_ci max_limits->vddc, &ps->performance_levels[i].vddc); 313862306a36Sopenharmony_ci btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 313962306a36Sopenharmony_ci ps->performance_levels[i].mclk, 314062306a36Sopenharmony_ci max_limits->vddci, &ps->performance_levels[i].vddci); 314162306a36Sopenharmony_ci btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 314262306a36Sopenharmony_ci ps->performance_levels[i].mclk, 314362306a36Sopenharmony_ci max_limits->vddc, &ps->performance_levels[i].vddc); 314462306a36Sopenharmony_ci btc_apply_voltage_dependency_rules(&rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk, 314562306a36Sopenharmony_ci rdev->clock.current_dispclk, 314662306a36Sopenharmony_ci max_limits->vddc, &ps->performance_levels[i].vddc); 314762306a36Sopenharmony_ci } 314862306a36Sopenharmony_ci 314962306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 315062306a36Sopenharmony_ci btc_apply_voltage_delta_rules(rdev, 315162306a36Sopenharmony_ci max_limits->vddc, max_limits->vddci, 315262306a36Sopenharmony_ci &ps->performance_levels[i].vddc, 315362306a36Sopenharmony_ci &ps->performance_levels[i].vddci); 315462306a36Sopenharmony_ci } 315562306a36Sopenharmony_ci 315662306a36Sopenharmony_ci ps->dc_compatible = true; 315762306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count; i++) { 315862306a36Sopenharmony_ci if (ps->performance_levels[i].vddc > rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc) 315962306a36Sopenharmony_ci ps->dc_compatible = false; 316062306a36Sopenharmony_ci } 316162306a36Sopenharmony_ci} 316262306a36Sopenharmony_ci 316362306a36Sopenharmony_ci#if 0 316462306a36Sopenharmony_cistatic int si_read_smc_soft_register(struct radeon_device *rdev, 316562306a36Sopenharmony_ci u16 reg_offset, u32 *value) 316662306a36Sopenharmony_ci{ 316762306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 316862306a36Sopenharmony_ci 316962306a36Sopenharmony_ci return si_read_smc_sram_dword(rdev, 317062306a36Sopenharmony_ci si_pi->soft_regs_start + reg_offset, value, 317162306a36Sopenharmony_ci si_pi->sram_end); 317262306a36Sopenharmony_ci} 317362306a36Sopenharmony_ci#endif 317462306a36Sopenharmony_ci 317562306a36Sopenharmony_cistatic int si_write_smc_soft_register(struct radeon_device *rdev, 317662306a36Sopenharmony_ci u16 reg_offset, u32 value) 317762306a36Sopenharmony_ci{ 317862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 317962306a36Sopenharmony_ci 318062306a36Sopenharmony_ci return si_write_smc_sram_dword(rdev, 318162306a36Sopenharmony_ci si_pi->soft_regs_start + reg_offset, 318262306a36Sopenharmony_ci value, si_pi->sram_end); 318362306a36Sopenharmony_ci} 318462306a36Sopenharmony_ci 318562306a36Sopenharmony_cistatic bool si_is_special_1gb_platform(struct radeon_device *rdev) 318662306a36Sopenharmony_ci{ 318762306a36Sopenharmony_ci bool ret = false; 318862306a36Sopenharmony_ci u32 tmp, width, row, column, bank, density; 318962306a36Sopenharmony_ci bool is_memory_gddr5, is_special; 319062306a36Sopenharmony_ci 319162306a36Sopenharmony_ci tmp = RREG32(MC_SEQ_MISC0); 319262306a36Sopenharmony_ci is_memory_gddr5 = (MC_SEQ_MISC0_GDDR5_VALUE == ((tmp & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT)); 319362306a36Sopenharmony_ci is_special = (MC_SEQ_MISC0_REV_ID_VALUE == ((tmp & MC_SEQ_MISC0_REV_ID_MASK) >> MC_SEQ_MISC0_REV_ID_SHIFT)) 319462306a36Sopenharmony_ci & (MC_SEQ_MISC0_VEN_ID_VALUE == ((tmp & MC_SEQ_MISC0_VEN_ID_MASK) >> MC_SEQ_MISC0_VEN_ID_SHIFT)); 319562306a36Sopenharmony_ci 319662306a36Sopenharmony_ci WREG32(MC_SEQ_IO_DEBUG_INDEX, 0xb); 319762306a36Sopenharmony_ci width = ((RREG32(MC_SEQ_IO_DEBUG_DATA) >> 1) & 1) ? 16 : 32; 319862306a36Sopenharmony_ci 319962306a36Sopenharmony_ci tmp = RREG32(MC_ARB_RAMCFG); 320062306a36Sopenharmony_ci row = ((tmp & NOOFROWS_MASK) >> NOOFROWS_SHIFT) + 10; 320162306a36Sopenharmony_ci column = ((tmp & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT) + 8; 320262306a36Sopenharmony_ci bank = ((tmp & NOOFBANK_MASK) >> NOOFBANK_SHIFT) + 2; 320362306a36Sopenharmony_ci 320462306a36Sopenharmony_ci density = (1 << (row + column - 20 + bank)) * width; 320562306a36Sopenharmony_ci 320662306a36Sopenharmony_ci if ((rdev->pdev->device == 0x6819) && 320762306a36Sopenharmony_ci is_memory_gddr5 && is_special && (density == 0x400)) 320862306a36Sopenharmony_ci ret = true; 320962306a36Sopenharmony_ci 321062306a36Sopenharmony_ci return ret; 321162306a36Sopenharmony_ci} 321262306a36Sopenharmony_ci 321362306a36Sopenharmony_cistatic void si_get_leakage_vddc(struct radeon_device *rdev) 321462306a36Sopenharmony_ci{ 321562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 321662306a36Sopenharmony_ci u16 vddc, count = 0; 321762306a36Sopenharmony_ci int i, ret; 321862306a36Sopenharmony_ci 321962306a36Sopenharmony_ci for (i = 0; i < SISLANDS_MAX_LEAKAGE_COUNT; i++) { 322062306a36Sopenharmony_ci ret = radeon_atom_get_leakage_vddc_based_on_leakage_idx(rdev, &vddc, SISLANDS_LEAKAGE_INDEX0 + i); 322162306a36Sopenharmony_ci 322262306a36Sopenharmony_ci if (!ret && (vddc > 0) && (vddc != (SISLANDS_LEAKAGE_INDEX0 + i))) { 322362306a36Sopenharmony_ci si_pi->leakage_voltage.entries[count].voltage = vddc; 322462306a36Sopenharmony_ci si_pi->leakage_voltage.entries[count].leakage_index = 322562306a36Sopenharmony_ci SISLANDS_LEAKAGE_INDEX0 + i; 322662306a36Sopenharmony_ci count++; 322762306a36Sopenharmony_ci } 322862306a36Sopenharmony_ci } 322962306a36Sopenharmony_ci si_pi->leakage_voltage.count = count; 323062306a36Sopenharmony_ci} 323162306a36Sopenharmony_ci 323262306a36Sopenharmony_cistatic int si_get_leakage_voltage_from_leakage_index(struct radeon_device *rdev, 323362306a36Sopenharmony_ci u32 index, u16 *leakage_voltage) 323462306a36Sopenharmony_ci{ 323562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 323662306a36Sopenharmony_ci int i; 323762306a36Sopenharmony_ci 323862306a36Sopenharmony_ci if (leakage_voltage == NULL) 323962306a36Sopenharmony_ci return -EINVAL; 324062306a36Sopenharmony_ci 324162306a36Sopenharmony_ci if ((index & 0xff00) != 0xff00) 324262306a36Sopenharmony_ci return -EINVAL; 324362306a36Sopenharmony_ci 324462306a36Sopenharmony_ci if ((index & 0xff) > SISLANDS_MAX_LEAKAGE_COUNT + 1) 324562306a36Sopenharmony_ci return -EINVAL; 324662306a36Sopenharmony_ci 324762306a36Sopenharmony_ci if (index < SISLANDS_LEAKAGE_INDEX0) 324862306a36Sopenharmony_ci return -EINVAL; 324962306a36Sopenharmony_ci 325062306a36Sopenharmony_ci for (i = 0; i < si_pi->leakage_voltage.count; i++) { 325162306a36Sopenharmony_ci if (si_pi->leakage_voltage.entries[i].leakage_index == index) { 325262306a36Sopenharmony_ci *leakage_voltage = si_pi->leakage_voltage.entries[i].voltage; 325362306a36Sopenharmony_ci return 0; 325462306a36Sopenharmony_ci } 325562306a36Sopenharmony_ci } 325662306a36Sopenharmony_ci return -EAGAIN; 325762306a36Sopenharmony_ci} 325862306a36Sopenharmony_ci 325962306a36Sopenharmony_cistatic void si_set_dpm_event_sources(struct radeon_device *rdev, u32 sources) 326062306a36Sopenharmony_ci{ 326162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 326262306a36Sopenharmony_ci bool want_thermal_protection; 326362306a36Sopenharmony_ci enum radeon_dpm_event_src dpm_event_src; 326462306a36Sopenharmony_ci 326562306a36Sopenharmony_ci switch (sources) { 326662306a36Sopenharmony_ci case 0: 326762306a36Sopenharmony_ci default: 326862306a36Sopenharmony_ci want_thermal_protection = false; 326962306a36Sopenharmony_ci break; 327062306a36Sopenharmony_ci case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL): 327162306a36Sopenharmony_ci want_thermal_protection = true; 327262306a36Sopenharmony_ci dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL; 327362306a36Sopenharmony_ci break; 327462306a36Sopenharmony_ci case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL): 327562306a36Sopenharmony_ci want_thermal_protection = true; 327662306a36Sopenharmony_ci dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL; 327762306a36Sopenharmony_ci break; 327862306a36Sopenharmony_ci case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) | 327962306a36Sopenharmony_ci (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)): 328062306a36Sopenharmony_ci want_thermal_protection = true; 328162306a36Sopenharmony_ci dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL; 328262306a36Sopenharmony_ci break; 328362306a36Sopenharmony_ci } 328462306a36Sopenharmony_ci 328562306a36Sopenharmony_ci if (want_thermal_protection) { 328662306a36Sopenharmony_ci WREG32_P(CG_THERMAL_CTRL, DPM_EVENT_SRC(dpm_event_src), ~DPM_EVENT_SRC_MASK); 328762306a36Sopenharmony_ci if (pi->thermal_protection) 328862306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, 0, ~THERMAL_PROTECTION_DIS); 328962306a36Sopenharmony_ci } else { 329062306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, THERMAL_PROTECTION_DIS, ~THERMAL_PROTECTION_DIS); 329162306a36Sopenharmony_ci } 329262306a36Sopenharmony_ci} 329362306a36Sopenharmony_ci 329462306a36Sopenharmony_cistatic void si_enable_auto_throttle_source(struct radeon_device *rdev, 329562306a36Sopenharmony_ci enum radeon_dpm_auto_throttle_src source, 329662306a36Sopenharmony_ci bool enable) 329762306a36Sopenharmony_ci{ 329862306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 329962306a36Sopenharmony_ci 330062306a36Sopenharmony_ci if (enable) { 330162306a36Sopenharmony_ci if (!(pi->active_auto_throttle_sources & (1 << source))) { 330262306a36Sopenharmony_ci pi->active_auto_throttle_sources |= 1 << source; 330362306a36Sopenharmony_ci si_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources); 330462306a36Sopenharmony_ci } 330562306a36Sopenharmony_ci } else { 330662306a36Sopenharmony_ci if (pi->active_auto_throttle_sources & (1 << source)) { 330762306a36Sopenharmony_ci pi->active_auto_throttle_sources &= ~(1 << source); 330862306a36Sopenharmony_ci si_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources); 330962306a36Sopenharmony_ci } 331062306a36Sopenharmony_ci } 331162306a36Sopenharmony_ci} 331262306a36Sopenharmony_ci 331362306a36Sopenharmony_cistatic void si_start_dpm(struct radeon_device *rdev) 331462306a36Sopenharmony_ci{ 331562306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, GLOBAL_PWRMGT_EN, ~GLOBAL_PWRMGT_EN); 331662306a36Sopenharmony_ci} 331762306a36Sopenharmony_ci 331862306a36Sopenharmony_cistatic void si_stop_dpm(struct radeon_device *rdev) 331962306a36Sopenharmony_ci{ 332062306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, 0, ~GLOBAL_PWRMGT_EN); 332162306a36Sopenharmony_ci} 332262306a36Sopenharmony_ci 332362306a36Sopenharmony_cistatic void si_enable_sclk_control(struct radeon_device *rdev, bool enable) 332462306a36Sopenharmony_ci{ 332562306a36Sopenharmony_ci if (enable) 332662306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, 0, ~SCLK_PWRMGT_OFF); 332762306a36Sopenharmony_ci else 332862306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, SCLK_PWRMGT_OFF, ~SCLK_PWRMGT_OFF); 332962306a36Sopenharmony_ci 333062306a36Sopenharmony_ci} 333162306a36Sopenharmony_ci 333262306a36Sopenharmony_ci#if 0 333362306a36Sopenharmony_cistatic int si_notify_hardware_of_thermal_state(struct radeon_device *rdev, 333462306a36Sopenharmony_ci u32 thermal_level) 333562306a36Sopenharmony_ci{ 333662306a36Sopenharmony_ci PPSMC_Result ret; 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_ci if (thermal_level == 0) { 333962306a36Sopenharmony_ci ret = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 334062306a36Sopenharmony_ci if (ret == PPSMC_Result_OK) 334162306a36Sopenharmony_ci return 0; 334262306a36Sopenharmony_ci else 334362306a36Sopenharmony_ci return -EINVAL; 334462306a36Sopenharmony_ci } 334562306a36Sopenharmony_ci return 0; 334662306a36Sopenharmony_ci} 334762306a36Sopenharmony_ci 334862306a36Sopenharmony_cistatic void si_notify_hardware_vpu_recovery_event(struct radeon_device *rdev) 334962306a36Sopenharmony_ci{ 335062306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen, true); 335162306a36Sopenharmony_ci} 335262306a36Sopenharmony_ci#endif 335362306a36Sopenharmony_ci 335462306a36Sopenharmony_ci#if 0 335562306a36Sopenharmony_cistatic int si_notify_hw_of_powersource(struct radeon_device *rdev, bool ac_power) 335662306a36Sopenharmony_ci{ 335762306a36Sopenharmony_ci if (ac_power) 335862306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_RunningOnAC) == PPSMC_Result_OK) ? 335962306a36Sopenharmony_ci 0 : -EINVAL; 336062306a36Sopenharmony_ci 336162306a36Sopenharmony_ci return 0; 336262306a36Sopenharmony_ci} 336362306a36Sopenharmony_ci#endif 336462306a36Sopenharmony_ci 336562306a36Sopenharmony_cistatic PPSMC_Result si_send_msg_to_smc_with_parameter(struct radeon_device *rdev, 336662306a36Sopenharmony_ci PPSMC_Msg msg, u32 parameter) 336762306a36Sopenharmony_ci{ 336862306a36Sopenharmony_ci WREG32(SMC_SCRATCH0, parameter); 336962306a36Sopenharmony_ci return si_send_msg_to_smc(rdev, msg); 337062306a36Sopenharmony_ci} 337162306a36Sopenharmony_ci 337262306a36Sopenharmony_cistatic int si_restrict_performance_levels_before_switch(struct radeon_device *rdev) 337362306a36Sopenharmony_ci{ 337462306a36Sopenharmony_ci if (si_send_msg_to_smc(rdev, PPSMC_MSG_NoForcedLevel) != PPSMC_Result_OK) 337562306a36Sopenharmony_ci return -EINVAL; 337662306a36Sopenharmony_ci 337762306a36Sopenharmony_ci return (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) == PPSMC_Result_OK) ? 337862306a36Sopenharmony_ci 0 : -EINVAL; 337962306a36Sopenharmony_ci} 338062306a36Sopenharmony_ci 338162306a36Sopenharmony_ciint si_dpm_force_performance_level(struct radeon_device *rdev, 338262306a36Sopenharmony_ci enum radeon_dpm_forced_level level) 338362306a36Sopenharmony_ci{ 338462306a36Sopenharmony_ci struct radeon_ps *rps = rdev->pm.dpm.current_ps; 338562306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 338662306a36Sopenharmony_ci u32 levels = ps->performance_level_count; 338762306a36Sopenharmony_ci 338862306a36Sopenharmony_ci if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { 338962306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) 339062306a36Sopenharmony_ci return -EINVAL; 339162306a36Sopenharmony_ci 339262306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK) 339362306a36Sopenharmony_ci return -EINVAL; 339462306a36Sopenharmony_ci } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) { 339562306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 339662306a36Sopenharmony_ci return -EINVAL; 339762306a36Sopenharmony_ci 339862306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK) 339962306a36Sopenharmony_ci return -EINVAL; 340062306a36Sopenharmony_ci } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { 340162306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 340262306a36Sopenharmony_ci return -EINVAL; 340362306a36Sopenharmony_ci 340462306a36Sopenharmony_ci if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK) 340562306a36Sopenharmony_ci return -EINVAL; 340662306a36Sopenharmony_ci } 340762306a36Sopenharmony_ci 340862306a36Sopenharmony_ci rdev->pm.dpm.forced_level = level; 340962306a36Sopenharmony_ci 341062306a36Sopenharmony_ci return 0; 341162306a36Sopenharmony_ci} 341262306a36Sopenharmony_ci 341362306a36Sopenharmony_ci#if 0 341462306a36Sopenharmony_cistatic int si_set_boot_state(struct radeon_device *rdev) 341562306a36Sopenharmony_ci{ 341662306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_SwitchToInitialState) == PPSMC_Result_OK) ? 341762306a36Sopenharmony_ci 0 : -EINVAL; 341862306a36Sopenharmony_ci} 341962306a36Sopenharmony_ci#endif 342062306a36Sopenharmony_ci 342162306a36Sopenharmony_cistatic int si_set_sw_state(struct radeon_device *rdev) 342262306a36Sopenharmony_ci{ 342362306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_SwitchToSwState) == PPSMC_Result_OK) ? 342462306a36Sopenharmony_ci 0 : -EINVAL; 342562306a36Sopenharmony_ci} 342662306a36Sopenharmony_ci 342762306a36Sopenharmony_cistatic int si_halt_smc(struct radeon_device *rdev) 342862306a36Sopenharmony_ci{ 342962306a36Sopenharmony_ci if (si_send_msg_to_smc(rdev, PPSMC_MSG_Halt) != PPSMC_Result_OK) 343062306a36Sopenharmony_ci return -EINVAL; 343162306a36Sopenharmony_ci 343262306a36Sopenharmony_ci return (si_wait_for_smc_inactive(rdev) == PPSMC_Result_OK) ? 343362306a36Sopenharmony_ci 0 : -EINVAL; 343462306a36Sopenharmony_ci} 343562306a36Sopenharmony_ci 343662306a36Sopenharmony_cistatic int si_resume_smc(struct radeon_device *rdev) 343762306a36Sopenharmony_ci{ 343862306a36Sopenharmony_ci if (si_send_msg_to_smc(rdev, PPSMC_FlushDataCache) != PPSMC_Result_OK) 343962306a36Sopenharmony_ci return -EINVAL; 344062306a36Sopenharmony_ci 344162306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_Resume) == PPSMC_Result_OK) ? 344262306a36Sopenharmony_ci 0 : -EINVAL; 344362306a36Sopenharmony_ci} 344462306a36Sopenharmony_ci 344562306a36Sopenharmony_cistatic void si_dpm_start_smc(struct radeon_device *rdev) 344662306a36Sopenharmony_ci{ 344762306a36Sopenharmony_ci si_program_jump_on_start(rdev); 344862306a36Sopenharmony_ci si_start_smc(rdev); 344962306a36Sopenharmony_ci si_start_smc_clock(rdev); 345062306a36Sopenharmony_ci} 345162306a36Sopenharmony_ci 345262306a36Sopenharmony_cistatic void si_dpm_stop_smc(struct radeon_device *rdev) 345362306a36Sopenharmony_ci{ 345462306a36Sopenharmony_ci si_reset_smc(rdev); 345562306a36Sopenharmony_ci si_stop_smc_clock(rdev); 345662306a36Sopenharmony_ci} 345762306a36Sopenharmony_ci 345862306a36Sopenharmony_cistatic int si_process_firmware_header(struct radeon_device *rdev) 345962306a36Sopenharmony_ci{ 346062306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 346162306a36Sopenharmony_ci u32 tmp; 346262306a36Sopenharmony_ci int ret; 346362306a36Sopenharmony_ci 346462306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 346562306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 346662306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_stateTable, 346762306a36Sopenharmony_ci &tmp, si_pi->sram_end); 346862306a36Sopenharmony_ci if (ret) 346962306a36Sopenharmony_ci return ret; 347062306a36Sopenharmony_ci 347162306a36Sopenharmony_ci si_pi->state_table_start = tmp; 347262306a36Sopenharmony_ci 347362306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 347462306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 347562306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_softRegisters, 347662306a36Sopenharmony_ci &tmp, si_pi->sram_end); 347762306a36Sopenharmony_ci if (ret) 347862306a36Sopenharmony_ci return ret; 347962306a36Sopenharmony_ci 348062306a36Sopenharmony_ci si_pi->soft_regs_start = tmp; 348162306a36Sopenharmony_ci 348262306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 348362306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 348462306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable, 348562306a36Sopenharmony_ci &tmp, si_pi->sram_end); 348662306a36Sopenharmony_ci if (ret) 348762306a36Sopenharmony_ci return ret; 348862306a36Sopenharmony_ci 348962306a36Sopenharmony_ci si_pi->mc_reg_table_start = tmp; 349062306a36Sopenharmony_ci 349162306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 349262306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 349362306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_fanTable, 349462306a36Sopenharmony_ci &tmp, si_pi->sram_end); 349562306a36Sopenharmony_ci if (ret) 349662306a36Sopenharmony_ci return ret; 349762306a36Sopenharmony_ci 349862306a36Sopenharmony_ci si_pi->fan_table_start = tmp; 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 350162306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 350262306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable, 350362306a36Sopenharmony_ci &tmp, si_pi->sram_end); 350462306a36Sopenharmony_ci if (ret) 350562306a36Sopenharmony_ci return ret; 350662306a36Sopenharmony_ci 350762306a36Sopenharmony_ci si_pi->arb_table_start = tmp; 350862306a36Sopenharmony_ci 350962306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 351062306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 351162306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_CacConfigTable, 351262306a36Sopenharmony_ci &tmp, si_pi->sram_end); 351362306a36Sopenharmony_ci if (ret) 351462306a36Sopenharmony_ci return ret; 351562306a36Sopenharmony_ci 351662306a36Sopenharmony_ci si_pi->cac_table_start = tmp; 351762306a36Sopenharmony_ci 351862306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 351962306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 352062306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_DteConfiguration, 352162306a36Sopenharmony_ci &tmp, si_pi->sram_end); 352262306a36Sopenharmony_ci if (ret) 352362306a36Sopenharmony_ci return ret; 352462306a36Sopenharmony_ci 352562306a36Sopenharmony_ci si_pi->dte_table_start = tmp; 352662306a36Sopenharmony_ci 352762306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 352862306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 352962306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_spllTable, 353062306a36Sopenharmony_ci &tmp, si_pi->sram_end); 353162306a36Sopenharmony_ci if (ret) 353262306a36Sopenharmony_ci return ret; 353362306a36Sopenharmony_ci 353462306a36Sopenharmony_ci si_pi->spll_table_start = tmp; 353562306a36Sopenharmony_ci 353662306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, 353762306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_LOCATION + 353862306a36Sopenharmony_ci SISLANDS_SMC_FIRMWARE_HEADER_PAPMParameters, 353962306a36Sopenharmony_ci &tmp, si_pi->sram_end); 354062306a36Sopenharmony_ci if (ret) 354162306a36Sopenharmony_ci return ret; 354262306a36Sopenharmony_ci 354362306a36Sopenharmony_ci si_pi->papm_cfg_table_start = tmp; 354462306a36Sopenharmony_ci 354562306a36Sopenharmony_ci return ret; 354662306a36Sopenharmony_ci} 354762306a36Sopenharmony_ci 354862306a36Sopenharmony_cistatic void si_read_clock_registers(struct radeon_device *rdev) 354962306a36Sopenharmony_ci{ 355062306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 355162306a36Sopenharmony_ci 355262306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_func_cntl = RREG32(CG_SPLL_FUNC_CNTL); 355362306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_func_cntl_2 = RREG32(CG_SPLL_FUNC_CNTL_2); 355462306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_func_cntl_3 = RREG32(CG_SPLL_FUNC_CNTL_3); 355562306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_func_cntl_4 = RREG32(CG_SPLL_FUNC_CNTL_4); 355662306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_spread_spectrum = RREG32(CG_SPLL_SPREAD_SPECTRUM); 355762306a36Sopenharmony_ci si_pi->clock_registers.cg_spll_spread_spectrum_2 = RREG32(CG_SPLL_SPREAD_SPECTRUM_2); 355862306a36Sopenharmony_ci si_pi->clock_registers.dll_cntl = RREG32(DLL_CNTL); 355962306a36Sopenharmony_ci si_pi->clock_registers.mclk_pwrmgt_cntl = RREG32(MCLK_PWRMGT_CNTL); 356062306a36Sopenharmony_ci si_pi->clock_registers.mpll_ad_func_cntl = RREG32(MPLL_AD_FUNC_CNTL); 356162306a36Sopenharmony_ci si_pi->clock_registers.mpll_dq_func_cntl = RREG32(MPLL_DQ_FUNC_CNTL); 356262306a36Sopenharmony_ci si_pi->clock_registers.mpll_func_cntl = RREG32(MPLL_FUNC_CNTL); 356362306a36Sopenharmony_ci si_pi->clock_registers.mpll_func_cntl_1 = RREG32(MPLL_FUNC_CNTL_1); 356462306a36Sopenharmony_ci si_pi->clock_registers.mpll_func_cntl_2 = RREG32(MPLL_FUNC_CNTL_2); 356562306a36Sopenharmony_ci si_pi->clock_registers.mpll_ss1 = RREG32(MPLL_SS1); 356662306a36Sopenharmony_ci si_pi->clock_registers.mpll_ss2 = RREG32(MPLL_SS2); 356762306a36Sopenharmony_ci} 356862306a36Sopenharmony_ci 356962306a36Sopenharmony_cistatic void si_enable_thermal_protection(struct radeon_device *rdev, 357062306a36Sopenharmony_ci bool enable) 357162306a36Sopenharmony_ci{ 357262306a36Sopenharmony_ci if (enable) 357362306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, 0, ~THERMAL_PROTECTION_DIS); 357462306a36Sopenharmony_ci else 357562306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, THERMAL_PROTECTION_DIS, ~THERMAL_PROTECTION_DIS); 357662306a36Sopenharmony_ci} 357762306a36Sopenharmony_ci 357862306a36Sopenharmony_cistatic void si_enable_acpi_power_management(struct radeon_device *rdev) 357962306a36Sopenharmony_ci{ 358062306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, STATIC_PM_EN, ~STATIC_PM_EN); 358162306a36Sopenharmony_ci} 358262306a36Sopenharmony_ci 358362306a36Sopenharmony_ci#if 0 358462306a36Sopenharmony_cistatic int si_enter_ulp_state(struct radeon_device *rdev) 358562306a36Sopenharmony_ci{ 358662306a36Sopenharmony_ci WREG32(SMC_MESSAGE_0, PPSMC_MSG_SwitchToMinimumPower); 358762306a36Sopenharmony_ci 358862306a36Sopenharmony_ci udelay(25000); 358962306a36Sopenharmony_ci 359062306a36Sopenharmony_ci return 0; 359162306a36Sopenharmony_ci} 359262306a36Sopenharmony_ci 359362306a36Sopenharmony_cistatic int si_exit_ulp_state(struct radeon_device *rdev) 359462306a36Sopenharmony_ci{ 359562306a36Sopenharmony_ci int i; 359662306a36Sopenharmony_ci 359762306a36Sopenharmony_ci WREG32(SMC_MESSAGE_0, PPSMC_MSG_ResumeFromMinimumPower); 359862306a36Sopenharmony_ci 359962306a36Sopenharmony_ci udelay(7000); 360062306a36Sopenharmony_ci 360162306a36Sopenharmony_ci for (i = 0; i < rdev->usec_timeout; i++) { 360262306a36Sopenharmony_ci if (RREG32(SMC_RESP_0) == 1) 360362306a36Sopenharmony_ci break; 360462306a36Sopenharmony_ci udelay(1000); 360562306a36Sopenharmony_ci } 360662306a36Sopenharmony_ci 360762306a36Sopenharmony_ci return 0; 360862306a36Sopenharmony_ci} 360962306a36Sopenharmony_ci#endif 361062306a36Sopenharmony_ci 361162306a36Sopenharmony_cistatic int si_notify_smc_display_change(struct radeon_device *rdev, 361262306a36Sopenharmony_ci bool has_display) 361362306a36Sopenharmony_ci{ 361462306a36Sopenharmony_ci PPSMC_Msg msg = has_display ? 361562306a36Sopenharmony_ci PPSMC_MSG_HasDisplay : PPSMC_MSG_NoDisplay; 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, msg) == PPSMC_Result_OK) ? 361862306a36Sopenharmony_ci 0 : -EINVAL; 361962306a36Sopenharmony_ci} 362062306a36Sopenharmony_ci 362162306a36Sopenharmony_cistatic void si_program_response_times(struct radeon_device *rdev) 362262306a36Sopenharmony_ci{ 362362306a36Sopenharmony_ci u32 voltage_response_time, acpi_delay_time, vbi_time_out; 362462306a36Sopenharmony_ci u32 vddc_dly, acpi_dly, vbi_dly; 362562306a36Sopenharmony_ci u32 reference_clock; 362662306a36Sopenharmony_ci 362762306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_mvdd_chg_time, 1); 362862306a36Sopenharmony_ci 362962306a36Sopenharmony_ci voltage_response_time = (u32)rdev->pm.dpm.voltage_response_time; 363062306a36Sopenharmony_ci 363162306a36Sopenharmony_ci if (voltage_response_time == 0) 363262306a36Sopenharmony_ci voltage_response_time = 1000; 363362306a36Sopenharmony_ci 363462306a36Sopenharmony_ci acpi_delay_time = 15000; 363562306a36Sopenharmony_ci vbi_time_out = 100000; 363662306a36Sopenharmony_ci 363762306a36Sopenharmony_ci reference_clock = radeon_get_xclk(rdev); 363862306a36Sopenharmony_ci 363962306a36Sopenharmony_ci vddc_dly = (voltage_response_time * reference_clock) / 100; 364062306a36Sopenharmony_ci acpi_dly = (acpi_delay_time * reference_clock) / 100; 364162306a36Sopenharmony_ci vbi_dly = (vbi_time_out * reference_clock) / 100; 364262306a36Sopenharmony_ci 364362306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_delay_vreg, vddc_dly); 364462306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_delay_acpi, acpi_dly); 364562306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_mclk_chg_timeout, vbi_dly); 364662306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_mc_block_delay, 0xAA); 364762306a36Sopenharmony_ci} 364862306a36Sopenharmony_ci 364962306a36Sopenharmony_cistatic void si_program_ds_registers(struct radeon_device *rdev) 365062306a36Sopenharmony_ci{ 365162306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 365262306a36Sopenharmony_ci u32 tmp = 1; /* XXX: 0x10 on tahiti A0 */ 365362306a36Sopenharmony_ci 365462306a36Sopenharmony_ci if (eg_pi->sclk_deep_sleep) { 365562306a36Sopenharmony_ci WREG32_P(MISC_CLK_CNTL, DEEP_SLEEP_CLK_SEL(tmp), ~DEEP_SLEEP_CLK_SEL_MASK); 365662306a36Sopenharmony_ci WREG32_P(CG_SPLL_AUTOSCALE_CNTL, AUTOSCALE_ON_SS_CLEAR, 365762306a36Sopenharmony_ci ~AUTOSCALE_ON_SS_CLEAR); 365862306a36Sopenharmony_ci } 365962306a36Sopenharmony_ci} 366062306a36Sopenharmony_ci 366162306a36Sopenharmony_cistatic void si_program_display_gap(struct radeon_device *rdev) 366262306a36Sopenharmony_ci{ 366362306a36Sopenharmony_ci u32 tmp, pipe; 366462306a36Sopenharmony_ci int i; 366562306a36Sopenharmony_ci 366662306a36Sopenharmony_ci tmp = RREG32(CG_DISPLAY_GAP_CNTL) & ~(DISP1_GAP_MASK | DISP2_GAP_MASK); 366762306a36Sopenharmony_ci if (rdev->pm.dpm.new_active_crtc_count > 0) 366862306a36Sopenharmony_ci tmp |= DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM); 366962306a36Sopenharmony_ci else 367062306a36Sopenharmony_ci tmp |= DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE); 367162306a36Sopenharmony_ci 367262306a36Sopenharmony_ci if (rdev->pm.dpm.new_active_crtc_count > 1) 367362306a36Sopenharmony_ci tmp |= DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM); 367462306a36Sopenharmony_ci else 367562306a36Sopenharmony_ci tmp |= DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE); 367662306a36Sopenharmony_ci 367762306a36Sopenharmony_ci WREG32(CG_DISPLAY_GAP_CNTL, tmp); 367862306a36Sopenharmony_ci 367962306a36Sopenharmony_ci tmp = RREG32(DCCG_DISP_SLOW_SELECT_REG); 368062306a36Sopenharmony_ci pipe = (tmp & DCCG_DISP1_SLOW_SELECT_MASK) >> DCCG_DISP1_SLOW_SELECT_SHIFT; 368162306a36Sopenharmony_ci 368262306a36Sopenharmony_ci if ((rdev->pm.dpm.new_active_crtc_count > 0) && 368362306a36Sopenharmony_ci (!(rdev->pm.dpm.new_active_crtcs & (1 << pipe)))) { 368462306a36Sopenharmony_ci /* find the first active crtc */ 368562306a36Sopenharmony_ci for (i = 0; i < rdev->num_crtc; i++) { 368662306a36Sopenharmony_ci if (rdev->pm.dpm.new_active_crtcs & (1 << i)) 368762306a36Sopenharmony_ci break; 368862306a36Sopenharmony_ci } 368962306a36Sopenharmony_ci if (i == rdev->num_crtc) 369062306a36Sopenharmony_ci pipe = 0; 369162306a36Sopenharmony_ci else 369262306a36Sopenharmony_ci pipe = i; 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci tmp &= ~DCCG_DISP1_SLOW_SELECT_MASK; 369562306a36Sopenharmony_ci tmp |= DCCG_DISP1_SLOW_SELECT(pipe); 369662306a36Sopenharmony_ci WREG32(DCCG_DISP_SLOW_SELECT_REG, tmp); 369762306a36Sopenharmony_ci } 369862306a36Sopenharmony_ci 369962306a36Sopenharmony_ci /* Setting this to false forces the performance state to low if the crtcs are disabled. 370062306a36Sopenharmony_ci * This can be a problem on PowerXpress systems or if you want to use the card 370162306a36Sopenharmony_ci * for offscreen rendering or compute if there are no crtcs enabled. 370262306a36Sopenharmony_ci */ 370362306a36Sopenharmony_ci si_notify_smc_display_change(rdev, rdev->pm.dpm.new_active_crtc_count > 0); 370462306a36Sopenharmony_ci} 370562306a36Sopenharmony_ci 370662306a36Sopenharmony_cistatic void si_enable_spread_spectrum(struct radeon_device *rdev, bool enable) 370762306a36Sopenharmony_ci{ 370862306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 370962306a36Sopenharmony_ci 371062306a36Sopenharmony_ci if (enable) { 371162306a36Sopenharmony_ci if (pi->sclk_ss) 371262306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, DYN_SPREAD_SPECTRUM_EN, ~DYN_SPREAD_SPECTRUM_EN); 371362306a36Sopenharmony_ci } else { 371462306a36Sopenharmony_ci WREG32_P(CG_SPLL_SPREAD_SPECTRUM, 0, ~SSEN); 371562306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, 0, ~DYN_SPREAD_SPECTRUM_EN); 371662306a36Sopenharmony_ci } 371762306a36Sopenharmony_ci} 371862306a36Sopenharmony_ci 371962306a36Sopenharmony_cistatic void si_setup_bsp(struct radeon_device *rdev) 372062306a36Sopenharmony_ci{ 372162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 372262306a36Sopenharmony_ci u32 xclk = radeon_get_xclk(rdev); 372362306a36Sopenharmony_ci 372462306a36Sopenharmony_ci r600_calculate_u_and_p(pi->asi, 372562306a36Sopenharmony_ci xclk, 372662306a36Sopenharmony_ci 16, 372762306a36Sopenharmony_ci &pi->bsp, 372862306a36Sopenharmony_ci &pi->bsu); 372962306a36Sopenharmony_ci 373062306a36Sopenharmony_ci r600_calculate_u_and_p(pi->pasi, 373162306a36Sopenharmony_ci xclk, 373262306a36Sopenharmony_ci 16, 373362306a36Sopenharmony_ci &pi->pbsp, 373462306a36Sopenharmony_ci &pi->pbsu); 373562306a36Sopenharmony_ci 373662306a36Sopenharmony_ci 373762306a36Sopenharmony_ci pi->dsp = BSP(pi->bsp) | BSU(pi->bsu); 373862306a36Sopenharmony_ci pi->psp = BSP(pi->pbsp) | BSU(pi->pbsu); 373962306a36Sopenharmony_ci 374062306a36Sopenharmony_ci WREG32(CG_BSP, pi->dsp); 374162306a36Sopenharmony_ci} 374262306a36Sopenharmony_ci 374362306a36Sopenharmony_cistatic void si_program_git(struct radeon_device *rdev) 374462306a36Sopenharmony_ci{ 374562306a36Sopenharmony_ci WREG32_P(CG_GIT, CG_GICST(R600_GICST_DFLT), ~CG_GICST_MASK); 374662306a36Sopenharmony_ci} 374762306a36Sopenharmony_ci 374862306a36Sopenharmony_cistatic void si_program_tp(struct radeon_device *rdev) 374962306a36Sopenharmony_ci{ 375062306a36Sopenharmony_ci int i; 375162306a36Sopenharmony_ci enum r600_td td = R600_TD_DFLT; 375262306a36Sopenharmony_ci 375362306a36Sopenharmony_ci for (i = 0; i < R600_PM_NUMBER_OF_TC; i++) 375462306a36Sopenharmony_ci WREG32(CG_FFCT_0 + (i * 4), (UTC_0(r600_utc[i]) | DTC_0(r600_dtc[i]))); 375562306a36Sopenharmony_ci 375662306a36Sopenharmony_ci if (td == R600_TD_AUTO) 375762306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_FORCE_TREND_SEL); 375862306a36Sopenharmony_ci else 375962306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, FIR_FORCE_TREND_SEL, ~FIR_FORCE_TREND_SEL); 376062306a36Sopenharmony_ci 376162306a36Sopenharmony_ci if (td == R600_TD_UP) 376262306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_TREND_MODE); 376362306a36Sopenharmony_ci 376462306a36Sopenharmony_ci if (td == R600_TD_DOWN) 376562306a36Sopenharmony_ci WREG32_P(SCLK_PWRMGT_CNTL, FIR_TREND_MODE, ~FIR_TREND_MODE); 376662306a36Sopenharmony_ci} 376762306a36Sopenharmony_ci 376862306a36Sopenharmony_cistatic void si_program_tpp(struct radeon_device *rdev) 376962306a36Sopenharmony_ci{ 377062306a36Sopenharmony_ci WREG32(CG_TPC, R600_TPC_DFLT); 377162306a36Sopenharmony_ci} 377262306a36Sopenharmony_ci 377362306a36Sopenharmony_cistatic void si_program_sstp(struct radeon_device *rdev) 377462306a36Sopenharmony_ci{ 377562306a36Sopenharmony_ci WREG32(CG_SSP, (SSTU(R600_SSTU_DFLT) | SST(R600_SST_DFLT))); 377662306a36Sopenharmony_ci} 377762306a36Sopenharmony_ci 377862306a36Sopenharmony_cistatic void si_enable_display_gap(struct radeon_device *rdev) 377962306a36Sopenharmony_ci{ 378062306a36Sopenharmony_ci u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL); 378162306a36Sopenharmony_ci 378262306a36Sopenharmony_ci tmp &= ~(DISP1_GAP_MASK | DISP2_GAP_MASK); 378362306a36Sopenharmony_ci tmp |= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE) | 378462306a36Sopenharmony_ci DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE)); 378562306a36Sopenharmony_ci 378662306a36Sopenharmony_ci tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK); 378762306a36Sopenharmony_ci tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK) | 378862306a36Sopenharmony_ci DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE)); 378962306a36Sopenharmony_ci WREG32(CG_DISPLAY_GAP_CNTL, tmp); 379062306a36Sopenharmony_ci} 379162306a36Sopenharmony_ci 379262306a36Sopenharmony_cistatic void si_program_vc(struct radeon_device *rdev) 379362306a36Sopenharmony_ci{ 379462306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 379562306a36Sopenharmony_ci 379662306a36Sopenharmony_ci WREG32(CG_FTV, pi->vrc); 379762306a36Sopenharmony_ci} 379862306a36Sopenharmony_ci 379962306a36Sopenharmony_cistatic void si_clear_vc(struct radeon_device *rdev) 380062306a36Sopenharmony_ci{ 380162306a36Sopenharmony_ci WREG32(CG_FTV, 0); 380262306a36Sopenharmony_ci} 380362306a36Sopenharmony_ci 380462306a36Sopenharmony_ciu8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock) 380562306a36Sopenharmony_ci{ 380662306a36Sopenharmony_ci u8 mc_para_index; 380762306a36Sopenharmony_ci 380862306a36Sopenharmony_ci if (memory_clock < 10000) 380962306a36Sopenharmony_ci mc_para_index = 0; 381062306a36Sopenharmony_ci else if (memory_clock >= 80000) 381162306a36Sopenharmony_ci mc_para_index = 0x0f; 381262306a36Sopenharmony_ci else 381362306a36Sopenharmony_ci mc_para_index = (u8)((memory_clock - 10000) / 5000 + 1); 381462306a36Sopenharmony_ci return mc_para_index; 381562306a36Sopenharmony_ci} 381662306a36Sopenharmony_ci 381762306a36Sopenharmony_ciu8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode) 381862306a36Sopenharmony_ci{ 381962306a36Sopenharmony_ci u8 mc_para_index; 382062306a36Sopenharmony_ci 382162306a36Sopenharmony_ci if (strobe_mode) { 382262306a36Sopenharmony_ci if (memory_clock < 12500) 382362306a36Sopenharmony_ci mc_para_index = 0x00; 382462306a36Sopenharmony_ci else if (memory_clock > 47500) 382562306a36Sopenharmony_ci mc_para_index = 0x0f; 382662306a36Sopenharmony_ci else 382762306a36Sopenharmony_ci mc_para_index = (u8)((memory_clock - 10000) / 2500); 382862306a36Sopenharmony_ci } else { 382962306a36Sopenharmony_ci if (memory_clock < 65000) 383062306a36Sopenharmony_ci mc_para_index = 0x00; 383162306a36Sopenharmony_ci else if (memory_clock > 135000) 383262306a36Sopenharmony_ci mc_para_index = 0x0f; 383362306a36Sopenharmony_ci else 383462306a36Sopenharmony_ci mc_para_index = (u8)((memory_clock - 60000) / 5000); 383562306a36Sopenharmony_ci } 383662306a36Sopenharmony_ci return mc_para_index; 383762306a36Sopenharmony_ci} 383862306a36Sopenharmony_ci 383962306a36Sopenharmony_cistatic u8 si_get_strobe_mode_settings(struct radeon_device *rdev, u32 mclk) 384062306a36Sopenharmony_ci{ 384162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 384262306a36Sopenharmony_ci bool strobe_mode = false; 384362306a36Sopenharmony_ci u8 result = 0; 384462306a36Sopenharmony_ci 384562306a36Sopenharmony_ci if (mclk <= pi->mclk_strobe_mode_threshold) 384662306a36Sopenharmony_ci strobe_mode = true; 384762306a36Sopenharmony_ci 384862306a36Sopenharmony_ci if (pi->mem_gddr5) 384962306a36Sopenharmony_ci result = si_get_mclk_frequency_ratio(mclk, strobe_mode); 385062306a36Sopenharmony_ci else 385162306a36Sopenharmony_ci result = si_get_ddr3_mclk_frequency_ratio(mclk); 385262306a36Sopenharmony_ci 385362306a36Sopenharmony_ci if (strobe_mode) 385462306a36Sopenharmony_ci result |= SISLANDS_SMC_STROBE_ENABLE; 385562306a36Sopenharmony_ci 385662306a36Sopenharmony_ci return result; 385762306a36Sopenharmony_ci} 385862306a36Sopenharmony_ci 385962306a36Sopenharmony_cistatic int si_upload_firmware(struct radeon_device *rdev) 386062306a36Sopenharmony_ci{ 386162306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 386262306a36Sopenharmony_ci int ret; 386362306a36Sopenharmony_ci 386462306a36Sopenharmony_ci si_reset_smc(rdev); 386562306a36Sopenharmony_ci si_stop_smc_clock(rdev); 386662306a36Sopenharmony_ci 386762306a36Sopenharmony_ci ret = si_load_smc_ucode(rdev, si_pi->sram_end); 386862306a36Sopenharmony_ci 386962306a36Sopenharmony_ci return ret; 387062306a36Sopenharmony_ci} 387162306a36Sopenharmony_ci 387262306a36Sopenharmony_cistatic bool si_validate_phase_shedding_tables(struct radeon_device *rdev, 387362306a36Sopenharmony_ci const struct atom_voltage_table *table, 387462306a36Sopenharmony_ci const struct radeon_phase_shedding_limits_table *limits) 387562306a36Sopenharmony_ci{ 387662306a36Sopenharmony_ci u32 data, num_bits, num_levels; 387762306a36Sopenharmony_ci 387862306a36Sopenharmony_ci if ((table == NULL) || (limits == NULL)) 387962306a36Sopenharmony_ci return false; 388062306a36Sopenharmony_ci 388162306a36Sopenharmony_ci data = table->mask_low; 388262306a36Sopenharmony_ci 388362306a36Sopenharmony_ci num_bits = hweight32(data); 388462306a36Sopenharmony_ci 388562306a36Sopenharmony_ci if (num_bits == 0) 388662306a36Sopenharmony_ci return false; 388762306a36Sopenharmony_ci 388862306a36Sopenharmony_ci num_levels = (1 << num_bits); 388962306a36Sopenharmony_ci 389062306a36Sopenharmony_ci if (table->count != num_levels) 389162306a36Sopenharmony_ci return false; 389262306a36Sopenharmony_ci 389362306a36Sopenharmony_ci if (limits->count != (num_levels - 1)) 389462306a36Sopenharmony_ci return false; 389562306a36Sopenharmony_ci 389662306a36Sopenharmony_ci return true; 389762306a36Sopenharmony_ci} 389862306a36Sopenharmony_ci 389962306a36Sopenharmony_civoid si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev, 390062306a36Sopenharmony_ci u32 max_voltage_steps, 390162306a36Sopenharmony_ci struct atom_voltage_table *voltage_table) 390262306a36Sopenharmony_ci{ 390362306a36Sopenharmony_ci unsigned int i, diff; 390462306a36Sopenharmony_ci 390562306a36Sopenharmony_ci if (voltage_table->count <= max_voltage_steps) 390662306a36Sopenharmony_ci return; 390762306a36Sopenharmony_ci 390862306a36Sopenharmony_ci diff = voltage_table->count - max_voltage_steps; 390962306a36Sopenharmony_ci 391062306a36Sopenharmony_ci for (i= 0; i < max_voltage_steps; i++) 391162306a36Sopenharmony_ci voltage_table->entries[i] = voltage_table->entries[i + diff]; 391262306a36Sopenharmony_ci 391362306a36Sopenharmony_ci voltage_table->count = max_voltage_steps; 391462306a36Sopenharmony_ci} 391562306a36Sopenharmony_ci 391662306a36Sopenharmony_cistatic int si_get_svi2_voltage_table(struct radeon_device *rdev, 391762306a36Sopenharmony_ci struct radeon_clock_voltage_dependency_table *voltage_dependency_table, 391862306a36Sopenharmony_ci struct atom_voltage_table *voltage_table) 391962306a36Sopenharmony_ci{ 392062306a36Sopenharmony_ci u32 i; 392162306a36Sopenharmony_ci 392262306a36Sopenharmony_ci if (voltage_dependency_table == NULL) 392362306a36Sopenharmony_ci return -EINVAL; 392462306a36Sopenharmony_ci 392562306a36Sopenharmony_ci voltage_table->mask_low = 0; 392662306a36Sopenharmony_ci voltage_table->phase_delay = 0; 392762306a36Sopenharmony_ci 392862306a36Sopenharmony_ci voltage_table->count = voltage_dependency_table->count; 392962306a36Sopenharmony_ci for (i = 0; i < voltage_table->count; i++) { 393062306a36Sopenharmony_ci voltage_table->entries[i].value = voltage_dependency_table->entries[i].v; 393162306a36Sopenharmony_ci voltage_table->entries[i].smio_low = 0; 393262306a36Sopenharmony_ci } 393362306a36Sopenharmony_ci 393462306a36Sopenharmony_ci return 0; 393562306a36Sopenharmony_ci} 393662306a36Sopenharmony_ci 393762306a36Sopenharmony_cistatic int si_construct_voltage_tables(struct radeon_device *rdev) 393862306a36Sopenharmony_ci{ 393962306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 394062306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 394162306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 394262306a36Sopenharmony_ci int ret; 394362306a36Sopenharmony_ci 394462306a36Sopenharmony_ci if (pi->voltage_control) { 394562306a36Sopenharmony_ci ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC, 394662306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table); 394762306a36Sopenharmony_ci if (ret) 394862306a36Sopenharmony_ci return ret; 394962306a36Sopenharmony_ci 395062306a36Sopenharmony_ci if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 395162306a36Sopenharmony_ci si_trim_voltage_table_to_fit_state_table(rdev, 395262306a36Sopenharmony_ci SISLANDS_MAX_NO_VREG_STEPS, 395362306a36Sopenharmony_ci &eg_pi->vddc_voltage_table); 395462306a36Sopenharmony_ci } else if (si_pi->voltage_control_svi2) { 395562306a36Sopenharmony_ci ret = si_get_svi2_voltage_table(rdev, 395662306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, 395762306a36Sopenharmony_ci &eg_pi->vddc_voltage_table); 395862306a36Sopenharmony_ci if (ret) 395962306a36Sopenharmony_ci return ret; 396062306a36Sopenharmony_ci } else { 396162306a36Sopenharmony_ci return -EINVAL; 396262306a36Sopenharmony_ci } 396362306a36Sopenharmony_ci 396462306a36Sopenharmony_ci if (eg_pi->vddci_control) { 396562306a36Sopenharmony_ci ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI, 396662306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddci_voltage_table); 396762306a36Sopenharmony_ci if (ret) 396862306a36Sopenharmony_ci return ret; 396962306a36Sopenharmony_ci 397062306a36Sopenharmony_ci if (eg_pi->vddci_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 397162306a36Sopenharmony_ci si_trim_voltage_table_to_fit_state_table(rdev, 397262306a36Sopenharmony_ci SISLANDS_MAX_NO_VREG_STEPS, 397362306a36Sopenharmony_ci &eg_pi->vddci_voltage_table); 397462306a36Sopenharmony_ci } 397562306a36Sopenharmony_ci if (si_pi->vddci_control_svi2) { 397662306a36Sopenharmony_ci ret = si_get_svi2_voltage_table(rdev, 397762306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, 397862306a36Sopenharmony_ci &eg_pi->vddci_voltage_table); 397962306a36Sopenharmony_ci if (ret) 398062306a36Sopenharmony_ci return ret; 398162306a36Sopenharmony_ci } 398262306a36Sopenharmony_ci 398362306a36Sopenharmony_ci if (pi->mvdd_control) { 398462306a36Sopenharmony_ci ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_MVDDC, 398562306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT, &si_pi->mvdd_voltage_table); 398662306a36Sopenharmony_ci 398762306a36Sopenharmony_ci if (ret) { 398862306a36Sopenharmony_ci pi->mvdd_control = false; 398962306a36Sopenharmony_ci return ret; 399062306a36Sopenharmony_ci } 399162306a36Sopenharmony_ci 399262306a36Sopenharmony_ci if (si_pi->mvdd_voltage_table.count == 0) { 399362306a36Sopenharmony_ci pi->mvdd_control = false; 399462306a36Sopenharmony_ci return -EINVAL; 399562306a36Sopenharmony_ci } 399662306a36Sopenharmony_ci 399762306a36Sopenharmony_ci if (si_pi->mvdd_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 399862306a36Sopenharmony_ci si_trim_voltage_table_to_fit_state_table(rdev, 399962306a36Sopenharmony_ci SISLANDS_MAX_NO_VREG_STEPS, 400062306a36Sopenharmony_ci &si_pi->mvdd_voltage_table); 400162306a36Sopenharmony_ci } 400262306a36Sopenharmony_ci 400362306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) { 400462306a36Sopenharmony_ci ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC, 400562306a36Sopenharmony_ci VOLTAGE_OBJ_PHASE_LUT, &si_pi->vddc_phase_shed_table); 400662306a36Sopenharmony_ci if (ret) 400762306a36Sopenharmony_ci si_pi->vddc_phase_shed_control = false; 400862306a36Sopenharmony_ci 400962306a36Sopenharmony_ci if ((si_pi->vddc_phase_shed_table.count == 0) || 401062306a36Sopenharmony_ci (si_pi->vddc_phase_shed_table.count > SISLANDS_MAX_NO_VREG_STEPS)) 401162306a36Sopenharmony_ci si_pi->vddc_phase_shed_control = false; 401262306a36Sopenharmony_ci } 401362306a36Sopenharmony_ci 401462306a36Sopenharmony_ci return 0; 401562306a36Sopenharmony_ci} 401662306a36Sopenharmony_ci 401762306a36Sopenharmony_cistatic void si_populate_smc_voltage_table(struct radeon_device *rdev, 401862306a36Sopenharmony_ci const struct atom_voltage_table *voltage_table, 401962306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *table) 402062306a36Sopenharmony_ci{ 402162306a36Sopenharmony_ci unsigned int i; 402262306a36Sopenharmony_ci 402362306a36Sopenharmony_ci for (i = 0; i < voltage_table->count; i++) 402462306a36Sopenharmony_ci table->lowSMIO[i] |= cpu_to_be32(voltage_table->entries[i].smio_low); 402562306a36Sopenharmony_ci} 402662306a36Sopenharmony_ci 402762306a36Sopenharmony_cistatic int si_populate_smc_voltage_tables(struct radeon_device *rdev, 402862306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *table) 402962306a36Sopenharmony_ci{ 403062306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 403162306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 403262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 403362306a36Sopenharmony_ci u8 i; 403462306a36Sopenharmony_ci 403562306a36Sopenharmony_ci if (si_pi->voltage_control_svi2) { 403662306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc, 403762306a36Sopenharmony_ci si_pi->svc_gpio_id); 403862306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd, 403962306a36Sopenharmony_ci si_pi->svd_gpio_id); 404062306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_svi_rework_plat_type, 404162306a36Sopenharmony_ci 2); 404262306a36Sopenharmony_ci } else { 404362306a36Sopenharmony_ci if (eg_pi->vddc_voltage_table.count) { 404462306a36Sopenharmony_ci si_populate_smc_voltage_table(rdev, &eg_pi->vddc_voltage_table, table); 404562306a36Sopenharmony_ci table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] = 404662306a36Sopenharmony_ci cpu_to_be32(eg_pi->vddc_voltage_table.mask_low); 404762306a36Sopenharmony_ci 404862306a36Sopenharmony_ci for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) { 404962306a36Sopenharmony_ci if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) { 405062306a36Sopenharmony_ci table->maxVDDCIndexInPPTable = i; 405162306a36Sopenharmony_ci break; 405262306a36Sopenharmony_ci } 405362306a36Sopenharmony_ci } 405462306a36Sopenharmony_ci } 405562306a36Sopenharmony_ci 405662306a36Sopenharmony_ci if (eg_pi->vddci_voltage_table.count) { 405762306a36Sopenharmony_ci si_populate_smc_voltage_table(rdev, &eg_pi->vddci_voltage_table, table); 405862306a36Sopenharmony_ci 405962306a36Sopenharmony_ci table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] = 406062306a36Sopenharmony_ci cpu_to_be32(eg_pi->vddci_voltage_table.mask_low); 406162306a36Sopenharmony_ci } 406262306a36Sopenharmony_ci 406362306a36Sopenharmony_ci 406462306a36Sopenharmony_ci if (si_pi->mvdd_voltage_table.count) { 406562306a36Sopenharmony_ci si_populate_smc_voltage_table(rdev, &si_pi->mvdd_voltage_table, table); 406662306a36Sopenharmony_ci 406762306a36Sopenharmony_ci table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] = 406862306a36Sopenharmony_ci cpu_to_be32(si_pi->mvdd_voltage_table.mask_low); 406962306a36Sopenharmony_ci } 407062306a36Sopenharmony_ci 407162306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) { 407262306a36Sopenharmony_ci if (si_validate_phase_shedding_tables(rdev, &si_pi->vddc_phase_shed_table, 407362306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) { 407462306a36Sopenharmony_ci si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table); 407562306a36Sopenharmony_ci 407662306a36Sopenharmony_ci table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING] = 407762306a36Sopenharmony_ci cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low); 407862306a36Sopenharmony_ci 407962306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay, 408062306a36Sopenharmony_ci (u32)si_pi->vddc_phase_shed_table.phase_delay); 408162306a36Sopenharmony_ci } else { 408262306a36Sopenharmony_ci si_pi->vddc_phase_shed_control = false; 408362306a36Sopenharmony_ci } 408462306a36Sopenharmony_ci } 408562306a36Sopenharmony_ci } 408662306a36Sopenharmony_ci 408762306a36Sopenharmony_ci return 0; 408862306a36Sopenharmony_ci} 408962306a36Sopenharmony_ci 409062306a36Sopenharmony_cistatic int si_populate_voltage_value(struct radeon_device *rdev, 409162306a36Sopenharmony_ci const struct atom_voltage_table *table, 409262306a36Sopenharmony_ci u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage) 409362306a36Sopenharmony_ci{ 409462306a36Sopenharmony_ci unsigned int i; 409562306a36Sopenharmony_ci 409662306a36Sopenharmony_ci for (i = 0; i < table->count; i++) { 409762306a36Sopenharmony_ci if (value <= table->entries[i].value) { 409862306a36Sopenharmony_ci voltage->index = (u8)i; 409962306a36Sopenharmony_ci voltage->value = cpu_to_be16(table->entries[i].value); 410062306a36Sopenharmony_ci break; 410162306a36Sopenharmony_ci } 410262306a36Sopenharmony_ci } 410362306a36Sopenharmony_ci 410462306a36Sopenharmony_ci if (i >= table->count) 410562306a36Sopenharmony_ci return -EINVAL; 410662306a36Sopenharmony_ci 410762306a36Sopenharmony_ci return 0; 410862306a36Sopenharmony_ci} 410962306a36Sopenharmony_ci 411062306a36Sopenharmony_cistatic int si_populate_mvdd_value(struct radeon_device *rdev, u32 mclk, 411162306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE *voltage) 411262306a36Sopenharmony_ci{ 411362306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 411462306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 411562306a36Sopenharmony_ci 411662306a36Sopenharmony_ci if (pi->mvdd_control) { 411762306a36Sopenharmony_ci if (mclk <= pi->mvdd_split_frequency) 411862306a36Sopenharmony_ci voltage->index = 0; 411962306a36Sopenharmony_ci else 412062306a36Sopenharmony_ci voltage->index = (u8)(si_pi->mvdd_voltage_table.count) - 1; 412162306a36Sopenharmony_ci 412262306a36Sopenharmony_ci voltage->value = cpu_to_be16(si_pi->mvdd_voltage_table.entries[voltage->index].value); 412362306a36Sopenharmony_ci } 412462306a36Sopenharmony_ci return 0; 412562306a36Sopenharmony_ci} 412662306a36Sopenharmony_ci 412762306a36Sopenharmony_cistatic int si_get_std_voltage_value(struct radeon_device *rdev, 412862306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE *voltage, 412962306a36Sopenharmony_ci u16 *std_voltage) 413062306a36Sopenharmony_ci{ 413162306a36Sopenharmony_ci u16 v_index; 413262306a36Sopenharmony_ci bool voltage_found = false; 413362306a36Sopenharmony_ci *std_voltage = be16_to_cpu(voltage->value); 413462306a36Sopenharmony_ci 413562306a36Sopenharmony_ci if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries) { 413662306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_NEW_CAC_VOLTAGE) { 413762306a36Sopenharmony_ci if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries == NULL) 413862306a36Sopenharmony_ci return -EINVAL; 413962306a36Sopenharmony_ci 414062306a36Sopenharmony_ci for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) { 414162306a36Sopenharmony_ci if (be16_to_cpu(voltage->value) == 414262306a36Sopenharmony_ci (u16)rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) { 414362306a36Sopenharmony_ci voltage_found = true; 414462306a36Sopenharmony_ci if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count) 414562306a36Sopenharmony_ci *std_voltage = 414662306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.cac_leakage_table.entries[v_index].vddc; 414762306a36Sopenharmony_ci else 414862306a36Sopenharmony_ci *std_voltage = 414962306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.cac_leakage_table.entries[rdev->pm.dpm.dyn_state.cac_leakage_table.count-1].vddc; 415062306a36Sopenharmony_ci break; 415162306a36Sopenharmony_ci } 415262306a36Sopenharmony_ci } 415362306a36Sopenharmony_ci 415462306a36Sopenharmony_ci if (!voltage_found) { 415562306a36Sopenharmony_ci for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) { 415662306a36Sopenharmony_ci if (be16_to_cpu(voltage->value) <= 415762306a36Sopenharmony_ci (u16)rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) { 415862306a36Sopenharmony_ci voltage_found = true; 415962306a36Sopenharmony_ci if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count) 416062306a36Sopenharmony_ci *std_voltage = 416162306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.cac_leakage_table.entries[v_index].vddc; 416262306a36Sopenharmony_ci else 416362306a36Sopenharmony_ci *std_voltage = 416462306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.cac_leakage_table.entries[rdev->pm.dpm.dyn_state.cac_leakage_table.count-1].vddc; 416562306a36Sopenharmony_ci break; 416662306a36Sopenharmony_ci } 416762306a36Sopenharmony_ci } 416862306a36Sopenharmony_ci } 416962306a36Sopenharmony_ci } else { 417062306a36Sopenharmony_ci if ((u32)voltage->index < rdev->pm.dpm.dyn_state.cac_leakage_table.count) 417162306a36Sopenharmony_ci *std_voltage = rdev->pm.dpm.dyn_state.cac_leakage_table.entries[voltage->index].vddc; 417262306a36Sopenharmony_ci } 417362306a36Sopenharmony_ci } 417462306a36Sopenharmony_ci 417562306a36Sopenharmony_ci return 0; 417662306a36Sopenharmony_ci} 417762306a36Sopenharmony_ci 417862306a36Sopenharmony_cistatic int si_populate_std_voltage_value(struct radeon_device *rdev, 417962306a36Sopenharmony_ci u16 value, u8 index, 418062306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE *voltage) 418162306a36Sopenharmony_ci{ 418262306a36Sopenharmony_ci voltage->index = index; 418362306a36Sopenharmony_ci voltage->value = cpu_to_be16(value); 418462306a36Sopenharmony_ci 418562306a36Sopenharmony_ci return 0; 418662306a36Sopenharmony_ci} 418762306a36Sopenharmony_ci 418862306a36Sopenharmony_cistatic int si_populate_phase_shedding_value(struct radeon_device *rdev, 418962306a36Sopenharmony_ci const struct radeon_phase_shedding_limits_table *limits, 419062306a36Sopenharmony_ci u16 voltage, u32 sclk, u32 mclk, 419162306a36Sopenharmony_ci SISLANDS_SMC_VOLTAGE_VALUE *smc_voltage) 419262306a36Sopenharmony_ci{ 419362306a36Sopenharmony_ci unsigned int i; 419462306a36Sopenharmony_ci 419562306a36Sopenharmony_ci for (i = 0; i < limits->count; i++) { 419662306a36Sopenharmony_ci if ((voltage <= limits->entries[i].voltage) && 419762306a36Sopenharmony_ci (sclk <= limits->entries[i].sclk) && 419862306a36Sopenharmony_ci (mclk <= limits->entries[i].mclk)) 419962306a36Sopenharmony_ci break; 420062306a36Sopenharmony_ci } 420162306a36Sopenharmony_ci 420262306a36Sopenharmony_ci smc_voltage->phase_settings = (u8)i; 420362306a36Sopenharmony_ci 420462306a36Sopenharmony_ci return 0; 420562306a36Sopenharmony_ci} 420662306a36Sopenharmony_ci 420762306a36Sopenharmony_cistatic int si_init_arb_table_index(struct radeon_device *rdev) 420862306a36Sopenharmony_ci{ 420962306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 421062306a36Sopenharmony_ci u32 tmp; 421162306a36Sopenharmony_ci int ret; 421262306a36Sopenharmony_ci 421362306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, si_pi->arb_table_start, &tmp, si_pi->sram_end); 421462306a36Sopenharmony_ci if (ret) 421562306a36Sopenharmony_ci return ret; 421662306a36Sopenharmony_ci 421762306a36Sopenharmony_ci tmp &= 0x00FFFFFF; 421862306a36Sopenharmony_ci tmp |= MC_CG_ARB_FREQ_F1 << 24; 421962306a36Sopenharmony_ci 422062306a36Sopenharmony_ci return si_write_smc_sram_dword(rdev, si_pi->arb_table_start, tmp, si_pi->sram_end); 422162306a36Sopenharmony_ci} 422262306a36Sopenharmony_ci 422362306a36Sopenharmony_cistatic int si_initial_switch_from_arb_f0_to_f1(struct radeon_device *rdev) 422462306a36Sopenharmony_ci{ 422562306a36Sopenharmony_ci return ni_copy_and_switch_arb_sets(rdev, MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1); 422662306a36Sopenharmony_ci} 422762306a36Sopenharmony_ci 422862306a36Sopenharmony_cistatic int si_reset_to_default(struct radeon_device *rdev) 422962306a36Sopenharmony_ci{ 423062306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) == PPSMC_Result_OK) ? 423162306a36Sopenharmony_ci 0 : -EINVAL; 423262306a36Sopenharmony_ci} 423362306a36Sopenharmony_ci 423462306a36Sopenharmony_cistatic int si_force_switch_to_arb_f0(struct radeon_device *rdev) 423562306a36Sopenharmony_ci{ 423662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 423762306a36Sopenharmony_ci u32 tmp; 423862306a36Sopenharmony_ci int ret; 423962306a36Sopenharmony_ci 424062306a36Sopenharmony_ci ret = si_read_smc_sram_dword(rdev, si_pi->arb_table_start, 424162306a36Sopenharmony_ci &tmp, si_pi->sram_end); 424262306a36Sopenharmony_ci if (ret) 424362306a36Sopenharmony_ci return ret; 424462306a36Sopenharmony_ci 424562306a36Sopenharmony_ci tmp = (tmp >> 24) & 0xff; 424662306a36Sopenharmony_ci 424762306a36Sopenharmony_ci if (tmp == MC_CG_ARB_FREQ_F0) 424862306a36Sopenharmony_ci return 0; 424962306a36Sopenharmony_ci 425062306a36Sopenharmony_ci return ni_copy_and_switch_arb_sets(rdev, tmp, MC_CG_ARB_FREQ_F0); 425162306a36Sopenharmony_ci} 425262306a36Sopenharmony_ci 425362306a36Sopenharmony_cistatic u32 si_calculate_memory_refresh_rate(struct radeon_device *rdev, 425462306a36Sopenharmony_ci u32 engine_clock) 425562306a36Sopenharmony_ci{ 425662306a36Sopenharmony_ci u32 dram_rows; 425762306a36Sopenharmony_ci u32 dram_refresh_rate; 425862306a36Sopenharmony_ci u32 mc_arb_rfsh_rate; 425962306a36Sopenharmony_ci u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT; 426062306a36Sopenharmony_ci 426162306a36Sopenharmony_ci if (tmp >= 4) 426262306a36Sopenharmony_ci dram_rows = 16384; 426362306a36Sopenharmony_ci else 426462306a36Sopenharmony_ci dram_rows = 1 << (tmp + 10); 426562306a36Sopenharmony_ci 426662306a36Sopenharmony_ci dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3); 426762306a36Sopenharmony_ci mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64; 426862306a36Sopenharmony_ci 426962306a36Sopenharmony_ci return mc_arb_rfsh_rate; 427062306a36Sopenharmony_ci} 427162306a36Sopenharmony_ci 427262306a36Sopenharmony_cistatic int si_populate_memory_timing_parameters(struct radeon_device *rdev, 427362306a36Sopenharmony_ci struct rv7xx_pl *pl, 427462306a36Sopenharmony_ci SMC_SIslands_MCArbDramTimingRegisterSet *arb_regs) 427562306a36Sopenharmony_ci{ 427662306a36Sopenharmony_ci u32 dram_timing; 427762306a36Sopenharmony_ci u32 dram_timing2; 427862306a36Sopenharmony_ci u32 burst_time; 427962306a36Sopenharmony_ci 428062306a36Sopenharmony_ci arb_regs->mc_arb_rfsh_rate = 428162306a36Sopenharmony_ci (u8)si_calculate_memory_refresh_rate(rdev, pl->sclk); 428262306a36Sopenharmony_ci 428362306a36Sopenharmony_ci radeon_atom_set_engine_dram_timings(rdev, 428462306a36Sopenharmony_ci pl->sclk, 428562306a36Sopenharmony_ci pl->mclk); 428662306a36Sopenharmony_ci 428762306a36Sopenharmony_ci dram_timing = RREG32(MC_ARB_DRAM_TIMING); 428862306a36Sopenharmony_ci dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2); 428962306a36Sopenharmony_ci burst_time = RREG32(MC_ARB_BURST_TIME) & STATE0_MASK; 429062306a36Sopenharmony_ci 429162306a36Sopenharmony_ci arb_regs->mc_arb_dram_timing = cpu_to_be32(dram_timing); 429262306a36Sopenharmony_ci arb_regs->mc_arb_dram_timing2 = cpu_to_be32(dram_timing2); 429362306a36Sopenharmony_ci arb_regs->mc_arb_burst_time = (u8)burst_time; 429462306a36Sopenharmony_ci 429562306a36Sopenharmony_ci return 0; 429662306a36Sopenharmony_ci} 429762306a36Sopenharmony_ci 429862306a36Sopenharmony_cistatic int si_do_program_memory_timing_parameters(struct radeon_device *rdev, 429962306a36Sopenharmony_ci struct radeon_ps *radeon_state, 430062306a36Sopenharmony_ci unsigned int first_arb_set) 430162306a36Sopenharmony_ci{ 430262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 430362306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 430462306a36Sopenharmony_ci SMC_SIslands_MCArbDramTimingRegisterSet arb_regs = { 0 }; 430562306a36Sopenharmony_ci int i, ret = 0; 430662306a36Sopenharmony_ci 430762306a36Sopenharmony_ci for (i = 0; i < state->performance_level_count; i++) { 430862306a36Sopenharmony_ci ret = si_populate_memory_timing_parameters(rdev, &state->performance_levels[i], &arb_regs); 430962306a36Sopenharmony_ci if (ret) 431062306a36Sopenharmony_ci break; 431162306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, 431262306a36Sopenharmony_ci si_pi->arb_table_start + 431362306a36Sopenharmony_ci offsetof(SMC_SIslands_MCArbDramTimingRegisters, data) + 431462306a36Sopenharmony_ci sizeof(SMC_SIslands_MCArbDramTimingRegisterSet) * (first_arb_set + i), 431562306a36Sopenharmony_ci (u8 *)&arb_regs, 431662306a36Sopenharmony_ci sizeof(SMC_SIslands_MCArbDramTimingRegisterSet), 431762306a36Sopenharmony_ci si_pi->sram_end); 431862306a36Sopenharmony_ci if (ret) 431962306a36Sopenharmony_ci break; 432062306a36Sopenharmony_ci } 432162306a36Sopenharmony_ci 432262306a36Sopenharmony_ci return ret; 432362306a36Sopenharmony_ci} 432462306a36Sopenharmony_ci 432562306a36Sopenharmony_cistatic int si_program_memory_timing_parameters(struct radeon_device *rdev, 432662306a36Sopenharmony_ci struct radeon_ps *radeon_new_state) 432762306a36Sopenharmony_ci{ 432862306a36Sopenharmony_ci return si_do_program_memory_timing_parameters(rdev, radeon_new_state, 432962306a36Sopenharmony_ci SISLANDS_DRIVER_STATE_ARB_INDEX); 433062306a36Sopenharmony_ci} 433162306a36Sopenharmony_ci 433262306a36Sopenharmony_cistatic int si_populate_initial_mvdd_value(struct radeon_device *rdev, 433362306a36Sopenharmony_ci struct SISLANDS_SMC_VOLTAGE_VALUE *voltage) 433462306a36Sopenharmony_ci{ 433562306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 433662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 433762306a36Sopenharmony_ci 433862306a36Sopenharmony_ci if (pi->mvdd_control) 433962306a36Sopenharmony_ci return si_populate_voltage_value(rdev, &si_pi->mvdd_voltage_table, 434062306a36Sopenharmony_ci si_pi->mvdd_bootup_value, voltage); 434162306a36Sopenharmony_ci 434262306a36Sopenharmony_ci return 0; 434362306a36Sopenharmony_ci} 434462306a36Sopenharmony_ci 434562306a36Sopenharmony_cistatic int si_populate_smc_initial_state(struct radeon_device *rdev, 434662306a36Sopenharmony_ci struct radeon_ps *radeon_initial_state, 434762306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *table) 434862306a36Sopenharmony_ci{ 434962306a36Sopenharmony_ci struct ni_ps *initial_state = ni_get_ps(radeon_initial_state); 435062306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 435162306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 435262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 435362306a36Sopenharmony_ci u32 reg; 435462306a36Sopenharmony_ci int ret; 435562306a36Sopenharmony_ci 435662306a36Sopenharmony_ci table->initialState.level.mclk.vDLL_CNTL = 435762306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.dll_cntl); 435862306a36Sopenharmony_ci table->initialState.level.mclk.vMCLK_PWRMGT_CNTL = 435962306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl); 436062306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL = 436162306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl); 436262306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL = 436362306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl); 436462306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_FUNC_CNTL = 436562306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_func_cntl); 436662306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_FUNC_CNTL_1 = 436762306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1); 436862306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_FUNC_CNTL_2 = 436962306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2); 437062306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_SS = 437162306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_ss1); 437262306a36Sopenharmony_ci table->initialState.level.mclk.vMPLL_SS2 = 437362306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_ss2); 437462306a36Sopenharmony_ci 437562306a36Sopenharmony_ci table->initialState.level.mclk.mclk_value = 437662306a36Sopenharmony_ci cpu_to_be32(initial_state->performance_levels[0].mclk); 437762306a36Sopenharmony_ci 437862306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL = 437962306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl); 438062306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 = 438162306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2); 438262306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 = 438362306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3); 438462306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 = 438562306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4); 438662306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM = 438762306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum); 438862306a36Sopenharmony_ci table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2 = 438962306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2); 439062306a36Sopenharmony_ci 439162306a36Sopenharmony_ci table->initialState.level.sclk.sclk_value = 439262306a36Sopenharmony_ci cpu_to_be32(initial_state->performance_levels[0].sclk); 439362306a36Sopenharmony_ci 439462306a36Sopenharmony_ci table->initialState.level.arbRefreshState = 439562306a36Sopenharmony_ci SISLANDS_INITIAL_STATE_ARB_INDEX; 439662306a36Sopenharmony_ci 439762306a36Sopenharmony_ci table->initialState.level.ACIndex = 0; 439862306a36Sopenharmony_ci 439962306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table, 440062306a36Sopenharmony_ci initial_state->performance_levels[0].vddc, 440162306a36Sopenharmony_ci &table->initialState.level.vddc); 440262306a36Sopenharmony_ci 440362306a36Sopenharmony_ci if (!ret) { 440462306a36Sopenharmony_ci u16 std_vddc; 440562306a36Sopenharmony_ci 440662306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, 440762306a36Sopenharmony_ci &table->initialState.level.vddc, 440862306a36Sopenharmony_ci &std_vddc); 440962306a36Sopenharmony_ci if (!ret) 441062306a36Sopenharmony_ci si_populate_std_voltage_value(rdev, std_vddc, 441162306a36Sopenharmony_ci table->initialState.level.vddc.index, 441262306a36Sopenharmony_ci &table->initialState.level.std_vddc); 441362306a36Sopenharmony_ci } 441462306a36Sopenharmony_ci 441562306a36Sopenharmony_ci if (eg_pi->vddci_control) 441662306a36Sopenharmony_ci si_populate_voltage_value(rdev, 441762306a36Sopenharmony_ci &eg_pi->vddci_voltage_table, 441862306a36Sopenharmony_ci initial_state->performance_levels[0].vddci, 441962306a36Sopenharmony_ci &table->initialState.level.vddci); 442062306a36Sopenharmony_ci 442162306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) 442262306a36Sopenharmony_ci si_populate_phase_shedding_value(rdev, 442362306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.phase_shedding_limits_table, 442462306a36Sopenharmony_ci initial_state->performance_levels[0].vddc, 442562306a36Sopenharmony_ci initial_state->performance_levels[0].sclk, 442662306a36Sopenharmony_ci initial_state->performance_levels[0].mclk, 442762306a36Sopenharmony_ci &table->initialState.level.vddc); 442862306a36Sopenharmony_ci 442962306a36Sopenharmony_ci si_populate_initial_mvdd_value(rdev, &table->initialState.level.mvdd); 443062306a36Sopenharmony_ci 443162306a36Sopenharmony_ci reg = CG_R(0xffff) | CG_L(0); 443262306a36Sopenharmony_ci table->initialState.level.aT = cpu_to_be32(reg); 443362306a36Sopenharmony_ci 443462306a36Sopenharmony_ci table->initialState.level.bSP = cpu_to_be32(pi->dsp); 443562306a36Sopenharmony_ci 443662306a36Sopenharmony_ci table->initialState.level.gen2PCIE = (u8)si_pi->boot_pcie_gen; 443762306a36Sopenharmony_ci 443862306a36Sopenharmony_ci if (pi->mem_gddr5) { 443962306a36Sopenharmony_ci table->initialState.level.strobeMode = 444062306a36Sopenharmony_ci si_get_strobe_mode_settings(rdev, 444162306a36Sopenharmony_ci initial_state->performance_levels[0].mclk); 444262306a36Sopenharmony_ci 444362306a36Sopenharmony_ci if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold) 444462306a36Sopenharmony_ci table->initialState.level.mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG; 444562306a36Sopenharmony_ci else 444662306a36Sopenharmony_ci table->initialState.level.mcFlags = 0; 444762306a36Sopenharmony_ci } 444862306a36Sopenharmony_ci 444962306a36Sopenharmony_ci table->initialState.levelCount = 1; 445062306a36Sopenharmony_ci 445162306a36Sopenharmony_ci table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC; 445262306a36Sopenharmony_ci 445362306a36Sopenharmony_ci table->initialState.level.dpm2.MaxPS = 0; 445462306a36Sopenharmony_ci table->initialState.level.dpm2.NearTDPDec = 0; 445562306a36Sopenharmony_ci table->initialState.level.dpm2.AboveSafeInc = 0; 445662306a36Sopenharmony_ci table->initialState.level.dpm2.BelowSafeInc = 0; 445762306a36Sopenharmony_ci table->initialState.level.dpm2.PwrEfficiencyRatio = 0; 445862306a36Sopenharmony_ci 445962306a36Sopenharmony_ci reg = MIN_POWER_MASK | MAX_POWER_MASK; 446062306a36Sopenharmony_ci table->initialState.level.SQPowerThrottle = cpu_to_be32(reg); 446162306a36Sopenharmony_ci 446262306a36Sopenharmony_ci reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK; 446362306a36Sopenharmony_ci table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg); 446462306a36Sopenharmony_ci 446562306a36Sopenharmony_ci return 0; 446662306a36Sopenharmony_ci} 446762306a36Sopenharmony_ci 446862306a36Sopenharmony_cistatic int si_populate_smc_acpi_state(struct radeon_device *rdev, 446962306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *table) 447062306a36Sopenharmony_ci{ 447162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 447262306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 447362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 447462306a36Sopenharmony_ci u32 spll_func_cntl = si_pi->clock_registers.cg_spll_func_cntl; 447562306a36Sopenharmony_ci u32 spll_func_cntl_2 = si_pi->clock_registers.cg_spll_func_cntl_2; 447662306a36Sopenharmony_ci u32 spll_func_cntl_3 = si_pi->clock_registers.cg_spll_func_cntl_3; 447762306a36Sopenharmony_ci u32 spll_func_cntl_4 = si_pi->clock_registers.cg_spll_func_cntl_4; 447862306a36Sopenharmony_ci u32 dll_cntl = si_pi->clock_registers.dll_cntl; 447962306a36Sopenharmony_ci u32 mclk_pwrmgt_cntl = si_pi->clock_registers.mclk_pwrmgt_cntl; 448062306a36Sopenharmony_ci u32 mpll_ad_func_cntl = si_pi->clock_registers.mpll_ad_func_cntl; 448162306a36Sopenharmony_ci u32 mpll_dq_func_cntl = si_pi->clock_registers.mpll_dq_func_cntl; 448262306a36Sopenharmony_ci u32 mpll_func_cntl = si_pi->clock_registers.mpll_func_cntl; 448362306a36Sopenharmony_ci u32 mpll_func_cntl_1 = si_pi->clock_registers.mpll_func_cntl_1; 448462306a36Sopenharmony_ci u32 mpll_func_cntl_2 = si_pi->clock_registers.mpll_func_cntl_2; 448562306a36Sopenharmony_ci u32 reg; 448662306a36Sopenharmony_ci int ret; 448762306a36Sopenharmony_ci 448862306a36Sopenharmony_ci table->ACPIState = table->initialState; 448962306a36Sopenharmony_ci 449062306a36Sopenharmony_ci table->ACPIState.flags &= ~PPSMC_SWSTATE_FLAG_DC; 449162306a36Sopenharmony_ci 449262306a36Sopenharmony_ci if (pi->acpi_vddc) { 449362306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table, 449462306a36Sopenharmony_ci pi->acpi_vddc, &table->ACPIState.level.vddc); 449562306a36Sopenharmony_ci if (!ret) { 449662306a36Sopenharmony_ci u16 std_vddc; 449762306a36Sopenharmony_ci 449862306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, 449962306a36Sopenharmony_ci &table->ACPIState.level.vddc, &std_vddc); 450062306a36Sopenharmony_ci if (!ret) 450162306a36Sopenharmony_ci si_populate_std_voltage_value(rdev, std_vddc, 450262306a36Sopenharmony_ci table->ACPIState.level.vddc.index, 450362306a36Sopenharmony_ci &table->ACPIState.level.std_vddc); 450462306a36Sopenharmony_ci } 450562306a36Sopenharmony_ci table->ACPIState.level.gen2PCIE = si_pi->acpi_pcie_gen; 450662306a36Sopenharmony_ci 450762306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) { 450862306a36Sopenharmony_ci si_populate_phase_shedding_value(rdev, 450962306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.phase_shedding_limits_table, 451062306a36Sopenharmony_ci pi->acpi_vddc, 451162306a36Sopenharmony_ci 0, 451262306a36Sopenharmony_ci 0, 451362306a36Sopenharmony_ci &table->ACPIState.level.vddc); 451462306a36Sopenharmony_ci } 451562306a36Sopenharmony_ci } else { 451662306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table, 451762306a36Sopenharmony_ci pi->min_vddc_in_table, &table->ACPIState.level.vddc); 451862306a36Sopenharmony_ci if (!ret) { 451962306a36Sopenharmony_ci u16 std_vddc; 452062306a36Sopenharmony_ci 452162306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, 452262306a36Sopenharmony_ci &table->ACPIState.level.vddc, &std_vddc); 452362306a36Sopenharmony_ci 452462306a36Sopenharmony_ci if (!ret) 452562306a36Sopenharmony_ci si_populate_std_voltage_value(rdev, std_vddc, 452662306a36Sopenharmony_ci table->ACPIState.level.vddc.index, 452762306a36Sopenharmony_ci &table->ACPIState.level.std_vddc); 452862306a36Sopenharmony_ci } 452962306a36Sopenharmony_ci table->ACPIState.level.gen2PCIE = (u8)r600_get_pcie_gen_support(rdev, 453062306a36Sopenharmony_ci si_pi->sys_pcie_mask, 453162306a36Sopenharmony_ci si_pi->boot_pcie_gen, 453262306a36Sopenharmony_ci RADEON_PCIE_GEN1); 453362306a36Sopenharmony_ci 453462306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) 453562306a36Sopenharmony_ci si_populate_phase_shedding_value(rdev, 453662306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.phase_shedding_limits_table, 453762306a36Sopenharmony_ci pi->min_vddc_in_table, 453862306a36Sopenharmony_ci 0, 453962306a36Sopenharmony_ci 0, 454062306a36Sopenharmony_ci &table->ACPIState.level.vddc); 454162306a36Sopenharmony_ci } 454262306a36Sopenharmony_ci 454362306a36Sopenharmony_ci if (pi->acpi_vddc) { 454462306a36Sopenharmony_ci if (eg_pi->acpi_vddci) 454562306a36Sopenharmony_ci si_populate_voltage_value(rdev, &eg_pi->vddci_voltage_table, 454662306a36Sopenharmony_ci eg_pi->acpi_vddci, 454762306a36Sopenharmony_ci &table->ACPIState.level.vddci); 454862306a36Sopenharmony_ci } 454962306a36Sopenharmony_ci 455062306a36Sopenharmony_ci mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET; 455162306a36Sopenharmony_ci mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB); 455262306a36Sopenharmony_ci 455362306a36Sopenharmony_ci dll_cntl &= ~(MRDCK0_BYPASS | MRDCK1_BYPASS); 455462306a36Sopenharmony_ci 455562306a36Sopenharmony_ci spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK; 455662306a36Sopenharmony_ci spll_func_cntl_2 |= SCLK_MUX_SEL(4); 455762306a36Sopenharmony_ci 455862306a36Sopenharmony_ci table->ACPIState.level.mclk.vDLL_CNTL = 455962306a36Sopenharmony_ci cpu_to_be32(dll_cntl); 456062306a36Sopenharmony_ci table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL = 456162306a36Sopenharmony_ci cpu_to_be32(mclk_pwrmgt_cntl); 456262306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL = 456362306a36Sopenharmony_ci cpu_to_be32(mpll_ad_func_cntl); 456462306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL = 456562306a36Sopenharmony_ci cpu_to_be32(mpll_dq_func_cntl); 456662306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_FUNC_CNTL = 456762306a36Sopenharmony_ci cpu_to_be32(mpll_func_cntl); 456862306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_1 = 456962306a36Sopenharmony_ci cpu_to_be32(mpll_func_cntl_1); 457062306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_2 = 457162306a36Sopenharmony_ci cpu_to_be32(mpll_func_cntl_2); 457262306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_SS = 457362306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_ss1); 457462306a36Sopenharmony_ci table->ACPIState.level.mclk.vMPLL_SS2 = 457562306a36Sopenharmony_ci cpu_to_be32(si_pi->clock_registers.mpll_ss2); 457662306a36Sopenharmony_ci 457762306a36Sopenharmony_ci table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL = 457862306a36Sopenharmony_ci cpu_to_be32(spll_func_cntl); 457962306a36Sopenharmony_ci table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 = 458062306a36Sopenharmony_ci cpu_to_be32(spll_func_cntl_2); 458162306a36Sopenharmony_ci table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 = 458262306a36Sopenharmony_ci cpu_to_be32(spll_func_cntl_3); 458362306a36Sopenharmony_ci table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 = 458462306a36Sopenharmony_ci cpu_to_be32(spll_func_cntl_4); 458562306a36Sopenharmony_ci 458662306a36Sopenharmony_ci table->ACPIState.level.mclk.mclk_value = 0; 458762306a36Sopenharmony_ci table->ACPIState.level.sclk.sclk_value = 0; 458862306a36Sopenharmony_ci 458962306a36Sopenharmony_ci si_populate_mvdd_value(rdev, 0, &table->ACPIState.level.mvdd); 459062306a36Sopenharmony_ci 459162306a36Sopenharmony_ci if (eg_pi->dynamic_ac_timing) 459262306a36Sopenharmony_ci table->ACPIState.level.ACIndex = 0; 459362306a36Sopenharmony_ci 459462306a36Sopenharmony_ci table->ACPIState.level.dpm2.MaxPS = 0; 459562306a36Sopenharmony_ci table->ACPIState.level.dpm2.NearTDPDec = 0; 459662306a36Sopenharmony_ci table->ACPIState.level.dpm2.AboveSafeInc = 0; 459762306a36Sopenharmony_ci table->ACPIState.level.dpm2.BelowSafeInc = 0; 459862306a36Sopenharmony_ci table->ACPIState.level.dpm2.PwrEfficiencyRatio = 0; 459962306a36Sopenharmony_ci 460062306a36Sopenharmony_ci reg = MIN_POWER_MASK | MAX_POWER_MASK; 460162306a36Sopenharmony_ci table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg); 460262306a36Sopenharmony_ci 460362306a36Sopenharmony_ci reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK; 460462306a36Sopenharmony_ci table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg); 460562306a36Sopenharmony_ci 460662306a36Sopenharmony_ci return 0; 460762306a36Sopenharmony_ci} 460862306a36Sopenharmony_ci 460962306a36Sopenharmony_cistatic int si_populate_ulv_state(struct radeon_device *rdev, 461062306a36Sopenharmony_ci struct SISLANDS_SMC_SWSTATE_SINGLE *state) 461162306a36Sopenharmony_ci{ 461262306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 461362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 461462306a36Sopenharmony_ci struct si_ulv_param *ulv = &si_pi->ulv; 461562306a36Sopenharmony_ci u32 sclk_in_sr = 1350; /* ??? */ 461662306a36Sopenharmony_ci int ret; 461762306a36Sopenharmony_ci 461862306a36Sopenharmony_ci ret = si_convert_power_level_to_smc(rdev, &ulv->pl, 461962306a36Sopenharmony_ci &state->level); 462062306a36Sopenharmony_ci if (!ret) { 462162306a36Sopenharmony_ci if (eg_pi->sclk_deep_sleep) { 462262306a36Sopenharmony_ci if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ) 462362306a36Sopenharmony_ci state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS; 462462306a36Sopenharmony_ci else 462562306a36Sopenharmony_ci state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE; 462662306a36Sopenharmony_ci } 462762306a36Sopenharmony_ci if (ulv->one_pcie_lane_in_ulv) 462862306a36Sopenharmony_ci state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1; 462962306a36Sopenharmony_ci state->level.arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX); 463062306a36Sopenharmony_ci state->level.ACIndex = 1; 463162306a36Sopenharmony_ci state->level.std_vddc = state->level.vddc; 463262306a36Sopenharmony_ci state->levelCount = 1; 463362306a36Sopenharmony_ci 463462306a36Sopenharmony_ci state->flags |= PPSMC_SWSTATE_FLAG_DC; 463562306a36Sopenharmony_ci } 463662306a36Sopenharmony_ci 463762306a36Sopenharmony_ci return ret; 463862306a36Sopenharmony_ci} 463962306a36Sopenharmony_ci 464062306a36Sopenharmony_cistatic int si_program_ulv_memory_timing_parameters(struct radeon_device *rdev) 464162306a36Sopenharmony_ci{ 464262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 464362306a36Sopenharmony_ci struct si_ulv_param *ulv = &si_pi->ulv; 464462306a36Sopenharmony_ci SMC_SIslands_MCArbDramTimingRegisterSet arb_regs = { 0 }; 464562306a36Sopenharmony_ci int ret; 464662306a36Sopenharmony_ci 464762306a36Sopenharmony_ci ret = si_populate_memory_timing_parameters(rdev, &ulv->pl, 464862306a36Sopenharmony_ci &arb_regs); 464962306a36Sopenharmony_ci if (ret) 465062306a36Sopenharmony_ci return ret; 465162306a36Sopenharmony_ci 465262306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_ulv_volt_change_delay, 465362306a36Sopenharmony_ci ulv->volt_change_delay); 465462306a36Sopenharmony_ci 465562306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, 465662306a36Sopenharmony_ci si_pi->arb_table_start + 465762306a36Sopenharmony_ci offsetof(SMC_SIslands_MCArbDramTimingRegisters, data) + 465862306a36Sopenharmony_ci sizeof(SMC_SIslands_MCArbDramTimingRegisterSet) * SISLANDS_ULV_STATE_ARB_INDEX, 465962306a36Sopenharmony_ci (u8 *)&arb_regs, 466062306a36Sopenharmony_ci sizeof(SMC_SIslands_MCArbDramTimingRegisterSet), 466162306a36Sopenharmony_ci si_pi->sram_end); 466262306a36Sopenharmony_ci 466362306a36Sopenharmony_ci return ret; 466462306a36Sopenharmony_ci} 466562306a36Sopenharmony_ci 466662306a36Sopenharmony_cistatic void si_get_mvdd_configuration(struct radeon_device *rdev) 466762306a36Sopenharmony_ci{ 466862306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 466962306a36Sopenharmony_ci 467062306a36Sopenharmony_ci pi->mvdd_split_frequency = 30000; 467162306a36Sopenharmony_ci} 467262306a36Sopenharmony_ci 467362306a36Sopenharmony_cistatic int si_init_smc_table(struct radeon_device *rdev) 467462306a36Sopenharmony_ci{ 467562306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 467662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 467762306a36Sopenharmony_ci struct radeon_ps *radeon_boot_state = rdev->pm.dpm.boot_ps; 467862306a36Sopenharmony_ci const struct si_ulv_param *ulv = &si_pi->ulv; 467962306a36Sopenharmony_ci SISLANDS_SMC_STATETABLE *table = &si_pi->smc_statetable; 468062306a36Sopenharmony_ci int ret; 468162306a36Sopenharmony_ci u32 lane_width; 468262306a36Sopenharmony_ci u32 vr_hot_gpio; 468362306a36Sopenharmony_ci 468462306a36Sopenharmony_ci si_populate_smc_voltage_tables(rdev, table); 468562306a36Sopenharmony_ci 468662306a36Sopenharmony_ci switch (rdev->pm.int_thermal_type) { 468762306a36Sopenharmony_ci case THERMAL_TYPE_SI: 468862306a36Sopenharmony_ci case THERMAL_TYPE_EMC2103_WITH_INTERNAL: 468962306a36Sopenharmony_ci table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL; 469062306a36Sopenharmony_ci break; 469162306a36Sopenharmony_ci case THERMAL_TYPE_NONE: 469262306a36Sopenharmony_ci table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE; 469362306a36Sopenharmony_ci break; 469462306a36Sopenharmony_ci default: 469562306a36Sopenharmony_ci table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL; 469662306a36Sopenharmony_ci break; 469762306a36Sopenharmony_ci } 469862306a36Sopenharmony_ci 469962306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC) 470062306a36Sopenharmony_ci table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC; 470162306a36Sopenharmony_ci 470262306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT) { 470362306a36Sopenharmony_ci if ((rdev->pdev->device != 0x6818) && (rdev->pdev->device != 0x6819)) 470462306a36Sopenharmony_ci table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT; 470562306a36Sopenharmony_ci } 470662306a36Sopenharmony_ci 470762306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC) 470862306a36Sopenharmony_ci table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC; 470962306a36Sopenharmony_ci 471062306a36Sopenharmony_ci if (pi->mem_gddr5) 471162306a36Sopenharmony_ci table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5; 471262306a36Sopenharmony_ci 471362306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REVERT_GPIO5_POLARITY) 471462306a36Sopenharmony_ci table->extraFlags |= PPSMC_EXTRAFLAGS_AC2DC_GPIO5_POLARITY_HIGH; 471562306a36Sopenharmony_ci 471662306a36Sopenharmony_ci if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_VRHOT_GPIO_CONFIGURABLE) { 471762306a36Sopenharmony_ci table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT_PROG_GPIO; 471862306a36Sopenharmony_ci vr_hot_gpio = rdev->pm.dpm.backbias_response_time; 471962306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_vr_hot_gpio, 472062306a36Sopenharmony_ci vr_hot_gpio); 472162306a36Sopenharmony_ci } 472262306a36Sopenharmony_ci 472362306a36Sopenharmony_ci ret = si_populate_smc_initial_state(rdev, radeon_boot_state, table); 472462306a36Sopenharmony_ci if (ret) 472562306a36Sopenharmony_ci return ret; 472662306a36Sopenharmony_ci 472762306a36Sopenharmony_ci ret = si_populate_smc_acpi_state(rdev, table); 472862306a36Sopenharmony_ci if (ret) 472962306a36Sopenharmony_ci return ret; 473062306a36Sopenharmony_ci 473162306a36Sopenharmony_ci table->driverState.flags = table->initialState.flags; 473262306a36Sopenharmony_ci table->driverState.levelCount = table->initialState.levelCount; 473362306a36Sopenharmony_ci table->driverState.levels[0] = table->initialState.level; 473462306a36Sopenharmony_ci 473562306a36Sopenharmony_ci ret = si_do_program_memory_timing_parameters(rdev, radeon_boot_state, 473662306a36Sopenharmony_ci SISLANDS_INITIAL_STATE_ARB_INDEX); 473762306a36Sopenharmony_ci if (ret) 473862306a36Sopenharmony_ci return ret; 473962306a36Sopenharmony_ci 474062306a36Sopenharmony_ci if (ulv->supported && ulv->pl.vddc) { 474162306a36Sopenharmony_ci ret = si_populate_ulv_state(rdev, &table->ULVState); 474262306a36Sopenharmony_ci if (ret) 474362306a36Sopenharmony_ci return ret; 474462306a36Sopenharmony_ci 474562306a36Sopenharmony_ci ret = si_program_ulv_memory_timing_parameters(rdev); 474662306a36Sopenharmony_ci if (ret) 474762306a36Sopenharmony_ci return ret; 474862306a36Sopenharmony_ci 474962306a36Sopenharmony_ci WREG32(CG_ULV_CONTROL, ulv->cg_ulv_control); 475062306a36Sopenharmony_ci WREG32(CG_ULV_PARAMETER, ulv->cg_ulv_parameter); 475162306a36Sopenharmony_ci 475262306a36Sopenharmony_ci lane_width = radeon_get_pcie_lanes(rdev); 475362306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width); 475462306a36Sopenharmony_ci } else { 475562306a36Sopenharmony_ci table->ULVState = table->initialState; 475662306a36Sopenharmony_ci } 475762306a36Sopenharmony_ci 475862306a36Sopenharmony_ci return si_copy_bytes_to_smc(rdev, si_pi->state_table_start, 475962306a36Sopenharmony_ci (u8 *)table, sizeof(SISLANDS_SMC_STATETABLE), 476062306a36Sopenharmony_ci si_pi->sram_end); 476162306a36Sopenharmony_ci} 476262306a36Sopenharmony_ci 476362306a36Sopenharmony_cistatic int si_calculate_sclk_params(struct radeon_device *rdev, 476462306a36Sopenharmony_ci u32 engine_clock, 476562306a36Sopenharmony_ci SISLANDS_SMC_SCLK_VALUE *sclk) 476662306a36Sopenharmony_ci{ 476762306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 476862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 476962306a36Sopenharmony_ci struct atom_clock_dividers dividers; 477062306a36Sopenharmony_ci u32 spll_func_cntl = si_pi->clock_registers.cg_spll_func_cntl; 477162306a36Sopenharmony_ci u32 spll_func_cntl_2 = si_pi->clock_registers.cg_spll_func_cntl_2; 477262306a36Sopenharmony_ci u32 spll_func_cntl_3 = si_pi->clock_registers.cg_spll_func_cntl_3; 477362306a36Sopenharmony_ci u32 spll_func_cntl_4 = si_pi->clock_registers.cg_spll_func_cntl_4; 477462306a36Sopenharmony_ci u32 cg_spll_spread_spectrum = si_pi->clock_registers.cg_spll_spread_spectrum; 477562306a36Sopenharmony_ci u32 cg_spll_spread_spectrum_2 = si_pi->clock_registers.cg_spll_spread_spectrum_2; 477662306a36Sopenharmony_ci u64 tmp; 477762306a36Sopenharmony_ci u32 reference_clock = rdev->clock.spll.reference_freq; 477862306a36Sopenharmony_ci u32 reference_divider; 477962306a36Sopenharmony_ci u32 fbdiv; 478062306a36Sopenharmony_ci int ret; 478162306a36Sopenharmony_ci 478262306a36Sopenharmony_ci ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 478362306a36Sopenharmony_ci engine_clock, false, ÷rs); 478462306a36Sopenharmony_ci if (ret) 478562306a36Sopenharmony_ci return ret; 478662306a36Sopenharmony_ci 478762306a36Sopenharmony_ci reference_divider = 1 + dividers.ref_div; 478862306a36Sopenharmony_ci 478962306a36Sopenharmony_ci tmp = (u64) engine_clock * reference_divider * dividers.post_div * 16384; 479062306a36Sopenharmony_ci do_div(tmp, reference_clock); 479162306a36Sopenharmony_ci fbdiv = (u32) tmp; 479262306a36Sopenharmony_ci 479362306a36Sopenharmony_ci spll_func_cntl &= ~(SPLL_PDIV_A_MASK | SPLL_REF_DIV_MASK); 479462306a36Sopenharmony_ci spll_func_cntl |= SPLL_REF_DIV(dividers.ref_div); 479562306a36Sopenharmony_ci spll_func_cntl |= SPLL_PDIV_A(dividers.post_div); 479662306a36Sopenharmony_ci 479762306a36Sopenharmony_ci spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK; 479862306a36Sopenharmony_ci spll_func_cntl_2 |= SCLK_MUX_SEL(2); 479962306a36Sopenharmony_ci 480062306a36Sopenharmony_ci spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK; 480162306a36Sopenharmony_ci spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv); 480262306a36Sopenharmony_ci spll_func_cntl_3 |= SPLL_DITHEN; 480362306a36Sopenharmony_ci 480462306a36Sopenharmony_ci if (pi->sclk_ss) { 480562306a36Sopenharmony_ci struct radeon_atom_ss ss; 480662306a36Sopenharmony_ci u32 vco_freq = engine_clock * dividers.post_div; 480762306a36Sopenharmony_ci 480862306a36Sopenharmony_ci if (radeon_atombios_get_asic_ss_info(rdev, &ss, 480962306a36Sopenharmony_ci ASIC_INTERNAL_ENGINE_SS, vco_freq)) { 481062306a36Sopenharmony_ci u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate); 481162306a36Sopenharmony_ci u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000); 481262306a36Sopenharmony_ci 481362306a36Sopenharmony_ci cg_spll_spread_spectrum &= ~CLK_S_MASK; 481462306a36Sopenharmony_ci cg_spll_spread_spectrum |= CLK_S(clk_s); 481562306a36Sopenharmony_ci cg_spll_spread_spectrum |= SSEN; 481662306a36Sopenharmony_ci 481762306a36Sopenharmony_ci cg_spll_spread_spectrum_2 &= ~CLK_V_MASK; 481862306a36Sopenharmony_ci cg_spll_spread_spectrum_2 |= CLK_V(clk_v); 481962306a36Sopenharmony_ci } 482062306a36Sopenharmony_ci } 482162306a36Sopenharmony_ci 482262306a36Sopenharmony_ci sclk->sclk_value = engine_clock; 482362306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL = spll_func_cntl; 482462306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_2 = spll_func_cntl_2; 482562306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_3 = spll_func_cntl_3; 482662306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_4 = spll_func_cntl_4; 482762306a36Sopenharmony_ci sclk->vCG_SPLL_SPREAD_SPECTRUM = cg_spll_spread_spectrum; 482862306a36Sopenharmony_ci sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cg_spll_spread_spectrum_2; 482962306a36Sopenharmony_ci 483062306a36Sopenharmony_ci return 0; 483162306a36Sopenharmony_ci} 483262306a36Sopenharmony_ci 483362306a36Sopenharmony_cistatic int si_populate_sclk_value(struct radeon_device *rdev, 483462306a36Sopenharmony_ci u32 engine_clock, 483562306a36Sopenharmony_ci SISLANDS_SMC_SCLK_VALUE *sclk) 483662306a36Sopenharmony_ci{ 483762306a36Sopenharmony_ci SISLANDS_SMC_SCLK_VALUE sclk_tmp; 483862306a36Sopenharmony_ci int ret; 483962306a36Sopenharmony_ci 484062306a36Sopenharmony_ci ret = si_calculate_sclk_params(rdev, engine_clock, &sclk_tmp); 484162306a36Sopenharmony_ci if (!ret) { 484262306a36Sopenharmony_ci sclk->sclk_value = cpu_to_be32(sclk_tmp.sclk_value); 484362306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL); 484462306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_2); 484562306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_3); 484662306a36Sopenharmony_ci sclk->vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_4); 484762306a36Sopenharmony_ci sclk->vCG_SPLL_SPREAD_SPECTRUM = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM); 484862306a36Sopenharmony_ci sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM_2); 484962306a36Sopenharmony_ci } 485062306a36Sopenharmony_ci 485162306a36Sopenharmony_ci return ret; 485262306a36Sopenharmony_ci} 485362306a36Sopenharmony_ci 485462306a36Sopenharmony_cistatic int si_populate_mclk_value(struct radeon_device *rdev, 485562306a36Sopenharmony_ci u32 engine_clock, 485662306a36Sopenharmony_ci u32 memory_clock, 485762306a36Sopenharmony_ci SISLANDS_SMC_MCLK_VALUE *mclk, 485862306a36Sopenharmony_ci bool strobe_mode, 485962306a36Sopenharmony_ci bool dll_state_on) 486062306a36Sopenharmony_ci{ 486162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 486262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 486362306a36Sopenharmony_ci u32 dll_cntl = si_pi->clock_registers.dll_cntl; 486462306a36Sopenharmony_ci u32 mclk_pwrmgt_cntl = si_pi->clock_registers.mclk_pwrmgt_cntl; 486562306a36Sopenharmony_ci u32 mpll_ad_func_cntl = si_pi->clock_registers.mpll_ad_func_cntl; 486662306a36Sopenharmony_ci u32 mpll_dq_func_cntl = si_pi->clock_registers.mpll_dq_func_cntl; 486762306a36Sopenharmony_ci u32 mpll_func_cntl = si_pi->clock_registers.mpll_func_cntl; 486862306a36Sopenharmony_ci u32 mpll_func_cntl_1 = si_pi->clock_registers.mpll_func_cntl_1; 486962306a36Sopenharmony_ci u32 mpll_func_cntl_2 = si_pi->clock_registers.mpll_func_cntl_2; 487062306a36Sopenharmony_ci u32 mpll_ss1 = si_pi->clock_registers.mpll_ss1; 487162306a36Sopenharmony_ci u32 mpll_ss2 = si_pi->clock_registers.mpll_ss2; 487262306a36Sopenharmony_ci struct atom_mpll_param mpll_param; 487362306a36Sopenharmony_ci int ret; 487462306a36Sopenharmony_ci 487562306a36Sopenharmony_ci ret = radeon_atom_get_memory_pll_dividers(rdev, memory_clock, strobe_mode, &mpll_param); 487662306a36Sopenharmony_ci if (ret) 487762306a36Sopenharmony_ci return ret; 487862306a36Sopenharmony_ci 487962306a36Sopenharmony_ci mpll_func_cntl &= ~BWCTRL_MASK; 488062306a36Sopenharmony_ci mpll_func_cntl |= BWCTRL(mpll_param.bwcntl); 488162306a36Sopenharmony_ci 488262306a36Sopenharmony_ci mpll_func_cntl_1 &= ~(CLKF_MASK | CLKFRAC_MASK | VCO_MODE_MASK); 488362306a36Sopenharmony_ci mpll_func_cntl_1 |= CLKF(mpll_param.clkf) | 488462306a36Sopenharmony_ci CLKFRAC(mpll_param.clkfrac) | VCO_MODE(mpll_param.vco_mode); 488562306a36Sopenharmony_ci 488662306a36Sopenharmony_ci mpll_ad_func_cntl &= ~YCLK_POST_DIV_MASK; 488762306a36Sopenharmony_ci mpll_ad_func_cntl |= YCLK_POST_DIV(mpll_param.post_div); 488862306a36Sopenharmony_ci 488962306a36Sopenharmony_ci if (pi->mem_gddr5) { 489062306a36Sopenharmony_ci mpll_dq_func_cntl &= ~(YCLK_SEL_MASK | YCLK_POST_DIV_MASK); 489162306a36Sopenharmony_ci mpll_dq_func_cntl |= YCLK_SEL(mpll_param.yclk_sel) | 489262306a36Sopenharmony_ci YCLK_POST_DIV(mpll_param.post_div); 489362306a36Sopenharmony_ci } 489462306a36Sopenharmony_ci 489562306a36Sopenharmony_ci if (pi->mclk_ss) { 489662306a36Sopenharmony_ci struct radeon_atom_ss ss; 489762306a36Sopenharmony_ci u32 freq_nom; 489862306a36Sopenharmony_ci u32 tmp; 489962306a36Sopenharmony_ci u32 reference_clock = rdev->clock.mpll.reference_freq; 490062306a36Sopenharmony_ci 490162306a36Sopenharmony_ci if (pi->mem_gddr5) 490262306a36Sopenharmony_ci freq_nom = memory_clock * 4; 490362306a36Sopenharmony_ci else 490462306a36Sopenharmony_ci freq_nom = memory_clock * 2; 490562306a36Sopenharmony_ci 490662306a36Sopenharmony_ci tmp = freq_nom / reference_clock; 490762306a36Sopenharmony_ci tmp = tmp * tmp; 490862306a36Sopenharmony_ci if (radeon_atombios_get_asic_ss_info(rdev, &ss, 490962306a36Sopenharmony_ci ASIC_INTERNAL_MEMORY_SS, freq_nom)) { 491062306a36Sopenharmony_ci u32 clks = reference_clock * 5 / ss.rate; 491162306a36Sopenharmony_ci u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom); 491262306a36Sopenharmony_ci 491362306a36Sopenharmony_ci mpll_ss1 &= ~CLKV_MASK; 491462306a36Sopenharmony_ci mpll_ss1 |= CLKV(clkv); 491562306a36Sopenharmony_ci 491662306a36Sopenharmony_ci mpll_ss2 &= ~CLKS_MASK; 491762306a36Sopenharmony_ci mpll_ss2 |= CLKS(clks); 491862306a36Sopenharmony_ci } 491962306a36Sopenharmony_ci } 492062306a36Sopenharmony_ci 492162306a36Sopenharmony_ci mclk_pwrmgt_cntl &= ~DLL_SPEED_MASK; 492262306a36Sopenharmony_ci mclk_pwrmgt_cntl |= DLL_SPEED(mpll_param.dll_speed); 492362306a36Sopenharmony_ci 492462306a36Sopenharmony_ci if (dll_state_on) 492562306a36Sopenharmony_ci mclk_pwrmgt_cntl |= MRDCK0_PDNB | MRDCK1_PDNB; 492662306a36Sopenharmony_ci else 492762306a36Sopenharmony_ci mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB); 492862306a36Sopenharmony_ci 492962306a36Sopenharmony_ci mclk->mclk_value = cpu_to_be32(memory_clock); 493062306a36Sopenharmony_ci mclk->vMPLL_FUNC_CNTL = cpu_to_be32(mpll_func_cntl); 493162306a36Sopenharmony_ci mclk->vMPLL_FUNC_CNTL_1 = cpu_to_be32(mpll_func_cntl_1); 493262306a36Sopenharmony_ci mclk->vMPLL_FUNC_CNTL_2 = cpu_to_be32(mpll_func_cntl_2); 493362306a36Sopenharmony_ci mclk->vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl); 493462306a36Sopenharmony_ci mclk->vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl); 493562306a36Sopenharmony_ci mclk->vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl); 493662306a36Sopenharmony_ci mclk->vDLL_CNTL = cpu_to_be32(dll_cntl); 493762306a36Sopenharmony_ci mclk->vMPLL_SS = cpu_to_be32(mpll_ss1); 493862306a36Sopenharmony_ci mclk->vMPLL_SS2 = cpu_to_be32(mpll_ss2); 493962306a36Sopenharmony_ci 494062306a36Sopenharmony_ci return 0; 494162306a36Sopenharmony_ci} 494262306a36Sopenharmony_ci 494362306a36Sopenharmony_cistatic void si_populate_smc_sp(struct radeon_device *rdev, 494462306a36Sopenharmony_ci struct radeon_ps *radeon_state, 494562306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state) 494662306a36Sopenharmony_ci{ 494762306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(radeon_state); 494862306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 494962306a36Sopenharmony_ci int i; 495062306a36Sopenharmony_ci 495162306a36Sopenharmony_ci for (i = 0; i < ps->performance_level_count - 1; i++) 495262306a36Sopenharmony_ci smc_state->levels[i].bSP = cpu_to_be32(pi->dsp); 495362306a36Sopenharmony_ci 495462306a36Sopenharmony_ci smc_state->levels[ps->performance_level_count - 1].bSP = 495562306a36Sopenharmony_ci cpu_to_be32(pi->psp); 495662306a36Sopenharmony_ci} 495762306a36Sopenharmony_ci 495862306a36Sopenharmony_cistatic int si_convert_power_level_to_smc(struct radeon_device *rdev, 495962306a36Sopenharmony_ci struct rv7xx_pl *pl, 496062306a36Sopenharmony_ci SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level) 496162306a36Sopenharmony_ci{ 496262306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 496362306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 496462306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 496562306a36Sopenharmony_ci int ret; 496662306a36Sopenharmony_ci bool dll_state_on; 496762306a36Sopenharmony_ci u16 std_vddc; 496862306a36Sopenharmony_ci bool gmc_pg = false; 496962306a36Sopenharmony_ci 497062306a36Sopenharmony_ci if (eg_pi->pcie_performance_request && 497162306a36Sopenharmony_ci (si_pi->force_pcie_gen != RADEON_PCIE_GEN_INVALID)) 497262306a36Sopenharmony_ci level->gen2PCIE = (u8)si_pi->force_pcie_gen; 497362306a36Sopenharmony_ci else 497462306a36Sopenharmony_ci level->gen2PCIE = (u8)pl->pcie_gen; 497562306a36Sopenharmony_ci 497662306a36Sopenharmony_ci ret = si_populate_sclk_value(rdev, pl->sclk, &level->sclk); 497762306a36Sopenharmony_ci if (ret) 497862306a36Sopenharmony_ci return ret; 497962306a36Sopenharmony_ci 498062306a36Sopenharmony_ci level->mcFlags = 0; 498162306a36Sopenharmony_ci 498262306a36Sopenharmony_ci if (pi->mclk_stutter_mode_threshold && 498362306a36Sopenharmony_ci (pl->mclk <= pi->mclk_stutter_mode_threshold) && 498462306a36Sopenharmony_ci !eg_pi->uvd_enabled && 498562306a36Sopenharmony_ci (RREG32(DPG_PIPE_STUTTER_CONTROL) & STUTTER_ENABLE) && 498662306a36Sopenharmony_ci (rdev->pm.dpm.new_active_crtc_count <= 2)) { 498762306a36Sopenharmony_ci level->mcFlags |= SISLANDS_SMC_MC_STUTTER_EN; 498862306a36Sopenharmony_ci 498962306a36Sopenharmony_ci if (gmc_pg) 499062306a36Sopenharmony_ci level->mcFlags |= SISLANDS_SMC_MC_PG_EN; 499162306a36Sopenharmony_ci } 499262306a36Sopenharmony_ci 499362306a36Sopenharmony_ci if (pi->mem_gddr5) { 499462306a36Sopenharmony_ci if (pl->mclk > pi->mclk_edc_enable_threshold) 499562306a36Sopenharmony_ci level->mcFlags |= SISLANDS_SMC_MC_EDC_RD_FLAG; 499662306a36Sopenharmony_ci 499762306a36Sopenharmony_ci if (pl->mclk > eg_pi->mclk_edc_wr_enable_threshold) 499862306a36Sopenharmony_ci level->mcFlags |= SISLANDS_SMC_MC_EDC_WR_FLAG; 499962306a36Sopenharmony_ci 500062306a36Sopenharmony_ci level->strobeMode = si_get_strobe_mode_settings(rdev, pl->mclk); 500162306a36Sopenharmony_ci 500262306a36Sopenharmony_ci if (level->strobeMode & SISLANDS_SMC_STROBE_ENABLE) { 500362306a36Sopenharmony_ci if (si_get_mclk_frequency_ratio(pl->mclk, true) >= 500462306a36Sopenharmony_ci ((RREG32(MC_SEQ_MISC7) >> 16) & 0xf)) 500562306a36Sopenharmony_ci dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false; 500662306a36Sopenharmony_ci else 500762306a36Sopenharmony_ci dll_state_on = ((RREG32(MC_SEQ_MISC6) >> 1) & 0x1) ? true : false; 500862306a36Sopenharmony_ci } else { 500962306a36Sopenharmony_ci dll_state_on = false; 501062306a36Sopenharmony_ci } 501162306a36Sopenharmony_ci } else { 501262306a36Sopenharmony_ci level->strobeMode = si_get_strobe_mode_settings(rdev, 501362306a36Sopenharmony_ci pl->mclk); 501462306a36Sopenharmony_ci 501562306a36Sopenharmony_ci dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false; 501662306a36Sopenharmony_ci } 501762306a36Sopenharmony_ci 501862306a36Sopenharmony_ci ret = si_populate_mclk_value(rdev, 501962306a36Sopenharmony_ci pl->sclk, 502062306a36Sopenharmony_ci pl->mclk, 502162306a36Sopenharmony_ci &level->mclk, 502262306a36Sopenharmony_ci (level->strobeMode & SISLANDS_SMC_STROBE_ENABLE) != 0, dll_state_on); 502362306a36Sopenharmony_ci if (ret) 502462306a36Sopenharmony_ci return ret; 502562306a36Sopenharmony_ci 502662306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, 502762306a36Sopenharmony_ci &eg_pi->vddc_voltage_table, 502862306a36Sopenharmony_ci pl->vddc, &level->vddc); 502962306a36Sopenharmony_ci if (ret) 503062306a36Sopenharmony_ci return ret; 503162306a36Sopenharmony_ci 503262306a36Sopenharmony_ci 503362306a36Sopenharmony_ci ret = si_get_std_voltage_value(rdev, &level->vddc, &std_vddc); 503462306a36Sopenharmony_ci if (ret) 503562306a36Sopenharmony_ci return ret; 503662306a36Sopenharmony_ci 503762306a36Sopenharmony_ci ret = si_populate_std_voltage_value(rdev, std_vddc, 503862306a36Sopenharmony_ci level->vddc.index, &level->std_vddc); 503962306a36Sopenharmony_ci if (ret) 504062306a36Sopenharmony_ci return ret; 504162306a36Sopenharmony_ci 504262306a36Sopenharmony_ci if (eg_pi->vddci_control) { 504362306a36Sopenharmony_ci ret = si_populate_voltage_value(rdev, &eg_pi->vddci_voltage_table, 504462306a36Sopenharmony_ci pl->vddci, &level->vddci); 504562306a36Sopenharmony_ci if (ret) 504662306a36Sopenharmony_ci return ret; 504762306a36Sopenharmony_ci } 504862306a36Sopenharmony_ci 504962306a36Sopenharmony_ci if (si_pi->vddc_phase_shed_control) { 505062306a36Sopenharmony_ci ret = si_populate_phase_shedding_value(rdev, 505162306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.phase_shedding_limits_table, 505262306a36Sopenharmony_ci pl->vddc, 505362306a36Sopenharmony_ci pl->sclk, 505462306a36Sopenharmony_ci pl->mclk, 505562306a36Sopenharmony_ci &level->vddc); 505662306a36Sopenharmony_ci if (ret) 505762306a36Sopenharmony_ci return ret; 505862306a36Sopenharmony_ci } 505962306a36Sopenharmony_ci 506062306a36Sopenharmony_ci level->MaxPoweredUpCU = si_pi->max_cu; 506162306a36Sopenharmony_ci 506262306a36Sopenharmony_ci ret = si_populate_mvdd_value(rdev, pl->mclk, &level->mvdd); 506362306a36Sopenharmony_ci 506462306a36Sopenharmony_ci return ret; 506562306a36Sopenharmony_ci} 506662306a36Sopenharmony_ci 506762306a36Sopenharmony_cistatic int si_populate_smc_t(struct radeon_device *rdev, 506862306a36Sopenharmony_ci struct radeon_ps *radeon_state, 506962306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state) 507062306a36Sopenharmony_ci{ 507162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 507262306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 507362306a36Sopenharmony_ci u32 a_t; 507462306a36Sopenharmony_ci u32 t_l, t_h; 507562306a36Sopenharmony_ci u32 high_bsp; 507662306a36Sopenharmony_ci int i, ret; 507762306a36Sopenharmony_ci 507862306a36Sopenharmony_ci if (state->performance_level_count >= 9) 507962306a36Sopenharmony_ci return -EINVAL; 508062306a36Sopenharmony_ci 508162306a36Sopenharmony_ci if (state->performance_level_count < 2) { 508262306a36Sopenharmony_ci a_t = CG_R(0xffff) | CG_L(0); 508362306a36Sopenharmony_ci smc_state->levels[0].aT = cpu_to_be32(a_t); 508462306a36Sopenharmony_ci return 0; 508562306a36Sopenharmony_ci } 508662306a36Sopenharmony_ci 508762306a36Sopenharmony_ci smc_state->levels[0].aT = cpu_to_be32(0); 508862306a36Sopenharmony_ci 508962306a36Sopenharmony_ci for (i = 0; i <= state->performance_level_count - 2; i++) { 509062306a36Sopenharmony_ci ret = r600_calculate_at( 509162306a36Sopenharmony_ci (50 / SISLANDS_MAX_HARDWARE_POWERLEVELS) * 100 * (i + 1), 509262306a36Sopenharmony_ci 100 * R600_AH_DFLT, 509362306a36Sopenharmony_ci state->performance_levels[i + 1].sclk, 509462306a36Sopenharmony_ci state->performance_levels[i].sclk, 509562306a36Sopenharmony_ci &t_l, 509662306a36Sopenharmony_ci &t_h); 509762306a36Sopenharmony_ci 509862306a36Sopenharmony_ci if (ret) { 509962306a36Sopenharmony_ci t_h = (i + 1) * 1000 - 50 * R600_AH_DFLT; 510062306a36Sopenharmony_ci t_l = (i + 1) * 1000 + 50 * R600_AH_DFLT; 510162306a36Sopenharmony_ci } 510262306a36Sopenharmony_ci 510362306a36Sopenharmony_ci a_t = be32_to_cpu(smc_state->levels[i].aT) & ~CG_R_MASK; 510462306a36Sopenharmony_ci a_t |= CG_R(t_l * pi->bsp / 20000); 510562306a36Sopenharmony_ci smc_state->levels[i].aT = cpu_to_be32(a_t); 510662306a36Sopenharmony_ci 510762306a36Sopenharmony_ci high_bsp = (i == state->performance_level_count - 2) ? 510862306a36Sopenharmony_ci pi->pbsp : pi->bsp; 510962306a36Sopenharmony_ci a_t = CG_R(0xffff) | CG_L(t_h * high_bsp / 20000); 511062306a36Sopenharmony_ci smc_state->levels[i + 1].aT = cpu_to_be32(a_t); 511162306a36Sopenharmony_ci } 511262306a36Sopenharmony_ci 511362306a36Sopenharmony_ci return 0; 511462306a36Sopenharmony_ci} 511562306a36Sopenharmony_ci 511662306a36Sopenharmony_cistatic int si_disable_ulv(struct radeon_device *rdev) 511762306a36Sopenharmony_ci{ 511862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 511962306a36Sopenharmony_ci struct si_ulv_param *ulv = &si_pi->ulv; 512062306a36Sopenharmony_ci 512162306a36Sopenharmony_ci if (ulv->supported) 512262306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) == PPSMC_Result_OK) ? 512362306a36Sopenharmony_ci 0 : -EINVAL; 512462306a36Sopenharmony_ci 512562306a36Sopenharmony_ci return 0; 512662306a36Sopenharmony_ci} 512762306a36Sopenharmony_ci 512862306a36Sopenharmony_cistatic bool si_is_state_ulv_compatible(struct radeon_device *rdev, 512962306a36Sopenharmony_ci struct radeon_ps *radeon_state) 513062306a36Sopenharmony_ci{ 513162306a36Sopenharmony_ci const struct si_power_info *si_pi = si_get_pi(rdev); 513262306a36Sopenharmony_ci const struct si_ulv_param *ulv = &si_pi->ulv; 513362306a36Sopenharmony_ci const struct ni_ps *state = ni_get_ps(radeon_state); 513462306a36Sopenharmony_ci int i; 513562306a36Sopenharmony_ci 513662306a36Sopenharmony_ci if (state->performance_levels[0].mclk != ulv->pl.mclk) 513762306a36Sopenharmony_ci return false; 513862306a36Sopenharmony_ci 513962306a36Sopenharmony_ci /* XXX validate against display requirements! */ 514062306a36Sopenharmony_ci 514162306a36Sopenharmony_ci for (i = 0; i < rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count; i++) { 514262306a36Sopenharmony_ci if (rdev->clock.current_dispclk <= 514362306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].clk) { 514462306a36Sopenharmony_ci if (ulv->pl.vddc < 514562306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].v) 514662306a36Sopenharmony_ci return false; 514762306a36Sopenharmony_ci } 514862306a36Sopenharmony_ci } 514962306a36Sopenharmony_ci 515062306a36Sopenharmony_ci if ((radeon_state->vclk != 0) || (radeon_state->dclk != 0)) 515162306a36Sopenharmony_ci return false; 515262306a36Sopenharmony_ci 515362306a36Sopenharmony_ci return true; 515462306a36Sopenharmony_ci} 515562306a36Sopenharmony_ci 515662306a36Sopenharmony_cistatic int si_set_power_state_conditionally_enable_ulv(struct radeon_device *rdev, 515762306a36Sopenharmony_ci struct radeon_ps *radeon_new_state) 515862306a36Sopenharmony_ci{ 515962306a36Sopenharmony_ci const struct si_power_info *si_pi = si_get_pi(rdev); 516062306a36Sopenharmony_ci const struct si_ulv_param *ulv = &si_pi->ulv; 516162306a36Sopenharmony_ci 516262306a36Sopenharmony_ci if (ulv->supported) { 516362306a36Sopenharmony_ci if (si_is_state_ulv_compatible(rdev, radeon_new_state)) 516462306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) == PPSMC_Result_OK) ? 516562306a36Sopenharmony_ci 0 : -EINVAL; 516662306a36Sopenharmony_ci } 516762306a36Sopenharmony_ci return 0; 516862306a36Sopenharmony_ci} 516962306a36Sopenharmony_ci 517062306a36Sopenharmony_cistatic int si_convert_power_state_to_smc(struct radeon_device *rdev, 517162306a36Sopenharmony_ci struct radeon_ps *radeon_state, 517262306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state) 517362306a36Sopenharmony_ci{ 517462306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 517562306a36Sopenharmony_ci struct ni_power_info *ni_pi = ni_get_pi(rdev); 517662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 517762306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 517862306a36Sopenharmony_ci int i, ret; 517962306a36Sopenharmony_ci u32 threshold; 518062306a36Sopenharmony_ci u32 sclk_in_sr = 1350; /* ??? */ 518162306a36Sopenharmony_ci 518262306a36Sopenharmony_ci if (state->performance_level_count > SISLANDS_MAX_HARDWARE_POWERLEVELS) 518362306a36Sopenharmony_ci return -EINVAL; 518462306a36Sopenharmony_ci 518562306a36Sopenharmony_ci threshold = state->performance_levels[state->performance_level_count-1].sclk * 100 / 100; 518662306a36Sopenharmony_ci 518762306a36Sopenharmony_ci if (radeon_state->vclk && radeon_state->dclk) { 518862306a36Sopenharmony_ci eg_pi->uvd_enabled = true; 518962306a36Sopenharmony_ci if (eg_pi->smu_uvd_hs) 519062306a36Sopenharmony_ci smc_state->flags |= PPSMC_SWSTATE_FLAG_UVD; 519162306a36Sopenharmony_ci } else { 519262306a36Sopenharmony_ci eg_pi->uvd_enabled = false; 519362306a36Sopenharmony_ci } 519462306a36Sopenharmony_ci 519562306a36Sopenharmony_ci if (state->dc_compatible) 519662306a36Sopenharmony_ci smc_state->flags |= PPSMC_SWSTATE_FLAG_DC; 519762306a36Sopenharmony_ci 519862306a36Sopenharmony_ci smc_state->levelCount = 0; 519962306a36Sopenharmony_ci for (i = 0; i < state->performance_level_count; i++) { 520062306a36Sopenharmony_ci if (eg_pi->sclk_deep_sleep) { 520162306a36Sopenharmony_ci if ((i == 0) || si_pi->sclk_deep_sleep_above_low) { 520262306a36Sopenharmony_ci if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ) 520362306a36Sopenharmony_ci smc_state->levels[i].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS; 520462306a36Sopenharmony_ci else 520562306a36Sopenharmony_ci smc_state->levels[i].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE; 520662306a36Sopenharmony_ci } 520762306a36Sopenharmony_ci } 520862306a36Sopenharmony_ci 520962306a36Sopenharmony_ci ret = si_convert_power_level_to_smc(rdev, &state->performance_levels[i], 521062306a36Sopenharmony_ci &smc_state->levels[i]); 521162306a36Sopenharmony_ci smc_state->levels[i].arbRefreshState = 521262306a36Sopenharmony_ci (u8)(SISLANDS_DRIVER_STATE_ARB_INDEX + i); 521362306a36Sopenharmony_ci 521462306a36Sopenharmony_ci if (ret) 521562306a36Sopenharmony_ci return ret; 521662306a36Sopenharmony_ci 521762306a36Sopenharmony_ci if (ni_pi->enable_power_containment) 521862306a36Sopenharmony_ci smc_state->levels[i].displayWatermark = 521962306a36Sopenharmony_ci (state->performance_levels[i].sclk < threshold) ? 522062306a36Sopenharmony_ci PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH; 522162306a36Sopenharmony_ci else 522262306a36Sopenharmony_ci smc_state->levels[i].displayWatermark = (i < 2) ? 522362306a36Sopenharmony_ci PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH; 522462306a36Sopenharmony_ci 522562306a36Sopenharmony_ci if (eg_pi->dynamic_ac_timing) 522662306a36Sopenharmony_ci smc_state->levels[i].ACIndex = SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i; 522762306a36Sopenharmony_ci else 522862306a36Sopenharmony_ci smc_state->levels[i].ACIndex = 0; 522962306a36Sopenharmony_ci 523062306a36Sopenharmony_ci smc_state->levelCount++; 523162306a36Sopenharmony_ci } 523262306a36Sopenharmony_ci 523362306a36Sopenharmony_ci si_write_smc_soft_register(rdev, 523462306a36Sopenharmony_ci SI_SMC_SOFT_REGISTER_watermark_threshold, 523562306a36Sopenharmony_ci threshold / 512); 523662306a36Sopenharmony_ci 523762306a36Sopenharmony_ci si_populate_smc_sp(rdev, radeon_state, smc_state); 523862306a36Sopenharmony_ci 523962306a36Sopenharmony_ci ret = si_populate_power_containment_values(rdev, radeon_state, smc_state); 524062306a36Sopenharmony_ci if (ret) 524162306a36Sopenharmony_ci ni_pi->enable_power_containment = false; 524262306a36Sopenharmony_ci 524362306a36Sopenharmony_ci ret = si_populate_sq_ramping_values(rdev, radeon_state, smc_state); 524462306a36Sopenharmony_ci if (ret) 524562306a36Sopenharmony_ci ni_pi->enable_sq_ramping = false; 524662306a36Sopenharmony_ci 524762306a36Sopenharmony_ci return si_populate_smc_t(rdev, radeon_state, smc_state); 524862306a36Sopenharmony_ci} 524962306a36Sopenharmony_ci 525062306a36Sopenharmony_cistatic int si_upload_sw_state(struct radeon_device *rdev, 525162306a36Sopenharmony_ci struct radeon_ps *radeon_new_state) 525262306a36Sopenharmony_ci{ 525362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 525462306a36Sopenharmony_ci struct ni_ps *new_state = ni_get_ps(radeon_new_state); 525562306a36Sopenharmony_ci int ret; 525662306a36Sopenharmony_ci u32 address = si_pi->state_table_start + 525762306a36Sopenharmony_ci offsetof(SISLANDS_SMC_STATETABLE, driverState); 525862306a36Sopenharmony_ci SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.driverState; 525962306a36Sopenharmony_ci size_t state_size = struct_size(smc_state, levels, 526062306a36Sopenharmony_ci new_state->performance_level_count); 526162306a36Sopenharmony_ci 526262306a36Sopenharmony_ci memset(smc_state, 0, state_size); 526362306a36Sopenharmony_ci 526462306a36Sopenharmony_ci ret = si_convert_power_state_to_smc(rdev, radeon_new_state, smc_state); 526562306a36Sopenharmony_ci if (ret) 526662306a36Sopenharmony_ci return ret; 526762306a36Sopenharmony_ci 526862306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, address, (u8 *)smc_state, 526962306a36Sopenharmony_ci state_size, si_pi->sram_end); 527062306a36Sopenharmony_ci 527162306a36Sopenharmony_ci return ret; 527262306a36Sopenharmony_ci} 527362306a36Sopenharmony_ci 527462306a36Sopenharmony_cistatic int si_upload_ulv_state(struct radeon_device *rdev) 527562306a36Sopenharmony_ci{ 527662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 527762306a36Sopenharmony_ci struct si_ulv_param *ulv = &si_pi->ulv; 527862306a36Sopenharmony_ci int ret = 0; 527962306a36Sopenharmony_ci 528062306a36Sopenharmony_ci if (ulv->supported && ulv->pl.vddc) { 528162306a36Sopenharmony_ci u32 address = si_pi->state_table_start + 528262306a36Sopenharmony_ci offsetof(SISLANDS_SMC_STATETABLE, ULVState); 528362306a36Sopenharmony_ci struct SISLANDS_SMC_SWSTATE_SINGLE *smc_state = &si_pi->smc_statetable.ULVState; 528462306a36Sopenharmony_ci u32 state_size = sizeof(struct SISLANDS_SMC_SWSTATE_SINGLE); 528562306a36Sopenharmony_ci 528662306a36Sopenharmony_ci memset(smc_state, 0, state_size); 528762306a36Sopenharmony_ci 528862306a36Sopenharmony_ci ret = si_populate_ulv_state(rdev, smc_state); 528962306a36Sopenharmony_ci if (!ret) 529062306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, address, (u8 *)smc_state, 529162306a36Sopenharmony_ci state_size, si_pi->sram_end); 529262306a36Sopenharmony_ci } 529362306a36Sopenharmony_ci 529462306a36Sopenharmony_ci return ret; 529562306a36Sopenharmony_ci} 529662306a36Sopenharmony_ci 529762306a36Sopenharmony_cistatic int si_upload_smc_data(struct radeon_device *rdev) 529862306a36Sopenharmony_ci{ 529962306a36Sopenharmony_ci struct radeon_crtc *radeon_crtc = NULL; 530062306a36Sopenharmony_ci int i; 530162306a36Sopenharmony_ci 530262306a36Sopenharmony_ci if (rdev->pm.dpm.new_active_crtc_count == 0) 530362306a36Sopenharmony_ci return 0; 530462306a36Sopenharmony_ci 530562306a36Sopenharmony_ci for (i = 0; i < rdev->num_crtc; i++) { 530662306a36Sopenharmony_ci if (rdev->pm.dpm.new_active_crtcs & (1 << i)) { 530762306a36Sopenharmony_ci radeon_crtc = rdev->mode_info.crtcs[i]; 530862306a36Sopenharmony_ci break; 530962306a36Sopenharmony_ci } 531062306a36Sopenharmony_ci } 531162306a36Sopenharmony_ci 531262306a36Sopenharmony_ci if (radeon_crtc == NULL) 531362306a36Sopenharmony_ci return 0; 531462306a36Sopenharmony_ci 531562306a36Sopenharmony_ci if (radeon_crtc->line_time <= 0) 531662306a36Sopenharmony_ci return 0; 531762306a36Sopenharmony_ci 531862306a36Sopenharmony_ci if (si_write_smc_soft_register(rdev, 531962306a36Sopenharmony_ci SI_SMC_SOFT_REGISTER_crtc_index, 532062306a36Sopenharmony_ci radeon_crtc->crtc_id) != PPSMC_Result_OK) 532162306a36Sopenharmony_ci return 0; 532262306a36Sopenharmony_ci 532362306a36Sopenharmony_ci if (si_write_smc_soft_register(rdev, 532462306a36Sopenharmony_ci SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min, 532562306a36Sopenharmony_ci radeon_crtc->wm_high / radeon_crtc->line_time) != PPSMC_Result_OK) 532662306a36Sopenharmony_ci return 0; 532762306a36Sopenharmony_ci 532862306a36Sopenharmony_ci if (si_write_smc_soft_register(rdev, 532962306a36Sopenharmony_ci SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max, 533062306a36Sopenharmony_ci radeon_crtc->wm_low / radeon_crtc->line_time) != PPSMC_Result_OK) 533162306a36Sopenharmony_ci return 0; 533262306a36Sopenharmony_ci 533362306a36Sopenharmony_ci return 0; 533462306a36Sopenharmony_ci} 533562306a36Sopenharmony_ci 533662306a36Sopenharmony_cistatic int si_set_mc_special_registers(struct radeon_device *rdev, 533762306a36Sopenharmony_ci struct si_mc_reg_table *table) 533862306a36Sopenharmony_ci{ 533962306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 534062306a36Sopenharmony_ci u8 i, j, k; 534162306a36Sopenharmony_ci u32 temp_reg; 534262306a36Sopenharmony_ci 534362306a36Sopenharmony_ci for (i = 0, j = table->last; i < table->last; i++) { 534462306a36Sopenharmony_ci if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 534562306a36Sopenharmony_ci return -EINVAL; 534662306a36Sopenharmony_ci switch (table->mc_reg_address[i].s1 << 2) { 534762306a36Sopenharmony_ci case MC_SEQ_MISC1: 534862306a36Sopenharmony_ci temp_reg = RREG32(MC_PMG_CMD_EMRS); 534962306a36Sopenharmony_ci table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2; 535062306a36Sopenharmony_ci table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2; 535162306a36Sopenharmony_ci for (k = 0; k < table->num_entries; k++) 535262306a36Sopenharmony_ci table->mc_reg_table_entry[k].mc_data[j] = 535362306a36Sopenharmony_ci ((temp_reg & 0xffff0000)) | 535462306a36Sopenharmony_ci ((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16); 535562306a36Sopenharmony_ci j++; 535662306a36Sopenharmony_ci if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 535762306a36Sopenharmony_ci return -EINVAL; 535862306a36Sopenharmony_ci 535962306a36Sopenharmony_ci temp_reg = RREG32(MC_PMG_CMD_MRS); 536062306a36Sopenharmony_ci table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2; 536162306a36Sopenharmony_ci table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2; 536262306a36Sopenharmony_ci for (k = 0; k < table->num_entries; k++) { 536362306a36Sopenharmony_ci table->mc_reg_table_entry[k].mc_data[j] = 536462306a36Sopenharmony_ci (temp_reg & 0xffff0000) | 536562306a36Sopenharmony_ci (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff); 536662306a36Sopenharmony_ci if (!pi->mem_gddr5) 536762306a36Sopenharmony_ci table->mc_reg_table_entry[k].mc_data[j] |= 0x100; 536862306a36Sopenharmony_ci } 536962306a36Sopenharmony_ci j++; 537062306a36Sopenharmony_ci if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 537162306a36Sopenharmony_ci return -EINVAL; 537262306a36Sopenharmony_ci 537362306a36Sopenharmony_ci if (!pi->mem_gddr5) { 537462306a36Sopenharmony_ci table->mc_reg_address[j].s1 = MC_PMG_AUTO_CMD >> 2; 537562306a36Sopenharmony_ci table->mc_reg_address[j].s0 = MC_PMG_AUTO_CMD >> 2; 537662306a36Sopenharmony_ci for (k = 0; k < table->num_entries; k++) 537762306a36Sopenharmony_ci table->mc_reg_table_entry[k].mc_data[j] = 537862306a36Sopenharmony_ci (table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16; 537962306a36Sopenharmony_ci j++; 538062306a36Sopenharmony_ci if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 538162306a36Sopenharmony_ci return -EINVAL; 538262306a36Sopenharmony_ci } 538362306a36Sopenharmony_ci break; 538462306a36Sopenharmony_ci case MC_SEQ_RESERVE_M: 538562306a36Sopenharmony_ci temp_reg = RREG32(MC_PMG_CMD_MRS1); 538662306a36Sopenharmony_ci table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2; 538762306a36Sopenharmony_ci table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2; 538862306a36Sopenharmony_ci for(k = 0; k < table->num_entries; k++) 538962306a36Sopenharmony_ci table->mc_reg_table_entry[k].mc_data[j] = 539062306a36Sopenharmony_ci (temp_reg & 0xffff0000) | 539162306a36Sopenharmony_ci (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff); 539262306a36Sopenharmony_ci j++; 539362306a36Sopenharmony_ci if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 539462306a36Sopenharmony_ci return -EINVAL; 539562306a36Sopenharmony_ci break; 539662306a36Sopenharmony_ci default: 539762306a36Sopenharmony_ci break; 539862306a36Sopenharmony_ci } 539962306a36Sopenharmony_ci } 540062306a36Sopenharmony_ci 540162306a36Sopenharmony_ci table->last = j; 540262306a36Sopenharmony_ci 540362306a36Sopenharmony_ci return 0; 540462306a36Sopenharmony_ci} 540562306a36Sopenharmony_ci 540662306a36Sopenharmony_cistatic bool si_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg) 540762306a36Sopenharmony_ci{ 540862306a36Sopenharmony_ci bool result = true; 540962306a36Sopenharmony_ci 541062306a36Sopenharmony_ci switch (in_reg) { 541162306a36Sopenharmony_ci case MC_SEQ_RAS_TIMING >> 2: 541262306a36Sopenharmony_ci *out_reg = MC_SEQ_RAS_TIMING_LP >> 2; 541362306a36Sopenharmony_ci break; 541462306a36Sopenharmony_ci case MC_SEQ_CAS_TIMING >> 2: 541562306a36Sopenharmony_ci *out_reg = MC_SEQ_CAS_TIMING_LP >> 2; 541662306a36Sopenharmony_ci break; 541762306a36Sopenharmony_ci case MC_SEQ_MISC_TIMING >> 2: 541862306a36Sopenharmony_ci *out_reg = MC_SEQ_MISC_TIMING_LP >> 2; 541962306a36Sopenharmony_ci break; 542062306a36Sopenharmony_ci case MC_SEQ_MISC_TIMING2 >> 2: 542162306a36Sopenharmony_ci *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2; 542262306a36Sopenharmony_ci break; 542362306a36Sopenharmony_ci case MC_SEQ_RD_CTL_D0 >> 2: 542462306a36Sopenharmony_ci *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2; 542562306a36Sopenharmony_ci break; 542662306a36Sopenharmony_ci case MC_SEQ_RD_CTL_D1 >> 2: 542762306a36Sopenharmony_ci *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2; 542862306a36Sopenharmony_ci break; 542962306a36Sopenharmony_ci case MC_SEQ_WR_CTL_D0 >> 2: 543062306a36Sopenharmony_ci *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2; 543162306a36Sopenharmony_ci break; 543262306a36Sopenharmony_ci case MC_SEQ_WR_CTL_D1 >> 2: 543362306a36Sopenharmony_ci *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2; 543462306a36Sopenharmony_ci break; 543562306a36Sopenharmony_ci case MC_PMG_CMD_EMRS >> 2: 543662306a36Sopenharmony_ci *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2; 543762306a36Sopenharmony_ci break; 543862306a36Sopenharmony_ci case MC_PMG_CMD_MRS >> 2: 543962306a36Sopenharmony_ci *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2; 544062306a36Sopenharmony_ci break; 544162306a36Sopenharmony_ci case MC_PMG_CMD_MRS1 >> 2: 544262306a36Sopenharmony_ci *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2; 544362306a36Sopenharmony_ci break; 544462306a36Sopenharmony_ci case MC_SEQ_PMG_TIMING >> 2: 544562306a36Sopenharmony_ci *out_reg = MC_SEQ_PMG_TIMING_LP >> 2; 544662306a36Sopenharmony_ci break; 544762306a36Sopenharmony_ci case MC_PMG_CMD_MRS2 >> 2: 544862306a36Sopenharmony_ci *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2; 544962306a36Sopenharmony_ci break; 545062306a36Sopenharmony_ci case MC_SEQ_WR_CTL_2 >> 2: 545162306a36Sopenharmony_ci *out_reg = MC_SEQ_WR_CTL_2_LP >> 2; 545262306a36Sopenharmony_ci break; 545362306a36Sopenharmony_ci default: 545462306a36Sopenharmony_ci result = false; 545562306a36Sopenharmony_ci break; 545662306a36Sopenharmony_ci } 545762306a36Sopenharmony_ci 545862306a36Sopenharmony_ci return result; 545962306a36Sopenharmony_ci} 546062306a36Sopenharmony_ci 546162306a36Sopenharmony_cistatic void si_set_valid_flag(struct si_mc_reg_table *table) 546262306a36Sopenharmony_ci{ 546362306a36Sopenharmony_ci u8 i, j; 546462306a36Sopenharmony_ci 546562306a36Sopenharmony_ci for (i = 0; i < table->last; i++) { 546662306a36Sopenharmony_ci for (j = 1; j < table->num_entries; j++) { 546762306a36Sopenharmony_ci if (table->mc_reg_table_entry[j-1].mc_data[i] != table->mc_reg_table_entry[j].mc_data[i]) { 546862306a36Sopenharmony_ci table->valid_flag |= 1 << i; 546962306a36Sopenharmony_ci break; 547062306a36Sopenharmony_ci } 547162306a36Sopenharmony_ci } 547262306a36Sopenharmony_ci } 547362306a36Sopenharmony_ci} 547462306a36Sopenharmony_ci 547562306a36Sopenharmony_cistatic void si_set_s0_mc_reg_index(struct si_mc_reg_table *table) 547662306a36Sopenharmony_ci{ 547762306a36Sopenharmony_ci u32 i; 547862306a36Sopenharmony_ci u16 address; 547962306a36Sopenharmony_ci 548062306a36Sopenharmony_ci for (i = 0; i < table->last; i++) 548162306a36Sopenharmony_ci table->mc_reg_address[i].s0 = si_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ? 548262306a36Sopenharmony_ci address : table->mc_reg_address[i].s1; 548362306a36Sopenharmony_ci 548462306a36Sopenharmony_ci} 548562306a36Sopenharmony_ci 548662306a36Sopenharmony_cistatic int si_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table, 548762306a36Sopenharmony_ci struct si_mc_reg_table *si_table) 548862306a36Sopenharmony_ci{ 548962306a36Sopenharmony_ci u8 i, j; 549062306a36Sopenharmony_ci 549162306a36Sopenharmony_ci if (table->last > SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 549262306a36Sopenharmony_ci return -EINVAL; 549362306a36Sopenharmony_ci if (table->num_entries > MAX_AC_TIMING_ENTRIES) 549462306a36Sopenharmony_ci return -EINVAL; 549562306a36Sopenharmony_ci 549662306a36Sopenharmony_ci for (i = 0; i < table->last; i++) 549762306a36Sopenharmony_ci si_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1; 549862306a36Sopenharmony_ci si_table->last = table->last; 549962306a36Sopenharmony_ci 550062306a36Sopenharmony_ci for (i = 0; i < table->num_entries; i++) { 550162306a36Sopenharmony_ci si_table->mc_reg_table_entry[i].mclk_max = 550262306a36Sopenharmony_ci table->mc_reg_table_entry[i].mclk_max; 550362306a36Sopenharmony_ci for (j = 0; j < table->last; j++) { 550462306a36Sopenharmony_ci si_table->mc_reg_table_entry[i].mc_data[j] = 550562306a36Sopenharmony_ci table->mc_reg_table_entry[i].mc_data[j]; 550662306a36Sopenharmony_ci } 550762306a36Sopenharmony_ci } 550862306a36Sopenharmony_ci si_table->num_entries = table->num_entries; 550962306a36Sopenharmony_ci 551062306a36Sopenharmony_ci return 0; 551162306a36Sopenharmony_ci} 551262306a36Sopenharmony_ci 551362306a36Sopenharmony_cistatic int si_initialize_mc_reg_table(struct radeon_device *rdev) 551462306a36Sopenharmony_ci{ 551562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 551662306a36Sopenharmony_ci struct atom_mc_reg_table *table; 551762306a36Sopenharmony_ci struct si_mc_reg_table *si_table = &si_pi->mc_reg_table; 551862306a36Sopenharmony_ci u8 module_index = rv770_get_memory_module_index(rdev); 551962306a36Sopenharmony_ci int ret; 552062306a36Sopenharmony_ci 552162306a36Sopenharmony_ci table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL); 552262306a36Sopenharmony_ci if (!table) 552362306a36Sopenharmony_ci return -ENOMEM; 552462306a36Sopenharmony_ci 552562306a36Sopenharmony_ci WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING)); 552662306a36Sopenharmony_ci WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING)); 552762306a36Sopenharmony_ci WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING)); 552862306a36Sopenharmony_ci WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2)); 552962306a36Sopenharmony_ci WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS)); 553062306a36Sopenharmony_ci WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS)); 553162306a36Sopenharmony_ci WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1)); 553262306a36Sopenharmony_ci WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0)); 553362306a36Sopenharmony_ci WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1)); 553462306a36Sopenharmony_ci WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0)); 553562306a36Sopenharmony_ci WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1)); 553662306a36Sopenharmony_ci WREG32(MC_SEQ_PMG_TIMING_LP, RREG32(MC_SEQ_PMG_TIMING)); 553762306a36Sopenharmony_ci WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2)); 553862306a36Sopenharmony_ci WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2)); 553962306a36Sopenharmony_ci 554062306a36Sopenharmony_ci ret = radeon_atom_init_mc_reg_table(rdev, module_index, table); 554162306a36Sopenharmony_ci if (ret) 554262306a36Sopenharmony_ci goto init_mc_done; 554362306a36Sopenharmony_ci 554462306a36Sopenharmony_ci ret = si_copy_vbios_mc_reg_table(table, si_table); 554562306a36Sopenharmony_ci if (ret) 554662306a36Sopenharmony_ci goto init_mc_done; 554762306a36Sopenharmony_ci 554862306a36Sopenharmony_ci si_set_s0_mc_reg_index(si_table); 554962306a36Sopenharmony_ci 555062306a36Sopenharmony_ci ret = si_set_mc_special_registers(rdev, si_table); 555162306a36Sopenharmony_ci if (ret) 555262306a36Sopenharmony_ci goto init_mc_done; 555362306a36Sopenharmony_ci 555462306a36Sopenharmony_ci si_set_valid_flag(si_table); 555562306a36Sopenharmony_ci 555662306a36Sopenharmony_ciinit_mc_done: 555762306a36Sopenharmony_ci kfree(table); 555862306a36Sopenharmony_ci 555962306a36Sopenharmony_ci return ret; 556062306a36Sopenharmony_ci 556162306a36Sopenharmony_ci} 556262306a36Sopenharmony_ci 556362306a36Sopenharmony_cistatic void si_populate_mc_reg_addresses(struct radeon_device *rdev, 556462306a36Sopenharmony_ci SMC_SIslands_MCRegisters *mc_reg_table) 556562306a36Sopenharmony_ci{ 556662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 556762306a36Sopenharmony_ci u32 i, j; 556862306a36Sopenharmony_ci 556962306a36Sopenharmony_ci for (i = 0, j = 0; j < si_pi->mc_reg_table.last; j++) { 557062306a36Sopenharmony_ci if (si_pi->mc_reg_table.valid_flag & (1 << j)) { 557162306a36Sopenharmony_ci if (i >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE) 557262306a36Sopenharmony_ci break; 557362306a36Sopenharmony_ci mc_reg_table->address[i].s0 = 557462306a36Sopenharmony_ci cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s0); 557562306a36Sopenharmony_ci mc_reg_table->address[i].s1 = 557662306a36Sopenharmony_ci cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s1); 557762306a36Sopenharmony_ci i++; 557862306a36Sopenharmony_ci } 557962306a36Sopenharmony_ci } 558062306a36Sopenharmony_ci mc_reg_table->last = (u8)i; 558162306a36Sopenharmony_ci} 558262306a36Sopenharmony_ci 558362306a36Sopenharmony_cistatic void si_convert_mc_registers(const struct si_mc_reg_entry *entry, 558462306a36Sopenharmony_ci SMC_SIslands_MCRegisterSet *data, 558562306a36Sopenharmony_ci u32 num_entries, u32 valid_flag) 558662306a36Sopenharmony_ci{ 558762306a36Sopenharmony_ci u32 i, j; 558862306a36Sopenharmony_ci 558962306a36Sopenharmony_ci for(i = 0, j = 0; j < num_entries; j++) { 559062306a36Sopenharmony_ci if (valid_flag & (1 << j)) { 559162306a36Sopenharmony_ci data->value[i] = cpu_to_be32(entry->mc_data[j]); 559262306a36Sopenharmony_ci i++; 559362306a36Sopenharmony_ci } 559462306a36Sopenharmony_ci } 559562306a36Sopenharmony_ci} 559662306a36Sopenharmony_ci 559762306a36Sopenharmony_cistatic void si_convert_mc_reg_table_entry_to_smc(struct radeon_device *rdev, 559862306a36Sopenharmony_ci struct rv7xx_pl *pl, 559962306a36Sopenharmony_ci SMC_SIslands_MCRegisterSet *mc_reg_table_data) 560062306a36Sopenharmony_ci{ 560162306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 560262306a36Sopenharmony_ci u32 i = 0; 560362306a36Sopenharmony_ci 560462306a36Sopenharmony_ci for (i = 0; i < si_pi->mc_reg_table.num_entries; i++) { 560562306a36Sopenharmony_ci if (pl->mclk <= si_pi->mc_reg_table.mc_reg_table_entry[i].mclk_max) 560662306a36Sopenharmony_ci break; 560762306a36Sopenharmony_ci } 560862306a36Sopenharmony_ci 560962306a36Sopenharmony_ci if ((i == si_pi->mc_reg_table.num_entries) && (i > 0)) 561062306a36Sopenharmony_ci --i; 561162306a36Sopenharmony_ci 561262306a36Sopenharmony_ci si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[i], 561362306a36Sopenharmony_ci mc_reg_table_data, si_pi->mc_reg_table.last, 561462306a36Sopenharmony_ci si_pi->mc_reg_table.valid_flag); 561562306a36Sopenharmony_ci} 561662306a36Sopenharmony_ci 561762306a36Sopenharmony_cistatic void si_convert_mc_reg_table_to_smc(struct radeon_device *rdev, 561862306a36Sopenharmony_ci struct radeon_ps *radeon_state, 561962306a36Sopenharmony_ci SMC_SIslands_MCRegisters *mc_reg_table) 562062306a36Sopenharmony_ci{ 562162306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 562262306a36Sopenharmony_ci int i; 562362306a36Sopenharmony_ci 562462306a36Sopenharmony_ci for (i = 0; i < state->performance_level_count; i++) { 562562306a36Sopenharmony_ci si_convert_mc_reg_table_entry_to_smc(rdev, 562662306a36Sopenharmony_ci &state->performance_levels[i], 562762306a36Sopenharmony_ci &mc_reg_table->data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i]); 562862306a36Sopenharmony_ci } 562962306a36Sopenharmony_ci} 563062306a36Sopenharmony_ci 563162306a36Sopenharmony_cistatic int si_populate_mc_reg_table(struct radeon_device *rdev, 563262306a36Sopenharmony_ci struct radeon_ps *radeon_boot_state) 563362306a36Sopenharmony_ci{ 563462306a36Sopenharmony_ci struct ni_ps *boot_state = ni_get_ps(radeon_boot_state); 563562306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 563662306a36Sopenharmony_ci struct si_ulv_param *ulv = &si_pi->ulv; 563762306a36Sopenharmony_ci SMC_SIslands_MCRegisters *smc_mc_reg_table = &si_pi->smc_mc_reg_table; 563862306a36Sopenharmony_ci 563962306a36Sopenharmony_ci memset(smc_mc_reg_table, 0, sizeof(SMC_SIslands_MCRegisters)); 564062306a36Sopenharmony_ci 564162306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_seq_index, 1); 564262306a36Sopenharmony_ci 564362306a36Sopenharmony_ci si_populate_mc_reg_addresses(rdev, smc_mc_reg_table); 564462306a36Sopenharmony_ci 564562306a36Sopenharmony_ci si_convert_mc_reg_table_entry_to_smc(rdev, &boot_state->performance_levels[0], 564662306a36Sopenharmony_ci &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_INITIAL_SLOT]); 564762306a36Sopenharmony_ci 564862306a36Sopenharmony_ci si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[0], 564962306a36Sopenharmony_ci &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ACPI_SLOT], 565062306a36Sopenharmony_ci si_pi->mc_reg_table.last, 565162306a36Sopenharmony_ci si_pi->mc_reg_table.valid_flag); 565262306a36Sopenharmony_ci 565362306a36Sopenharmony_ci if (ulv->supported && ulv->pl.vddc != 0) 565462306a36Sopenharmony_ci si_convert_mc_reg_table_entry_to_smc(rdev, &ulv->pl, 565562306a36Sopenharmony_ci &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ULV_SLOT]); 565662306a36Sopenharmony_ci else 565762306a36Sopenharmony_ci si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[0], 565862306a36Sopenharmony_ci &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ULV_SLOT], 565962306a36Sopenharmony_ci si_pi->mc_reg_table.last, 566062306a36Sopenharmony_ci si_pi->mc_reg_table.valid_flag); 566162306a36Sopenharmony_ci 566262306a36Sopenharmony_ci si_convert_mc_reg_table_to_smc(rdev, radeon_boot_state, smc_mc_reg_table); 566362306a36Sopenharmony_ci 566462306a36Sopenharmony_ci return si_copy_bytes_to_smc(rdev, si_pi->mc_reg_table_start, 566562306a36Sopenharmony_ci (u8 *)smc_mc_reg_table, 566662306a36Sopenharmony_ci sizeof(SMC_SIslands_MCRegisters), si_pi->sram_end); 566762306a36Sopenharmony_ci} 566862306a36Sopenharmony_ci 566962306a36Sopenharmony_cistatic int si_upload_mc_reg_table(struct radeon_device *rdev, 567062306a36Sopenharmony_ci struct radeon_ps *radeon_new_state) 567162306a36Sopenharmony_ci{ 567262306a36Sopenharmony_ci struct ni_ps *new_state = ni_get_ps(radeon_new_state); 567362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 567462306a36Sopenharmony_ci u32 address = si_pi->mc_reg_table_start + 567562306a36Sopenharmony_ci offsetof(SMC_SIslands_MCRegisters, 567662306a36Sopenharmony_ci data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT]); 567762306a36Sopenharmony_ci SMC_SIslands_MCRegisters *smc_mc_reg_table = &si_pi->smc_mc_reg_table; 567862306a36Sopenharmony_ci 567962306a36Sopenharmony_ci memset(smc_mc_reg_table, 0, sizeof(SMC_SIslands_MCRegisters)); 568062306a36Sopenharmony_ci 568162306a36Sopenharmony_ci si_convert_mc_reg_table_to_smc(rdev, radeon_new_state, smc_mc_reg_table); 568262306a36Sopenharmony_ci 568362306a36Sopenharmony_ci 568462306a36Sopenharmony_ci return si_copy_bytes_to_smc(rdev, address, 568562306a36Sopenharmony_ci (u8 *)&smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT], 568662306a36Sopenharmony_ci sizeof(SMC_SIslands_MCRegisterSet) * new_state->performance_level_count, 568762306a36Sopenharmony_ci si_pi->sram_end); 568862306a36Sopenharmony_ci 568962306a36Sopenharmony_ci} 569062306a36Sopenharmony_ci 569162306a36Sopenharmony_cistatic void si_enable_voltage_control(struct radeon_device *rdev, bool enable) 569262306a36Sopenharmony_ci{ 569362306a36Sopenharmony_ci if (enable) 569462306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, VOLT_PWRMGT_EN, ~VOLT_PWRMGT_EN); 569562306a36Sopenharmony_ci else 569662306a36Sopenharmony_ci WREG32_P(GENERAL_PWRMGT, 0, ~VOLT_PWRMGT_EN); 569762306a36Sopenharmony_ci} 569862306a36Sopenharmony_ci 569962306a36Sopenharmony_cistatic enum radeon_pcie_gen si_get_maximum_link_speed(struct radeon_device *rdev, 570062306a36Sopenharmony_ci struct radeon_ps *radeon_state) 570162306a36Sopenharmony_ci{ 570262306a36Sopenharmony_ci struct ni_ps *state = ni_get_ps(radeon_state); 570362306a36Sopenharmony_ci int i; 570462306a36Sopenharmony_ci u16 pcie_speed, max_speed = 0; 570562306a36Sopenharmony_ci 570662306a36Sopenharmony_ci for (i = 0; i < state->performance_level_count; i++) { 570762306a36Sopenharmony_ci pcie_speed = state->performance_levels[i].pcie_gen; 570862306a36Sopenharmony_ci if (max_speed < pcie_speed) 570962306a36Sopenharmony_ci max_speed = pcie_speed; 571062306a36Sopenharmony_ci } 571162306a36Sopenharmony_ci return max_speed; 571262306a36Sopenharmony_ci} 571362306a36Sopenharmony_ci 571462306a36Sopenharmony_cistatic u16 si_get_current_pcie_speed(struct radeon_device *rdev) 571562306a36Sopenharmony_ci{ 571662306a36Sopenharmony_ci u32 speed_cntl; 571762306a36Sopenharmony_ci 571862306a36Sopenharmony_ci speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL) & LC_CURRENT_DATA_RATE_MASK; 571962306a36Sopenharmony_ci speed_cntl >>= LC_CURRENT_DATA_RATE_SHIFT; 572062306a36Sopenharmony_ci 572162306a36Sopenharmony_ci return (u16)speed_cntl; 572262306a36Sopenharmony_ci} 572362306a36Sopenharmony_ci 572462306a36Sopenharmony_cistatic void si_request_link_speed_change_before_state_change(struct radeon_device *rdev, 572562306a36Sopenharmony_ci struct radeon_ps *radeon_new_state, 572662306a36Sopenharmony_ci struct radeon_ps *radeon_current_state) 572762306a36Sopenharmony_ci{ 572862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 572962306a36Sopenharmony_ci enum radeon_pcie_gen target_link_speed = si_get_maximum_link_speed(rdev, radeon_new_state); 573062306a36Sopenharmony_ci enum radeon_pcie_gen current_link_speed; 573162306a36Sopenharmony_ci 573262306a36Sopenharmony_ci if (si_pi->force_pcie_gen == RADEON_PCIE_GEN_INVALID) 573362306a36Sopenharmony_ci current_link_speed = si_get_maximum_link_speed(rdev, radeon_current_state); 573462306a36Sopenharmony_ci else 573562306a36Sopenharmony_ci current_link_speed = si_pi->force_pcie_gen; 573662306a36Sopenharmony_ci 573762306a36Sopenharmony_ci si_pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID; 573862306a36Sopenharmony_ci si_pi->pspp_notify_required = false; 573962306a36Sopenharmony_ci if (target_link_speed > current_link_speed) { 574062306a36Sopenharmony_ci switch (target_link_speed) { 574162306a36Sopenharmony_ci#if defined(CONFIG_ACPI) 574262306a36Sopenharmony_ci case RADEON_PCIE_GEN3: 574362306a36Sopenharmony_ci if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN3, false) == 0) 574462306a36Sopenharmony_ci break; 574562306a36Sopenharmony_ci si_pi->force_pcie_gen = RADEON_PCIE_GEN2; 574662306a36Sopenharmony_ci if (current_link_speed == RADEON_PCIE_GEN2) 574762306a36Sopenharmony_ci break; 574862306a36Sopenharmony_ci fallthrough; 574962306a36Sopenharmony_ci case RADEON_PCIE_GEN2: 575062306a36Sopenharmony_ci if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN2, false) == 0) 575162306a36Sopenharmony_ci break; 575262306a36Sopenharmony_ci fallthrough; 575362306a36Sopenharmony_ci#endif 575462306a36Sopenharmony_ci default: 575562306a36Sopenharmony_ci si_pi->force_pcie_gen = si_get_current_pcie_speed(rdev); 575662306a36Sopenharmony_ci break; 575762306a36Sopenharmony_ci } 575862306a36Sopenharmony_ci } else { 575962306a36Sopenharmony_ci if (target_link_speed < current_link_speed) 576062306a36Sopenharmony_ci si_pi->pspp_notify_required = true; 576162306a36Sopenharmony_ci } 576262306a36Sopenharmony_ci} 576362306a36Sopenharmony_ci 576462306a36Sopenharmony_cistatic void si_notify_link_speed_change_after_state_change(struct radeon_device *rdev, 576562306a36Sopenharmony_ci struct radeon_ps *radeon_new_state, 576662306a36Sopenharmony_ci struct radeon_ps *radeon_current_state) 576762306a36Sopenharmony_ci{ 576862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 576962306a36Sopenharmony_ci enum radeon_pcie_gen target_link_speed = si_get_maximum_link_speed(rdev, radeon_new_state); 577062306a36Sopenharmony_ci u8 request; 577162306a36Sopenharmony_ci 577262306a36Sopenharmony_ci if (si_pi->pspp_notify_required) { 577362306a36Sopenharmony_ci if (target_link_speed == RADEON_PCIE_GEN3) 577462306a36Sopenharmony_ci request = PCIE_PERF_REQ_PECI_GEN3; 577562306a36Sopenharmony_ci else if (target_link_speed == RADEON_PCIE_GEN2) 577662306a36Sopenharmony_ci request = PCIE_PERF_REQ_PECI_GEN2; 577762306a36Sopenharmony_ci else 577862306a36Sopenharmony_ci request = PCIE_PERF_REQ_PECI_GEN1; 577962306a36Sopenharmony_ci 578062306a36Sopenharmony_ci if ((request == PCIE_PERF_REQ_PECI_GEN1) && 578162306a36Sopenharmony_ci (si_get_current_pcie_speed(rdev) > 0)) 578262306a36Sopenharmony_ci return; 578362306a36Sopenharmony_ci 578462306a36Sopenharmony_ci#if defined(CONFIG_ACPI) 578562306a36Sopenharmony_ci radeon_acpi_pcie_performance_request(rdev, request, false); 578662306a36Sopenharmony_ci#endif 578762306a36Sopenharmony_ci } 578862306a36Sopenharmony_ci} 578962306a36Sopenharmony_ci 579062306a36Sopenharmony_ci#if 0 579162306a36Sopenharmony_cistatic int si_ds_request(struct radeon_device *rdev, 579262306a36Sopenharmony_ci bool ds_status_on, u32 count_write) 579362306a36Sopenharmony_ci{ 579462306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 579562306a36Sopenharmony_ci 579662306a36Sopenharmony_ci if (eg_pi->sclk_deep_sleep) { 579762306a36Sopenharmony_ci if (ds_status_on) 579862306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_CancelThrottleOVRDSCLKDS) == 579962306a36Sopenharmony_ci PPSMC_Result_OK) ? 580062306a36Sopenharmony_ci 0 : -EINVAL; 580162306a36Sopenharmony_ci else 580262306a36Sopenharmony_ci return (si_send_msg_to_smc(rdev, PPSMC_MSG_ThrottleOVRDSCLKDS) == 580362306a36Sopenharmony_ci PPSMC_Result_OK) ? 0 : -EINVAL; 580462306a36Sopenharmony_ci } 580562306a36Sopenharmony_ci return 0; 580662306a36Sopenharmony_ci} 580762306a36Sopenharmony_ci#endif 580862306a36Sopenharmony_ci 580962306a36Sopenharmony_cistatic void si_set_max_cu_value(struct radeon_device *rdev) 581062306a36Sopenharmony_ci{ 581162306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 581262306a36Sopenharmony_ci 581362306a36Sopenharmony_ci if (rdev->family == CHIP_VERDE) { 581462306a36Sopenharmony_ci switch (rdev->pdev->device) { 581562306a36Sopenharmony_ci case 0x6820: 581662306a36Sopenharmony_ci case 0x6825: 581762306a36Sopenharmony_ci case 0x6821: 581862306a36Sopenharmony_ci case 0x6823: 581962306a36Sopenharmony_ci case 0x6827: 582062306a36Sopenharmony_ci si_pi->max_cu = 10; 582162306a36Sopenharmony_ci break; 582262306a36Sopenharmony_ci case 0x682D: 582362306a36Sopenharmony_ci case 0x6824: 582462306a36Sopenharmony_ci case 0x682F: 582562306a36Sopenharmony_ci case 0x6826: 582662306a36Sopenharmony_ci si_pi->max_cu = 8; 582762306a36Sopenharmony_ci break; 582862306a36Sopenharmony_ci case 0x6828: 582962306a36Sopenharmony_ci case 0x6830: 583062306a36Sopenharmony_ci case 0x6831: 583162306a36Sopenharmony_ci case 0x6838: 583262306a36Sopenharmony_ci case 0x6839: 583362306a36Sopenharmony_ci case 0x683D: 583462306a36Sopenharmony_ci si_pi->max_cu = 10; 583562306a36Sopenharmony_ci break; 583662306a36Sopenharmony_ci case 0x683B: 583762306a36Sopenharmony_ci case 0x683F: 583862306a36Sopenharmony_ci case 0x6829: 583962306a36Sopenharmony_ci si_pi->max_cu = 8; 584062306a36Sopenharmony_ci break; 584162306a36Sopenharmony_ci default: 584262306a36Sopenharmony_ci si_pi->max_cu = 0; 584362306a36Sopenharmony_ci break; 584462306a36Sopenharmony_ci } 584562306a36Sopenharmony_ci } else { 584662306a36Sopenharmony_ci si_pi->max_cu = 0; 584762306a36Sopenharmony_ci } 584862306a36Sopenharmony_ci} 584962306a36Sopenharmony_ci 585062306a36Sopenharmony_cistatic int si_patch_single_dependency_table_based_on_leakage(struct radeon_device *rdev, 585162306a36Sopenharmony_ci struct radeon_clock_voltage_dependency_table *table) 585262306a36Sopenharmony_ci{ 585362306a36Sopenharmony_ci u32 i; 585462306a36Sopenharmony_ci int j; 585562306a36Sopenharmony_ci u16 leakage_voltage; 585662306a36Sopenharmony_ci 585762306a36Sopenharmony_ci if (table) { 585862306a36Sopenharmony_ci for (i = 0; i < table->count; i++) { 585962306a36Sopenharmony_ci switch (si_get_leakage_voltage_from_leakage_index(rdev, 586062306a36Sopenharmony_ci table->entries[i].v, 586162306a36Sopenharmony_ci &leakage_voltage)) { 586262306a36Sopenharmony_ci case 0: 586362306a36Sopenharmony_ci table->entries[i].v = leakage_voltage; 586462306a36Sopenharmony_ci break; 586562306a36Sopenharmony_ci case -EAGAIN: 586662306a36Sopenharmony_ci return -EINVAL; 586762306a36Sopenharmony_ci case -EINVAL: 586862306a36Sopenharmony_ci default: 586962306a36Sopenharmony_ci break; 587062306a36Sopenharmony_ci } 587162306a36Sopenharmony_ci } 587262306a36Sopenharmony_ci 587362306a36Sopenharmony_ci for (j = (table->count - 2); j >= 0; j--) { 587462306a36Sopenharmony_ci table->entries[j].v = (table->entries[j].v <= table->entries[j + 1].v) ? 587562306a36Sopenharmony_ci table->entries[j].v : table->entries[j + 1].v; 587662306a36Sopenharmony_ci } 587762306a36Sopenharmony_ci } 587862306a36Sopenharmony_ci return 0; 587962306a36Sopenharmony_ci} 588062306a36Sopenharmony_ci 588162306a36Sopenharmony_cistatic int si_patch_dependency_tables_based_on_leakage(struct radeon_device *rdev) 588262306a36Sopenharmony_ci{ 588362306a36Sopenharmony_ci int ret; 588462306a36Sopenharmony_ci 588562306a36Sopenharmony_ci ret = si_patch_single_dependency_table_based_on_leakage(rdev, 588662306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk); 588762306a36Sopenharmony_ci ret = si_patch_single_dependency_table_based_on_leakage(rdev, 588862306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk); 588962306a36Sopenharmony_ci ret = si_patch_single_dependency_table_based_on_leakage(rdev, 589062306a36Sopenharmony_ci &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk); 589162306a36Sopenharmony_ci return ret; 589262306a36Sopenharmony_ci} 589362306a36Sopenharmony_ci 589462306a36Sopenharmony_cistatic void si_set_pcie_lane_width_in_smc(struct radeon_device *rdev, 589562306a36Sopenharmony_ci struct radeon_ps *radeon_new_state, 589662306a36Sopenharmony_ci struct radeon_ps *radeon_current_state) 589762306a36Sopenharmony_ci{ 589862306a36Sopenharmony_ci u32 lane_width; 589962306a36Sopenharmony_ci u32 new_lane_width = 590062306a36Sopenharmony_ci ((radeon_new_state->caps & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >> ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1; 590162306a36Sopenharmony_ci u32 current_lane_width = 590262306a36Sopenharmony_ci ((radeon_current_state->caps & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >> ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1; 590362306a36Sopenharmony_ci 590462306a36Sopenharmony_ci if (new_lane_width != current_lane_width) { 590562306a36Sopenharmony_ci radeon_set_pcie_lanes(rdev, new_lane_width); 590662306a36Sopenharmony_ci lane_width = radeon_get_pcie_lanes(rdev); 590762306a36Sopenharmony_ci si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width); 590862306a36Sopenharmony_ci } 590962306a36Sopenharmony_ci} 591062306a36Sopenharmony_ci 591162306a36Sopenharmony_cistatic void si_set_vce_clock(struct radeon_device *rdev, 591262306a36Sopenharmony_ci struct radeon_ps *new_rps, 591362306a36Sopenharmony_ci struct radeon_ps *old_rps) 591462306a36Sopenharmony_ci{ 591562306a36Sopenharmony_ci if ((old_rps->evclk != new_rps->evclk) || 591662306a36Sopenharmony_ci (old_rps->ecclk != new_rps->ecclk)) { 591762306a36Sopenharmony_ci /* turn the clocks on when encoding, off otherwise */ 591862306a36Sopenharmony_ci if (new_rps->evclk || new_rps->ecclk) 591962306a36Sopenharmony_ci vce_v1_0_enable_mgcg(rdev, false); 592062306a36Sopenharmony_ci else 592162306a36Sopenharmony_ci vce_v1_0_enable_mgcg(rdev, true); 592262306a36Sopenharmony_ci radeon_set_vce_clocks(rdev, new_rps->evclk, new_rps->ecclk); 592362306a36Sopenharmony_ci } 592462306a36Sopenharmony_ci} 592562306a36Sopenharmony_ci 592662306a36Sopenharmony_civoid si_dpm_setup_asic(struct radeon_device *rdev) 592762306a36Sopenharmony_ci{ 592862306a36Sopenharmony_ci int r; 592962306a36Sopenharmony_ci 593062306a36Sopenharmony_ci r = si_mc_load_microcode(rdev); 593162306a36Sopenharmony_ci if (r) 593262306a36Sopenharmony_ci DRM_ERROR("Failed to load MC firmware!\n"); 593362306a36Sopenharmony_ci rv770_get_memory_type(rdev); 593462306a36Sopenharmony_ci si_read_clock_registers(rdev); 593562306a36Sopenharmony_ci si_enable_acpi_power_management(rdev); 593662306a36Sopenharmony_ci} 593762306a36Sopenharmony_ci 593862306a36Sopenharmony_cistatic int si_thermal_enable_alert(struct radeon_device *rdev, 593962306a36Sopenharmony_ci bool enable) 594062306a36Sopenharmony_ci{ 594162306a36Sopenharmony_ci u32 thermal_int = RREG32(CG_THERMAL_INT); 594262306a36Sopenharmony_ci 594362306a36Sopenharmony_ci if (enable) { 594462306a36Sopenharmony_ci PPSMC_Result result; 594562306a36Sopenharmony_ci 594662306a36Sopenharmony_ci thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); 594762306a36Sopenharmony_ci WREG32(CG_THERMAL_INT, thermal_int); 594862306a36Sopenharmony_ci rdev->irq.dpm_thermal = false; 594962306a36Sopenharmony_ci result = si_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt); 595062306a36Sopenharmony_ci if (result != PPSMC_Result_OK) { 595162306a36Sopenharmony_ci DRM_DEBUG_KMS("Could not enable thermal interrupts.\n"); 595262306a36Sopenharmony_ci return -EINVAL; 595362306a36Sopenharmony_ci } 595462306a36Sopenharmony_ci } else { 595562306a36Sopenharmony_ci thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW; 595662306a36Sopenharmony_ci WREG32(CG_THERMAL_INT, thermal_int); 595762306a36Sopenharmony_ci rdev->irq.dpm_thermal = true; 595862306a36Sopenharmony_ci } 595962306a36Sopenharmony_ci 596062306a36Sopenharmony_ci return 0; 596162306a36Sopenharmony_ci} 596262306a36Sopenharmony_ci 596362306a36Sopenharmony_cistatic int si_thermal_set_temperature_range(struct radeon_device *rdev, 596462306a36Sopenharmony_ci int min_temp, int max_temp) 596562306a36Sopenharmony_ci{ 596662306a36Sopenharmony_ci int low_temp = 0 * 1000; 596762306a36Sopenharmony_ci int high_temp = 255 * 1000; 596862306a36Sopenharmony_ci 596962306a36Sopenharmony_ci if (low_temp < min_temp) 597062306a36Sopenharmony_ci low_temp = min_temp; 597162306a36Sopenharmony_ci if (high_temp > max_temp) 597262306a36Sopenharmony_ci high_temp = max_temp; 597362306a36Sopenharmony_ci if (high_temp < low_temp) { 597462306a36Sopenharmony_ci DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp); 597562306a36Sopenharmony_ci return -EINVAL; 597662306a36Sopenharmony_ci } 597762306a36Sopenharmony_ci 597862306a36Sopenharmony_ci WREG32_P(CG_THERMAL_INT, DIG_THERM_INTH(high_temp / 1000), ~DIG_THERM_INTH_MASK); 597962306a36Sopenharmony_ci WREG32_P(CG_THERMAL_INT, DIG_THERM_INTL(low_temp / 1000), ~DIG_THERM_INTL_MASK); 598062306a36Sopenharmony_ci WREG32_P(CG_THERMAL_CTRL, DIG_THERM_DPM(high_temp / 1000), ~DIG_THERM_DPM_MASK); 598162306a36Sopenharmony_ci 598262306a36Sopenharmony_ci rdev->pm.dpm.thermal.min_temp = low_temp; 598362306a36Sopenharmony_ci rdev->pm.dpm.thermal.max_temp = high_temp; 598462306a36Sopenharmony_ci 598562306a36Sopenharmony_ci return 0; 598662306a36Sopenharmony_ci} 598762306a36Sopenharmony_ci 598862306a36Sopenharmony_cistatic void si_fan_ctrl_set_static_mode(struct radeon_device *rdev, u32 mode) 598962306a36Sopenharmony_ci{ 599062306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 599162306a36Sopenharmony_ci u32 tmp; 599262306a36Sopenharmony_ci 599362306a36Sopenharmony_ci if (si_pi->fan_ctrl_is_in_default_mode) { 599462306a36Sopenharmony_ci tmp = (RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK) >> FDO_PWM_MODE_SHIFT; 599562306a36Sopenharmony_ci si_pi->fan_ctrl_default_mode = tmp; 599662306a36Sopenharmony_ci tmp = (RREG32(CG_FDO_CTRL2) & TMIN_MASK) >> TMIN_SHIFT; 599762306a36Sopenharmony_ci si_pi->t_min = tmp; 599862306a36Sopenharmony_ci si_pi->fan_ctrl_is_in_default_mode = false; 599962306a36Sopenharmony_ci } 600062306a36Sopenharmony_ci 600162306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK; 600262306a36Sopenharmony_ci tmp |= TMIN(0); 600362306a36Sopenharmony_ci WREG32(CG_FDO_CTRL2, tmp); 600462306a36Sopenharmony_ci 600562306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK; 600662306a36Sopenharmony_ci tmp |= FDO_PWM_MODE(mode); 600762306a36Sopenharmony_ci WREG32(CG_FDO_CTRL2, tmp); 600862306a36Sopenharmony_ci} 600962306a36Sopenharmony_ci 601062306a36Sopenharmony_cistatic int si_thermal_setup_fan_table(struct radeon_device *rdev) 601162306a36Sopenharmony_ci{ 601262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 601362306a36Sopenharmony_ci PP_SIslands_FanTable fan_table = { FDO_MODE_HARDWARE }; 601462306a36Sopenharmony_ci u32 duty100; 601562306a36Sopenharmony_ci u32 t_diff1, t_diff2, pwm_diff1, pwm_diff2; 601662306a36Sopenharmony_ci u16 fdo_min, slope1, slope2; 601762306a36Sopenharmony_ci u32 reference_clock, tmp; 601862306a36Sopenharmony_ci int ret; 601962306a36Sopenharmony_ci u64 tmp64; 602062306a36Sopenharmony_ci 602162306a36Sopenharmony_ci if (!si_pi->fan_table_start) { 602262306a36Sopenharmony_ci rdev->pm.dpm.fan.ucode_fan_control = false; 602362306a36Sopenharmony_ci return 0; 602462306a36Sopenharmony_ci } 602562306a36Sopenharmony_ci 602662306a36Sopenharmony_ci duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 602762306a36Sopenharmony_ci 602862306a36Sopenharmony_ci if (duty100 == 0) { 602962306a36Sopenharmony_ci rdev->pm.dpm.fan.ucode_fan_control = false; 603062306a36Sopenharmony_ci return 0; 603162306a36Sopenharmony_ci } 603262306a36Sopenharmony_ci 603362306a36Sopenharmony_ci tmp64 = (u64)rdev->pm.dpm.fan.pwm_min * duty100; 603462306a36Sopenharmony_ci do_div(tmp64, 10000); 603562306a36Sopenharmony_ci fdo_min = (u16)tmp64; 603662306a36Sopenharmony_ci 603762306a36Sopenharmony_ci t_diff1 = rdev->pm.dpm.fan.t_med - rdev->pm.dpm.fan.t_min; 603862306a36Sopenharmony_ci t_diff2 = rdev->pm.dpm.fan.t_high - rdev->pm.dpm.fan.t_med; 603962306a36Sopenharmony_ci 604062306a36Sopenharmony_ci pwm_diff1 = rdev->pm.dpm.fan.pwm_med - rdev->pm.dpm.fan.pwm_min; 604162306a36Sopenharmony_ci pwm_diff2 = rdev->pm.dpm.fan.pwm_high - rdev->pm.dpm.fan.pwm_med; 604262306a36Sopenharmony_ci 604362306a36Sopenharmony_ci slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100); 604462306a36Sopenharmony_ci slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100); 604562306a36Sopenharmony_ci 604662306a36Sopenharmony_ci fan_table.temp_min = cpu_to_be16((50 + rdev->pm.dpm.fan.t_min) / 100); 604762306a36Sopenharmony_ci fan_table.temp_med = cpu_to_be16((50 + rdev->pm.dpm.fan.t_med) / 100); 604862306a36Sopenharmony_ci fan_table.temp_max = cpu_to_be16((50 + rdev->pm.dpm.fan.t_max) / 100); 604962306a36Sopenharmony_ci 605062306a36Sopenharmony_ci fan_table.slope1 = cpu_to_be16(slope1); 605162306a36Sopenharmony_ci fan_table.slope2 = cpu_to_be16(slope2); 605262306a36Sopenharmony_ci 605362306a36Sopenharmony_ci fan_table.fdo_min = cpu_to_be16(fdo_min); 605462306a36Sopenharmony_ci 605562306a36Sopenharmony_ci fan_table.hys_down = cpu_to_be16(rdev->pm.dpm.fan.t_hyst); 605662306a36Sopenharmony_ci 605762306a36Sopenharmony_ci fan_table.hys_up = cpu_to_be16(1); 605862306a36Sopenharmony_ci 605962306a36Sopenharmony_ci fan_table.hys_slope = cpu_to_be16(1); 606062306a36Sopenharmony_ci 606162306a36Sopenharmony_ci fan_table.temp_resp_lim = cpu_to_be16(5); 606262306a36Sopenharmony_ci 606362306a36Sopenharmony_ci reference_clock = radeon_get_xclk(rdev); 606462306a36Sopenharmony_ci 606562306a36Sopenharmony_ci fan_table.refresh_period = cpu_to_be32((rdev->pm.dpm.fan.cycle_delay * 606662306a36Sopenharmony_ci reference_clock) / 1600); 606762306a36Sopenharmony_ci 606862306a36Sopenharmony_ci fan_table.fdo_max = cpu_to_be16((u16)duty100); 606962306a36Sopenharmony_ci 607062306a36Sopenharmony_ci tmp = (RREG32(CG_MULT_THERMAL_CTRL) & TEMP_SEL_MASK) >> TEMP_SEL_SHIFT; 607162306a36Sopenharmony_ci fan_table.temp_src = (uint8_t)tmp; 607262306a36Sopenharmony_ci 607362306a36Sopenharmony_ci ret = si_copy_bytes_to_smc(rdev, 607462306a36Sopenharmony_ci si_pi->fan_table_start, 607562306a36Sopenharmony_ci (u8 *)(&fan_table), 607662306a36Sopenharmony_ci sizeof(fan_table), 607762306a36Sopenharmony_ci si_pi->sram_end); 607862306a36Sopenharmony_ci 607962306a36Sopenharmony_ci if (ret) { 608062306a36Sopenharmony_ci DRM_ERROR("Failed to load fan table to the SMC."); 608162306a36Sopenharmony_ci rdev->pm.dpm.fan.ucode_fan_control = false; 608262306a36Sopenharmony_ci } 608362306a36Sopenharmony_ci 608462306a36Sopenharmony_ci return 0; 608562306a36Sopenharmony_ci} 608662306a36Sopenharmony_ci 608762306a36Sopenharmony_cistatic int si_fan_ctrl_start_smc_fan_control(struct radeon_device *rdev) 608862306a36Sopenharmony_ci{ 608962306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 609062306a36Sopenharmony_ci PPSMC_Result ret; 609162306a36Sopenharmony_ci 609262306a36Sopenharmony_ci ret = si_send_msg_to_smc(rdev, PPSMC_StartFanControl); 609362306a36Sopenharmony_ci if (ret == PPSMC_Result_OK) { 609462306a36Sopenharmony_ci si_pi->fan_is_controlled_by_smc = true; 609562306a36Sopenharmony_ci return 0; 609662306a36Sopenharmony_ci } else { 609762306a36Sopenharmony_ci return -EINVAL; 609862306a36Sopenharmony_ci } 609962306a36Sopenharmony_ci} 610062306a36Sopenharmony_ci 610162306a36Sopenharmony_cistatic int si_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev) 610262306a36Sopenharmony_ci{ 610362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 610462306a36Sopenharmony_ci PPSMC_Result ret; 610562306a36Sopenharmony_ci 610662306a36Sopenharmony_ci ret = si_send_msg_to_smc(rdev, PPSMC_StopFanControl); 610762306a36Sopenharmony_ci 610862306a36Sopenharmony_ci if (ret == PPSMC_Result_OK) { 610962306a36Sopenharmony_ci si_pi->fan_is_controlled_by_smc = false; 611062306a36Sopenharmony_ci return 0; 611162306a36Sopenharmony_ci } else { 611262306a36Sopenharmony_ci return -EINVAL; 611362306a36Sopenharmony_ci } 611462306a36Sopenharmony_ci} 611562306a36Sopenharmony_ci 611662306a36Sopenharmony_ciint si_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev, 611762306a36Sopenharmony_ci u32 *speed) 611862306a36Sopenharmony_ci{ 611962306a36Sopenharmony_ci u32 duty, duty100; 612062306a36Sopenharmony_ci u64 tmp64; 612162306a36Sopenharmony_ci 612262306a36Sopenharmony_ci if (rdev->pm.no_fan) 612362306a36Sopenharmony_ci return -ENOENT; 612462306a36Sopenharmony_ci 612562306a36Sopenharmony_ci duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 612662306a36Sopenharmony_ci duty = (RREG32(CG_THERMAL_STATUS) & FDO_PWM_DUTY_MASK) >> FDO_PWM_DUTY_SHIFT; 612762306a36Sopenharmony_ci 612862306a36Sopenharmony_ci if (duty100 == 0) 612962306a36Sopenharmony_ci return -EINVAL; 613062306a36Sopenharmony_ci 613162306a36Sopenharmony_ci tmp64 = (u64)duty * 100; 613262306a36Sopenharmony_ci do_div(tmp64, duty100); 613362306a36Sopenharmony_ci *speed = (u32)tmp64; 613462306a36Sopenharmony_ci 613562306a36Sopenharmony_ci if (*speed > 100) 613662306a36Sopenharmony_ci *speed = 100; 613762306a36Sopenharmony_ci 613862306a36Sopenharmony_ci return 0; 613962306a36Sopenharmony_ci} 614062306a36Sopenharmony_ci 614162306a36Sopenharmony_ciint si_fan_ctrl_set_fan_speed_percent(struct radeon_device *rdev, 614262306a36Sopenharmony_ci u32 speed) 614362306a36Sopenharmony_ci{ 614462306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 614562306a36Sopenharmony_ci u32 tmp; 614662306a36Sopenharmony_ci u32 duty, duty100; 614762306a36Sopenharmony_ci u64 tmp64; 614862306a36Sopenharmony_ci 614962306a36Sopenharmony_ci if (rdev->pm.no_fan) 615062306a36Sopenharmony_ci return -ENOENT; 615162306a36Sopenharmony_ci 615262306a36Sopenharmony_ci if (si_pi->fan_is_controlled_by_smc) 615362306a36Sopenharmony_ci return -EINVAL; 615462306a36Sopenharmony_ci 615562306a36Sopenharmony_ci if (speed > 100) 615662306a36Sopenharmony_ci return -EINVAL; 615762306a36Sopenharmony_ci 615862306a36Sopenharmony_ci duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT; 615962306a36Sopenharmony_ci 616062306a36Sopenharmony_ci if (duty100 == 0) 616162306a36Sopenharmony_ci return -EINVAL; 616262306a36Sopenharmony_ci 616362306a36Sopenharmony_ci tmp64 = (u64)speed * duty100; 616462306a36Sopenharmony_ci do_div(tmp64, 100); 616562306a36Sopenharmony_ci duty = (u32)tmp64; 616662306a36Sopenharmony_ci 616762306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK; 616862306a36Sopenharmony_ci tmp |= FDO_STATIC_DUTY(duty); 616962306a36Sopenharmony_ci WREG32(CG_FDO_CTRL0, tmp); 617062306a36Sopenharmony_ci 617162306a36Sopenharmony_ci return 0; 617262306a36Sopenharmony_ci} 617362306a36Sopenharmony_ci 617462306a36Sopenharmony_civoid si_fan_ctrl_set_mode(struct radeon_device *rdev, u32 mode) 617562306a36Sopenharmony_ci{ 617662306a36Sopenharmony_ci if (mode) { 617762306a36Sopenharmony_ci /* stop auto-manage */ 617862306a36Sopenharmony_ci if (rdev->pm.dpm.fan.ucode_fan_control) 617962306a36Sopenharmony_ci si_fan_ctrl_stop_smc_fan_control(rdev); 618062306a36Sopenharmony_ci si_fan_ctrl_set_static_mode(rdev, mode); 618162306a36Sopenharmony_ci } else { 618262306a36Sopenharmony_ci /* restart auto-manage */ 618362306a36Sopenharmony_ci if (rdev->pm.dpm.fan.ucode_fan_control) 618462306a36Sopenharmony_ci si_thermal_start_smc_fan_control(rdev); 618562306a36Sopenharmony_ci else 618662306a36Sopenharmony_ci si_fan_ctrl_set_default_mode(rdev); 618762306a36Sopenharmony_ci } 618862306a36Sopenharmony_ci} 618962306a36Sopenharmony_ci 619062306a36Sopenharmony_ciu32 si_fan_ctrl_get_mode(struct radeon_device *rdev) 619162306a36Sopenharmony_ci{ 619262306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 619362306a36Sopenharmony_ci u32 tmp; 619462306a36Sopenharmony_ci 619562306a36Sopenharmony_ci if (si_pi->fan_is_controlled_by_smc) 619662306a36Sopenharmony_ci return 0; 619762306a36Sopenharmony_ci 619862306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK; 619962306a36Sopenharmony_ci return (tmp >> FDO_PWM_MODE_SHIFT); 620062306a36Sopenharmony_ci} 620162306a36Sopenharmony_ci 620262306a36Sopenharmony_ci#if 0 620362306a36Sopenharmony_cistatic int si_fan_ctrl_get_fan_speed_rpm(struct radeon_device *rdev, 620462306a36Sopenharmony_ci u32 *speed) 620562306a36Sopenharmony_ci{ 620662306a36Sopenharmony_ci u32 tach_period; 620762306a36Sopenharmony_ci u32 xclk = radeon_get_xclk(rdev); 620862306a36Sopenharmony_ci 620962306a36Sopenharmony_ci if (rdev->pm.no_fan) 621062306a36Sopenharmony_ci return -ENOENT; 621162306a36Sopenharmony_ci 621262306a36Sopenharmony_ci if (rdev->pm.fan_pulses_per_revolution == 0) 621362306a36Sopenharmony_ci return -ENOENT; 621462306a36Sopenharmony_ci 621562306a36Sopenharmony_ci tach_period = (RREG32(CG_TACH_STATUS) & TACH_PERIOD_MASK) >> TACH_PERIOD_SHIFT; 621662306a36Sopenharmony_ci if (tach_period == 0) 621762306a36Sopenharmony_ci return -ENOENT; 621862306a36Sopenharmony_ci 621962306a36Sopenharmony_ci *speed = 60 * xclk * 10000 / tach_period; 622062306a36Sopenharmony_ci 622162306a36Sopenharmony_ci return 0; 622262306a36Sopenharmony_ci} 622362306a36Sopenharmony_ci 622462306a36Sopenharmony_cistatic int si_fan_ctrl_set_fan_speed_rpm(struct radeon_device *rdev, 622562306a36Sopenharmony_ci u32 speed) 622662306a36Sopenharmony_ci{ 622762306a36Sopenharmony_ci u32 tach_period, tmp; 622862306a36Sopenharmony_ci u32 xclk = radeon_get_xclk(rdev); 622962306a36Sopenharmony_ci 623062306a36Sopenharmony_ci if (rdev->pm.no_fan) 623162306a36Sopenharmony_ci return -ENOENT; 623262306a36Sopenharmony_ci 623362306a36Sopenharmony_ci if (rdev->pm.fan_pulses_per_revolution == 0) 623462306a36Sopenharmony_ci return -ENOENT; 623562306a36Sopenharmony_ci 623662306a36Sopenharmony_ci if ((speed < rdev->pm.fan_min_rpm) || 623762306a36Sopenharmony_ci (speed > rdev->pm.fan_max_rpm)) 623862306a36Sopenharmony_ci return -EINVAL; 623962306a36Sopenharmony_ci 624062306a36Sopenharmony_ci if (rdev->pm.dpm.fan.ucode_fan_control) 624162306a36Sopenharmony_ci si_fan_ctrl_stop_smc_fan_control(rdev); 624262306a36Sopenharmony_ci 624362306a36Sopenharmony_ci tach_period = 60 * xclk * 10000 / (8 * speed); 624462306a36Sopenharmony_ci tmp = RREG32(CG_TACH_CTRL) & ~TARGET_PERIOD_MASK; 624562306a36Sopenharmony_ci tmp |= TARGET_PERIOD(tach_period); 624662306a36Sopenharmony_ci WREG32(CG_TACH_CTRL, tmp); 624762306a36Sopenharmony_ci 624862306a36Sopenharmony_ci si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC_RPM); 624962306a36Sopenharmony_ci 625062306a36Sopenharmony_ci return 0; 625162306a36Sopenharmony_ci} 625262306a36Sopenharmony_ci#endif 625362306a36Sopenharmony_ci 625462306a36Sopenharmony_cistatic void si_fan_ctrl_set_default_mode(struct radeon_device *rdev) 625562306a36Sopenharmony_ci{ 625662306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 625762306a36Sopenharmony_ci u32 tmp; 625862306a36Sopenharmony_ci 625962306a36Sopenharmony_ci if (!si_pi->fan_ctrl_is_in_default_mode) { 626062306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK; 626162306a36Sopenharmony_ci tmp |= FDO_PWM_MODE(si_pi->fan_ctrl_default_mode); 626262306a36Sopenharmony_ci WREG32(CG_FDO_CTRL2, tmp); 626362306a36Sopenharmony_ci 626462306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK; 626562306a36Sopenharmony_ci tmp |= TMIN(si_pi->t_min); 626662306a36Sopenharmony_ci WREG32(CG_FDO_CTRL2, tmp); 626762306a36Sopenharmony_ci si_pi->fan_ctrl_is_in_default_mode = true; 626862306a36Sopenharmony_ci } 626962306a36Sopenharmony_ci} 627062306a36Sopenharmony_ci 627162306a36Sopenharmony_cistatic void si_thermal_start_smc_fan_control(struct radeon_device *rdev) 627262306a36Sopenharmony_ci{ 627362306a36Sopenharmony_ci if (rdev->pm.dpm.fan.ucode_fan_control) { 627462306a36Sopenharmony_ci si_fan_ctrl_start_smc_fan_control(rdev); 627562306a36Sopenharmony_ci si_fan_ctrl_set_static_mode(rdev, FDO_PWM_MODE_STATIC); 627662306a36Sopenharmony_ci } 627762306a36Sopenharmony_ci} 627862306a36Sopenharmony_ci 627962306a36Sopenharmony_cistatic void si_thermal_initialize(struct radeon_device *rdev) 628062306a36Sopenharmony_ci{ 628162306a36Sopenharmony_ci u32 tmp; 628262306a36Sopenharmony_ci 628362306a36Sopenharmony_ci if (rdev->pm.fan_pulses_per_revolution) { 628462306a36Sopenharmony_ci tmp = RREG32(CG_TACH_CTRL) & ~EDGE_PER_REV_MASK; 628562306a36Sopenharmony_ci tmp |= EDGE_PER_REV(rdev->pm.fan_pulses_per_revolution -1); 628662306a36Sopenharmony_ci WREG32(CG_TACH_CTRL, tmp); 628762306a36Sopenharmony_ci } 628862306a36Sopenharmony_ci 628962306a36Sopenharmony_ci tmp = RREG32(CG_FDO_CTRL2) & ~TACH_PWM_RESP_RATE_MASK; 629062306a36Sopenharmony_ci tmp |= TACH_PWM_RESP_RATE(0x28); 629162306a36Sopenharmony_ci WREG32(CG_FDO_CTRL2, tmp); 629262306a36Sopenharmony_ci} 629362306a36Sopenharmony_ci 629462306a36Sopenharmony_cistatic int si_thermal_start_thermal_controller(struct radeon_device *rdev) 629562306a36Sopenharmony_ci{ 629662306a36Sopenharmony_ci int ret; 629762306a36Sopenharmony_ci 629862306a36Sopenharmony_ci si_thermal_initialize(rdev); 629962306a36Sopenharmony_ci ret = si_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 630062306a36Sopenharmony_ci if (ret) 630162306a36Sopenharmony_ci return ret; 630262306a36Sopenharmony_ci ret = si_thermal_enable_alert(rdev, true); 630362306a36Sopenharmony_ci if (ret) 630462306a36Sopenharmony_ci return ret; 630562306a36Sopenharmony_ci if (rdev->pm.dpm.fan.ucode_fan_control) { 630662306a36Sopenharmony_ci ret = si_halt_smc(rdev); 630762306a36Sopenharmony_ci if (ret) 630862306a36Sopenharmony_ci return ret; 630962306a36Sopenharmony_ci ret = si_thermal_setup_fan_table(rdev); 631062306a36Sopenharmony_ci if (ret) 631162306a36Sopenharmony_ci return ret; 631262306a36Sopenharmony_ci ret = si_resume_smc(rdev); 631362306a36Sopenharmony_ci if (ret) 631462306a36Sopenharmony_ci return ret; 631562306a36Sopenharmony_ci si_thermal_start_smc_fan_control(rdev); 631662306a36Sopenharmony_ci } 631762306a36Sopenharmony_ci 631862306a36Sopenharmony_ci return 0; 631962306a36Sopenharmony_ci} 632062306a36Sopenharmony_ci 632162306a36Sopenharmony_cistatic void si_thermal_stop_thermal_controller(struct radeon_device *rdev) 632262306a36Sopenharmony_ci{ 632362306a36Sopenharmony_ci if (!rdev->pm.no_fan) { 632462306a36Sopenharmony_ci si_fan_ctrl_set_default_mode(rdev); 632562306a36Sopenharmony_ci si_fan_ctrl_stop_smc_fan_control(rdev); 632662306a36Sopenharmony_ci } 632762306a36Sopenharmony_ci} 632862306a36Sopenharmony_ci 632962306a36Sopenharmony_ciint si_dpm_enable(struct radeon_device *rdev) 633062306a36Sopenharmony_ci{ 633162306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 633262306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 633362306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 633462306a36Sopenharmony_ci struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 633562306a36Sopenharmony_ci int ret; 633662306a36Sopenharmony_ci 633762306a36Sopenharmony_ci if (si_is_smc_running(rdev)) 633862306a36Sopenharmony_ci return -EINVAL; 633962306a36Sopenharmony_ci if (pi->voltage_control || si_pi->voltage_control_svi2) 634062306a36Sopenharmony_ci si_enable_voltage_control(rdev, true); 634162306a36Sopenharmony_ci if (pi->mvdd_control) 634262306a36Sopenharmony_ci si_get_mvdd_configuration(rdev); 634362306a36Sopenharmony_ci if (pi->voltage_control || si_pi->voltage_control_svi2) { 634462306a36Sopenharmony_ci ret = si_construct_voltage_tables(rdev); 634562306a36Sopenharmony_ci if (ret) { 634662306a36Sopenharmony_ci DRM_ERROR("si_construct_voltage_tables failed\n"); 634762306a36Sopenharmony_ci return ret; 634862306a36Sopenharmony_ci } 634962306a36Sopenharmony_ci } 635062306a36Sopenharmony_ci if (eg_pi->dynamic_ac_timing) { 635162306a36Sopenharmony_ci ret = si_initialize_mc_reg_table(rdev); 635262306a36Sopenharmony_ci if (ret) 635362306a36Sopenharmony_ci eg_pi->dynamic_ac_timing = false; 635462306a36Sopenharmony_ci } 635562306a36Sopenharmony_ci if (pi->dynamic_ss) 635662306a36Sopenharmony_ci si_enable_spread_spectrum(rdev, true); 635762306a36Sopenharmony_ci if (pi->thermal_protection) 635862306a36Sopenharmony_ci si_enable_thermal_protection(rdev, true); 635962306a36Sopenharmony_ci si_setup_bsp(rdev); 636062306a36Sopenharmony_ci si_program_git(rdev); 636162306a36Sopenharmony_ci si_program_tp(rdev); 636262306a36Sopenharmony_ci si_program_tpp(rdev); 636362306a36Sopenharmony_ci si_program_sstp(rdev); 636462306a36Sopenharmony_ci si_enable_display_gap(rdev); 636562306a36Sopenharmony_ci si_program_vc(rdev); 636662306a36Sopenharmony_ci ret = si_upload_firmware(rdev); 636762306a36Sopenharmony_ci if (ret) { 636862306a36Sopenharmony_ci DRM_ERROR("si_upload_firmware failed\n"); 636962306a36Sopenharmony_ci return ret; 637062306a36Sopenharmony_ci } 637162306a36Sopenharmony_ci ret = si_process_firmware_header(rdev); 637262306a36Sopenharmony_ci if (ret) { 637362306a36Sopenharmony_ci DRM_ERROR("si_process_firmware_header failed\n"); 637462306a36Sopenharmony_ci return ret; 637562306a36Sopenharmony_ci } 637662306a36Sopenharmony_ci ret = si_initial_switch_from_arb_f0_to_f1(rdev); 637762306a36Sopenharmony_ci if (ret) { 637862306a36Sopenharmony_ci DRM_ERROR("si_initial_switch_from_arb_f0_to_f1 failed\n"); 637962306a36Sopenharmony_ci return ret; 638062306a36Sopenharmony_ci } 638162306a36Sopenharmony_ci ret = si_init_smc_table(rdev); 638262306a36Sopenharmony_ci if (ret) { 638362306a36Sopenharmony_ci DRM_ERROR("si_init_smc_table failed\n"); 638462306a36Sopenharmony_ci return ret; 638562306a36Sopenharmony_ci } 638662306a36Sopenharmony_ci ret = si_init_smc_spll_table(rdev); 638762306a36Sopenharmony_ci if (ret) { 638862306a36Sopenharmony_ci DRM_ERROR("si_init_smc_spll_table failed\n"); 638962306a36Sopenharmony_ci return ret; 639062306a36Sopenharmony_ci } 639162306a36Sopenharmony_ci ret = si_init_arb_table_index(rdev); 639262306a36Sopenharmony_ci if (ret) { 639362306a36Sopenharmony_ci DRM_ERROR("si_init_arb_table_index failed\n"); 639462306a36Sopenharmony_ci return ret; 639562306a36Sopenharmony_ci } 639662306a36Sopenharmony_ci if (eg_pi->dynamic_ac_timing) { 639762306a36Sopenharmony_ci ret = si_populate_mc_reg_table(rdev, boot_ps); 639862306a36Sopenharmony_ci if (ret) { 639962306a36Sopenharmony_ci DRM_ERROR("si_populate_mc_reg_table failed\n"); 640062306a36Sopenharmony_ci return ret; 640162306a36Sopenharmony_ci } 640262306a36Sopenharmony_ci } 640362306a36Sopenharmony_ci ret = si_initialize_smc_cac_tables(rdev); 640462306a36Sopenharmony_ci if (ret) { 640562306a36Sopenharmony_ci DRM_ERROR("si_initialize_smc_cac_tables failed\n"); 640662306a36Sopenharmony_ci return ret; 640762306a36Sopenharmony_ci } 640862306a36Sopenharmony_ci ret = si_initialize_hardware_cac_manager(rdev); 640962306a36Sopenharmony_ci if (ret) { 641062306a36Sopenharmony_ci DRM_ERROR("si_initialize_hardware_cac_manager failed\n"); 641162306a36Sopenharmony_ci return ret; 641262306a36Sopenharmony_ci } 641362306a36Sopenharmony_ci ret = si_initialize_smc_dte_tables(rdev); 641462306a36Sopenharmony_ci if (ret) { 641562306a36Sopenharmony_ci DRM_ERROR("si_initialize_smc_dte_tables failed\n"); 641662306a36Sopenharmony_ci return ret; 641762306a36Sopenharmony_ci } 641862306a36Sopenharmony_ci ret = si_populate_smc_tdp_limits(rdev, boot_ps); 641962306a36Sopenharmony_ci if (ret) { 642062306a36Sopenharmony_ci DRM_ERROR("si_populate_smc_tdp_limits failed\n"); 642162306a36Sopenharmony_ci return ret; 642262306a36Sopenharmony_ci } 642362306a36Sopenharmony_ci ret = si_populate_smc_tdp_limits_2(rdev, boot_ps); 642462306a36Sopenharmony_ci if (ret) { 642562306a36Sopenharmony_ci DRM_ERROR("si_populate_smc_tdp_limits_2 failed\n"); 642662306a36Sopenharmony_ci return ret; 642762306a36Sopenharmony_ci } 642862306a36Sopenharmony_ci si_program_response_times(rdev); 642962306a36Sopenharmony_ci si_program_ds_registers(rdev); 643062306a36Sopenharmony_ci si_dpm_start_smc(rdev); 643162306a36Sopenharmony_ci ret = si_notify_smc_display_change(rdev, false); 643262306a36Sopenharmony_ci if (ret) { 643362306a36Sopenharmony_ci DRM_ERROR("si_notify_smc_display_change failed\n"); 643462306a36Sopenharmony_ci return ret; 643562306a36Sopenharmony_ci } 643662306a36Sopenharmony_ci si_enable_sclk_control(rdev, true); 643762306a36Sopenharmony_ci si_start_dpm(rdev); 643862306a36Sopenharmony_ci 643962306a36Sopenharmony_ci si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 644062306a36Sopenharmony_ci 644162306a36Sopenharmony_ci si_thermal_start_thermal_controller(rdev); 644262306a36Sopenharmony_ci 644362306a36Sopenharmony_ci ni_update_current_ps(rdev, boot_ps); 644462306a36Sopenharmony_ci 644562306a36Sopenharmony_ci return 0; 644662306a36Sopenharmony_ci} 644762306a36Sopenharmony_ci 644862306a36Sopenharmony_cistatic int si_set_temperature_range(struct radeon_device *rdev) 644962306a36Sopenharmony_ci{ 645062306a36Sopenharmony_ci int ret; 645162306a36Sopenharmony_ci 645262306a36Sopenharmony_ci ret = si_thermal_enable_alert(rdev, false); 645362306a36Sopenharmony_ci if (ret) 645462306a36Sopenharmony_ci return ret; 645562306a36Sopenharmony_ci ret = si_thermal_set_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); 645662306a36Sopenharmony_ci if (ret) 645762306a36Sopenharmony_ci return ret; 645862306a36Sopenharmony_ci ret = si_thermal_enable_alert(rdev, true); 645962306a36Sopenharmony_ci if (ret) 646062306a36Sopenharmony_ci return ret; 646162306a36Sopenharmony_ci 646262306a36Sopenharmony_ci return ret; 646362306a36Sopenharmony_ci} 646462306a36Sopenharmony_ci 646562306a36Sopenharmony_ciint si_dpm_late_enable(struct radeon_device *rdev) 646662306a36Sopenharmony_ci{ 646762306a36Sopenharmony_ci int ret; 646862306a36Sopenharmony_ci 646962306a36Sopenharmony_ci ret = si_set_temperature_range(rdev); 647062306a36Sopenharmony_ci if (ret) 647162306a36Sopenharmony_ci return ret; 647262306a36Sopenharmony_ci 647362306a36Sopenharmony_ci return ret; 647462306a36Sopenharmony_ci} 647562306a36Sopenharmony_ci 647662306a36Sopenharmony_civoid si_dpm_disable(struct radeon_device *rdev) 647762306a36Sopenharmony_ci{ 647862306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 647962306a36Sopenharmony_ci struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 648062306a36Sopenharmony_ci 648162306a36Sopenharmony_ci if (!si_is_smc_running(rdev)) 648262306a36Sopenharmony_ci return; 648362306a36Sopenharmony_ci si_thermal_stop_thermal_controller(rdev); 648462306a36Sopenharmony_ci si_disable_ulv(rdev); 648562306a36Sopenharmony_ci si_clear_vc(rdev); 648662306a36Sopenharmony_ci if (pi->thermal_protection) 648762306a36Sopenharmony_ci si_enable_thermal_protection(rdev, false); 648862306a36Sopenharmony_ci si_enable_power_containment(rdev, boot_ps, false); 648962306a36Sopenharmony_ci si_enable_smc_cac(rdev, boot_ps, false); 649062306a36Sopenharmony_ci si_enable_spread_spectrum(rdev, false); 649162306a36Sopenharmony_ci si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false); 649262306a36Sopenharmony_ci si_stop_dpm(rdev); 649362306a36Sopenharmony_ci si_reset_to_default(rdev); 649462306a36Sopenharmony_ci si_dpm_stop_smc(rdev); 649562306a36Sopenharmony_ci si_force_switch_to_arb_f0(rdev); 649662306a36Sopenharmony_ci 649762306a36Sopenharmony_ci ni_update_current_ps(rdev, boot_ps); 649862306a36Sopenharmony_ci} 649962306a36Sopenharmony_ci 650062306a36Sopenharmony_ciint si_dpm_pre_set_power_state(struct radeon_device *rdev) 650162306a36Sopenharmony_ci{ 650262306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 650362306a36Sopenharmony_ci struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps; 650462306a36Sopenharmony_ci struct radeon_ps *new_ps = &requested_ps; 650562306a36Sopenharmony_ci 650662306a36Sopenharmony_ci ni_update_requested_ps(rdev, new_ps); 650762306a36Sopenharmony_ci 650862306a36Sopenharmony_ci si_apply_state_adjust_rules(rdev, &eg_pi->requested_rps); 650962306a36Sopenharmony_ci 651062306a36Sopenharmony_ci return 0; 651162306a36Sopenharmony_ci} 651262306a36Sopenharmony_ci 651362306a36Sopenharmony_cistatic int si_power_control_set_level(struct radeon_device *rdev) 651462306a36Sopenharmony_ci{ 651562306a36Sopenharmony_ci struct radeon_ps *new_ps = rdev->pm.dpm.requested_ps; 651662306a36Sopenharmony_ci int ret; 651762306a36Sopenharmony_ci 651862306a36Sopenharmony_ci ret = si_restrict_performance_levels_before_switch(rdev); 651962306a36Sopenharmony_ci if (ret) 652062306a36Sopenharmony_ci return ret; 652162306a36Sopenharmony_ci ret = si_halt_smc(rdev); 652262306a36Sopenharmony_ci if (ret) 652362306a36Sopenharmony_ci return ret; 652462306a36Sopenharmony_ci ret = si_populate_smc_tdp_limits(rdev, new_ps); 652562306a36Sopenharmony_ci if (ret) 652662306a36Sopenharmony_ci return ret; 652762306a36Sopenharmony_ci ret = si_populate_smc_tdp_limits_2(rdev, new_ps); 652862306a36Sopenharmony_ci if (ret) 652962306a36Sopenharmony_ci return ret; 653062306a36Sopenharmony_ci ret = si_resume_smc(rdev); 653162306a36Sopenharmony_ci if (ret) 653262306a36Sopenharmony_ci return ret; 653362306a36Sopenharmony_ci ret = si_set_sw_state(rdev); 653462306a36Sopenharmony_ci if (ret) 653562306a36Sopenharmony_ci return ret; 653662306a36Sopenharmony_ci return 0; 653762306a36Sopenharmony_ci} 653862306a36Sopenharmony_ci 653962306a36Sopenharmony_ciint si_dpm_set_power_state(struct radeon_device *rdev) 654062306a36Sopenharmony_ci{ 654162306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 654262306a36Sopenharmony_ci struct radeon_ps *new_ps = &eg_pi->requested_rps; 654362306a36Sopenharmony_ci struct radeon_ps *old_ps = &eg_pi->current_rps; 654462306a36Sopenharmony_ci int ret; 654562306a36Sopenharmony_ci 654662306a36Sopenharmony_ci ret = si_disable_ulv(rdev); 654762306a36Sopenharmony_ci if (ret) { 654862306a36Sopenharmony_ci DRM_ERROR("si_disable_ulv failed\n"); 654962306a36Sopenharmony_ci return ret; 655062306a36Sopenharmony_ci } 655162306a36Sopenharmony_ci ret = si_restrict_performance_levels_before_switch(rdev); 655262306a36Sopenharmony_ci if (ret) { 655362306a36Sopenharmony_ci DRM_ERROR("si_restrict_performance_levels_before_switch failed\n"); 655462306a36Sopenharmony_ci return ret; 655562306a36Sopenharmony_ci } 655662306a36Sopenharmony_ci if (eg_pi->pcie_performance_request) 655762306a36Sopenharmony_ci si_request_link_speed_change_before_state_change(rdev, new_ps, old_ps); 655862306a36Sopenharmony_ci ni_set_uvd_clock_before_set_eng_clock(rdev, new_ps, old_ps); 655962306a36Sopenharmony_ci ret = si_enable_power_containment(rdev, new_ps, false); 656062306a36Sopenharmony_ci if (ret) { 656162306a36Sopenharmony_ci DRM_ERROR("si_enable_power_containment failed\n"); 656262306a36Sopenharmony_ci return ret; 656362306a36Sopenharmony_ci } 656462306a36Sopenharmony_ci ret = si_enable_smc_cac(rdev, new_ps, false); 656562306a36Sopenharmony_ci if (ret) { 656662306a36Sopenharmony_ci DRM_ERROR("si_enable_smc_cac failed\n"); 656762306a36Sopenharmony_ci return ret; 656862306a36Sopenharmony_ci } 656962306a36Sopenharmony_ci ret = si_halt_smc(rdev); 657062306a36Sopenharmony_ci if (ret) { 657162306a36Sopenharmony_ci DRM_ERROR("si_halt_smc failed\n"); 657262306a36Sopenharmony_ci return ret; 657362306a36Sopenharmony_ci } 657462306a36Sopenharmony_ci ret = si_upload_sw_state(rdev, new_ps); 657562306a36Sopenharmony_ci if (ret) { 657662306a36Sopenharmony_ci DRM_ERROR("si_upload_sw_state failed\n"); 657762306a36Sopenharmony_ci return ret; 657862306a36Sopenharmony_ci } 657962306a36Sopenharmony_ci ret = si_upload_smc_data(rdev); 658062306a36Sopenharmony_ci if (ret) { 658162306a36Sopenharmony_ci DRM_ERROR("si_upload_smc_data failed\n"); 658262306a36Sopenharmony_ci return ret; 658362306a36Sopenharmony_ci } 658462306a36Sopenharmony_ci ret = si_upload_ulv_state(rdev); 658562306a36Sopenharmony_ci if (ret) { 658662306a36Sopenharmony_ci DRM_ERROR("si_upload_ulv_state failed\n"); 658762306a36Sopenharmony_ci return ret; 658862306a36Sopenharmony_ci } 658962306a36Sopenharmony_ci if (eg_pi->dynamic_ac_timing) { 659062306a36Sopenharmony_ci ret = si_upload_mc_reg_table(rdev, new_ps); 659162306a36Sopenharmony_ci if (ret) { 659262306a36Sopenharmony_ci DRM_ERROR("si_upload_mc_reg_table failed\n"); 659362306a36Sopenharmony_ci return ret; 659462306a36Sopenharmony_ci } 659562306a36Sopenharmony_ci } 659662306a36Sopenharmony_ci ret = si_program_memory_timing_parameters(rdev, new_ps); 659762306a36Sopenharmony_ci if (ret) { 659862306a36Sopenharmony_ci DRM_ERROR("si_program_memory_timing_parameters failed\n"); 659962306a36Sopenharmony_ci return ret; 660062306a36Sopenharmony_ci } 660162306a36Sopenharmony_ci si_set_pcie_lane_width_in_smc(rdev, new_ps, old_ps); 660262306a36Sopenharmony_ci 660362306a36Sopenharmony_ci ret = si_resume_smc(rdev); 660462306a36Sopenharmony_ci if (ret) { 660562306a36Sopenharmony_ci DRM_ERROR("si_resume_smc failed\n"); 660662306a36Sopenharmony_ci return ret; 660762306a36Sopenharmony_ci } 660862306a36Sopenharmony_ci ret = si_set_sw_state(rdev); 660962306a36Sopenharmony_ci if (ret) { 661062306a36Sopenharmony_ci DRM_ERROR("si_set_sw_state failed\n"); 661162306a36Sopenharmony_ci return ret; 661262306a36Sopenharmony_ci } 661362306a36Sopenharmony_ci ni_set_uvd_clock_after_set_eng_clock(rdev, new_ps, old_ps); 661462306a36Sopenharmony_ci si_set_vce_clock(rdev, new_ps, old_ps); 661562306a36Sopenharmony_ci if (eg_pi->pcie_performance_request) 661662306a36Sopenharmony_ci si_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps); 661762306a36Sopenharmony_ci ret = si_set_power_state_conditionally_enable_ulv(rdev, new_ps); 661862306a36Sopenharmony_ci if (ret) { 661962306a36Sopenharmony_ci DRM_ERROR("si_set_power_state_conditionally_enable_ulv failed\n"); 662062306a36Sopenharmony_ci return ret; 662162306a36Sopenharmony_ci } 662262306a36Sopenharmony_ci ret = si_enable_smc_cac(rdev, new_ps, true); 662362306a36Sopenharmony_ci if (ret) { 662462306a36Sopenharmony_ci DRM_ERROR("si_enable_smc_cac failed\n"); 662562306a36Sopenharmony_ci return ret; 662662306a36Sopenharmony_ci } 662762306a36Sopenharmony_ci ret = si_enable_power_containment(rdev, new_ps, true); 662862306a36Sopenharmony_ci if (ret) { 662962306a36Sopenharmony_ci DRM_ERROR("si_enable_power_containment failed\n"); 663062306a36Sopenharmony_ci return ret; 663162306a36Sopenharmony_ci } 663262306a36Sopenharmony_ci 663362306a36Sopenharmony_ci ret = si_power_control_set_level(rdev); 663462306a36Sopenharmony_ci if (ret) { 663562306a36Sopenharmony_ci DRM_ERROR("si_power_control_set_level failed\n"); 663662306a36Sopenharmony_ci return ret; 663762306a36Sopenharmony_ci } 663862306a36Sopenharmony_ci 663962306a36Sopenharmony_ci return 0; 664062306a36Sopenharmony_ci} 664162306a36Sopenharmony_ci 664262306a36Sopenharmony_civoid si_dpm_post_set_power_state(struct radeon_device *rdev) 664362306a36Sopenharmony_ci{ 664462306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 664562306a36Sopenharmony_ci struct radeon_ps *new_ps = &eg_pi->requested_rps; 664662306a36Sopenharmony_ci 664762306a36Sopenharmony_ci ni_update_current_ps(rdev, new_ps); 664862306a36Sopenharmony_ci} 664962306a36Sopenharmony_ci 665062306a36Sopenharmony_ci#if 0 665162306a36Sopenharmony_civoid si_dpm_reset_asic(struct radeon_device *rdev) 665262306a36Sopenharmony_ci{ 665362306a36Sopenharmony_ci si_restrict_performance_levels_before_switch(rdev); 665462306a36Sopenharmony_ci si_disable_ulv(rdev); 665562306a36Sopenharmony_ci si_set_boot_state(rdev); 665662306a36Sopenharmony_ci} 665762306a36Sopenharmony_ci#endif 665862306a36Sopenharmony_ci 665962306a36Sopenharmony_civoid si_dpm_display_configuration_changed(struct radeon_device *rdev) 666062306a36Sopenharmony_ci{ 666162306a36Sopenharmony_ci si_program_display_gap(rdev); 666262306a36Sopenharmony_ci} 666362306a36Sopenharmony_ci 666462306a36Sopenharmony_ciunion power_info { 666562306a36Sopenharmony_ci struct _ATOM_POWERPLAY_INFO info; 666662306a36Sopenharmony_ci struct _ATOM_POWERPLAY_INFO_V2 info_2; 666762306a36Sopenharmony_ci struct _ATOM_POWERPLAY_INFO_V3 info_3; 666862306a36Sopenharmony_ci struct _ATOM_PPLIB_POWERPLAYTABLE pplib; 666962306a36Sopenharmony_ci struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2; 667062306a36Sopenharmony_ci struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3; 667162306a36Sopenharmony_ci}; 667262306a36Sopenharmony_ci 667362306a36Sopenharmony_ciunion pplib_clock_info { 667462306a36Sopenharmony_ci struct _ATOM_PPLIB_R600_CLOCK_INFO r600; 667562306a36Sopenharmony_ci struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780; 667662306a36Sopenharmony_ci struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen; 667762306a36Sopenharmony_ci struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo; 667862306a36Sopenharmony_ci struct _ATOM_PPLIB_SI_CLOCK_INFO si; 667962306a36Sopenharmony_ci}; 668062306a36Sopenharmony_ci 668162306a36Sopenharmony_ciunion pplib_power_state { 668262306a36Sopenharmony_ci struct _ATOM_PPLIB_STATE v1; 668362306a36Sopenharmony_ci struct _ATOM_PPLIB_STATE_V2 v2; 668462306a36Sopenharmony_ci}; 668562306a36Sopenharmony_ci 668662306a36Sopenharmony_cistatic void si_parse_pplib_non_clock_info(struct radeon_device *rdev, 668762306a36Sopenharmony_ci struct radeon_ps *rps, 668862306a36Sopenharmony_ci struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info, 668962306a36Sopenharmony_ci u8 table_rev) 669062306a36Sopenharmony_ci{ 669162306a36Sopenharmony_ci rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings); 669262306a36Sopenharmony_ci rps->class = le16_to_cpu(non_clock_info->usClassification); 669362306a36Sopenharmony_ci rps->class2 = le16_to_cpu(non_clock_info->usClassification2); 669462306a36Sopenharmony_ci 669562306a36Sopenharmony_ci if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) { 669662306a36Sopenharmony_ci rps->vclk = le32_to_cpu(non_clock_info->ulVCLK); 669762306a36Sopenharmony_ci rps->dclk = le32_to_cpu(non_clock_info->ulDCLK); 669862306a36Sopenharmony_ci } else if (r600_is_uvd_state(rps->class, rps->class2)) { 669962306a36Sopenharmony_ci rps->vclk = RV770_DEFAULT_VCLK_FREQ; 670062306a36Sopenharmony_ci rps->dclk = RV770_DEFAULT_DCLK_FREQ; 670162306a36Sopenharmony_ci } else { 670262306a36Sopenharmony_ci rps->vclk = 0; 670362306a36Sopenharmony_ci rps->dclk = 0; 670462306a36Sopenharmony_ci } 670562306a36Sopenharmony_ci 670662306a36Sopenharmony_ci if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) 670762306a36Sopenharmony_ci rdev->pm.dpm.boot_ps = rps; 670862306a36Sopenharmony_ci if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE) 670962306a36Sopenharmony_ci rdev->pm.dpm.uvd_ps = rps; 671062306a36Sopenharmony_ci} 671162306a36Sopenharmony_ci 671262306a36Sopenharmony_cistatic void si_parse_pplib_clock_info(struct radeon_device *rdev, 671362306a36Sopenharmony_ci struct radeon_ps *rps, int index, 671462306a36Sopenharmony_ci union pplib_clock_info *clock_info) 671562306a36Sopenharmony_ci{ 671662306a36Sopenharmony_ci struct rv7xx_power_info *pi = rv770_get_pi(rdev); 671762306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 671862306a36Sopenharmony_ci struct si_power_info *si_pi = si_get_pi(rdev); 671962306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 672062306a36Sopenharmony_ci u16 leakage_voltage; 672162306a36Sopenharmony_ci struct rv7xx_pl *pl = &ps->performance_levels[index]; 672262306a36Sopenharmony_ci int ret; 672362306a36Sopenharmony_ci 672462306a36Sopenharmony_ci ps->performance_level_count = index + 1; 672562306a36Sopenharmony_ci 672662306a36Sopenharmony_ci pl->sclk = le16_to_cpu(clock_info->si.usEngineClockLow); 672762306a36Sopenharmony_ci pl->sclk |= clock_info->si.ucEngineClockHigh << 16; 672862306a36Sopenharmony_ci pl->mclk = le16_to_cpu(clock_info->si.usMemoryClockLow); 672962306a36Sopenharmony_ci pl->mclk |= clock_info->si.ucMemoryClockHigh << 16; 673062306a36Sopenharmony_ci 673162306a36Sopenharmony_ci pl->vddc = le16_to_cpu(clock_info->si.usVDDC); 673262306a36Sopenharmony_ci pl->vddci = le16_to_cpu(clock_info->si.usVDDCI); 673362306a36Sopenharmony_ci pl->flags = le32_to_cpu(clock_info->si.ulFlags); 673462306a36Sopenharmony_ci pl->pcie_gen = r600_get_pcie_gen_support(rdev, 673562306a36Sopenharmony_ci si_pi->sys_pcie_mask, 673662306a36Sopenharmony_ci si_pi->boot_pcie_gen, 673762306a36Sopenharmony_ci clock_info->si.ucPCIEGen); 673862306a36Sopenharmony_ci 673962306a36Sopenharmony_ci /* patch up vddc if necessary */ 674062306a36Sopenharmony_ci ret = si_get_leakage_voltage_from_leakage_index(rdev, pl->vddc, 674162306a36Sopenharmony_ci &leakage_voltage); 674262306a36Sopenharmony_ci if (ret == 0) 674362306a36Sopenharmony_ci pl->vddc = leakage_voltage; 674462306a36Sopenharmony_ci 674562306a36Sopenharmony_ci if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) { 674662306a36Sopenharmony_ci pi->acpi_vddc = pl->vddc; 674762306a36Sopenharmony_ci eg_pi->acpi_vddci = pl->vddci; 674862306a36Sopenharmony_ci si_pi->acpi_pcie_gen = pl->pcie_gen; 674962306a36Sopenharmony_ci } 675062306a36Sopenharmony_ci 675162306a36Sopenharmony_ci if ((rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) && 675262306a36Sopenharmony_ci index == 0) { 675362306a36Sopenharmony_ci /* XXX disable for A0 tahiti */ 675462306a36Sopenharmony_ci si_pi->ulv.supported = false; 675562306a36Sopenharmony_ci si_pi->ulv.pl = *pl; 675662306a36Sopenharmony_ci si_pi->ulv.one_pcie_lane_in_ulv = false; 675762306a36Sopenharmony_ci si_pi->ulv.volt_change_delay = SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT; 675862306a36Sopenharmony_ci si_pi->ulv.cg_ulv_parameter = SISLANDS_CGULVPARAMETER_DFLT; 675962306a36Sopenharmony_ci si_pi->ulv.cg_ulv_control = SISLANDS_CGULVCONTROL_DFLT; 676062306a36Sopenharmony_ci } 676162306a36Sopenharmony_ci 676262306a36Sopenharmony_ci if (pi->min_vddc_in_table > pl->vddc) 676362306a36Sopenharmony_ci pi->min_vddc_in_table = pl->vddc; 676462306a36Sopenharmony_ci 676562306a36Sopenharmony_ci if (pi->max_vddc_in_table < pl->vddc) 676662306a36Sopenharmony_ci pi->max_vddc_in_table = pl->vddc; 676762306a36Sopenharmony_ci 676862306a36Sopenharmony_ci /* patch up boot state */ 676962306a36Sopenharmony_ci if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) { 677062306a36Sopenharmony_ci u16 vddc, vddci, mvdd; 677162306a36Sopenharmony_ci radeon_atombios_get_default_voltages(rdev, &vddc, &vddci, &mvdd); 677262306a36Sopenharmony_ci pl->mclk = rdev->clock.default_mclk; 677362306a36Sopenharmony_ci pl->sclk = rdev->clock.default_sclk; 677462306a36Sopenharmony_ci pl->vddc = vddc; 677562306a36Sopenharmony_ci pl->vddci = vddci; 677662306a36Sopenharmony_ci si_pi->mvdd_bootup_value = mvdd; 677762306a36Sopenharmony_ci } 677862306a36Sopenharmony_ci 677962306a36Sopenharmony_ci if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == 678062306a36Sopenharmony_ci ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) { 678162306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk; 678262306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk; 678362306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc; 678462306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci; 678562306a36Sopenharmony_ci } 678662306a36Sopenharmony_ci} 678762306a36Sopenharmony_ci 678862306a36Sopenharmony_cistatic int si_parse_power_table(struct radeon_device *rdev) 678962306a36Sopenharmony_ci{ 679062306a36Sopenharmony_ci struct radeon_mode_info *mode_info = &rdev->mode_info; 679162306a36Sopenharmony_ci struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info; 679262306a36Sopenharmony_ci union pplib_power_state *power_state; 679362306a36Sopenharmony_ci int i, j, k, non_clock_array_index, clock_array_index; 679462306a36Sopenharmony_ci union pplib_clock_info *clock_info; 679562306a36Sopenharmony_ci struct _StateArray *state_array; 679662306a36Sopenharmony_ci struct _ClockInfoArray *clock_info_array; 679762306a36Sopenharmony_ci struct _NonClockInfoArray *non_clock_info_array; 679862306a36Sopenharmony_ci union power_info *power_info; 679962306a36Sopenharmony_ci int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 680062306a36Sopenharmony_ci u16 data_offset; 680162306a36Sopenharmony_ci u8 frev, crev; 680262306a36Sopenharmony_ci u8 *power_state_offset; 680362306a36Sopenharmony_ci struct ni_ps *ps; 680462306a36Sopenharmony_ci 680562306a36Sopenharmony_ci if (!atom_parse_data_header(mode_info->atom_context, index, NULL, 680662306a36Sopenharmony_ci &frev, &crev, &data_offset)) 680762306a36Sopenharmony_ci return -EINVAL; 680862306a36Sopenharmony_ci power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 680962306a36Sopenharmony_ci 681062306a36Sopenharmony_ci state_array = (struct _StateArray *) 681162306a36Sopenharmony_ci (mode_info->atom_context->bios + data_offset + 681262306a36Sopenharmony_ci le16_to_cpu(power_info->pplib.usStateArrayOffset)); 681362306a36Sopenharmony_ci clock_info_array = (struct _ClockInfoArray *) 681462306a36Sopenharmony_ci (mode_info->atom_context->bios + data_offset + 681562306a36Sopenharmony_ci le16_to_cpu(power_info->pplib.usClockInfoArrayOffset)); 681662306a36Sopenharmony_ci non_clock_info_array = (struct _NonClockInfoArray *) 681762306a36Sopenharmony_ci (mode_info->atom_context->bios + data_offset + 681862306a36Sopenharmony_ci le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset)); 681962306a36Sopenharmony_ci 682062306a36Sopenharmony_ci rdev->pm.dpm.ps = kcalloc(state_array->ucNumEntries, 682162306a36Sopenharmony_ci sizeof(struct radeon_ps), 682262306a36Sopenharmony_ci GFP_KERNEL); 682362306a36Sopenharmony_ci if (!rdev->pm.dpm.ps) 682462306a36Sopenharmony_ci return -ENOMEM; 682562306a36Sopenharmony_ci power_state_offset = (u8 *)state_array->states; 682662306a36Sopenharmony_ci for (i = 0; i < state_array->ucNumEntries; i++) { 682762306a36Sopenharmony_ci u8 *idx; 682862306a36Sopenharmony_ci power_state = (union pplib_power_state *)power_state_offset; 682962306a36Sopenharmony_ci non_clock_array_index = power_state->v2.nonClockInfoIndex; 683062306a36Sopenharmony_ci non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 683162306a36Sopenharmony_ci &non_clock_info_array->nonClockInfo[non_clock_array_index]; 683262306a36Sopenharmony_ci if (!rdev->pm.power_state[i].clock_info) 683362306a36Sopenharmony_ci return -EINVAL; 683462306a36Sopenharmony_ci ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL); 683562306a36Sopenharmony_ci if (ps == NULL) { 683662306a36Sopenharmony_ci kfree(rdev->pm.dpm.ps); 683762306a36Sopenharmony_ci return -ENOMEM; 683862306a36Sopenharmony_ci } 683962306a36Sopenharmony_ci rdev->pm.dpm.ps[i].ps_priv = ps; 684062306a36Sopenharmony_ci si_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 684162306a36Sopenharmony_ci non_clock_info, 684262306a36Sopenharmony_ci non_clock_info_array->ucEntrySize); 684362306a36Sopenharmony_ci k = 0; 684462306a36Sopenharmony_ci idx = (u8 *)&power_state->v2.clockInfoIndex[0]; 684562306a36Sopenharmony_ci for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 684662306a36Sopenharmony_ci clock_array_index = idx[j]; 684762306a36Sopenharmony_ci if (clock_array_index >= clock_info_array->ucNumEntries) 684862306a36Sopenharmony_ci continue; 684962306a36Sopenharmony_ci if (k >= SISLANDS_MAX_HARDWARE_POWERLEVELS) 685062306a36Sopenharmony_ci break; 685162306a36Sopenharmony_ci clock_info = (union pplib_clock_info *) 685262306a36Sopenharmony_ci ((u8 *)&clock_info_array->clockInfo[0] + 685362306a36Sopenharmony_ci (clock_array_index * clock_info_array->ucEntrySize)); 685462306a36Sopenharmony_ci si_parse_pplib_clock_info(rdev, 685562306a36Sopenharmony_ci &rdev->pm.dpm.ps[i], k, 685662306a36Sopenharmony_ci clock_info); 685762306a36Sopenharmony_ci k++; 685862306a36Sopenharmony_ci } 685962306a36Sopenharmony_ci power_state_offset += 2 + power_state->v2.ucNumDPMLevels; 686062306a36Sopenharmony_ci } 686162306a36Sopenharmony_ci rdev->pm.dpm.num_ps = state_array->ucNumEntries; 686262306a36Sopenharmony_ci 686362306a36Sopenharmony_ci /* fill in the vce power states */ 686462306a36Sopenharmony_ci for (i = 0; i < RADEON_MAX_VCE_LEVELS; i++) { 686562306a36Sopenharmony_ci u32 sclk, mclk; 686662306a36Sopenharmony_ci clock_array_index = rdev->pm.dpm.vce_states[i].clk_idx; 686762306a36Sopenharmony_ci clock_info = (union pplib_clock_info *) 686862306a36Sopenharmony_ci &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize]; 686962306a36Sopenharmony_ci sclk = le16_to_cpu(clock_info->si.usEngineClockLow); 687062306a36Sopenharmony_ci sclk |= clock_info->si.ucEngineClockHigh << 16; 687162306a36Sopenharmony_ci mclk = le16_to_cpu(clock_info->si.usMemoryClockLow); 687262306a36Sopenharmony_ci mclk |= clock_info->si.ucMemoryClockHigh << 16; 687362306a36Sopenharmony_ci rdev->pm.dpm.vce_states[i].sclk = sclk; 687462306a36Sopenharmony_ci rdev->pm.dpm.vce_states[i].mclk = mclk; 687562306a36Sopenharmony_ci } 687662306a36Sopenharmony_ci 687762306a36Sopenharmony_ci return 0; 687862306a36Sopenharmony_ci} 687962306a36Sopenharmony_ci 688062306a36Sopenharmony_ciint si_dpm_init(struct radeon_device *rdev) 688162306a36Sopenharmony_ci{ 688262306a36Sopenharmony_ci struct rv7xx_power_info *pi; 688362306a36Sopenharmony_ci struct evergreen_power_info *eg_pi; 688462306a36Sopenharmony_ci struct ni_power_info *ni_pi; 688562306a36Sopenharmony_ci struct si_power_info *si_pi; 688662306a36Sopenharmony_ci struct atom_clock_dividers dividers; 688762306a36Sopenharmony_ci enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN; 688862306a36Sopenharmony_ci struct pci_dev *root = rdev->pdev->bus->self; 688962306a36Sopenharmony_ci int ret; 689062306a36Sopenharmony_ci 689162306a36Sopenharmony_ci si_pi = kzalloc(sizeof(struct si_power_info), GFP_KERNEL); 689262306a36Sopenharmony_ci if (si_pi == NULL) 689362306a36Sopenharmony_ci return -ENOMEM; 689462306a36Sopenharmony_ci rdev->pm.dpm.priv = si_pi; 689562306a36Sopenharmony_ci ni_pi = &si_pi->ni; 689662306a36Sopenharmony_ci eg_pi = &ni_pi->eg; 689762306a36Sopenharmony_ci pi = &eg_pi->rv7xx; 689862306a36Sopenharmony_ci 689962306a36Sopenharmony_ci if (!pci_is_root_bus(rdev->pdev->bus)) 690062306a36Sopenharmony_ci speed_cap = pcie_get_speed_cap(root); 690162306a36Sopenharmony_ci if (speed_cap == PCI_SPEED_UNKNOWN) { 690262306a36Sopenharmony_ci si_pi->sys_pcie_mask = 0; 690362306a36Sopenharmony_ci } else { 690462306a36Sopenharmony_ci if (speed_cap == PCIE_SPEED_8_0GT) 690562306a36Sopenharmony_ci si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 690662306a36Sopenharmony_ci RADEON_PCIE_SPEED_50 | 690762306a36Sopenharmony_ci RADEON_PCIE_SPEED_80; 690862306a36Sopenharmony_ci else if (speed_cap == PCIE_SPEED_5_0GT) 690962306a36Sopenharmony_ci si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25 | 691062306a36Sopenharmony_ci RADEON_PCIE_SPEED_50; 691162306a36Sopenharmony_ci else 691262306a36Sopenharmony_ci si_pi->sys_pcie_mask = RADEON_PCIE_SPEED_25; 691362306a36Sopenharmony_ci } 691462306a36Sopenharmony_ci si_pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID; 691562306a36Sopenharmony_ci si_pi->boot_pcie_gen = si_get_current_pcie_speed(rdev); 691662306a36Sopenharmony_ci 691762306a36Sopenharmony_ci si_set_max_cu_value(rdev); 691862306a36Sopenharmony_ci 691962306a36Sopenharmony_ci rv770_get_max_vddc(rdev); 692062306a36Sopenharmony_ci si_get_leakage_vddc(rdev); 692162306a36Sopenharmony_ci si_patch_dependency_tables_based_on_leakage(rdev); 692262306a36Sopenharmony_ci 692362306a36Sopenharmony_ci pi->acpi_vddc = 0; 692462306a36Sopenharmony_ci eg_pi->acpi_vddci = 0; 692562306a36Sopenharmony_ci pi->min_vddc_in_table = 0; 692662306a36Sopenharmony_ci pi->max_vddc_in_table = 0; 692762306a36Sopenharmony_ci 692862306a36Sopenharmony_ci ret = r600_get_platform_caps(rdev); 692962306a36Sopenharmony_ci if (ret) 693062306a36Sopenharmony_ci return ret; 693162306a36Sopenharmony_ci 693262306a36Sopenharmony_ci ret = r600_parse_extended_power_table(rdev); 693362306a36Sopenharmony_ci if (ret) 693462306a36Sopenharmony_ci return ret; 693562306a36Sopenharmony_ci 693662306a36Sopenharmony_ci ret = si_parse_power_table(rdev); 693762306a36Sopenharmony_ci if (ret) 693862306a36Sopenharmony_ci return ret; 693962306a36Sopenharmony_ci 694062306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries = 694162306a36Sopenharmony_ci kcalloc(4, 694262306a36Sopenharmony_ci sizeof(struct radeon_clock_voltage_dependency_entry), 694362306a36Sopenharmony_ci GFP_KERNEL); 694462306a36Sopenharmony_ci if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) { 694562306a36Sopenharmony_ci r600_free_extended_power_table(rdev); 694662306a36Sopenharmony_ci return -ENOMEM; 694762306a36Sopenharmony_ci } 694862306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4; 694962306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0; 695062306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0; 695162306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000; 695262306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720; 695362306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000; 695462306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810; 695562306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000; 695662306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900; 695762306a36Sopenharmony_ci 695862306a36Sopenharmony_ci if (rdev->pm.dpm.voltage_response_time == 0) 695962306a36Sopenharmony_ci rdev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT; 696062306a36Sopenharmony_ci if (rdev->pm.dpm.backbias_response_time == 0) 696162306a36Sopenharmony_ci rdev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT; 696262306a36Sopenharmony_ci 696362306a36Sopenharmony_ci ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM, 696462306a36Sopenharmony_ci 0, false, ÷rs); 696562306a36Sopenharmony_ci if (ret) 696662306a36Sopenharmony_ci pi->ref_div = dividers.ref_div + 1; 696762306a36Sopenharmony_ci else 696862306a36Sopenharmony_ci pi->ref_div = R600_REFERENCEDIVIDER_DFLT; 696962306a36Sopenharmony_ci 697062306a36Sopenharmony_ci eg_pi->smu_uvd_hs = false; 697162306a36Sopenharmony_ci 697262306a36Sopenharmony_ci pi->mclk_strobe_mode_threshold = 40000; 697362306a36Sopenharmony_ci if (si_is_special_1gb_platform(rdev)) 697462306a36Sopenharmony_ci pi->mclk_stutter_mode_threshold = 0; 697562306a36Sopenharmony_ci else 697662306a36Sopenharmony_ci pi->mclk_stutter_mode_threshold = pi->mclk_strobe_mode_threshold; 697762306a36Sopenharmony_ci pi->mclk_edc_enable_threshold = 40000; 697862306a36Sopenharmony_ci eg_pi->mclk_edc_wr_enable_threshold = 40000; 697962306a36Sopenharmony_ci 698062306a36Sopenharmony_ci ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold; 698162306a36Sopenharmony_ci 698262306a36Sopenharmony_ci pi->voltage_control = 698362306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 698462306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT); 698562306a36Sopenharmony_ci if (!pi->voltage_control) { 698662306a36Sopenharmony_ci si_pi->voltage_control_svi2 = 698762306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 698862306a36Sopenharmony_ci VOLTAGE_OBJ_SVID2); 698962306a36Sopenharmony_ci if (si_pi->voltage_control_svi2) 699062306a36Sopenharmony_ci radeon_atom_get_svi2_info(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 699162306a36Sopenharmony_ci &si_pi->svd_gpio_id, &si_pi->svc_gpio_id); 699262306a36Sopenharmony_ci } 699362306a36Sopenharmony_ci 699462306a36Sopenharmony_ci pi->mvdd_control = 699562306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 699662306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT); 699762306a36Sopenharmony_ci 699862306a36Sopenharmony_ci eg_pi->vddci_control = 699962306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 700062306a36Sopenharmony_ci VOLTAGE_OBJ_GPIO_LUT); 700162306a36Sopenharmony_ci if (!eg_pi->vddci_control) 700262306a36Sopenharmony_ci si_pi->vddci_control_svi2 = 700362306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 700462306a36Sopenharmony_ci VOLTAGE_OBJ_SVID2); 700562306a36Sopenharmony_ci 700662306a36Sopenharmony_ci si_pi->vddc_phase_shed_control = 700762306a36Sopenharmony_ci radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, 700862306a36Sopenharmony_ci VOLTAGE_OBJ_PHASE_LUT); 700962306a36Sopenharmony_ci 701062306a36Sopenharmony_ci rv770_get_engine_memory_ss(rdev); 701162306a36Sopenharmony_ci 701262306a36Sopenharmony_ci pi->asi = RV770_ASI_DFLT; 701362306a36Sopenharmony_ci pi->pasi = CYPRESS_HASI_DFLT; 701462306a36Sopenharmony_ci pi->vrc = SISLANDS_VRC_DFLT; 701562306a36Sopenharmony_ci 701662306a36Sopenharmony_ci pi->gfx_clock_gating = true; 701762306a36Sopenharmony_ci 701862306a36Sopenharmony_ci eg_pi->sclk_deep_sleep = true; 701962306a36Sopenharmony_ci si_pi->sclk_deep_sleep_above_low = false; 702062306a36Sopenharmony_ci 702162306a36Sopenharmony_ci if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE) 702262306a36Sopenharmony_ci pi->thermal_protection = true; 702362306a36Sopenharmony_ci else 702462306a36Sopenharmony_ci pi->thermal_protection = false; 702562306a36Sopenharmony_ci 702662306a36Sopenharmony_ci eg_pi->dynamic_ac_timing = true; 702762306a36Sopenharmony_ci 702862306a36Sopenharmony_ci eg_pi->light_sleep = true; 702962306a36Sopenharmony_ci#if defined(CONFIG_ACPI) 703062306a36Sopenharmony_ci eg_pi->pcie_performance_request = 703162306a36Sopenharmony_ci radeon_acpi_is_pcie_performance_request_supported(rdev); 703262306a36Sopenharmony_ci#else 703362306a36Sopenharmony_ci eg_pi->pcie_performance_request = false; 703462306a36Sopenharmony_ci#endif 703562306a36Sopenharmony_ci 703662306a36Sopenharmony_ci si_pi->sram_end = SMC_RAM_END; 703762306a36Sopenharmony_ci 703862306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4; 703962306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000; 704062306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200; 704162306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.valid_sclk_values.count = 0; 704262306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.valid_sclk_values.values = NULL; 704362306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0; 704462306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL; 704562306a36Sopenharmony_ci 704662306a36Sopenharmony_ci si_initialize_powertune_defaults(rdev); 704762306a36Sopenharmony_ci 704862306a36Sopenharmony_ci /* make sure dc limits are valid */ 704962306a36Sopenharmony_ci if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) || 705062306a36Sopenharmony_ci (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0)) 705162306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc = 705262306a36Sopenharmony_ci rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; 705362306a36Sopenharmony_ci 705462306a36Sopenharmony_ci si_pi->fan_ctrl_is_in_default_mode = true; 705562306a36Sopenharmony_ci 705662306a36Sopenharmony_ci return 0; 705762306a36Sopenharmony_ci} 705862306a36Sopenharmony_ci 705962306a36Sopenharmony_civoid si_dpm_fini(struct radeon_device *rdev) 706062306a36Sopenharmony_ci{ 706162306a36Sopenharmony_ci int i; 706262306a36Sopenharmony_ci 706362306a36Sopenharmony_ci for (i = 0; i < rdev->pm.dpm.num_ps; i++) { 706462306a36Sopenharmony_ci kfree(rdev->pm.dpm.ps[i].ps_priv); 706562306a36Sopenharmony_ci } 706662306a36Sopenharmony_ci kfree(rdev->pm.dpm.ps); 706762306a36Sopenharmony_ci kfree(rdev->pm.dpm.priv); 706862306a36Sopenharmony_ci kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries); 706962306a36Sopenharmony_ci r600_free_extended_power_table(rdev); 707062306a36Sopenharmony_ci} 707162306a36Sopenharmony_ci 707262306a36Sopenharmony_civoid si_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, 707362306a36Sopenharmony_ci struct seq_file *m) 707462306a36Sopenharmony_ci{ 707562306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 707662306a36Sopenharmony_ci struct radeon_ps *rps = &eg_pi->current_rps; 707762306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 707862306a36Sopenharmony_ci struct rv7xx_pl *pl; 707962306a36Sopenharmony_ci u32 current_index = 708062306a36Sopenharmony_ci (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >> 708162306a36Sopenharmony_ci CURRENT_STATE_INDEX_SHIFT; 708262306a36Sopenharmony_ci 708362306a36Sopenharmony_ci if (current_index >= ps->performance_level_count) { 708462306a36Sopenharmony_ci seq_printf(m, "invalid dpm profile %d\n", current_index); 708562306a36Sopenharmony_ci } else { 708662306a36Sopenharmony_ci pl = &ps->performance_levels[current_index]; 708762306a36Sopenharmony_ci seq_printf(m, "uvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk); 708862306a36Sopenharmony_ci seq_printf(m, "power level %d sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n", 708962306a36Sopenharmony_ci current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1); 709062306a36Sopenharmony_ci } 709162306a36Sopenharmony_ci} 709262306a36Sopenharmony_ci 709362306a36Sopenharmony_ciu32 si_dpm_get_current_sclk(struct radeon_device *rdev) 709462306a36Sopenharmony_ci{ 709562306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 709662306a36Sopenharmony_ci struct radeon_ps *rps = &eg_pi->current_rps; 709762306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 709862306a36Sopenharmony_ci struct rv7xx_pl *pl; 709962306a36Sopenharmony_ci u32 current_index = 710062306a36Sopenharmony_ci (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >> 710162306a36Sopenharmony_ci CURRENT_STATE_INDEX_SHIFT; 710262306a36Sopenharmony_ci 710362306a36Sopenharmony_ci if (current_index >= ps->performance_level_count) { 710462306a36Sopenharmony_ci return 0; 710562306a36Sopenharmony_ci } else { 710662306a36Sopenharmony_ci pl = &ps->performance_levels[current_index]; 710762306a36Sopenharmony_ci return pl->sclk; 710862306a36Sopenharmony_ci } 710962306a36Sopenharmony_ci} 711062306a36Sopenharmony_ci 711162306a36Sopenharmony_ciu32 si_dpm_get_current_mclk(struct radeon_device *rdev) 711262306a36Sopenharmony_ci{ 711362306a36Sopenharmony_ci struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev); 711462306a36Sopenharmony_ci struct radeon_ps *rps = &eg_pi->current_rps; 711562306a36Sopenharmony_ci struct ni_ps *ps = ni_get_ps(rps); 711662306a36Sopenharmony_ci struct rv7xx_pl *pl; 711762306a36Sopenharmony_ci u32 current_index = 711862306a36Sopenharmony_ci (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >> 711962306a36Sopenharmony_ci CURRENT_STATE_INDEX_SHIFT; 712062306a36Sopenharmony_ci 712162306a36Sopenharmony_ci if (current_index >= ps->performance_level_count) { 712262306a36Sopenharmony_ci return 0; 712362306a36Sopenharmony_ci } else { 712462306a36Sopenharmony_ci pl = &ps->performance_levels[current_index]; 712562306a36Sopenharmony_ci return pl->mclk; 712662306a36Sopenharmony_ci } 712762306a36Sopenharmony_ci} 7128