162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2015 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/firmware.h>
2562306a36Sopenharmony_ci#include <linux/slab.h>
2662306a36Sopenharmony_ci#include <linux/module.h>
2762306a36Sopenharmony_ci#include <linux/pci.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include <drm/amdgpu_drm.h>
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#include "amdgpu.h"
3262306a36Sopenharmony_ci#include "amdgpu_atombios.h"
3362306a36Sopenharmony_ci#include "amdgpu_ih.h"
3462306a36Sopenharmony_ci#include "amdgpu_uvd.h"
3562306a36Sopenharmony_ci#include "amdgpu_vce.h"
3662306a36Sopenharmony_ci#include "atom.h"
3762306a36Sopenharmony_ci#include "amd_pcie.h"
3862306a36Sopenharmony_ci#include "si_dpm.h"
3962306a36Sopenharmony_ci#include "sid.h"
4062306a36Sopenharmony_ci#include "si_ih.h"
4162306a36Sopenharmony_ci#include "gfx_v6_0.h"
4262306a36Sopenharmony_ci#include "gmc_v6_0.h"
4362306a36Sopenharmony_ci#include "si_dma.h"
4462306a36Sopenharmony_ci#include "dce_v6_0.h"
4562306a36Sopenharmony_ci#include "si.h"
4662306a36Sopenharmony_ci#include "uvd_v3_1.h"
4762306a36Sopenharmony_ci#include "amdgpu_vkms.h"
4862306a36Sopenharmony_ci#include "gca/gfx_6_0_d.h"
4962306a36Sopenharmony_ci#include "oss/oss_1_0_d.h"
5062306a36Sopenharmony_ci#include "oss/oss_1_0_sh_mask.h"
5162306a36Sopenharmony_ci#include "gmc/gmc_6_0_d.h"
5262306a36Sopenharmony_ci#include "dce/dce_6_0_d.h"
5362306a36Sopenharmony_ci#include "uvd/uvd_4_0_d.h"
5462306a36Sopenharmony_ci#include "bif/bif_3_0_d.h"
5562306a36Sopenharmony_ci#include "bif/bif_3_0_sh_mask.h"
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#include "amdgpu_dm.h"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic const u32 tahiti_golden_registers[] =
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
6262306a36Sopenharmony_ci	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
6362306a36Sopenharmony_ci	mmDB_DEBUG, 0xffffffff, 0x00000000,
6462306a36Sopenharmony_ci	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
6562306a36Sopenharmony_ci	mmDB_DEBUG3, 0x0002021c, 0x00020200,
6662306a36Sopenharmony_ci	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
6762306a36Sopenharmony_ci	0x340c, 0x000000c0, 0x00800040,
6862306a36Sopenharmony_ci	0x360c, 0x000000c0, 0x00800040,
6962306a36Sopenharmony_ci	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
7062306a36Sopenharmony_ci	mmFBC_MISC, 0x00200000, 0x50100000,
7162306a36Sopenharmony_ci	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
7262306a36Sopenharmony_ci	mmMC_ARB_WTM_CNTL_RD, 0x00000003, 0x000007ff,
7362306a36Sopenharmony_ci	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
7462306a36Sopenharmony_ci	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
7562306a36Sopenharmony_ci	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
7662306a36Sopenharmony_ci	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
7762306a36Sopenharmony_ci	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
7862306a36Sopenharmony_ci	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
7962306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0040,
8062306a36Sopenharmony_ci	0x000d, 0x00000040, 0x00004040,
8162306a36Sopenharmony_ci	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
8262306a36Sopenharmony_ci	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
8362306a36Sopenharmony_ci	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
8462306a36Sopenharmony_ci	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
8562306a36Sopenharmony_ci	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
8662306a36Sopenharmony_ci	mmTCP_ADDR_CONFIG, 0x00000200, 0x000002fb,
8762306a36Sopenharmony_ci	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x0000543b,
8862306a36Sopenharmony_ci	mmTCP_CHAN_STEER_LO, 0xffffffff, 0xa9210876,
8962306a36Sopenharmony_ci	mmVGT_FIFO_DEPTHS, 0xffffffff, 0x000fff40,
9062306a36Sopenharmony_ci	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
9162306a36Sopenharmony_ci	mmVM_CONTEXT0_CNTL, 0x20000000, 0x20fffed8,
9262306a36Sopenharmony_ci	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
9362306a36Sopenharmony_ci	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
9462306a36Sopenharmony_ci	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
9562306a36Sopenharmony_ci	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
9662306a36Sopenharmony_ci	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic const u32 tahiti_golden_registers2[] =
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	mmMCIF_MEM_CONTROL, 0x00000001, 0x00000001,
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic const u32 tahiti_golden_rlc_registers[] =
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
10762306a36Sopenharmony_ci	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
10862306a36Sopenharmony_ci	0x311f, 0xffffffff, 0x10104040,
10962306a36Sopenharmony_ci	0x3122, 0xffffffff, 0x0100000a,
11062306a36Sopenharmony_ci	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
11162306a36Sopenharmony_ci	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
11262306a36Sopenharmony_ci	mmUVD_CGC_GATE, 0x00000008, 0x00000000,
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic const u32 pitcairn_golden_registers[] =
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
11862306a36Sopenharmony_ci	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
11962306a36Sopenharmony_ci	mmDB_DEBUG, 0xffffffff, 0x00000000,
12062306a36Sopenharmony_ci	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
12162306a36Sopenharmony_ci	mmDB_DEBUG3, 0x0002021c, 0x00020200,
12262306a36Sopenharmony_ci	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
12362306a36Sopenharmony_ci	0x340c, 0x000300c0, 0x00800040,
12462306a36Sopenharmony_ci	0x360c, 0x000300c0, 0x00800040,
12562306a36Sopenharmony_ci	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
12662306a36Sopenharmony_ci	mmFBC_MISC, 0x00200000, 0x50100000,
12762306a36Sopenharmony_ci	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
12862306a36Sopenharmony_ci	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
12962306a36Sopenharmony_ci	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
13062306a36Sopenharmony_ci	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
13162306a36Sopenharmony_ci	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
13262306a36Sopenharmony_ci	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
13362306a36Sopenharmony_ci	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
13462306a36Sopenharmony_ci	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x2a00126a,
13562306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0040,
13662306a36Sopenharmony_ci	0x000d, 0x00000040, 0x00004040,
13762306a36Sopenharmony_ci	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
13862306a36Sopenharmony_ci	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
13962306a36Sopenharmony_ci	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
14062306a36Sopenharmony_ci	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
14162306a36Sopenharmony_ci	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
14262306a36Sopenharmony_ci	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x32761054,
14362306a36Sopenharmony_ci	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
14462306a36Sopenharmony_ci	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
14562306a36Sopenharmony_ci	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
14662306a36Sopenharmony_ci	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
14762306a36Sopenharmony_ci	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
14862306a36Sopenharmony_ci	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
14962306a36Sopenharmony_ci};
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistatic const u32 pitcairn_golden_rlc_registers[] =
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	mmGB_ADDR_CONFIG, 0xffffffff, 0x12011003,
15462306a36Sopenharmony_ci	mmRLC_LB_PARAMS, 0xffffffff, 0x00601004,
15562306a36Sopenharmony_ci	0x311f, 0xffffffff, 0x10102020,
15662306a36Sopenharmony_ci	0x3122, 0xffffffff, 0x01000020,
15762306a36Sopenharmony_ci	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
15862306a36Sopenharmony_ci	mmRLC_LB_CNTL, 0xffffffff, 0x800000a4,
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistatic const u32 verde_pg_init[] =
16262306a36Sopenharmony_ci{
16362306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x40000,
16462306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x200010ff,
16562306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16662306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16762306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16862306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
16962306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17062306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x7007,
17162306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x300010ff,
17262306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17362306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17462306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17562306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17662306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
17762306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x400000,
17862306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x100010ff,
17962306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18062306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18162306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18262306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18362306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18462306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x120200,
18562306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x500010ff,
18662306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18762306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18862306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
18962306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19062306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19162306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x1e1e16,
19262306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x600010ff,
19362306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19462306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19562306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19662306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19762306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
19862306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x171f1e,
19962306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x700010ff,
20062306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20162306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20262306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20362306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20462306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20562306a36Sopenharmony_ci	mmGMCON_PGFSM_WRITE, 0xffffffff, 0x0,
20662306a36Sopenharmony_ci	mmGMCON_PGFSM_CONFIG, 0xffffffff, 0x9ff,
20762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x0,
20862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10000800,
20962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
21062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf,
21162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4,
21262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1000051e,
21362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
21462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xffff,
21562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x8,
21662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x80500,
21762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x12,
21862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x9050c,
21962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1d,
22062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xb052c,
22162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2a,
22262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1053e,
22362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x2d,
22462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10546,
22562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x30,
22662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xa054e,
22762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3c,
22862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1055f,
22962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x3f,
23062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10567,
23162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x42,
23262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1056f,
23362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x45,
23462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x10572,
23562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x48,
23662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20575,
23762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x4c,
23862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x190801,
23962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x67,
24062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1082a,
24162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x6a,
24262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1b082d,
24362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x87,
24462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x310851,
24562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xba,
24662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x891,
24762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbc,
24862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x893,
24962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xbe,
25062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20895,
25162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc2,
25262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x20899,
25362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xc6,
25462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2089d,
25562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xca,
25662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a1,
25762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xcc,
25862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x8a3,
25962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xce,
26062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x308a5,
26162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0xd3,
26262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x6d08cd,
26362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x142,
26462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x2000095a,
26562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x1,
26662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x144,
26762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x301f095b,
26862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x165,
26962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc094d,
27062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x173,
27162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xf096d,
27262306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x184,
27362306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x15097f,
27462306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x19b,
27562306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xc0998,
27662306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1a9,
27762306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x409a7,
27862306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1af,
27962306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0xcdc,
28062306a36Sopenharmony_ci	mmGMCON_RENG_RAM_INDEX, 0xffffffff, 0x1b1,
28162306a36Sopenharmony_ci	mmGMCON_RENG_RAM_DATA, 0xffffffff, 0x800,
28262306a36Sopenharmony_ci	mmGMCON_RENG_EXECUTE, 0xffffffff, 0x6c9b2000,
28362306a36Sopenharmony_ci	mmGMCON_MISC2, 0xfc00, 0x2000,
28462306a36Sopenharmony_ci	mmGMCON_MISC3, 0xffffffff, 0xfc0,
28562306a36Sopenharmony_ci	mmMC_PMG_AUTO_CFG, 0x00000100, 0x100,
28662306a36Sopenharmony_ci};
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_cistatic const u32 verde_golden_rlc_registers[] =
28962306a36Sopenharmony_ci{
29062306a36Sopenharmony_ci	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
29162306a36Sopenharmony_ci	mmRLC_LB_PARAMS, 0xffffffff, 0x033f1005,
29262306a36Sopenharmony_ci	0x311f, 0xffffffff, 0x10808020,
29362306a36Sopenharmony_ci	0x3122, 0xffffffff, 0x00800008,
29462306a36Sopenharmony_ci	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00001000,
29562306a36Sopenharmony_ci	mmRLC_LB_CNTL, 0xffffffff, 0x80010014,
29662306a36Sopenharmony_ci};
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic const u32 verde_golden_registers[] =
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
30162306a36Sopenharmony_ci	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
30262306a36Sopenharmony_ci	mmDB_DEBUG, 0xffffffff, 0x00000000,
30362306a36Sopenharmony_ci	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
30462306a36Sopenharmony_ci	mmDB_DEBUG3, 0x0002021c, 0x00020200,
30562306a36Sopenharmony_ci	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
30662306a36Sopenharmony_ci	0x340c, 0x000300c0, 0x00800040,
30762306a36Sopenharmony_ci	0x360c, 0x000300c0, 0x00800040,
30862306a36Sopenharmony_ci	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
30962306a36Sopenharmony_ci	mmFBC_MISC, 0x00200000, 0x50100000,
31062306a36Sopenharmony_ci	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
31162306a36Sopenharmony_ci	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
31262306a36Sopenharmony_ci	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
31362306a36Sopenharmony_ci	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
31462306a36Sopenharmony_ci	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
31562306a36Sopenharmony_ci	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
31662306a36Sopenharmony_ci	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
31762306a36Sopenharmony_ci	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x0000124a,
31862306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0040,
31962306a36Sopenharmony_ci	0x000d, 0x00000040, 0x00004040,
32062306a36Sopenharmony_ci	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
32162306a36Sopenharmony_ci	mmSQ_DED_CNT, 0x01ff1f3f, 0x00000000,
32262306a36Sopenharmony_ci	mmSQ_SEC_CNT, 0x01ff1f3f, 0x00000000,
32362306a36Sopenharmony_ci	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
32462306a36Sopenharmony_ci	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
32562306a36Sopenharmony_ci	mmTCP_ADDR_CONFIG, 0x000003ff, 0x00000003,
32662306a36Sopenharmony_ci	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
32762306a36Sopenharmony_ci	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00001032,
32862306a36Sopenharmony_ci	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
32962306a36Sopenharmony_ci	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
33062306a36Sopenharmony_ci	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
33162306a36Sopenharmony_ci	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
33262306a36Sopenharmony_ci	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
33362306a36Sopenharmony_ci	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
33462306a36Sopenharmony_ci};
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_cistatic const u32 oland_golden_registers[] =
33762306a36Sopenharmony_ci{
33862306a36Sopenharmony_ci	mmAZALIA_SCLK_CONTROL, 0x00000030, 0x00000011,
33962306a36Sopenharmony_ci	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
34062306a36Sopenharmony_ci	mmDB_DEBUG, 0xffffffff, 0x00000000,
34162306a36Sopenharmony_ci	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
34262306a36Sopenharmony_ci	mmDB_DEBUG3, 0x0002021c, 0x00020200,
34362306a36Sopenharmony_ci	mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
34462306a36Sopenharmony_ci	0x340c, 0x000300c0, 0x00800040,
34562306a36Sopenharmony_ci	0x360c, 0x000300c0, 0x00800040,
34662306a36Sopenharmony_ci	mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
34762306a36Sopenharmony_ci	mmFBC_MISC, 0x00200000, 0x50100000,
34862306a36Sopenharmony_ci	mmDIG0_HDMI_CONTROL, 0x31000311, 0x00000011,
34962306a36Sopenharmony_ci	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
35062306a36Sopenharmony_ci	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
35162306a36Sopenharmony_ci	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
35262306a36Sopenharmony_ci	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
35362306a36Sopenharmony_ci	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
35462306a36Sopenharmony_ci	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
35562306a36Sopenharmony_ci	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000082,
35662306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0040,
35762306a36Sopenharmony_ci	0x000d, 0x00000040, 0x00004040,
35862306a36Sopenharmony_ci	mmSPI_CONFIG_CNTL, 0x07ffffff, 0x03000000,
35962306a36Sopenharmony_ci	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
36062306a36Sopenharmony_ci	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
36162306a36Sopenharmony_ci	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
36262306a36Sopenharmony_ci	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
36362306a36Sopenharmony_ci	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
36462306a36Sopenharmony_ci	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
36562306a36Sopenharmony_ci	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
36662306a36Sopenharmony_ci	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
36762306a36Sopenharmony_ci	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
36862306a36Sopenharmony_ci	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
36962306a36Sopenharmony_ci	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cistatic const u32 oland_golden_rlc_registers[] =
37462306a36Sopenharmony_ci{
37562306a36Sopenharmony_ci	mmGB_ADDR_CONFIG, 0xffffffff, 0x02010002,
37662306a36Sopenharmony_ci	mmRLC_LB_PARAMS, 0xffffffff, 0x00601005,
37762306a36Sopenharmony_ci	0x311f, 0xffffffff, 0x10104040,
37862306a36Sopenharmony_ci	0x3122, 0xffffffff, 0x0100000a,
37962306a36Sopenharmony_ci	mmRLC_LB_CNTR_MAX, 0xffffffff, 0x00000800,
38062306a36Sopenharmony_ci	mmRLC_LB_CNTL, 0xffffffff, 0x800000f4,
38162306a36Sopenharmony_ci};
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cistatic const u32 hainan_golden_registers[] =
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci	0x17bc, 0x00000030, 0x00000011,
38662306a36Sopenharmony_ci	mmCB_HW_CONTROL, 0x00010000, 0x00018208,
38762306a36Sopenharmony_ci	mmDB_DEBUG, 0xffffffff, 0x00000000,
38862306a36Sopenharmony_ci	mmDB_DEBUG2, 0xf00fffff, 0x00000400,
38962306a36Sopenharmony_ci	mmDB_DEBUG3, 0x0002021c, 0x00020200,
39062306a36Sopenharmony_ci	0x031e, 0x00000080, 0x00000000,
39162306a36Sopenharmony_ci	0x3430, 0xff000fff, 0x00000100,
39262306a36Sopenharmony_ci	0x340c, 0x000300c0, 0x00800040,
39362306a36Sopenharmony_ci	0x3630, 0xff000fff, 0x00000100,
39462306a36Sopenharmony_ci	0x360c, 0x000300c0, 0x00800040,
39562306a36Sopenharmony_ci	0x16ec, 0x000000f0, 0x00000070,
39662306a36Sopenharmony_ci	0x16f0, 0x00200000, 0x50100000,
39762306a36Sopenharmony_ci	0x1c0c, 0x31000311, 0x00000011,
39862306a36Sopenharmony_ci	mmMC_SEQ_PMG_PG_HWCNTL, 0x00073ffe, 0x000022a2,
39962306a36Sopenharmony_ci	mmMC_XPB_P2P_BAR_CFG, 0x000007ff, 0x00000000,
40062306a36Sopenharmony_ci	mmPA_CL_ENHANCE, 0xf000001f, 0x00000007,
40162306a36Sopenharmony_ci	mmPA_SC_FORCE_EOV_MAX_CNTS, 0xffffffff, 0x00ffffff,
40262306a36Sopenharmony_ci	mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
40362306a36Sopenharmony_ci	mmPA_SC_MODE_CNTL_1, 0x07ffffff, 0x4e000000,
40462306a36Sopenharmony_ci	mmPA_SC_RASTER_CONFIG, 0x3f3f3fff, 0x00000000,
40562306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0040,
40662306a36Sopenharmony_ci	0x000d, 0x00000040, 0x00004040,
40762306a36Sopenharmony_ci	mmSPI_CONFIG_CNTL, 0x03e00000, 0x03600000,
40862306a36Sopenharmony_ci	mmSX_DEBUG_1, 0x0000007f, 0x00000020,
40962306a36Sopenharmony_ci	mmTA_CNTL_AUX, 0x00010000, 0x00010000,
41062306a36Sopenharmony_ci	mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f1,
41162306a36Sopenharmony_ci	mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
41262306a36Sopenharmony_ci	mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
41362306a36Sopenharmony_ci	mmVGT_GS_VERTEX_REUSE, 0x0000001f, 0x00000010,
41462306a36Sopenharmony_ci	mmVM_L2_CG, 0x000c0fc0, 0x000c0400,
41562306a36Sopenharmony_ci	mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0xffffffff,
41662306a36Sopenharmony_ci	mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
41762306a36Sopenharmony_ci	mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
41862306a36Sopenharmony_ci	mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff,
41962306a36Sopenharmony_ci};
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_cistatic const u32 hainan_golden_registers2[] =
42262306a36Sopenharmony_ci{
42362306a36Sopenharmony_ci	mmGB_ADDR_CONFIG, 0xffffffff, 0x2011003,
42462306a36Sopenharmony_ci};
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_cistatic const u32 tahiti_mgcg_cgcg_init[] =
42762306a36Sopenharmony_ci{
42862306a36Sopenharmony_ci	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
42962306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
43062306a36Sopenharmony_ci	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
43162306a36Sopenharmony_ci	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
43262306a36Sopenharmony_ci	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
43362306a36Sopenharmony_ci	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
43462306a36Sopenharmony_ci	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
43562306a36Sopenharmony_ci	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
43662306a36Sopenharmony_ci	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
43762306a36Sopenharmony_ci	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
43862306a36Sopenharmony_ci	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
43962306a36Sopenharmony_ci	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
44062306a36Sopenharmony_ci	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
44162306a36Sopenharmony_ci	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
44262306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
44362306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
44462306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
44562306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
44662306a36Sopenharmony_ci	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
44762306a36Sopenharmony_ci	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
44862306a36Sopenharmony_ci	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
44962306a36Sopenharmony_ci	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
45062306a36Sopenharmony_ci	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
45162306a36Sopenharmony_ci	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
45262306a36Sopenharmony_ci	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
45362306a36Sopenharmony_ci	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
45462306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
45562306a36Sopenharmony_ci	0x2458, 0xffffffff, 0x00010000,
45662306a36Sopenharmony_ci	0x2459, 0xffffffff, 0x00030002,
45762306a36Sopenharmony_ci	0x245a, 0xffffffff, 0x00040007,
45862306a36Sopenharmony_ci	0x245b, 0xffffffff, 0x00060005,
45962306a36Sopenharmony_ci	0x245c, 0xffffffff, 0x00090008,
46062306a36Sopenharmony_ci	0x245d, 0xffffffff, 0x00020001,
46162306a36Sopenharmony_ci	0x245e, 0xffffffff, 0x00040003,
46262306a36Sopenharmony_ci	0x245f, 0xffffffff, 0x00000007,
46362306a36Sopenharmony_ci	0x2460, 0xffffffff, 0x00060005,
46462306a36Sopenharmony_ci	0x2461, 0xffffffff, 0x00090008,
46562306a36Sopenharmony_ci	0x2462, 0xffffffff, 0x00030002,
46662306a36Sopenharmony_ci	0x2463, 0xffffffff, 0x00050004,
46762306a36Sopenharmony_ci	0x2464, 0xffffffff, 0x00000008,
46862306a36Sopenharmony_ci	0x2465, 0xffffffff, 0x00070006,
46962306a36Sopenharmony_ci	0x2466, 0xffffffff, 0x000a0009,
47062306a36Sopenharmony_ci	0x2467, 0xffffffff, 0x00040003,
47162306a36Sopenharmony_ci	0x2468, 0xffffffff, 0x00060005,
47262306a36Sopenharmony_ci	0x2469, 0xffffffff, 0x00000009,
47362306a36Sopenharmony_ci	0x246a, 0xffffffff, 0x00080007,
47462306a36Sopenharmony_ci	0x246b, 0xffffffff, 0x000b000a,
47562306a36Sopenharmony_ci	0x246c, 0xffffffff, 0x00050004,
47662306a36Sopenharmony_ci	0x246d, 0xffffffff, 0x00070006,
47762306a36Sopenharmony_ci	0x246e, 0xffffffff, 0x0008000b,
47862306a36Sopenharmony_ci	0x246f, 0xffffffff, 0x000a0009,
47962306a36Sopenharmony_ci	0x2470, 0xffffffff, 0x000d000c,
48062306a36Sopenharmony_ci	0x2471, 0xffffffff, 0x00060005,
48162306a36Sopenharmony_ci	0x2472, 0xffffffff, 0x00080007,
48262306a36Sopenharmony_ci	0x2473, 0xffffffff, 0x0000000b,
48362306a36Sopenharmony_ci	0x2474, 0xffffffff, 0x000a0009,
48462306a36Sopenharmony_ci	0x2475, 0xffffffff, 0x000d000c,
48562306a36Sopenharmony_ci	0x2476, 0xffffffff, 0x00070006,
48662306a36Sopenharmony_ci	0x2477, 0xffffffff, 0x00090008,
48762306a36Sopenharmony_ci	0x2478, 0xffffffff, 0x0000000c,
48862306a36Sopenharmony_ci	0x2479, 0xffffffff, 0x000b000a,
48962306a36Sopenharmony_ci	0x247a, 0xffffffff, 0x000e000d,
49062306a36Sopenharmony_ci	0x247b, 0xffffffff, 0x00080007,
49162306a36Sopenharmony_ci	0x247c, 0xffffffff, 0x000a0009,
49262306a36Sopenharmony_ci	0x247d, 0xffffffff, 0x0000000d,
49362306a36Sopenharmony_ci	0x247e, 0xffffffff, 0x000c000b,
49462306a36Sopenharmony_ci	0x247f, 0xffffffff, 0x000f000e,
49562306a36Sopenharmony_ci	0x2480, 0xffffffff, 0x00090008,
49662306a36Sopenharmony_ci	0x2481, 0xffffffff, 0x000b000a,
49762306a36Sopenharmony_ci	0x2482, 0xffffffff, 0x000c000f,
49862306a36Sopenharmony_ci	0x2483, 0xffffffff, 0x000e000d,
49962306a36Sopenharmony_ci	0x2484, 0xffffffff, 0x00110010,
50062306a36Sopenharmony_ci	0x2485, 0xffffffff, 0x000a0009,
50162306a36Sopenharmony_ci	0x2486, 0xffffffff, 0x000c000b,
50262306a36Sopenharmony_ci	0x2487, 0xffffffff, 0x0000000f,
50362306a36Sopenharmony_ci	0x2488, 0xffffffff, 0x000e000d,
50462306a36Sopenharmony_ci	0x2489, 0xffffffff, 0x00110010,
50562306a36Sopenharmony_ci	0x248a, 0xffffffff, 0x000b000a,
50662306a36Sopenharmony_ci	0x248b, 0xffffffff, 0x000d000c,
50762306a36Sopenharmony_ci	0x248c, 0xffffffff, 0x00000010,
50862306a36Sopenharmony_ci	0x248d, 0xffffffff, 0x000f000e,
50962306a36Sopenharmony_ci	0x248e, 0xffffffff, 0x00120011,
51062306a36Sopenharmony_ci	0x248f, 0xffffffff, 0x000c000b,
51162306a36Sopenharmony_ci	0x2490, 0xffffffff, 0x000e000d,
51262306a36Sopenharmony_ci	0x2491, 0xffffffff, 0x00000011,
51362306a36Sopenharmony_ci	0x2492, 0xffffffff, 0x0010000f,
51462306a36Sopenharmony_ci	0x2493, 0xffffffff, 0x00130012,
51562306a36Sopenharmony_ci	0x2494, 0xffffffff, 0x000d000c,
51662306a36Sopenharmony_ci	0x2495, 0xffffffff, 0x000f000e,
51762306a36Sopenharmony_ci	0x2496, 0xffffffff, 0x00100013,
51862306a36Sopenharmony_ci	0x2497, 0xffffffff, 0x00120011,
51962306a36Sopenharmony_ci	0x2498, 0xffffffff, 0x00150014,
52062306a36Sopenharmony_ci	0x2499, 0xffffffff, 0x000e000d,
52162306a36Sopenharmony_ci	0x249a, 0xffffffff, 0x0010000f,
52262306a36Sopenharmony_ci	0x249b, 0xffffffff, 0x00000013,
52362306a36Sopenharmony_ci	0x249c, 0xffffffff, 0x00120011,
52462306a36Sopenharmony_ci	0x249d, 0xffffffff, 0x00150014,
52562306a36Sopenharmony_ci	0x249e, 0xffffffff, 0x000f000e,
52662306a36Sopenharmony_ci	0x249f, 0xffffffff, 0x00110010,
52762306a36Sopenharmony_ci	0x24a0, 0xffffffff, 0x00000014,
52862306a36Sopenharmony_ci	0x24a1, 0xffffffff, 0x00130012,
52962306a36Sopenharmony_ci	0x24a2, 0xffffffff, 0x00160015,
53062306a36Sopenharmony_ci	0x24a3, 0xffffffff, 0x0010000f,
53162306a36Sopenharmony_ci	0x24a4, 0xffffffff, 0x00120011,
53262306a36Sopenharmony_ci	0x24a5, 0xffffffff, 0x00000015,
53362306a36Sopenharmony_ci	0x24a6, 0xffffffff, 0x00140013,
53462306a36Sopenharmony_ci	0x24a7, 0xffffffff, 0x00170016,
53562306a36Sopenharmony_ci	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
53662306a36Sopenharmony_ci	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
53762306a36Sopenharmony_ci	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
53862306a36Sopenharmony_ci	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
53962306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0000001c,
54062306a36Sopenharmony_ci	0x000d, 0x000f0000, 0x000f0000,
54162306a36Sopenharmony_ci	0x0583, 0xffffffff, 0x00000100,
54262306a36Sopenharmony_ci	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
54362306a36Sopenharmony_ci	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
54462306a36Sopenharmony_ci	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
54562306a36Sopenharmony_ci	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
54662306a36Sopenharmony_ci	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
54762306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
54862306a36Sopenharmony_ci	0x157a, 0x00000001, 0x00000001,
54962306a36Sopenharmony_ci	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
55062306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
55162306a36Sopenharmony_ci	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
55262306a36Sopenharmony_ci	0x3430, 0xfffffff0, 0x00000100,
55362306a36Sopenharmony_ci	0x3630, 0xfffffff0, 0x00000100,
55462306a36Sopenharmony_ci};
55562306a36Sopenharmony_cistatic const u32 pitcairn_mgcg_cgcg_init[] =
55662306a36Sopenharmony_ci{
55762306a36Sopenharmony_ci	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
55862306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
55962306a36Sopenharmony_ci	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
56062306a36Sopenharmony_ci	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
56162306a36Sopenharmony_ci	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
56262306a36Sopenharmony_ci	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
56362306a36Sopenharmony_ci	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
56462306a36Sopenharmony_ci	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
56562306a36Sopenharmony_ci	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
56662306a36Sopenharmony_ci	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
56762306a36Sopenharmony_ci	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
56862306a36Sopenharmony_ci	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
56962306a36Sopenharmony_ci	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
57062306a36Sopenharmony_ci	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
57162306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
57262306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
57362306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
57462306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
57562306a36Sopenharmony_ci	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
57662306a36Sopenharmony_ci	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
57762306a36Sopenharmony_ci	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
57862306a36Sopenharmony_ci	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
57962306a36Sopenharmony_ci	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
58062306a36Sopenharmony_ci	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
58162306a36Sopenharmony_ci	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
58262306a36Sopenharmony_ci	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
58362306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
58462306a36Sopenharmony_ci	0x2458, 0xffffffff, 0x00010000,
58562306a36Sopenharmony_ci	0x2459, 0xffffffff, 0x00030002,
58662306a36Sopenharmony_ci	0x245a, 0xffffffff, 0x00040007,
58762306a36Sopenharmony_ci	0x245b, 0xffffffff, 0x00060005,
58862306a36Sopenharmony_ci	0x245c, 0xffffffff, 0x00090008,
58962306a36Sopenharmony_ci	0x245d, 0xffffffff, 0x00020001,
59062306a36Sopenharmony_ci	0x245e, 0xffffffff, 0x00040003,
59162306a36Sopenharmony_ci	0x245f, 0xffffffff, 0x00000007,
59262306a36Sopenharmony_ci	0x2460, 0xffffffff, 0x00060005,
59362306a36Sopenharmony_ci	0x2461, 0xffffffff, 0x00090008,
59462306a36Sopenharmony_ci	0x2462, 0xffffffff, 0x00030002,
59562306a36Sopenharmony_ci	0x2463, 0xffffffff, 0x00050004,
59662306a36Sopenharmony_ci	0x2464, 0xffffffff, 0x00000008,
59762306a36Sopenharmony_ci	0x2465, 0xffffffff, 0x00070006,
59862306a36Sopenharmony_ci	0x2466, 0xffffffff, 0x000a0009,
59962306a36Sopenharmony_ci	0x2467, 0xffffffff, 0x00040003,
60062306a36Sopenharmony_ci	0x2468, 0xffffffff, 0x00060005,
60162306a36Sopenharmony_ci	0x2469, 0xffffffff, 0x00000009,
60262306a36Sopenharmony_ci	0x246a, 0xffffffff, 0x00080007,
60362306a36Sopenharmony_ci	0x246b, 0xffffffff, 0x000b000a,
60462306a36Sopenharmony_ci	0x246c, 0xffffffff, 0x00050004,
60562306a36Sopenharmony_ci	0x246d, 0xffffffff, 0x00070006,
60662306a36Sopenharmony_ci	0x246e, 0xffffffff, 0x0008000b,
60762306a36Sopenharmony_ci	0x246f, 0xffffffff, 0x000a0009,
60862306a36Sopenharmony_ci	0x2470, 0xffffffff, 0x000d000c,
60962306a36Sopenharmony_ci	0x2480, 0xffffffff, 0x00090008,
61062306a36Sopenharmony_ci	0x2481, 0xffffffff, 0x000b000a,
61162306a36Sopenharmony_ci	0x2482, 0xffffffff, 0x000c000f,
61262306a36Sopenharmony_ci	0x2483, 0xffffffff, 0x000e000d,
61362306a36Sopenharmony_ci	0x2484, 0xffffffff, 0x00110010,
61462306a36Sopenharmony_ci	0x2485, 0xffffffff, 0x000a0009,
61562306a36Sopenharmony_ci	0x2486, 0xffffffff, 0x000c000b,
61662306a36Sopenharmony_ci	0x2487, 0xffffffff, 0x0000000f,
61762306a36Sopenharmony_ci	0x2488, 0xffffffff, 0x000e000d,
61862306a36Sopenharmony_ci	0x2489, 0xffffffff, 0x00110010,
61962306a36Sopenharmony_ci	0x248a, 0xffffffff, 0x000b000a,
62062306a36Sopenharmony_ci	0x248b, 0xffffffff, 0x000d000c,
62162306a36Sopenharmony_ci	0x248c, 0xffffffff, 0x00000010,
62262306a36Sopenharmony_ci	0x248d, 0xffffffff, 0x000f000e,
62362306a36Sopenharmony_ci	0x248e, 0xffffffff, 0x00120011,
62462306a36Sopenharmony_ci	0x248f, 0xffffffff, 0x000c000b,
62562306a36Sopenharmony_ci	0x2490, 0xffffffff, 0x000e000d,
62662306a36Sopenharmony_ci	0x2491, 0xffffffff, 0x00000011,
62762306a36Sopenharmony_ci	0x2492, 0xffffffff, 0x0010000f,
62862306a36Sopenharmony_ci	0x2493, 0xffffffff, 0x00130012,
62962306a36Sopenharmony_ci	0x2494, 0xffffffff, 0x000d000c,
63062306a36Sopenharmony_ci	0x2495, 0xffffffff, 0x000f000e,
63162306a36Sopenharmony_ci	0x2496, 0xffffffff, 0x00100013,
63262306a36Sopenharmony_ci	0x2497, 0xffffffff, 0x00120011,
63362306a36Sopenharmony_ci	0x2498, 0xffffffff, 0x00150014,
63462306a36Sopenharmony_ci	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
63562306a36Sopenharmony_ci	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
63662306a36Sopenharmony_ci	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
63762306a36Sopenharmony_ci	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
63862306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0000001c,
63962306a36Sopenharmony_ci	0x000d, 0x000f0000, 0x000f0000,
64062306a36Sopenharmony_ci	0x0583, 0xffffffff, 0x00000100,
64162306a36Sopenharmony_ci	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
64262306a36Sopenharmony_ci	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
64362306a36Sopenharmony_ci	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
64462306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
64562306a36Sopenharmony_ci	0x157a, 0x00000001, 0x00000001,
64662306a36Sopenharmony_ci	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
64762306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
64862306a36Sopenharmony_ci	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
64962306a36Sopenharmony_ci	0x3430, 0xfffffff0, 0x00000100,
65062306a36Sopenharmony_ci	0x3630, 0xfffffff0, 0x00000100,
65162306a36Sopenharmony_ci};
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_cistatic const u32 verde_mgcg_cgcg_init[] =
65462306a36Sopenharmony_ci{
65562306a36Sopenharmony_ci	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
65662306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
65762306a36Sopenharmony_ci	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
65862306a36Sopenharmony_ci	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
65962306a36Sopenharmony_ci	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
66062306a36Sopenharmony_ci	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
66162306a36Sopenharmony_ci	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
66262306a36Sopenharmony_ci	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
66362306a36Sopenharmony_ci	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
66462306a36Sopenharmony_ci	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
66562306a36Sopenharmony_ci	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
66662306a36Sopenharmony_ci	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
66762306a36Sopenharmony_ci	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
66862306a36Sopenharmony_ci	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
66962306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
67062306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
67162306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
67262306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
67362306a36Sopenharmony_ci	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
67462306a36Sopenharmony_ci	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
67562306a36Sopenharmony_ci	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
67662306a36Sopenharmony_ci	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
67762306a36Sopenharmony_ci	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
67862306a36Sopenharmony_ci	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
67962306a36Sopenharmony_ci	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
68062306a36Sopenharmony_ci	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
68162306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
68262306a36Sopenharmony_ci	0x2458, 0xffffffff, 0x00010000,
68362306a36Sopenharmony_ci	0x2459, 0xffffffff, 0x00030002,
68462306a36Sopenharmony_ci	0x245a, 0xffffffff, 0x00040007,
68562306a36Sopenharmony_ci	0x245b, 0xffffffff, 0x00060005,
68662306a36Sopenharmony_ci	0x245c, 0xffffffff, 0x00090008,
68762306a36Sopenharmony_ci	0x245d, 0xffffffff, 0x00020001,
68862306a36Sopenharmony_ci	0x245e, 0xffffffff, 0x00040003,
68962306a36Sopenharmony_ci	0x245f, 0xffffffff, 0x00000007,
69062306a36Sopenharmony_ci	0x2460, 0xffffffff, 0x00060005,
69162306a36Sopenharmony_ci	0x2461, 0xffffffff, 0x00090008,
69262306a36Sopenharmony_ci	0x2462, 0xffffffff, 0x00030002,
69362306a36Sopenharmony_ci	0x2463, 0xffffffff, 0x00050004,
69462306a36Sopenharmony_ci	0x2464, 0xffffffff, 0x00000008,
69562306a36Sopenharmony_ci	0x2465, 0xffffffff, 0x00070006,
69662306a36Sopenharmony_ci	0x2466, 0xffffffff, 0x000a0009,
69762306a36Sopenharmony_ci	0x2467, 0xffffffff, 0x00040003,
69862306a36Sopenharmony_ci	0x2468, 0xffffffff, 0x00060005,
69962306a36Sopenharmony_ci	0x2469, 0xffffffff, 0x00000009,
70062306a36Sopenharmony_ci	0x246a, 0xffffffff, 0x00080007,
70162306a36Sopenharmony_ci	0x246b, 0xffffffff, 0x000b000a,
70262306a36Sopenharmony_ci	0x246c, 0xffffffff, 0x00050004,
70362306a36Sopenharmony_ci	0x246d, 0xffffffff, 0x00070006,
70462306a36Sopenharmony_ci	0x246e, 0xffffffff, 0x0008000b,
70562306a36Sopenharmony_ci	0x246f, 0xffffffff, 0x000a0009,
70662306a36Sopenharmony_ci	0x2470, 0xffffffff, 0x000d000c,
70762306a36Sopenharmony_ci	0x2480, 0xffffffff, 0x00090008,
70862306a36Sopenharmony_ci	0x2481, 0xffffffff, 0x000b000a,
70962306a36Sopenharmony_ci	0x2482, 0xffffffff, 0x000c000f,
71062306a36Sopenharmony_ci	0x2483, 0xffffffff, 0x000e000d,
71162306a36Sopenharmony_ci	0x2484, 0xffffffff, 0x00110010,
71262306a36Sopenharmony_ci	0x2485, 0xffffffff, 0x000a0009,
71362306a36Sopenharmony_ci	0x2486, 0xffffffff, 0x000c000b,
71462306a36Sopenharmony_ci	0x2487, 0xffffffff, 0x0000000f,
71562306a36Sopenharmony_ci	0x2488, 0xffffffff, 0x000e000d,
71662306a36Sopenharmony_ci	0x2489, 0xffffffff, 0x00110010,
71762306a36Sopenharmony_ci	0x248a, 0xffffffff, 0x000b000a,
71862306a36Sopenharmony_ci	0x248b, 0xffffffff, 0x000d000c,
71962306a36Sopenharmony_ci	0x248c, 0xffffffff, 0x00000010,
72062306a36Sopenharmony_ci	0x248d, 0xffffffff, 0x000f000e,
72162306a36Sopenharmony_ci	0x248e, 0xffffffff, 0x00120011,
72262306a36Sopenharmony_ci	0x248f, 0xffffffff, 0x000c000b,
72362306a36Sopenharmony_ci	0x2490, 0xffffffff, 0x000e000d,
72462306a36Sopenharmony_ci	0x2491, 0xffffffff, 0x00000011,
72562306a36Sopenharmony_ci	0x2492, 0xffffffff, 0x0010000f,
72662306a36Sopenharmony_ci	0x2493, 0xffffffff, 0x00130012,
72762306a36Sopenharmony_ci	0x2494, 0xffffffff, 0x000d000c,
72862306a36Sopenharmony_ci	0x2495, 0xffffffff, 0x000f000e,
72962306a36Sopenharmony_ci	0x2496, 0xffffffff, 0x00100013,
73062306a36Sopenharmony_ci	0x2497, 0xffffffff, 0x00120011,
73162306a36Sopenharmony_ci	0x2498, 0xffffffff, 0x00150014,
73262306a36Sopenharmony_ci	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
73362306a36Sopenharmony_ci	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
73462306a36Sopenharmony_ci	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
73562306a36Sopenharmony_ci	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
73662306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0000001c,
73762306a36Sopenharmony_ci	0x000d, 0x000f0000, 0x000f0000,
73862306a36Sopenharmony_ci	0x0583, 0xffffffff, 0x00000100,
73962306a36Sopenharmony_ci	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
74062306a36Sopenharmony_ci	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
74162306a36Sopenharmony_ci	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
74262306a36Sopenharmony_ci	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
74362306a36Sopenharmony_ci	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
74462306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
74562306a36Sopenharmony_ci	0x157a, 0x00000001, 0x00000001,
74662306a36Sopenharmony_ci	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
74762306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
74862306a36Sopenharmony_ci	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
74962306a36Sopenharmony_ci	0x3430, 0xfffffff0, 0x00000100,
75062306a36Sopenharmony_ci	0x3630, 0xfffffff0, 0x00000100,
75162306a36Sopenharmony_ci};
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_cistatic const u32 oland_mgcg_cgcg_init[] =
75462306a36Sopenharmony_ci{
75562306a36Sopenharmony_ci	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
75662306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
75762306a36Sopenharmony_ci	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
75862306a36Sopenharmony_ci	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
75962306a36Sopenharmony_ci	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
76062306a36Sopenharmony_ci	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
76162306a36Sopenharmony_ci	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
76262306a36Sopenharmony_ci	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
76362306a36Sopenharmony_ci	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
76462306a36Sopenharmony_ci	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
76562306a36Sopenharmony_ci	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
76662306a36Sopenharmony_ci	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
76762306a36Sopenharmony_ci	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
76862306a36Sopenharmony_ci	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
76962306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
77062306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
77162306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
77262306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
77362306a36Sopenharmony_ci	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
77462306a36Sopenharmony_ci	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
77562306a36Sopenharmony_ci	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
77662306a36Sopenharmony_ci	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
77762306a36Sopenharmony_ci	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
77862306a36Sopenharmony_ci	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
77962306a36Sopenharmony_ci	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
78062306a36Sopenharmony_ci	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
78162306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
78262306a36Sopenharmony_ci	0x2458, 0xffffffff, 0x00010000,
78362306a36Sopenharmony_ci	0x2459, 0xffffffff, 0x00030002,
78462306a36Sopenharmony_ci	0x245a, 0xffffffff, 0x00040007,
78562306a36Sopenharmony_ci	0x245b, 0xffffffff, 0x00060005,
78662306a36Sopenharmony_ci	0x245c, 0xffffffff, 0x00090008,
78762306a36Sopenharmony_ci	0x245d, 0xffffffff, 0x00020001,
78862306a36Sopenharmony_ci	0x245e, 0xffffffff, 0x00040003,
78962306a36Sopenharmony_ci	0x245f, 0xffffffff, 0x00000007,
79062306a36Sopenharmony_ci	0x2460, 0xffffffff, 0x00060005,
79162306a36Sopenharmony_ci	0x2461, 0xffffffff, 0x00090008,
79262306a36Sopenharmony_ci	0x2462, 0xffffffff, 0x00030002,
79362306a36Sopenharmony_ci	0x2463, 0xffffffff, 0x00050004,
79462306a36Sopenharmony_ci	0x2464, 0xffffffff, 0x00000008,
79562306a36Sopenharmony_ci	0x2465, 0xffffffff, 0x00070006,
79662306a36Sopenharmony_ci	0x2466, 0xffffffff, 0x000a0009,
79762306a36Sopenharmony_ci	0x2467, 0xffffffff, 0x00040003,
79862306a36Sopenharmony_ci	0x2468, 0xffffffff, 0x00060005,
79962306a36Sopenharmony_ci	0x2469, 0xffffffff, 0x00000009,
80062306a36Sopenharmony_ci	0x246a, 0xffffffff, 0x00080007,
80162306a36Sopenharmony_ci	0x246b, 0xffffffff, 0x000b000a,
80262306a36Sopenharmony_ci	0x246c, 0xffffffff, 0x00050004,
80362306a36Sopenharmony_ci	0x246d, 0xffffffff, 0x00070006,
80462306a36Sopenharmony_ci	0x246e, 0xffffffff, 0x0008000b,
80562306a36Sopenharmony_ci	0x246f, 0xffffffff, 0x000a0009,
80662306a36Sopenharmony_ci	0x2470, 0xffffffff, 0x000d000c,
80762306a36Sopenharmony_ci	0x2471, 0xffffffff, 0x00060005,
80862306a36Sopenharmony_ci	0x2472, 0xffffffff, 0x00080007,
80962306a36Sopenharmony_ci	0x2473, 0xffffffff, 0x0000000b,
81062306a36Sopenharmony_ci	0x2474, 0xffffffff, 0x000a0009,
81162306a36Sopenharmony_ci	0x2475, 0xffffffff, 0x000d000c,
81262306a36Sopenharmony_ci	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
81362306a36Sopenharmony_ci	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
81462306a36Sopenharmony_ci	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
81562306a36Sopenharmony_ci	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
81662306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0000001c,
81762306a36Sopenharmony_ci	0x000d, 0x000f0000, 0x000f0000,
81862306a36Sopenharmony_ci	0x0583, 0xffffffff, 0x00000100,
81962306a36Sopenharmony_ci	mmXDMA_CLOCK_GATING_CNTL, 0xffffffff, 0x00000100,
82062306a36Sopenharmony_ci	mmXDMA_MEM_POWER_CNTL, 0x00000101, 0x00000000,
82162306a36Sopenharmony_ci	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
82262306a36Sopenharmony_ci	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
82362306a36Sopenharmony_ci	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
82462306a36Sopenharmony_ci	mmCGTT_DRM_CLK_CTRL0, 0xff000fff, 0x00000100,
82562306a36Sopenharmony_ci	0x157a, 0x00000001, 0x00000001,
82662306a36Sopenharmony_ci	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
82762306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
82862306a36Sopenharmony_ci	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
82962306a36Sopenharmony_ci	0x3430, 0xfffffff0, 0x00000100,
83062306a36Sopenharmony_ci	0x3630, 0xfffffff0, 0x00000100,
83162306a36Sopenharmony_ci};
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_cistatic const u32 hainan_mgcg_cgcg_init[] =
83462306a36Sopenharmony_ci{
83562306a36Sopenharmony_ci	mmRLC_CGTT_MGCG_OVERRIDE, 0xffffffff, 0xfffffffc,
83662306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
83762306a36Sopenharmony_ci	mmCB_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
83862306a36Sopenharmony_ci	mmCGTT_BCI_CLK_CTRL, 0xffffffff, 0x00000100,
83962306a36Sopenharmony_ci	mmCGTT_CP_CLK_CTRL, 0xffffffff, 0x00000100,
84062306a36Sopenharmony_ci	mmCGTT_GDS_CLK_CTRL, 0xffffffff, 0x00000100,
84162306a36Sopenharmony_ci	mmCGTT_IA_CLK_CTRL, 0xffffffff, 0x06000100,
84262306a36Sopenharmony_ci	mmCGTT_PA_CLK_CTRL, 0xffffffff, 0x00000100,
84362306a36Sopenharmony_ci	mmCGTT_PC_CLK_CTRL, 0xffffffff, 0x00000100,
84462306a36Sopenharmony_ci	mmCGTT_RLC_CLK_CTRL, 0xffffffff, 0x00000100,
84562306a36Sopenharmony_ci	mmCGTT_SC_CLK_CTRL, 0xffffffff, 0x00000100,
84662306a36Sopenharmony_ci	mmCGTT_SPI_CLK_CTRL, 0xffffffff, 0x00000100,
84762306a36Sopenharmony_ci	mmCGTT_SQ_CLK_CTRL, 0xffffffff, 0x00000100,
84862306a36Sopenharmony_ci	mmCGTT_SQG_CLK_CTRL, 0xffffffff, 0x00000100,
84962306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL0, 0xffffffff, 0x00000100,
85062306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL1, 0xffffffff, 0x00000100,
85162306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL2, 0xffffffff, 0x00000100,
85262306a36Sopenharmony_ci	mmCGTT_SX_CLK_CTRL3, 0xffffffff, 0x00000100,
85362306a36Sopenharmony_ci	mmCGTT_TCI_CLK_CTRL, 0xffffffff, 0x00000100,
85462306a36Sopenharmony_ci	mmCGTT_TCP_CLK_CTRL, 0xffffffff, 0x00000100,
85562306a36Sopenharmony_ci	mmCGTT_VGT_CLK_CTRL, 0xffffffff, 0x06000100,
85662306a36Sopenharmony_ci	mmDB_CGTT_CLK_CTRL_0, 0xffffffff, 0x00000100,
85762306a36Sopenharmony_ci	mmTA_CGTT_CTRL, 0xffffffff, 0x00000100,
85862306a36Sopenharmony_ci	mmTCA_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
85962306a36Sopenharmony_ci	mmTCC_CGTT_SCLK_CTRL, 0xffffffff, 0x00000100,
86062306a36Sopenharmony_ci	mmTD_CGTT_CTRL, 0xffffffff, 0x00000100,
86162306a36Sopenharmony_ci	mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
86262306a36Sopenharmony_ci	0x2458, 0xffffffff, 0x00010000,
86362306a36Sopenharmony_ci	0x2459, 0xffffffff, 0x00030002,
86462306a36Sopenharmony_ci	0x245a, 0xffffffff, 0x00040007,
86562306a36Sopenharmony_ci	0x245b, 0xffffffff, 0x00060005,
86662306a36Sopenharmony_ci	0x245c, 0xffffffff, 0x00090008,
86762306a36Sopenharmony_ci	0x245d, 0xffffffff, 0x00020001,
86862306a36Sopenharmony_ci	0x245e, 0xffffffff, 0x00040003,
86962306a36Sopenharmony_ci	0x245f, 0xffffffff, 0x00000007,
87062306a36Sopenharmony_ci	0x2460, 0xffffffff, 0x00060005,
87162306a36Sopenharmony_ci	0x2461, 0xffffffff, 0x00090008,
87262306a36Sopenharmony_ci	0x2462, 0xffffffff, 0x00030002,
87362306a36Sopenharmony_ci	0x2463, 0xffffffff, 0x00050004,
87462306a36Sopenharmony_ci	0x2464, 0xffffffff, 0x00000008,
87562306a36Sopenharmony_ci	0x2465, 0xffffffff, 0x00070006,
87662306a36Sopenharmony_ci	0x2466, 0xffffffff, 0x000a0009,
87762306a36Sopenharmony_ci	0x2467, 0xffffffff, 0x00040003,
87862306a36Sopenharmony_ci	0x2468, 0xffffffff, 0x00060005,
87962306a36Sopenharmony_ci	0x2469, 0xffffffff, 0x00000009,
88062306a36Sopenharmony_ci	0x246a, 0xffffffff, 0x00080007,
88162306a36Sopenharmony_ci	0x246b, 0xffffffff, 0x000b000a,
88262306a36Sopenharmony_ci	0x246c, 0xffffffff, 0x00050004,
88362306a36Sopenharmony_ci	0x246d, 0xffffffff, 0x00070006,
88462306a36Sopenharmony_ci	0x246e, 0xffffffff, 0x0008000b,
88562306a36Sopenharmony_ci	0x246f, 0xffffffff, 0x000a0009,
88662306a36Sopenharmony_ci	0x2470, 0xffffffff, 0x000d000c,
88762306a36Sopenharmony_ci	0x2471, 0xffffffff, 0x00060005,
88862306a36Sopenharmony_ci	0x2472, 0xffffffff, 0x00080007,
88962306a36Sopenharmony_ci	0x2473, 0xffffffff, 0x0000000b,
89062306a36Sopenharmony_ci	0x2474, 0xffffffff, 0x000a0009,
89162306a36Sopenharmony_ci	0x2475, 0xffffffff, 0x000d000c,
89262306a36Sopenharmony_ci	mmCGTS_SM_CTRL_REG, 0xffffffff, 0x96940200,
89362306a36Sopenharmony_ci	mmCP_RB_WPTR_POLL_CNTL, 0xffffffff, 0x00900100,
89462306a36Sopenharmony_ci	mmRLC_GCPM_GENERAL_3, 0xffffffff, 0x00000080,
89562306a36Sopenharmony_ci	mmRLC_CGCG_CGLS_CTRL, 0xffffffff, 0x0020003f,
89662306a36Sopenharmony_ci	0x000c, 0xffffffff, 0x0000001c,
89762306a36Sopenharmony_ci	0x000d, 0x000f0000, 0x000f0000,
89862306a36Sopenharmony_ci	0x0583, 0xffffffff, 0x00000100,
89962306a36Sopenharmony_ci	0x0409, 0xffffffff, 0x00000100,
90062306a36Sopenharmony_ci	mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104,
90162306a36Sopenharmony_ci	mmMC_CITF_MISC_WR_CG, 0x000c0000, 0x000c0000,
90262306a36Sopenharmony_ci	mmMC_CITF_MISC_RD_CG, 0x000c0000, 0x000c0000,
90362306a36Sopenharmony_ci	mmHDP_MEM_POWER_LS, 0x00000001, 0x00000001,
90462306a36Sopenharmony_ci	mmHDP_XDP_CGTT_BLK_CTRL, 0xc0000fff, 0x00000104,
90562306a36Sopenharmony_ci	mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
90662306a36Sopenharmony_ci	0x3430, 0xfffffff0, 0x00000100,
90762306a36Sopenharmony_ci	0x3630, 0xfffffff0, 0x00000100,
90862306a36Sopenharmony_ci};
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci/* XXX: update when we support VCE */
91162306a36Sopenharmony_ci#if 0
91262306a36Sopenharmony_ci/* tahiti, pitcarin, verde */
91362306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info tahiti_video_codecs_encode_array[] =
91462306a36Sopenharmony_ci{
91562306a36Sopenharmony_ci	{
91662306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
91762306a36Sopenharmony_ci		.max_width = 2048,
91862306a36Sopenharmony_ci		.max_height = 1152,
91962306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
92062306a36Sopenharmony_ci		.max_level = 0,
92162306a36Sopenharmony_ci	},
92262306a36Sopenharmony_ci};
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_cistatic const struct amdgpu_video_codecs tahiti_video_codecs_encode =
92562306a36Sopenharmony_ci{
92662306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(tahiti_video_codecs_encode_array),
92762306a36Sopenharmony_ci	.codec_array = tahiti_video_codecs_encode_array,
92862306a36Sopenharmony_ci};
92962306a36Sopenharmony_ci#else
93062306a36Sopenharmony_cistatic const struct amdgpu_video_codecs tahiti_video_codecs_encode =
93162306a36Sopenharmony_ci{
93262306a36Sopenharmony_ci	.codec_count = 0,
93362306a36Sopenharmony_ci	.codec_array = NULL,
93462306a36Sopenharmony_ci};
93562306a36Sopenharmony_ci#endif
93662306a36Sopenharmony_ci/* oland and hainan don't support encode */
93762306a36Sopenharmony_cistatic const struct amdgpu_video_codecs hainan_video_codecs_encode =
93862306a36Sopenharmony_ci{
93962306a36Sopenharmony_ci	.codec_count = 0,
94062306a36Sopenharmony_ci	.codec_array = NULL,
94162306a36Sopenharmony_ci};
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci/* tahiti, pitcarin, verde, oland */
94462306a36Sopenharmony_cistatic const struct amdgpu_video_codec_info tahiti_video_codecs_decode_array[] =
94562306a36Sopenharmony_ci{
94662306a36Sopenharmony_ci	{
94762306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2,
94862306a36Sopenharmony_ci		.max_width = 2048,
94962306a36Sopenharmony_ci		.max_height = 1152,
95062306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
95162306a36Sopenharmony_ci		.max_level = 3,
95262306a36Sopenharmony_ci	},
95362306a36Sopenharmony_ci	{
95462306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4,
95562306a36Sopenharmony_ci		.max_width = 2048,
95662306a36Sopenharmony_ci		.max_height = 1152,
95762306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
95862306a36Sopenharmony_ci		.max_level = 5,
95962306a36Sopenharmony_ci	},
96062306a36Sopenharmony_ci	{
96162306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC,
96262306a36Sopenharmony_ci		.max_width = 2048,
96362306a36Sopenharmony_ci		.max_height = 1152,
96462306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
96562306a36Sopenharmony_ci		.max_level = 41,
96662306a36Sopenharmony_ci	},
96762306a36Sopenharmony_ci	{
96862306a36Sopenharmony_ci		.codec_type = AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VC1,
96962306a36Sopenharmony_ci		.max_width = 2048,
97062306a36Sopenharmony_ci		.max_height = 1152,
97162306a36Sopenharmony_ci		.max_pixels_per_frame = 2048 * 1152,
97262306a36Sopenharmony_ci		.max_level = 4,
97362306a36Sopenharmony_ci	},
97462306a36Sopenharmony_ci};
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic const struct amdgpu_video_codecs tahiti_video_codecs_decode =
97762306a36Sopenharmony_ci{
97862306a36Sopenharmony_ci	.codec_count = ARRAY_SIZE(tahiti_video_codecs_decode_array),
97962306a36Sopenharmony_ci	.codec_array = tahiti_video_codecs_decode_array,
98062306a36Sopenharmony_ci};
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci/* hainan doesn't support decode */
98362306a36Sopenharmony_cistatic const struct amdgpu_video_codecs hainan_video_codecs_decode =
98462306a36Sopenharmony_ci{
98562306a36Sopenharmony_ci	.codec_count = 0,
98662306a36Sopenharmony_ci	.codec_array = NULL,
98762306a36Sopenharmony_ci};
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_cistatic int si_query_video_codecs(struct amdgpu_device *adev, bool encode,
99062306a36Sopenharmony_ci				 const struct amdgpu_video_codecs **codecs)
99162306a36Sopenharmony_ci{
99262306a36Sopenharmony_ci	switch (adev->asic_type) {
99362306a36Sopenharmony_ci	case CHIP_VERDE:
99462306a36Sopenharmony_ci	case CHIP_TAHITI:
99562306a36Sopenharmony_ci	case CHIP_PITCAIRN:
99662306a36Sopenharmony_ci		if (encode)
99762306a36Sopenharmony_ci			*codecs = &tahiti_video_codecs_encode;
99862306a36Sopenharmony_ci		else
99962306a36Sopenharmony_ci			*codecs = &tahiti_video_codecs_decode;
100062306a36Sopenharmony_ci		return 0;
100162306a36Sopenharmony_ci	case CHIP_OLAND:
100262306a36Sopenharmony_ci		if (encode)
100362306a36Sopenharmony_ci			*codecs = &hainan_video_codecs_encode;
100462306a36Sopenharmony_ci		else
100562306a36Sopenharmony_ci			*codecs = &tahiti_video_codecs_decode;
100662306a36Sopenharmony_ci		return 0;
100762306a36Sopenharmony_ci	case CHIP_HAINAN:
100862306a36Sopenharmony_ci		if (encode)
100962306a36Sopenharmony_ci			*codecs = &hainan_video_codecs_encode;
101062306a36Sopenharmony_ci		else
101162306a36Sopenharmony_ci			*codecs = &hainan_video_codecs_decode;
101262306a36Sopenharmony_ci		return 0;
101362306a36Sopenharmony_ci	default:
101462306a36Sopenharmony_ci		return -EINVAL;
101562306a36Sopenharmony_ci	}
101662306a36Sopenharmony_ci}
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_cistatic u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
101962306a36Sopenharmony_ci{
102062306a36Sopenharmony_ci	unsigned long flags;
102162306a36Sopenharmony_ci	u32 r;
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
102462306a36Sopenharmony_ci	WREG32(AMDGPU_PCIE_INDEX, reg);
102562306a36Sopenharmony_ci	(void)RREG32(AMDGPU_PCIE_INDEX);
102662306a36Sopenharmony_ci	r = RREG32(AMDGPU_PCIE_DATA);
102762306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
102862306a36Sopenharmony_ci	return r;
102962306a36Sopenharmony_ci}
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_cistatic void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
103262306a36Sopenharmony_ci{
103362306a36Sopenharmony_ci	unsigned long flags;
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
103662306a36Sopenharmony_ci	WREG32(AMDGPU_PCIE_INDEX, reg);
103762306a36Sopenharmony_ci	(void)RREG32(AMDGPU_PCIE_INDEX);
103862306a36Sopenharmony_ci	WREG32(AMDGPU_PCIE_DATA, v);
103962306a36Sopenharmony_ci	(void)RREG32(AMDGPU_PCIE_DATA);
104062306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
104162306a36Sopenharmony_ci}
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_cistatic u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
104462306a36Sopenharmony_ci{
104562306a36Sopenharmony_ci	unsigned long flags;
104662306a36Sopenharmony_ci	u32 r;
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
104962306a36Sopenharmony_ci	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
105062306a36Sopenharmony_ci	(void)RREG32(PCIE_PORT_INDEX);
105162306a36Sopenharmony_ci	r = RREG32(PCIE_PORT_DATA);
105262306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
105362306a36Sopenharmony_ci	return r;
105462306a36Sopenharmony_ci}
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_cistatic void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
105762306a36Sopenharmony_ci{
105862306a36Sopenharmony_ci	unsigned long flags;
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
106162306a36Sopenharmony_ci	WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
106262306a36Sopenharmony_ci	(void)RREG32(PCIE_PORT_INDEX);
106362306a36Sopenharmony_ci	WREG32(PCIE_PORT_DATA, (v));
106462306a36Sopenharmony_ci	(void)RREG32(PCIE_PORT_DATA);
106562306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
106662306a36Sopenharmony_ci}
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_cistatic u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
106962306a36Sopenharmony_ci{
107062306a36Sopenharmony_ci	unsigned long flags;
107162306a36Sopenharmony_ci	u32 r;
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
107462306a36Sopenharmony_ci	WREG32(SMC_IND_INDEX_0, (reg));
107562306a36Sopenharmony_ci	r = RREG32(SMC_IND_DATA_0);
107662306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
107762306a36Sopenharmony_ci	return r;
107862306a36Sopenharmony_ci}
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_cistatic void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
108162306a36Sopenharmony_ci{
108262306a36Sopenharmony_ci	unsigned long flags;
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci	spin_lock_irqsave(&adev->smc_idx_lock, flags);
108562306a36Sopenharmony_ci	WREG32(SMC_IND_INDEX_0, (reg));
108662306a36Sopenharmony_ci	WREG32(SMC_IND_DATA_0, (v));
108762306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
108862306a36Sopenharmony_ci}
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_cistatic u32 si_uvd_ctx_rreg(struct amdgpu_device *adev, u32 reg)
109162306a36Sopenharmony_ci{
109262306a36Sopenharmony_ci	unsigned long flags;
109362306a36Sopenharmony_ci	u32 r;
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
109662306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
109762306a36Sopenharmony_ci	r = RREG32(mmUVD_CTX_DATA);
109862306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
109962306a36Sopenharmony_ci	return r;
110062306a36Sopenharmony_ci}
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_cistatic void si_uvd_ctx_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
110362306a36Sopenharmony_ci{
110462306a36Sopenharmony_ci	unsigned long flags;
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	spin_lock_irqsave(&adev->uvd_ctx_idx_lock, flags);
110762306a36Sopenharmony_ci	WREG32(mmUVD_CTX_INDEX, ((reg) & 0x1ff));
110862306a36Sopenharmony_ci	WREG32(mmUVD_CTX_DATA, (v));
110962306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->uvd_ctx_idx_lock, flags);
111062306a36Sopenharmony_ci}
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_cistatic struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
111362306a36Sopenharmony_ci	{GRBM_STATUS},
111462306a36Sopenharmony_ci	{mmGRBM_STATUS2},
111562306a36Sopenharmony_ci	{mmGRBM_STATUS_SE0},
111662306a36Sopenharmony_ci	{mmGRBM_STATUS_SE1},
111762306a36Sopenharmony_ci	{mmSRBM_STATUS},
111862306a36Sopenharmony_ci	{mmSRBM_STATUS2},
111962306a36Sopenharmony_ci	{DMA_STATUS_REG + DMA0_REGISTER_OFFSET},
112062306a36Sopenharmony_ci	{DMA_STATUS_REG + DMA1_REGISTER_OFFSET},
112162306a36Sopenharmony_ci	{mmCP_STAT},
112262306a36Sopenharmony_ci	{mmCP_STALLED_STAT1},
112362306a36Sopenharmony_ci	{mmCP_STALLED_STAT2},
112462306a36Sopenharmony_ci	{mmCP_STALLED_STAT3},
112562306a36Sopenharmony_ci	{GB_ADDR_CONFIG},
112662306a36Sopenharmony_ci	{MC_ARB_RAMCFG},
112762306a36Sopenharmony_ci	{GB_TILE_MODE0},
112862306a36Sopenharmony_ci	{GB_TILE_MODE1},
112962306a36Sopenharmony_ci	{GB_TILE_MODE2},
113062306a36Sopenharmony_ci	{GB_TILE_MODE3},
113162306a36Sopenharmony_ci	{GB_TILE_MODE4},
113262306a36Sopenharmony_ci	{GB_TILE_MODE5},
113362306a36Sopenharmony_ci	{GB_TILE_MODE6},
113462306a36Sopenharmony_ci	{GB_TILE_MODE7},
113562306a36Sopenharmony_ci	{GB_TILE_MODE8},
113662306a36Sopenharmony_ci	{GB_TILE_MODE9},
113762306a36Sopenharmony_ci	{GB_TILE_MODE10},
113862306a36Sopenharmony_ci	{GB_TILE_MODE11},
113962306a36Sopenharmony_ci	{GB_TILE_MODE12},
114062306a36Sopenharmony_ci	{GB_TILE_MODE13},
114162306a36Sopenharmony_ci	{GB_TILE_MODE14},
114262306a36Sopenharmony_ci	{GB_TILE_MODE15},
114362306a36Sopenharmony_ci	{GB_TILE_MODE16},
114462306a36Sopenharmony_ci	{GB_TILE_MODE17},
114562306a36Sopenharmony_ci	{GB_TILE_MODE18},
114662306a36Sopenharmony_ci	{GB_TILE_MODE19},
114762306a36Sopenharmony_ci	{GB_TILE_MODE20},
114862306a36Sopenharmony_ci	{GB_TILE_MODE21},
114962306a36Sopenharmony_ci	{GB_TILE_MODE22},
115062306a36Sopenharmony_ci	{GB_TILE_MODE23},
115162306a36Sopenharmony_ci	{GB_TILE_MODE24},
115262306a36Sopenharmony_ci	{GB_TILE_MODE25},
115362306a36Sopenharmony_ci	{GB_TILE_MODE26},
115462306a36Sopenharmony_ci	{GB_TILE_MODE27},
115562306a36Sopenharmony_ci	{GB_TILE_MODE28},
115662306a36Sopenharmony_ci	{GB_TILE_MODE29},
115762306a36Sopenharmony_ci	{GB_TILE_MODE30},
115862306a36Sopenharmony_ci	{GB_TILE_MODE31},
115962306a36Sopenharmony_ci	{CC_RB_BACKEND_DISABLE, true},
116062306a36Sopenharmony_ci	{GC_USER_RB_BACKEND_DISABLE, true},
116162306a36Sopenharmony_ci	{PA_SC_RASTER_CONFIG, true},
116262306a36Sopenharmony_ci};
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_cistatic uint32_t si_get_register_value(struct amdgpu_device *adev,
116562306a36Sopenharmony_ci				      bool indexed, u32 se_num,
116662306a36Sopenharmony_ci				      u32 sh_num, u32 reg_offset)
116762306a36Sopenharmony_ci{
116862306a36Sopenharmony_ci	if (indexed) {
116962306a36Sopenharmony_ci		uint32_t val;
117062306a36Sopenharmony_ci		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num;
117162306a36Sopenharmony_ci		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num;
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ci		switch (reg_offset) {
117462306a36Sopenharmony_ci		case mmCC_RB_BACKEND_DISABLE:
117562306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable;
117662306a36Sopenharmony_ci		case mmGC_USER_RB_BACKEND_DISABLE:
117762306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable;
117862306a36Sopenharmony_ci		case mmPA_SC_RASTER_CONFIG:
117962306a36Sopenharmony_ci			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config;
118062306a36Sopenharmony_ci		}
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci		mutex_lock(&adev->grbm_idx_mutex);
118362306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
118462306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci		val = RREG32(reg_offset);
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_ci		if (se_num != 0xffffffff || sh_num != 0xffffffff)
118962306a36Sopenharmony_ci			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
119062306a36Sopenharmony_ci		mutex_unlock(&adev->grbm_idx_mutex);
119162306a36Sopenharmony_ci		return val;
119262306a36Sopenharmony_ci	} else {
119362306a36Sopenharmony_ci		unsigned idx;
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_ci		switch (reg_offset) {
119662306a36Sopenharmony_ci		case mmGB_ADDR_CONFIG:
119762306a36Sopenharmony_ci			return adev->gfx.config.gb_addr_config;
119862306a36Sopenharmony_ci		case mmMC_ARB_RAMCFG:
119962306a36Sopenharmony_ci			return adev->gfx.config.mc_arb_ramcfg;
120062306a36Sopenharmony_ci		case mmGB_TILE_MODE0:
120162306a36Sopenharmony_ci		case mmGB_TILE_MODE1:
120262306a36Sopenharmony_ci		case mmGB_TILE_MODE2:
120362306a36Sopenharmony_ci		case mmGB_TILE_MODE3:
120462306a36Sopenharmony_ci		case mmGB_TILE_MODE4:
120562306a36Sopenharmony_ci		case mmGB_TILE_MODE5:
120662306a36Sopenharmony_ci		case mmGB_TILE_MODE6:
120762306a36Sopenharmony_ci		case mmGB_TILE_MODE7:
120862306a36Sopenharmony_ci		case mmGB_TILE_MODE8:
120962306a36Sopenharmony_ci		case mmGB_TILE_MODE9:
121062306a36Sopenharmony_ci		case mmGB_TILE_MODE10:
121162306a36Sopenharmony_ci		case mmGB_TILE_MODE11:
121262306a36Sopenharmony_ci		case mmGB_TILE_MODE12:
121362306a36Sopenharmony_ci		case mmGB_TILE_MODE13:
121462306a36Sopenharmony_ci		case mmGB_TILE_MODE14:
121562306a36Sopenharmony_ci		case mmGB_TILE_MODE15:
121662306a36Sopenharmony_ci		case mmGB_TILE_MODE16:
121762306a36Sopenharmony_ci		case mmGB_TILE_MODE17:
121862306a36Sopenharmony_ci		case mmGB_TILE_MODE18:
121962306a36Sopenharmony_ci		case mmGB_TILE_MODE19:
122062306a36Sopenharmony_ci		case mmGB_TILE_MODE20:
122162306a36Sopenharmony_ci		case mmGB_TILE_MODE21:
122262306a36Sopenharmony_ci		case mmGB_TILE_MODE22:
122362306a36Sopenharmony_ci		case mmGB_TILE_MODE23:
122462306a36Sopenharmony_ci		case mmGB_TILE_MODE24:
122562306a36Sopenharmony_ci		case mmGB_TILE_MODE25:
122662306a36Sopenharmony_ci		case mmGB_TILE_MODE26:
122762306a36Sopenharmony_ci		case mmGB_TILE_MODE27:
122862306a36Sopenharmony_ci		case mmGB_TILE_MODE28:
122962306a36Sopenharmony_ci		case mmGB_TILE_MODE29:
123062306a36Sopenharmony_ci		case mmGB_TILE_MODE30:
123162306a36Sopenharmony_ci		case mmGB_TILE_MODE31:
123262306a36Sopenharmony_ci			idx = (reg_offset - mmGB_TILE_MODE0);
123362306a36Sopenharmony_ci			return adev->gfx.config.tile_mode_array[idx];
123462306a36Sopenharmony_ci		default:
123562306a36Sopenharmony_ci			return RREG32(reg_offset);
123662306a36Sopenharmony_ci		}
123762306a36Sopenharmony_ci	}
123862306a36Sopenharmony_ci}
123962306a36Sopenharmony_cistatic int si_read_register(struct amdgpu_device *adev, u32 se_num,
124062306a36Sopenharmony_ci			     u32 sh_num, u32 reg_offset, u32 *value)
124162306a36Sopenharmony_ci{
124262306a36Sopenharmony_ci	uint32_t i;
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	*value = 0;
124562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
124662306a36Sopenharmony_ci		bool indexed = si_allowed_read_registers[i].grbm_indexed;
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci		if (reg_offset != si_allowed_read_registers[i].reg_offset)
124962306a36Sopenharmony_ci			continue;
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci		*value = si_get_register_value(adev, indexed, se_num, sh_num,
125262306a36Sopenharmony_ci					       reg_offset);
125362306a36Sopenharmony_ci		return 0;
125462306a36Sopenharmony_ci	}
125562306a36Sopenharmony_ci	return -EINVAL;
125662306a36Sopenharmony_ci}
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_cistatic bool si_read_disabled_bios(struct amdgpu_device *adev)
125962306a36Sopenharmony_ci{
126062306a36Sopenharmony_ci	u32 bus_cntl;
126162306a36Sopenharmony_ci	u32 d1vga_control = 0;
126262306a36Sopenharmony_ci	u32 d2vga_control = 0;
126362306a36Sopenharmony_ci	u32 vga_render_control = 0;
126462306a36Sopenharmony_ci	u32 rom_cntl;
126562306a36Sopenharmony_ci	bool r;
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	bus_cntl = RREG32(R600_BUS_CNTL);
126862306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
126962306a36Sopenharmony_ci		d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
127062306a36Sopenharmony_ci		d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
127162306a36Sopenharmony_ci		vga_render_control = RREG32(VGA_RENDER_CONTROL);
127262306a36Sopenharmony_ci	}
127362306a36Sopenharmony_ci	rom_cntl = RREG32(R600_ROM_CNTL);
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	/* enable the rom */
127662306a36Sopenharmony_ci	WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
127762306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
127862306a36Sopenharmony_ci		/* Disable VGA mode */
127962306a36Sopenharmony_ci		WREG32(AVIVO_D1VGA_CONTROL,
128062306a36Sopenharmony_ci		       (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
128162306a36Sopenharmony_ci					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
128262306a36Sopenharmony_ci		WREG32(AVIVO_D2VGA_CONTROL,
128362306a36Sopenharmony_ci		       (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
128462306a36Sopenharmony_ci					  AVIVO_DVGA_CONTROL_TIMING_SELECT)));
128562306a36Sopenharmony_ci		WREG32(VGA_RENDER_CONTROL,
128662306a36Sopenharmony_ci		       (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
128762306a36Sopenharmony_ci	}
128862306a36Sopenharmony_ci	WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
128962306a36Sopenharmony_ci
129062306a36Sopenharmony_ci	r = amdgpu_read_bios(adev);
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci	/* restore regs */
129362306a36Sopenharmony_ci	WREG32(R600_BUS_CNTL, bus_cntl);
129462306a36Sopenharmony_ci	if (adev->mode_info.num_crtc) {
129562306a36Sopenharmony_ci		WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
129662306a36Sopenharmony_ci		WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
129762306a36Sopenharmony_ci		WREG32(VGA_RENDER_CONTROL, vga_render_control);
129862306a36Sopenharmony_ci	}
129962306a36Sopenharmony_ci	WREG32(R600_ROM_CNTL, rom_cntl);
130062306a36Sopenharmony_ci	return r;
130162306a36Sopenharmony_ci}
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci#define mmROM_INDEX 0x2A
130462306a36Sopenharmony_ci#define mmROM_DATA  0x2B
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_cistatic bool si_read_bios_from_rom(struct amdgpu_device *adev,
130762306a36Sopenharmony_ci				  u8 *bios, u32 length_bytes)
130862306a36Sopenharmony_ci{
130962306a36Sopenharmony_ci	u32 *dw_ptr;
131062306a36Sopenharmony_ci	u32 i, length_dw;
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_ci	if (bios == NULL)
131362306a36Sopenharmony_ci		return false;
131462306a36Sopenharmony_ci	if (length_bytes == 0)
131562306a36Sopenharmony_ci		return false;
131662306a36Sopenharmony_ci	/* APU vbios image is part of sbios image */
131762306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
131862306a36Sopenharmony_ci		return false;
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	dw_ptr = (u32 *)bios;
132162306a36Sopenharmony_ci	length_dw = ALIGN(length_bytes, 4) / 4;
132262306a36Sopenharmony_ci	/* set rom index to 0 */
132362306a36Sopenharmony_ci	WREG32(mmROM_INDEX, 0);
132462306a36Sopenharmony_ci	for (i = 0; i < length_dw; i++)
132562306a36Sopenharmony_ci		dw_ptr[i] = RREG32(mmROM_DATA);
132662306a36Sopenharmony_ci
132762306a36Sopenharmony_ci	return true;
132862306a36Sopenharmony_ci}
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_cistatic void si_set_clk_bypass_mode(struct amdgpu_device *adev)
133162306a36Sopenharmony_ci{
133262306a36Sopenharmony_ci	u32 tmp, i;
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	tmp = RREG32(CG_SPLL_FUNC_CNTL);
133562306a36Sopenharmony_ci	tmp |= SPLL_BYPASS_EN;
133662306a36Sopenharmony_ci	WREG32(CG_SPLL_FUNC_CNTL, tmp);
133762306a36Sopenharmony_ci
133862306a36Sopenharmony_ci	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
133962306a36Sopenharmony_ci	tmp |= SPLL_CTLREQ_CHG;
134062306a36Sopenharmony_ci	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
134362306a36Sopenharmony_ci		if (RREG32(SPLL_STATUS) & SPLL_CHG_STATUS)
134462306a36Sopenharmony_ci			break;
134562306a36Sopenharmony_ci		udelay(1);
134662306a36Sopenharmony_ci	}
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_ci	tmp = RREG32(CG_SPLL_FUNC_CNTL_2);
134962306a36Sopenharmony_ci	tmp &= ~(SPLL_CTLREQ_CHG | SCLK_MUX_UPDATE);
135062306a36Sopenharmony_ci	WREG32(CG_SPLL_FUNC_CNTL_2, tmp);
135162306a36Sopenharmony_ci
135262306a36Sopenharmony_ci	tmp = RREG32(MPLL_CNTL_MODE);
135362306a36Sopenharmony_ci	tmp &= ~MPLL_MCLK_SEL;
135462306a36Sopenharmony_ci	WREG32(MPLL_CNTL_MODE, tmp);
135562306a36Sopenharmony_ci}
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_cistatic void si_spll_powerdown(struct amdgpu_device *adev)
135862306a36Sopenharmony_ci{
135962306a36Sopenharmony_ci	u32 tmp;
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci	tmp = RREG32(SPLL_CNTL_MODE);
136262306a36Sopenharmony_ci	tmp |= SPLL_SW_DIR_CONTROL;
136362306a36Sopenharmony_ci	WREG32(SPLL_CNTL_MODE, tmp);
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci	tmp = RREG32(CG_SPLL_FUNC_CNTL);
136662306a36Sopenharmony_ci	tmp |= SPLL_RESET;
136762306a36Sopenharmony_ci	WREG32(CG_SPLL_FUNC_CNTL, tmp);
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci	tmp = RREG32(CG_SPLL_FUNC_CNTL);
137062306a36Sopenharmony_ci	tmp |= SPLL_SLEEP;
137162306a36Sopenharmony_ci	WREG32(CG_SPLL_FUNC_CNTL, tmp);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	tmp = RREG32(SPLL_CNTL_MODE);
137462306a36Sopenharmony_ci	tmp &= ~SPLL_SW_DIR_CONTROL;
137562306a36Sopenharmony_ci	WREG32(SPLL_CNTL_MODE, tmp);
137662306a36Sopenharmony_ci}
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_cistatic int si_gpu_pci_config_reset(struct amdgpu_device *adev)
137962306a36Sopenharmony_ci{
138062306a36Sopenharmony_ci	u32 i;
138162306a36Sopenharmony_ci	int r = -EINVAL;
138262306a36Sopenharmony_ci
138362306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, true);
138462306a36Sopenharmony_ci
138562306a36Sopenharmony_ci	/* set mclk/sclk to bypass */
138662306a36Sopenharmony_ci	si_set_clk_bypass_mode(adev);
138762306a36Sopenharmony_ci	/* powerdown spll */
138862306a36Sopenharmony_ci	si_spll_powerdown(adev);
138962306a36Sopenharmony_ci	/* disable BM */
139062306a36Sopenharmony_ci	pci_clear_master(adev->pdev);
139162306a36Sopenharmony_ci	/* reset */
139262306a36Sopenharmony_ci	amdgpu_device_pci_config_reset(adev);
139362306a36Sopenharmony_ci
139462306a36Sopenharmony_ci	udelay(100);
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_ci	/* wait for asic to come out of reset */
139762306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
139862306a36Sopenharmony_ci		if (RREG32(mmCONFIG_MEMSIZE) != 0xffffffff) {
139962306a36Sopenharmony_ci			/* enable BM */
140062306a36Sopenharmony_ci			pci_set_master(adev->pdev);
140162306a36Sopenharmony_ci			adev->has_hw_reset = true;
140262306a36Sopenharmony_ci			r = 0;
140362306a36Sopenharmony_ci			break;
140462306a36Sopenharmony_ci		}
140562306a36Sopenharmony_ci		udelay(1);
140662306a36Sopenharmony_ci	}
140762306a36Sopenharmony_ci	amdgpu_atombios_scratch_regs_engine_hung(adev, false);
140862306a36Sopenharmony_ci
140962306a36Sopenharmony_ci	return r;
141062306a36Sopenharmony_ci}
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_cistatic bool si_asic_supports_baco(struct amdgpu_device *adev)
141362306a36Sopenharmony_ci{
141462306a36Sopenharmony_ci	return false;
141562306a36Sopenharmony_ci}
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_cistatic enum amd_reset_method
141862306a36Sopenharmony_cisi_asic_reset_method(struct amdgpu_device *adev)
141962306a36Sopenharmony_ci{
142062306a36Sopenharmony_ci	if (amdgpu_reset_method == AMD_RESET_METHOD_PCI)
142162306a36Sopenharmony_ci		return amdgpu_reset_method;
142262306a36Sopenharmony_ci	else if (amdgpu_reset_method != AMD_RESET_METHOD_LEGACY &&
142362306a36Sopenharmony_ci		 amdgpu_reset_method != -1)
142462306a36Sopenharmony_ci		dev_warn(adev->dev, "Specified reset method:%d isn't supported, using AUTO instead.\n",
142562306a36Sopenharmony_ci			 amdgpu_reset_method);
142662306a36Sopenharmony_ci
142762306a36Sopenharmony_ci	return AMD_RESET_METHOD_LEGACY;
142862306a36Sopenharmony_ci}
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_cistatic int si_asic_reset(struct amdgpu_device *adev)
143162306a36Sopenharmony_ci{
143262306a36Sopenharmony_ci	int r;
143362306a36Sopenharmony_ci
143462306a36Sopenharmony_ci	switch (si_asic_reset_method(adev)) {
143562306a36Sopenharmony_ci	case AMD_RESET_METHOD_PCI:
143662306a36Sopenharmony_ci		dev_info(adev->dev, "PCI reset\n");
143762306a36Sopenharmony_ci		r = amdgpu_device_pci_reset(adev);
143862306a36Sopenharmony_ci		break;
143962306a36Sopenharmony_ci	default:
144062306a36Sopenharmony_ci		dev_info(adev->dev, "PCI CONFIG reset\n");
144162306a36Sopenharmony_ci		r = si_gpu_pci_config_reset(adev);
144262306a36Sopenharmony_ci		break;
144362306a36Sopenharmony_ci	}
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_ci	return r;
144662306a36Sopenharmony_ci}
144762306a36Sopenharmony_ci
144862306a36Sopenharmony_cistatic u32 si_get_config_memsize(struct amdgpu_device *adev)
144962306a36Sopenharmony_ci{
145062306a36Sopenharmony_ci	return RREG32(mmCONFIG_MEMSIZE);
145162306a36Sopenharmony_ci}
145262306a36Sopenharmony_ci
145362306a36Sopenharmony_cistatic void si_vga_set_state(struct amdgpu_device *adev, bool state)
145462306a36Sopenharmony_ci{
145562306a36Sopenharmony_ci	uint32_t temp;
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci	temp = RREG32(CONFIG_CNTL);
145862306a36Sopenharmony_ci	if (!state) {
145962306a36Sopenharmony_ci		temp &= ~(1<<0);
146062306a36Sopenharmony_ci		temp |= (1<<1);
146162306a36Sopenharmony_ci	} else {
146262306a36Sopenharmony_ci		temp &= ~(1<<1);
146362306a36Sopenharmony_ci	}
146462306a36Sopenharmony_ci	WREG32(CONFIG_CNTL, temp);
146562306a36Sopenharmony_ci}
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_cistatic u32 si_get_xclk(struct amdgpu_device *adev)
146862306a36Sopenharmony_ci{
146962306a36Sopenharmony_ci	u32 reference_clock = adev->clock.spll.reference_freq;
147062306a36Sopenharmony_ci	u32 tmp;
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci	tmp = RREG32(CG_CLKPIN_CNTL_2);
147362306a36Sopenharmony_ci	if (tmp & MUX_TCLK_TO_XCLK)
147462306a36Sopenharmony_ci		return TCLK;
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_ci	tmp = RREG32(CG_CLKPIN_CNTL);
147762306a36Sopenharmony_ci	if (tmp & XTALIN_DIVIDE)
147862306a36Sopenharmony_ci		return reference_clock / 4;
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_ci	return reference_clock;
148162306a36Sopenharmony_ci}
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_cistatic void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)
148462306a36Sopenharmony_ci{
148562306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
148662306a36Sopenharmony_ci		WREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
148762306a36Sopenharmony_ci		RREG32(mmHDP_MEM_COHERENCY_FLUSH_CNTL);
148862306a36Sopenharmony_ci	} else {
148962306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 1);
149062306a36Sopenharmony_ci	}
149162306a36Sopenharmony_ci}
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_cistatic void si_invalidate_hdp(struct amdgpu_device *adev,
149462306a36Sopenharmony_ci			      struct amdgpu_ring *ring)
149562306a36Sopenharmony_ci{
149662306a36Sopenharmony_ci	if (!ring || !ring->funcs->emit_wreg) {
149762306a36Sopenharmony_ci		WREG32(mmHDP_DEBUG0, 1);
149862306a36Sopenharmony_ci		RREG32(mmHDP_DEBUG0);
149962306a36Sopenharmony_ci	} else {
150062306a36Sopenharmony_ci		amdgpu_ring_emit_wreg(ring, mmHDP_DEBUG0, 1);
150162306a36Sopenharmony_ci	}
150262306a36Sopenharmony_ci}
150362306a36Sopenharmony_ci
150462306a36Sopenharmony_cistatic bool si_need_full_reset(struct amdgpu_device *adev)
150562306a36Sopenharmony_ci{
150662306a36Sopenharmony_ci	/* change this when we support soft reset */
150762306a36Sopenharmony_ci	return true;
150862306a36Sopenharmony_ci}
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_cistatic bool si_need_reset_on_init(struct amdgpu_device *adev)
151162306a36Sopenharmony_ci{
151262306a36Sopenharmony_ci	return false;
151362306a36Sopenharmony_ci}
151462306a36Sopenharmony_ci
151562306a36Sopenharmony_cistatic int si_get_pcie_lanes(struct amdgpu_device *adev)
151662306a36Sopenharmony_ci{
151762306a36Sopenharmony_ci	u32 link_width_cntl;
151862306a36Sopenharmony_ci
151962306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
152062306a36Sopenharmony_ci		return 0;
152162306a36Sopenharmony_ci
152262306a36Sopenharmony_ci	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci	switch ((link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT) {
152562306a36Sopenharmony_ci	case LC_LINK_WIDTH_X1:
152662306a36Sopenharmony_ci		return 1;
152762306a36Sopenharmony_ci	case LC_LINK_WIDTH_X2:
152862306a36Sopenharmony_ci		return 2;
152962306a36Sopenharmony_ci	case LC_LINK_WIDTH_X4:
153062306a36Sopenharmony_ci		return 4;
153162306a36Sopenharmony_ci	case LC_LINK_WIDTH_X8:
153262306a36Sopenharmony_ci		return 8;
153362306a36Sopenharmony_ci	case LC_LINK_WIDTH_X0:
153462306a36Sopenharmony_ci	case LC_LINK_WIDTH_X16:
153562306a36Sopenharmony_ci	default:
153662306a36Sopenharmony_ci		return 16;
153762306a36Sopenharmony_ci	}
153862306a36Sopenharmony_ci}
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_cistatic void si_set_pcie_lanes(struct amdgpu_device *adev, int lanes)
154162306a36Sopenharmony_ci{
154262306a36Sopenharmony_ci	u32 link_width_cntl, mask;
154362306a36Sopenharmony_ci
154462306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
154562306a36Sopenharmony_ci		return;
154662306a36Sopenharmony_ci
154762306a36Sopenharmony_ci	switch (lanes) {
154862306a36Sopenharmony_ci	case 0:
154962306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X0;
155062306a36Sopenharmony_ci		break;
155162306a36Sopenharmony_ci	case 1:
155262306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X1;
155362306a36Sopenharmony_ci		break;
155462306a36Sopenharmony_ci	case 2:
155562306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X2;
155662306a36Sopenharmony_ci		break;
155762306a36Sopenharmony_ci	case 4:
155862306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X4;
155962306a36Sopenharmony_ci		break;
156062306a36Sopenharmony_ci	case 8:
156162306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X8;
156262306a36Sopenharmony_ci		break;
156362306a36Sopenharmony_ci	case 16:
156462306a36Sopenharmony_ci		mask = LC_LINK_WIDTH_X16;
156562306a36Sopenharmony_ci		break;
156662306a36Sopenharmony_ci	default:
156762306a36Sopenharmony_ci		DRM_ERROR("invalid pcie lane request: %d\n", lanes);
156862306a36Sopenharmony_ci		return;
156962306a36Sopenharmony_ci	}
157062306a36Sopenharmony_ci
157162306a36Sopenharmony_ci	link_width_cntl = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
157262306a36Sopenharmony_ci	link_width_cntl &= ~LC_LINK_WIDTH_MASK;
157362306a36Sopenharmony_ci	link_width_cntl |= mask << LC_LINK_WIDTH_SHIFT;
157462306a36Sopenharmony_ci	link_width_cntl |= (LC_RECONFIG_NOW |
157562306a36Sopenharmony_ci			    LC_RECONFIG_ARC_MISSING_ESCAPE);
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_ci	WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
157862306a36Sopenharmony_ci}
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_cistatic void si_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
158162306a36Sopenharmony_ci			      uint64_t *count1)
158262306a36Sopenharmony_ci{
158362306a36Sopenharmony_ci	uint32_t perfctr = 0;
158462306a36Sopenharmony_ci	uint64_t cnt0_of, cnt1_of;
158562306a36Sopenharmony_ci	int tmp;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	/* This reports 0 on APUs, so return to avoid writing/reading registers
158862306a36Sopenharmony_ci	 * that may or may not be different from their GPU counterparts
158962306a36Sopenharmony_ci	 */
159062306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
159162306a36Sopenharmony_ci		return;
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci	/* Set the 2 events that we wish to watch, defined above */
159462306a36Sopenharmony_ci	/* Reg 40 is # received msgs, Reg 104 is # of posted requests sent */
159562306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT0_SEL, 40);
159662306a36Sopenharmony_ci	perfctr = REG_SET_FIELD(perfctr, PCIE_PERF_CNTL_TXCLK, EVENT1_SEL, 104);
159762306a36Sopenharmony_ci
159862306a36Sopenharmony_ci	/* Write to enable desired perf counters */
159962306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK, perfctr);
160062306a36Sopenharmony_ci	/* Zero out and enable the perf counters
160162306a36Sopenharmony_ci	 * Write 0x5:
160262306a36Sopenharmony_ci	 * Bit 0 = Start all counters(1)
160362306a36Sopenharmony_ci	 * Bit 2 = Global counter reset enable(1)
160462306a36Sopenharmony_ci	 */
160562306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000005);
160662306a36Sopenharmony_ci
160762306a36Sopenharmony_ci	msleep(1000);
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_ci	/* Load the shadow and disable the perf counters
161062306a36Sopenharmony_ci	 * Write 0x2:
161162306a36Sopenharmony_ci	 * Bit 0 = Stop counters(0)
161262306a36Sopenharmony_ci	 * Bit 1 = Load the shadow counters(1)
161362306a36Sopenharmony_ci	 */
161462306a36Sopenharmony_ci	WREG32_PCIE(ixPCIE_PERF_COUNT_CNTL, 0x00000002);
161562306a36Sopenharmony_ci
161662306a36Sopenharmony_ci	/* Read register values to get any >32bit overflow */
161762306a36Sopenharmony_ci	tmp = RREG32_PCIE(ixPCIE_PERF_CNTL_TXCLK);
161862306a36Sopenharmony_ci	cnt0_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER0_UPPER);
161962306a36Sopenharmony_ci	cnt1_of = REG_GET_FIELD(tmp, PCIE_PERF_CNTL_TXCLK, COUNTER1_UPPER);
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci	/* Get the values and add the overflow */
162262306a36Sopenharmony_ci	*count0 = RREG32_PCIE(ixPCIE_PERF_COUNT0_TXCLK) | (cnt0_of << 32);
162362306a36Sopenharmony_ci	*count1 = RREG32_PCIE(ixPCIE_PERF_COUNT1_TXCLK) | (cnt1_of << 32);
162462306a36Sopenharmony_ci}
162562306a36Sopenharmony_ci
162662306a36Sopenharmony_cistatic uint64_t si_get_pcie_replay_count(struct amdgpu_device *adev)
162762306a36Sopenharmony_ci{
162862306a36Sopenharmony_ci	uint64_t nak_r, nak_g;
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci	/* Get the number of NAKs received and generated */
163162306a36Sopenharmony_ci	nak_r = RREG32_PCIE(ixPCIE_RX_NUM_NAK);
163262306a36Sopenharmony_ci	nak_g = RREG32_PCIE(ixPCIE_RX_NUM_NAK_GENERATED);
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci	/* Add the total number of NAKs, i.e the number of replays */
163562306a36Sopenharmony_ci	return (nak_r + nak_g);
163662306a36Sopenharmony_ci}
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_cistatic int si_uvd_send_upll_ctlreq(struct amdgpu_device *adev,
163962306a36Sopenharmony_ci				   unsigned cg_upll_func_cntl)
164062306a36Sopenharmony_ci{
164162306a36Sopenharmony_ci	unsigned i;
164262306a36Sopenharmony_ci
164362306a36Sopenharmony_ci	/* Make sure UPLL_CTLREQ is deasserted */
164462306a36Sopenharmony_ci	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
164562306a36Sopenharmony_ci
164662306a36Sopenharmony_ci	mdelay(10);
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci	/* Assert UPLL_CTLREQ */
164962306a36Sopenharmony_ci	WREG32_P(cg_upll_func_cntl, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci	/* Wait for CTLACK and CTLACK2 to get asserted */
165262306a36Sopenharmony_ci	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
165362306a36Sopenharmony_ci		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
165462306a36Sopenharmony_ci
165562306a36Sopenharmony_ci		if ((RREG32(cg_upll_func_cntl) & mask) == mask)
165662306a36Sopenharmony_ci			break;
165762306a36Sopenharmony_ci		mdelay(10);
165862306a36Sopenharmony_ci	}
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	/* Deassert UPLL_CTLREQ */
166162306a36Sopenharmony_ci	WREG32_P(cg_upll_func_cntl, 0, ~UPLL_CTLREQ_MASK);
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
166462306a36Sopenharmony_ci		DRM_ERROR("Timeout setting UVD clocks!\n");
166562306a36Sopenharmony_ci		return -ETIMEDOUT;
166662306a36Sopenharmony_ci	}
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_ci	return 0;
166962306a36Sopenharmony_ci}
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_cistatic unsigned si_uvd_calc_upll_post_div(unsigned vco_freq,
167262306a36Sopenharmony_ci					  unsigned target_freq,
167362306a36Sopenharmony_ci					  unsigned pd_min,
167462306a36Sopenharmony_ci					  unsigned pd_even)
167562306a36Sopenharmony_ci{
167662306a36Sopenharmony_ci	unsigned post_div = vco_freq / target_freq;
167762306a36Sopenharmony_ci
167862306a36Sopenharmony_ci	/* Adjust to post divider minimum value */
167962306a36Sopenharmony_ci	if (post_div < pd_min)
168062306a36Sopenharmony_ci		post_div = pd_min;
168162306a36Sopenharmony_ci
168262306a36Sopenharmony_ci	/* We alway need a frequency less than or equal the target */
168362306a36Sopenharmony_ci	if ((vco_freq / post_div) > target_freq)
168462306a36Sopenharmony_ci		post_div += 1;
168562306a36Sopenharmony_ci
168662306a36Sopenharmony_ci	/* Post dividers above a certain value must be even */
168762306a36Sopenharmony_ci	if (post_div > pd_even && post_div % 2)
168862306a36Sopenharmony_ci		post_div += 1;
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	return post_div;
169162306a36Sopenharmony_ci}
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_ci/**
169462306a36Sopenharmony_ci * si_calc_upll_dividers - calc UPLL clock dividers
169562306a36Sopenharmony_ci *
169662306a36Sopenharmony_ci * @adev: amdgpu_device pointer
169762306a36Sopenharmony_ci * @vclk: wanted VCLK
169862306a36Sopenharmony_ci * @dclk: wanted DCLK
169962306a36Sopenharmony_ci * @vco_min: minimum VCO frequency
170062306a36Sopenharmony_ci * @vco_max: maximum VCO frequency
170162306a36Sopenharmony_ci * @fb_factor: factor to multiply vco freq with
170262306a36Sopenharmony_ci * @fb_mask: limit and bitmask for feedback divider
170362306a36Sopenharmony_ci * @pd_min: post divider minimum
170462306a36Sopenharmony_ci * @pd_max: post divider maximum
170562306a36Sopenharmony_ci * @pd_even: post divider must be even above this value
170662306a36Sopenharmony_ci * @optimal_fb_div: resulting feedback divider
170762306a36Sopenharmony_ci * @optimal_vclk_div: resulting vclk post divider
170862306a36Sopenharmony_ci * @optimal_dclk_div: resulting dclk post divider
170962306a36Sopenharmony_ci *
171062306a36Sopenharmony_ci * Calculate dividers for UVDs UPLL (except APUs).
171162306a36Sopenharmony_ci * Returns zero on success; -EINVAL on error.
171262306a36Sopenharmony_ci */
171362306a36Sopenharmony_cistatic int si_calc_upll_dividers(struct amdgpu_device *adev,
171462306a36Sopenharmony_ci				 unsigned vclk, unsigned dclk,
171562306a36Sopenharmony_ci				 unsigned vco_min, unsigned vco_max,
171662306a36Sopenharmony_ci				 unsigned fb_factor, unsigned fb_mask,
171762306a36Sopenharmony_ci				 unsigned pd_min, unsigned pd_max,
171862306a36Sopenharmony_ci				 unsigned pd_even,
171962306a36Sopenharmony_ci				 unsigned *optimal_fb_div,
172062306a36Sopenharmony_ci				 unsigned *optimal_vclk_div,
172162306a36Sopenharmony_ci				 unsigned *optimal_dclk_div)
172262306a36Sopenharmony_ci{
172362306a36Sopenharmony_ci	unsigned vco_freq, ref_freq = adev->clock.spll.reference_freq;
172462306a36Sopenharmony_ci
172562306a36Sopenharmony_ci	/* Start off with something large */
172662306a36Sopenharmony_ci	unsigned optimal_score = ~0;
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci	/* Loop through vco from low to high */
172962306a36Sopenharmony_ci	vco_min = max(max(vco_min, vclk), dclk);
173062306a36Sopenharmony_ci	for (vco_freq = vco_min; vco_freq <= vco_max; vco_freq += 100) {
173162306a36Sopenharmony_ci		uint64_t fb_div = (uint64_t)vco_freq * fb_factor;
173262306a36Sopenharmony_ci		unsigned vclk_div, dclk_div, score;
173362306a36Sopenharmony_ci
173462306a36Sopenharmony_ci		do_div(fb_div, ref_freq);
173562306a36Sopenharmony_ci
173662306a36Sopenharmony_ci		/* fb div out of range ? */
173762306a36Sopenharmony_ci		if (fb_div > fb_mask)
173862306a36Sopenharmony_ci			break; /* It can oly get worse */
173962306a36Sopenharmony_ci
174062306a36Sopenharmony_ci		fb_div &= fb_mask;
174162306a36Sopenharmony_ci
174262306a36Sopenharmony_ci		/* Calc vclk divider with current vco freq */
174362306a36Sopenharmony_ci		vclk_div = si_uvd_calc_upll_post_div(vco_freq, vclk,
174462306a36Sopenharmony_ci						     pd_min, pd_even);
174562306a36Sopenharmony_ci		if (vclk_div > pd_max)
174662306a36Sopenharmony_ci			break; /* vco is too big, it has to stop */
174762306a36Sopenharmony_ci
174862306a36Sopenharmony_ci		/* Calc dclk divider with current vco freq */
174962306a36Sopenharmony_ci		dclk_div = si_uvd_calc_upll_post_div(vco_freq, dclk,
175062306a36Sopenharmony_ci						     pd_min, pd_even);
175162306a36Sopenharmony_ci		if (dclk_div > pd_max)
175262306a36Sopenharmony_ci			break; /* vco is too big, it has to stop */
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci		/* Calc score with current vco freq */
175562306a36Sopenharmony_ci		score = vclk - (vco_freq / vclk_div) + dclk - (vco_freq / dclk_div);
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci		/* Determine if this vco setting is better than current optimal settings */
175862306a36Sopenharmony_ci		if (score < optimal_score) {
175962306a36Sopenharmony_ci			*optimal_fb_div = fb_div;
176062306a36Sopenharmony_ci			*optimal_vclk_div = vclk_div;
176162306a36Sopenharmony_ci			*optimal_dclk_div = dclk_div;
176262306a36Sopenharmony_ci			optimal_score = score;
176362306a36Sopenharmony_ci			if (optimal_score == 0)
176462306a36Sopenharmony_ci				break; /* It can't get better than this */
176562306a36Sopenharmony_ci		}
176662306a36Sopenharmony_ci	}
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci	/* Did we found a valid setup ? */
176962306a36Sopenharmony_ci	if (optimal_score == ~0)
177062306a36Sopenharmony_ci		return -EINVAL;
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci	return 0;
177362306a36Sopenharmony_ci}
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_cistatic int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
177662306a36Sopenharmony_ci{
177762306a36Sopenharmony_ci	unsigned fb_div = 0, vclk_div = 0, dclk_div = 0;
177862306a36Sopenharmony_ci	int r;
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_ci	/* Bypass vclk and dclk with bclk */
178162306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL_2,
178262306a36Sopenharmony_ci		 VCLK_SRC_SEL(1) | DCLK_SRC_SEL(1),
178362306a36Sopenharmony_ci		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
178462306a36Sopenharmony_ci
178562306a36Sopenharmony_ci	/* Put PLL in bypass mode */
178662306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK);
178762306a36Sopenharmony_ci
178862306a36Sopenharmony_ci	if (!vclk || !dclk) {
178962306a36Sopenharmony_ci		/* Keep the Bypass mode */
179062306a36Sopenharmony_ci		return 0;
179162306a36Sopenharmony_ci	}
179262306a36Sopenharmony_ci
179362306a36Sopenharmony_ci	r = si_calc_upll_dividers(adev, vclk, dclk, 125000, 250000,
179462306a36Sopenharmony_ci				  16384, 0x03FFFFFF, 0, 128, 5,
179562306a36Sopenharmony_ci				  &fb_div, &vclk_div, &dclk_div);
179662306a36Sopenharmony_ci	if (r)
179762306a36Sopenharmony_ci		return r;
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci	/* Set RESET_ANTI_MUX to 0 */
180062306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci	/* Set VCO_MODE to 1 */
180362306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK);
180462306a36Sopenharmony_ci
180562306a36Sopenharmony_ci	/* Disable sleep mode */
180662306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK);
180762306a36Sopenharmony_ci
180862306a36Sopenharmony_ci	/* Deassert UPLL_RESET */
180962306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	mdelay(1);
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
181462306a36Sopenharmony_ci	if (r)
181562306a36Sopenharmony_ci		return r;
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_ci	/* Assert UPLL_RESET again */
181862306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_RESET_MASK, ~UPLL_RESET_MASK);
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_ci	/* Disable spread spectrum. */
182162306a36Sopenharmony_ci	WREG32_P(CG_UPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci	/* Set feedback divider */
182462306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL_3, UPLL_FB_DIV(fb_div), ~UPLL_FB_DIV_MASK);
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci	/* Set ref divider to 0 */
182762306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_REF_DIV_MASK);
182862306a36Sopenharmony_ci
182962306a36Sopenharmony_ci	if (fb_div < 307200)
183062306a36Sopenharmony_ci		WREG32_P(CG_UPLL_FUNC_CNTL_4, 0, ~UPLL_SPARE_ISPARE9);
183162306a36Sopenharmony_ci	else
183262306a36Sopenharmony_ci		WREG32_P(CG_UPLL_FUNC_CNTL_4,
183362306a36Sopenharmony_ci			 UPLL_SPARE_ISPARE9,
183462306a36Sopenharmony_ci			 ~UPLL_SPARE_ISPARE9);
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_ci	/* Set PDIV_A and PDIV_B */
183762306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL_2,
183862306a36Sopenharmony_ci		 UPLL_PDIV_A(vclk_div) | UPLL_PDIV_B(dclk_div),
183962306a36Sopenharmony_ci		 ~(UPLL_PDIV_A_MASK | UPLL_PDIV_B_MASK));
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_ci	/* Give the PLL some time to settle */
184262306a36Sopenharmony_ci	mdelay(15);
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	/* Deassert PLL_RESET */
184562306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_RESET_MASK);
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci	mdelay(15);
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci	/* Switch from bypass mode to normal mode */
185062306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_BYPASS_EN_MASK);
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci	r = si_uvd_send_upll_ctlreq(adev, CG_UPLL_FUNC_CNTL);
185362306a36Sopenharmony_ci	if (r)
185462306a36Sopenharmony_ci		return r;
185562306a36Sopenharmony_ci
185662306a36Sopenharmony_ci	/* Switch VCLK and DCLK selection */
185762306a36Sopenharmony_ci	WREG32_P(CG_UPLL_FUNC_CNTL_2,
185862306a36Sopenharmony_ci		 VCLK_SRC_SEL(2) | DCLK_SRC_SEL(2),
185962306a36Sopenharmony_ci		 ~(VCLK_SRC_SEL_MASK | DCLK_SRC_SEL_MASK));
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci	mdelay(100);
186262306a36Sopenharmony_ci
186362306a36Sopenharmony_ci	return 0;
186462306a36Sopenharmony_ci}
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_cistatic int si_vce_send_vcepll_ctlreq(struct amdgpu_device *adev)
186762306a36Sopenharmony_ci{
186862306a36Sopenharmony_ci	unsigned i;
186962306a36Sopenharmony_ci
187062306a36Sopenharmony_ci	/* Make sure VCEPLL_CTLREQ is deasserted */
187162306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
187262306a36Sopenharmony_ci
187362306a36Sopenharmony_ci	mdelay(10);
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_ci	/* Assert UPLL_CTLREQ */
187662306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, UPLL_CTLREQ_MASK, ~UPLL_CTLREQ_MASK);
187762306a36Sopenharmony_ci
187862306a36Sopenharmony_ci	/* Wait for CTLACK and CTLACK2 to get asserted */
187962306a36Sopenharmony_ci	for (i = 0; i < SI_MAX_CTLACKS_ASSERTION_WAIT; ++i) {
188062306a36Sopenharmony_ci		uint32_t mask = UPLL_CTLACK_MASK | UPLL_CTLACK2_MASK;
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci		if ((RREG32_SMC(CG_VCEPLL_FUNC_CNTL) & mask) == mask)
188362306a36Sopenharmony_ci			break;
188462306a36Sopenharmony_ci		mdelay(10);
188562306a36Sopenharmony_ci	}
188662306a36Sopenharmony_ci
188762306a36Sopenharmony_ci	/* Deassert UPLL_CTLREQ */
188862306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~UPLL_CTLREQ_MASK);
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_ci	if (i == SI_MAX_CTLACKS_ASSERTION_WAIT) {
189162306a36Sopenharmony_ci		DRM_ERROR("Timeout setting UVD clocks!\n");
189262306a36Sopenharmony_ci		return -ETIMEDOUT;
189362306a36Sopenharmony_ci	}
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_ci	return 0;
189662306a36Sopenharmony_ci}
189762306a36Sopenharmony_ci
189862306a36Sopenharmony_cistatic int si_set_vce_clocks(struct amdgpu_device *adev, u32 evclk, u32 ecclk)
189962306a36Sopenharmony_ci{
190062306a36Sopenharmony_ci	unsigned fb_div = 0, evclk_div = 0, ecclk_div = 0;
190162306a36Sopenharmony_ci	int r;
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	/* Bypass evclk and ecclk with bclk */
190462306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
190562306a36Sopenharmony_ci		     EVCLK_SRC_SEL(1) | ECCLK_SRC_SEL(1),
190662306a36Sopenharmony_ci		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
190762306a36Sopenharmony_ci
190862306a36Sopenharmony_ci	/* Put PLL in bypass mode */
190962306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_BYPASS_EN_MASK,
191062306a36Sopenharmony_ci		     ~VCEPLL_BYPASS_EN_MASK);
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci	if (!evclk || !ecclk) {
191362306a36Sopenharmony_ci		/* Keep the Bypass mode, put PLL to sleep */
191462306a36Sopenharmony_ci		WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
191562306a36Sopenharmony_ci			     ~VCEPLL_SLEEP_MASK);
191662306a36Sopenharmony_ci		return 0;
191762306a36Sopenharmony_ci	}
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_ci	r = si_calc_upll_dividers(adev, evclk, ecclk, 125000, 250000,
192062306a36Sopenharmony_ci				  16384, 0x03FFFFFF, 0, 128, 5,
192162306a36Sopenharmony_ci				  &fb_div, &evclk_div, &ecclk_div);
192262306a36Sopenharmony_ci	if (r)
192362306a36Sopenharmony_ci		return r;
192462306a36Sopenharmony_ci
192562306a36Sopenharmony_ci	/* Set RESET_ANTI_MUX to 0 */
192662306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_5, 0, ~RESET_ANTI_MUX_MASK);
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_ci	/* Set VCO_MODE to 1 */
192962306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_VCO_MODE_MASK,
193062306a36Sopenharmony_ci		     ~VCEPLL_VCO_MODE_MASK);
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci	/* Toggle VCEPLL_SLEEP to 1 then back to 0 */
193362306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_SLEEP_MASK,
193462306a36Sopenharmony_ci		     ~VCEPLL_SLEEP_MASK);
193562306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_SLEEP_MASK);
193662306a36Sopenharmony_ci
193762306a36Sopenharmony_ci	/* Deassert VCEPLL_RESET */
193862306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci	mdelay(1);
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_ci	r = si_vce_send_vcepll_ctlreq(adev);
194362306a36Sopenharmony_ci	if (r)
194462306a36Sopenharmony_ci		return r;
194562306a36Sopenharmony_ci
194662306a36Sopenharmony_ci	/* Assert VCEPLL_RESET again */
194762306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, VCEPLL_RESET_MASK, ~VCEPLL_RESET_MASK);
194862306a36Sopenharmony_ci
194962306a36Sopenharmony_ci	/* Disable spread spectrum. */
195062306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_SPREAD_SPECTRUM, 0, ~SSEN_MASK);
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	/* Set feedback divider */
195362306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_3,
195462306a36Sopenharmony_ci		     VCEPLL_FB_DIV(fb_div),
195562306a36Sopenharmony_ci		     ~VCEPLL_FB_DIV_MASK);
195662306a36Sopenharmony_ci
195762306a36Sopenharmony_ci	/* Set ref divider to 0 */
195862306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_REF_DIV_MASK);
195962306a36Sopenharmony_ci
196062306a36Sopenharmony_ci	/* Set PDIV_A and PDIV_B */
196162306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
196262306a36Sopenharmony_ci		     VCEPLL_PDIV_A(evclk_div) | VCEPLL_PDIV_B(ecclk_div),
196362306a36Sopenharmony_ci		     ~(VCEPLL_PDIV_A_MASK | VCEPLL_PDIV_B_MASK));
196462306a36Sopenharmony_ci
196562306a36Sopenharmony_ci	/* Give the PLL some time to settle */
196662306a36Sopenharmony_ci	mdelay(15);
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci	/* Deassert PLL_RESET */
196962306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_RESET_MASK);
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci	mdelay(15);
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci	/* Switch from bypass mode to normal mode */
197462306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL, 0, ~VCEPLL_BYPASS_EN_MASK);
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	r = si_vce_send_vcepll_ctlreq(adev);
197762306a36Sopenharmony_ci	if (r)
197862306a36Sopenharmony_ci		return r;
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_ci	/* Switch VCLK and DCLK selection */
198162306a36Sopenharmony_ci	WREG32_SMC_P(CG_VCEPLL_FUNC_CNTL_2,
198262306a36Sopenharmony_ci		     EVCLK_SRC_SEL(16) | ECCLK_SRC_SEL(16),
198362306a36Sopenharmony_ci		     ~(EVCLK_SRC_SEL_MASK | ECCLK_SRC_SEL_MASK));
198462306a36Sopenharmony_ci
198562306a36Sopenharmony_ci	mdelay(100);
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_ci	return 0;
198862306a36Sopenharmony_ci}
198962306a36Sopenharmony_ci
199062306a36Sopenharmony_cistatic void si_pre_asic_init(struct amdgpu_device *adev)
199162306a36Sopenharmony_ci{
199262306a36Sopenharmony_ci}
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_cistatic const struct amdgpu_asic_funcs si_asic_funcs =
199562306a36Sopenharmony_ci{
199662306a36Sopenharmony_ci	.read_disabled_bios = &si_read_disabled_bios,
199762306a36Sopenharmony_ci	.read_bios_from_rom = &si_read_bios_from_rom,
199862306a36Sopenharmony_ci	.read_register = &si_read_register,
199962306a36Sopenharmony_ci	.reset = &si_asic_reset,
200062306a36Sopenharmony_ci	.reset_method = &si_asic_reset_method,
200162306a36Sopenharmony_ci	.set_vga_state = &si_vga_set_state,
200262306a36Sopenharmony_ci	.get_xclk = &si_get_xclk,
200362306a36Sopenharmony_ci	.set_uvd_clocks = &si_set_uvd_clocks,
200462306a36Sopenharmony_ci	.set_vce_clocks = &si_set_vce_clocks,
200562306a36Sopenharmony_ci	.get_pcie_lanes = &si_get_pcie_lanes,
200662306a36Sopenharmony_ci	.set_pcie_lanes = &si_set_pcie_lanes,
200762306a36Sopenharmony_ci	.get_config_memsize = &si_get_config_memsize,
200862306a36Sopenharmony_ci	.flush_hdp = &si_flush_hdp,
200962306a36Sopenharmony_ci	.invalidate_hdp = &si_invalidate_hdp,
201062306a36Sopenharmony_ci	.need_full_reset = &si_need_full_reset,
201162306a36Sopenharmony_ci	.get_pcie_usage = &si_get_pcie_usage,
201262306a36Sopenharmony_ci	.need_reset_on_init = &si_need_reset_on_init,
201362306a36Sopenharmony_ci	.get_pcie_replay_count = &si_get_pcie_replay_count,
201462306a36Sopenharmony_ci	.supports_baco = &si_asic_supports_baco,
201562306a36Sopenharmony_ci	.pre_asic_init = &si_pre_asic_init,
201662306a36Sopenharmony_ci	.query_video_codecs = &si_query_video_codecs,
201762306a36Sopenharmony_ci};
201862306a36Sopenharmony_ci
201962306a36Sopenharmony_cistatic uint32_t si_get_rev_id(struct amdgpu_device *adev)
202062306a36Sopenharmony_ci{
202162306a36Sopenharmony_ci	return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
202262306a36Sopenharmony_ci		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
202362306a36Sopenharmony_ci}
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_cistatic int si_common_early_init(void *handle)
202662306a36Sopenharmony_ci{
202762306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
202862306a36Sopenharmony_ci
202962306a36Sopenharmony_ci	adev->smc_rreg = &si_smc_rreg;
203062306a36Sopenharmony_ci	adev->smc_wreg = &si_smc_wreg;
203162306a36Sopenharmony_ci	adev->pcie_rreg = &si_pcie_rreg;
203262306a36Sopenharmony_ci	adev->pcie_wreg = &si_pcie_wreg;
203362306a36Sopenharmony_ci	adev->pciep_rreg = &si_pciep_rreg;
203462306a36Sopenharmony_ci	adev->pciep_wreg = &si_pciep_wreg;
203562306a36Sopenharmony_ci	adev->uvd_ctx_rreg = si_uvd_ctx_rreg;
203662306a36Sopenharmony_ci	adev->uvd_ctx_wreg = si_uvd_ctx_wreg;
203762306a36Sopenharmony_ci	adev->didt_rreg = NULL;
203862306a36Sopenharmony_ci	adev->didt_wreg = NULL;
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	adev->asic_funcs = &si_asic_funcs;
204162306a36Sopenharmony_ci
204262306a36Sopenharmony_ci	adev->rev_id = si_get_rev_id(adev);
204362306a36Sopenharmony_ci	adev->external_rev_id = 0xFF;
204462306a36Sopenharmony_ci	switch (adev->asic_type) {
204562306a36Sopenharmony_ci	case CHIP_TAHITI:
204662306a36Sopenharmony_ci		adev->cg_flags =
204762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
204862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
204962306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
205062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
205162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
205262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
205362306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
205462306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
205562306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
205662306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
205762306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
205862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
205962306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
206062306a36Sopenharmony_ci		adev->pg_flags = 0;
206162306a36Sopenharmony_ci		adev->external_rev_id = (adev->rev_id == 0) ? 1 :
206262306a36Sopenharmony_ci					(adev->rev_id == 1) ? 5 : 6;
206362306a36Sopenharmony_ci		break;
206462306a36Sopenharmony_ci	case CHIP_PITCAIRN:
206562306a36Sopenharmony_ci		adev->cg_flags =
206662306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
206762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
206862306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
206962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
207062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
207162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
207262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
207362306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
207462306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
207562306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
207662306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
207762306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
207862306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
207962306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
208062306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
208162306a36Sopenharmony_ci		adev->pg_flags = 0;
208262306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 20;
208362306a36Sopenharmony_ci		break;
208462306a36Sopenharmony_ci
208562306a36Sopenharmony_ci	case CHIP_VERDE:
208662306a36Sopenharmony_ci		adev->cg_flags =
208762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
208862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
208962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
209062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
209162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS_LS |
209262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
209362306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
209462306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
209562306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
209662306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_LS |
209762306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
209862306a36Sopenharmony_ci			AMD_CG_SUPPORT_VCE_MGCG |
209962306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
210062306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
210162306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
210262306a36Sopenharmony_ci		adev->pg_flags = 0;
210362306a36Sopenharmony_ci		//???
210462306a36Sopenharmony_ci		adev->external_rev_id = adev->rev_id + 40;
210562306a36Sopenharmony_ci		break;
210662306a36Sopenharmony_ci	case CHIP_OLAND:
210762306a36Sopenharmony_ci		adev->cg_flags =
210862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
210962306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
211062306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
211162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
211262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
211362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
211462306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
211562306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
211662306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
211762306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
211862306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
211962306a36Sopenharmony_ci			AMD_CG_SUPPORT_UVD_MGCG |
212062306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
212162306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
212262306a36Sopenharmony_ci		adev->pg_flags = 0;
212362306a36Sopenharmony_ci		adev->external_rev_id = 60;
212462306a36Sopenharmony_ci		break;
212562306a36Sopenharmony_ci	case CHIP_HAINAN:
212662306a36Sopenharmony_ci		adev->cg_flags =
212762306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGCG |
212862306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_MGLS |
212962306a36Sopenharmony_ci			/*AMD_CG_SUPPORT_GFX_CGCG |*/
213062306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGLS |
213162306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CGTS |
213262306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_CP_LS |
213362306a36Sopenharmony_ci			AMD_CG_SUPPORT_GFX_RLC_LS |
213462306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_LS |
213562306a36Sopenharmony_ci			AMD_CG_SUPPORT_MC_MGCG |
213662306a36Sopenharmony_ci			AMD_CG_SUPPORT_SDMA_MGCG |
213762306a36Sopenharmony_ci			AMD_CG_SUPPORT_BIF_LS |
213862306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_LS |
213962306a36Sopenharmony_ci			AMD_CG_SUPPORT_HDP_MGCG;
214062306a36Sopenharmony_ci		adev->pg_flags = 0;
214162306a36Sopenharmony_ci		adev->external_rev_id = 70;
214262306a36Sopenharmony_ci		break;
214362306a36Sopenharmony_ci
214462306a36Sopenharmony_ci	default:
214562306a36Sopenharmony_ci		return -EINVAL;
214662306a36Sopenharmony_ci	}
214762306a36Sopenharmony_ci
214862306a36Sopenharmony_ci	return 0;
214962306a36Sopenharmony_ci}
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_cistatic int si_common_sw_init(void *handle)
215262306a36Sopenharmony_ci{
215362306a36Sopenharmony_ci	return 0;
215462306a36Sopenharmony_ci}
215562306a36Sopenharmony_ci
215662306a36Sopenharmony_cistatic int si_common_sw_fini(void *handle)
215762306a36Sopenharmony_ci{
215862306a36Sopenharmony_ci	return 0;
215962306a36Sopenharmony_ci}
216062306a36Sopenharmony_ci
216162306a36Sopenharmony_ci
216262306a36Sopenharmony_cistatic void si_init_golden_registers(struct amdgpu_device *adev)
216362306a36Sopenharmony_ci{
216462306a36Sopenharmony_ci	switch (adev->asic_type) {
216562306a36Sopenharmony_ci	case CHIP_TAHITI:
216662306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
216762306a36Sopenharmony_ci							tahiti_golden_registers,
216862306a36Sopenharmony_ci							ARRAY_SIZE(tahiti_golden_registers));
216962306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
217062306a36Sopenharmony_ci							tahiti_golden_rlc_registers,
217162306a36Sopenharmony_ci							ARRAY_SIZE(tahiti_golden_rlc_registers));
217262306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
217362306a36Sopenharmony_ci							tahiti_mgcg_cgcg_init,
217462306a36Sopenharmony_ci							ARRAY_SIZE(tahiti_mgcg_cgcg_init));
217562306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
217662306a36Sopenharmony_ci							tahiti_golden_registers2,
217762306a36Sopenharmony_ci							ARRAY_SIZE(tahiti_golden_registers2));
217862306a36Sopenharmony_ci		break;
217962306a36Sopenharmony_ci	case CHIP_PITCAIRN:
218062306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
218162306a36Sopenharmony_ci							pitcairn_golden_registers,
218262306a36Sopenharmony_ci							ARRAY_SIZE(pitcairn_golden_registers));
218362306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
218462306a36Sopenharmony_ci							pitcairn_golden_rlc_registers,
218562306a36Sopenharmony_ci							ARRAY_SIZE(pitcairn_golden_rlc_registers));
218662306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
218762306a36Sopenharmony_ci							pitcairn_mgcg_cgcg_init,
218862306a36Sopenharmony_ci							ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
218962306a36Sopenharmony_ci		break;
219062306a36Sopenharmony_ci	case CHIP_VERDE:
219162306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
219262306a36Sopenharmony_ci							verde_golden_registers,
219362306a36Sopenharmony_ci							ARRAY_SIZE(verde_golden_registers));
219462306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
219562306a36Sopenharmony_ci							verde_golden_rlc_registers,
219662306a36Sopenharmony_ci							ARRAY_SIZE(verde_golden_rlc_registers));
219762306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
219862306a36Sopenharmony_ci							verde_mgcg_cgcg_init,
219962306a36Sopenharmony_ci							ARRAY_SIZE(verde_mgcg_cgcg_init));
220062306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
220162306a36Sopenharmony_ci							verde_pg_init,
220262306a36Sopenharmony_ci							ARRAY_SIZE(verde_pg_init));
220362306a36Sopenharmony_ci		break;
220462306a36Sopenharmony_ci	case CHIP_OLAND:
220562306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
220662306a36Sopenharmony_ci							oland_golden_registers,
220762306a36Sopenharmony_ci							ARRAY_SIZE(oland_golden_registers));
220862306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
220962306a36Sopenharmony_ci							oland_golden_rlc_registers,
221062306a36Sopenharmony_ci							ARRAY_SIZE(oland_golden_rlc_registers));
221162306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
221262306a36Sopenharmony_ci							oland_mgcg_cgcg_init,
221362306a36Sopenharmony_ci							ARRAY_SIZE(oland_mgcg_cgcg_init));
221462306a36Sopenharmony_ci		break;
221562306a36Sopenharmony_ci	case CHIP_HAINAN:
221662306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
221762306a36Sopenharmony_ci							hainan_golden_registers,
221862306a36Sopenharmony_ci							ARRAY_SIZE(hainan_golden_registers));
221962306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
222062306a36Sopenharmony_ci							hainan_golden_registers2,
222162306a36Sopenharmony_ci							ARRAY_SIZE(hainan_golden_registers2));
222262306a36Sopenharmony_ci		amdgpu_device_program_register_sequence(adev,
222362306a36Sopenharmony_ci							hainan_mgcg_cgcg_init,
222462306a36Sopenharmony_ci							ARRAY_SIZE(hainan_mgcg_cgcg_init));
222562306a36Sopenharmony_ci		break;
222662306a36Sopenharmony_ci
222762306a36Sopenharmony_ci
222862306a36Sopenharmony_ci	default:
222962306a36Sopenharmony_ci		BUG();
223062306a36Sopenharmony_ci	}
223162306a36Sopenharmony_ci}
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_cistatic void si_pcie_gen3_enable(struct amdgpu_device *adev)
223462306a36Sopenharmony_ci{
223562306a36Sopenharmony_ci	struct pci_dev *root = adev->pdev->bus->self;
223662306a36Sopenharmony_ci	u32 speed_cntl, current_data_rate;
223762306a36Sopenharmony_ci	int i;
223862306a36Sopenharmony_ci	u16 tmp16;
223962306a36Sopenharmony_ci
224062306a36Sopenharmony_ci	if (pci_is_root_bus(adev->pdev->bus))
224162306a36Sopenharmony_ci		return;
224262306a36Sopenharmony_ci
224362306a36Sopenharmony_ci	if (amdgpu_pcie_gen2 == 0)
224462306a36Sopenharmony_ci		return;
224562306a36Sopenharmony_ci
224662306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
224762306a36Sopenharmony_ci		return;
224862306a36Sopenharmony_ci
224962306a36Sopenharmony_ci	if (!(adev->pm.pcie_gen_mask & (CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2 |
225062306a36Sopenharmony_ci					CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)))
225162306a36Sopenharmony_ci		return;
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_ci	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
225462306a36Sopenharmony_ci	current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
225562306a36Sopenharmony_ci		LC_CURRENT_DATA_RATE_SHIFT;
225662306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
225762306a36Sopenharmony_ci		if (current_data_rate == 2) {
225862306a36Sopenharmony_ci			DRM_INFO("PCIE gen 3 link speeds already enabled\n");
225962306a36Sopenharmony_ci			return;
226062306a36Sopenharmony_ci		}
226162306a36Sopenharmony_ci		DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
226262306a36Sopenharmony_ci	} else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2) {
226362306a36Sopenharmony_ci		if (current_data_rate == 1) {
226462306a36Sopenharmony_ci			DRM_INFO("PCIE gen 2 link speeds already enabled\n");
226562306a36Sopenharmony_ci			return;
226662306a36Sopenharmony_ci		}
226762306a36Sopenharmony_ci		DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
226862306a36Sopenharmony_ci	}
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_ci	if (!pci_is_pcie(root) || !pci_is_pcie(adev->pdev))
227162306a36Sopenharmony_ci		return;
227262306a36Sopenharmony_ci
227362306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3) {
227462306a36Sopenharmony_ci		if (current_data_rate != 2) {
227562306a36Sopenharmony_ci			u16 bridge_cfg, gpu_cfg;
227662306a36Sopenharmony_ci			u16 bridge_cfg2, gpu_cfg2;
227762306a36Sopenharmony_ci			u32 max_lw, current_lw, tmp;
227862306a36Sopenharmony_ci
227962306a36Sopenharmony_ci			pcie_capability_set_word(root, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
228062306a36Sopenharmony_ci			pcie_capability_set_word(adev->pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_HAWD);
228162306a36Sopenharmony_ci
228262306a36Sopenharmony_ci			tmp = RREG32_PCIE(PCIE_LC_STATUS1);
228362306a36Sopenharmony_ci			max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
228462306a36Sopenharmony_ci			current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
228562306a36Sopenharmony_ci
228662306a36Sopenharmony_ci			if (current_lw < max_lw) {
228762306a36Sopenharmony_ci				tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
228862306a36Sopenharmony_ci				if (tmp & LC_RENEGOTIATION_SUPPORT) {
228962306a36Sopenharmony_ci					tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
229062306a36Sopenharmony_ci					tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
229162306a36Sopenharmony_ci					tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
229262306a36Sopenharmony_ci					WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
229362306a36Sopenharmony_ci				}
229462306a36Sopenharmony_ci			}
229562306a36Sopenharmony_ci
229662306a36Sopenharmony_ci			for (i = 0; i < 10; i++) {
229762306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
229862306a36Sopenharmony_ci							  PCI_EXP_DEVSTA,
229962306a36Sopenharmony_ci							  &tmp16);
230062306a36Sopenharmony_ci				if (tmp16 & PCI_EXP_DEVSTA_TRPND)
230162306a36Sopenharmony_ci					break;
230262306a36Sopenharmony_ci
230362306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL,
230462306a36Sopenharmony_ci							  &bridge_cfg);
230562306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
230662306a36Sopenharmony_ci							  PCI_EXP_LNKCTL,
230762306a36Sopenharmony_ci							  &gpu_cfg);
230862306a36Sopenharmony_ci
230962306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
231062306a36Sopenharmony_ci							  &bridge_cfg2);
231162306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
231262306a36Sopenharmony_ci							  PCI_EXP_LNKCTL2,
231362306a36Sopenharmony_ci							  &gpu_cfg2);
231462306a36Sopenharmony_ci
231562306a36Sopenharmony_ci				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
231662306a36Sopenharmony_ci				tmp |= LC_SET_QUIESCE;
231762306a36Sopenharmony_ci				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
231862306a36Sopenharmony_ci
231962306a36Sopenharmony_ci				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
232062306a36Sopenharmony_ci				tmp |= LC_REDO_EQ;
232162306a36Sopenharmony_ci				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci				mdelay(100);
232462306a36Sopenharmony_ci
232562306a36Sopenharmony_ci				pcie_capability_clear_and_set_word(root, PCI_EXP_LNKCTL,
232662306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD,
232762306a36Sopenharmony_ci								   bridge_cfg &
232862306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD);
232962306a36Sopenharmony_ci				pcie_capability_clear_and_set_word(adev->pdev, PCI_EXP_LNKCTL,
233062306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD,
233162306a36Sopenharmony_ci								   gpu_cfg &
233262306a36Sopenharmony_ci								   PCI_EXP_LNKCTL_HAWD);
233362306a36Sopenharmony_ci
233462306a36Sopenharmony_ci				pcie_capability_read_word(root, PCI_EXP_LNKCTL2,
233562306a36Sopenharmony_ci							  &tmp16);
233662306a36Sopenharmony_ci				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
233762306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN);
233862306a36Sopenharmony_ci				tmp16 |= (bridge_cfg2 &
233962306a36Sopenharmony_ci					  (PCI_EXP_LNKCTL2_ENTER_COMP |
234062306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN));
234162306a36Sopenharmony_ci				pcie_capability_write_word(root,
234262306a36Sopenharmony_ci							   PCI_EXP_LNKCTL2,
234362306a36Sopenharmony_ci							   tmp16);
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_ci				pcie_capability_read_word(adev->pdev,
234662306a36Sopenharmony_ci							  PCI_EXP_LNKCTL2,
234762306a36Sopenharmony_ci							  &tmp16);
234862306a36Sopenharmony_ci				tmp16 &= ~(PCI_EXP_LNKCTL2_ENTER_COMP |
234962306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN);
235062306a36Sopenharmony_ci				tmp16 |= (gpu_cfg2 &
235162306a36Sopenharmony_ci					  (PCI_EXP_LNKCTL2_ENTER_COMP |
235262306a36Sopenharmony_ci					   PCI_EXP_LNKCTL2_TX_MARGIN));
235362306a36Sopenharmony_ci				pcie_capability_write_word(adev->pdev,
235462306a36Sopenharmony_ci							   PCI_EXP_LNKCTL2,
235562306a36Sopenharmony_ci							   tmp16);
235662306a36Sopenharmony_ci
235762306a36Sopenharmony_ci				tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
235862306a36Sopenharmony_ci				tmp &= ~LC_SET_QUIESCE;
235962306a36Sopenharmony_ci				WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
236062306a36Sopenharmony_ci			}
236162306a36Sopenharmony_ci		}
236262306a36Sopenharmony_ci	}
236362306a36Sopenharmony_ci
236462306a36Sopenharmony_ci	speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
236562306a36Sopenharmony_ci	speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
236662306a36Sopenharmony_ci	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
236762306a36Sopenharmony_ci
236862306a36Sopenharmony_ci	pcie_capability_read_word(adev->pdev, PCI_EXP_LNKCTL2, &tmp16);
236962306a36Sopenharmony_ci	tmp16 &= ~PCI_EXP_LNKCTL2_TLS;
237062306a36Sopenharmony_ci
237162306a36Sopenharmony_ci	if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
237262306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_8_0GT; /* gen3 */
237362306a36Sopenharmony_ci	else if (adev->pm.pcie_gen_mask & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN2)
237462306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_5_0GT; /* gen2 */
237562306a36Sopenharmony_ci	else
237662306a36Sopenharmony_ci		tmp16 |= PCI_EXP_LNKCTL2_TLS_2_5GT; /* gen1 */
237762306a36Sopenharmony_ci	pcie_capability_write_word(adev->pdev, PCI_EXP_LNKCTL2, tmp16);
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
238062306a36Sopenharmony_ci	speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
238162306a36Sopenharmony_ci	WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
238262306a36Sopenharmony_ci
238362306a36Sopenharmony_ci	for (i = 0; i < adev->usec_timeout; i++) {
238462306a36Sopenharmony_ci		speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
238562306a36Sopenharmony_ci		if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
238662306a36Sopenharmony_ci			break;
238762306a36Sopenharmony_ci		udelay(1);
238862306a36Sopenharmony_ci	}
238962306a36Sopenharmony_ci}
239062306a36Sopenharmony_ci
239162306a36Sopenharmony_cistatic inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
239262306a36Sopenharmony_ci{
239362306a36Sopenharmony_ci	unsigned long flags;
239462306a36Sopenharmony_ci	u32 r;
239562306a36Sopenharmony_ci
239662306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
239762306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
239862306a36Sopenharmony_ci	r = RREG32(EVERGREEN_PIF_PHY0_DATA);
239962306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
240062306a36Sopenharmony_ci	return r;
240162306a36Sopenharmony_ci}
240262306a36Sopenharmony_ci
240362306a36Sopenharmony_cistatic inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
240462306a36Sopenharmony_ci{
240562306a36Sopenharmony_ci	unsigned long flags;
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
240862306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
240962306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
241062306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
241162306a36Sopenharmony_ci}
241262306a36Sopenharmony_ci
241362306a36Sopenharmony_cistatic inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
241462306a36Sopenharmony_ci{
241562306a36Sopenharmony_ci	unsigned long flags;
241662306a36Sopenharmony_ci	u32 r;
241762306a36Sopenharmony_ci
241862306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
241962306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
242062306a36Sopenharmony_ci	r = RREG32(EVERGREEN_PIF_PHY1_DATA);
242162306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
242262306a36Sopenharmony_ci	return r;
242362306a36Sopenharmony_ci}
242462306a36Sopenharmony_ci
242562306a36Sopenharmony_cistatic inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
242662306a36Sopenharmony_ci{
242762306a36Sopenharmony_ci	unsigned long flags;
242862306a36Sopenharmony_ci
242962306a36Sopenharmony_ci	spin_lock_irqsave(&adev->pcie_idx_lock, flags);
243062306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
243162306a36Sopenharmony_ci	WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
243262306a36Sopenharmony_ci	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
243362306a36Sopenharmony_ci}
243462306a36Sopenharmony_cistatic void si_program_aspm(struct amdgpu_device *adev)
243562306a36Sopenharmony_ci{
243662306a36Sopenharmony_ci	u32 data, orig;
243762306a36Sopenharmony_ci	bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
243862306a36Sopenharmony_ci	bool disable_clkreq = false;
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_ci	if (!amdgpu_device_should_use_aspm(adev))
244162306a36Sopenharmony_ci		return;
244262306a36Sopenharmony_ci
244362306a36Sopenharmony_ci	if (adev->flags & AMD_IS_APU)
244462306a36Sopenharmony_ci		return;
244562306a36Sopenharmony_ci	orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
244662306a36Sopenharmony_ci	data &= ~LC_XMIT_N_FTS_MASK;
244762306a36Sopenharmony_ci	data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
244862306a36Sopenharmony_ci	if (orig != data)
244962306a36Sopenharmony_ci		WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
245062306a36Sopenharmony_ci
245162306a36Sopenharmony_ci	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
245262306a36Sopenharmony_ci	data |= LC_GO_TO_RECOVERY;
245362306a36Sopenharmony_ci	if (orig != data)
245462306a36Sopenharmony_ci		WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
245562306a36Sopenharmony_ci
245662306a36Sopenharmony_ci	orig = data = RREG32_PCIE(PCIE_P_CNTL);
245762306a36Sopenharmony_ci	data |= P_IGNORE_EDB_ERR;
245862306a36Sopenharmony_ci	if (orig != data)
245962306a36Sopenharmony_ci		WREG32_PCIE(PCIE_P_CNTL, data);
246062306a36Sopenharmony_ci
246162306a36Sopenharmony_ci	orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
246262306a36Sopenharmony_ci	data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
246362306a36Sopenharmony_ci	data |= LC_PMI_TO_L1_DIS;
246462306a36Sopenharmony_ci	if (!disable_l0s)
246562306a36Sopenharmony_ci		data |= LC_L0S_INACTIVITY(7);
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci	if (!disable_l1) {
246862306a36Sopenharmony_ci		data |= LC_L1_INACTIVITY(7);
246962306a36Sopenharmony_ci		data &= ~LC_PMI_TO_L1_DIS;
247062306a36Sopenharmony_ci		if (orig != data)
247162306a36Sopenharmony_ci			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
247262306a36Sopenharmony_ci
247362306a36Sopenharmony_ci		if (!disable_plloff_in_l1) {
247462306a36Sopenharmony_ci			bool clk_req_support;
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_ci			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
247762306a36Sopenharmony_ci			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
247862306a36Sopenharmony_ci			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
247962306a36Sopenharmony_ci			if (orig != data)
248062306a36Sopenharmony_ci				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
248162306a36Sopenharmony_ci
248262306a36Sopenharmony_ci			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
248362306a36Sopenharmony_ci			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
248462306a36Sopenharmony_ci			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
248562306a36Sopenharmony_ci			if (orig != data)
248662306a36Sopenharmony_ci				si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_ci			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
248962306a36Sopenharmony_ci			data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
249062306a36Sopenharmony_ci			data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
249162306a36Sopenharmony_ci			if (orig != data)
249262306a36Sopenharmony_ci				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
249362306a36Sopenharmony_ci
249462306a36Sopenharmony_ci			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
249562306a36Sopenharmony_ci			data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
249662306a36Sopenharmony_ci			data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
249762306a36Sopenharmony_ci			if (orig != data)
249862306a36Sopenharmony_ci				si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
249962306a36Sopenharmony_ci
250062306a36Sopenharmony_ci			if ((adev->asic_type != CHIP_OLAND) && (adev->asic_type != CHIP_HAINAN)) {
250162306a36Sopenharmony_ci				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
250262306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_0_MASK;
250362306a36Sopenharmony_ci				if (orig != data)
250462306a36Sopenharmony_ci					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_ci				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
250762306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_1_MASK;
250862306a36Sopenharmony_ci				if (orig != data)
250962306a36Sopenharmony_ci					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
251062306a36Sopenharmony_ci
251162306a36Sopenharmony_ci				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
251262306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_2_MASK;
251362306a36Sopenharmony_ci				if (orig != data)
251462306a36Sopenharmony_ci					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
251562306a36Sopenharmony_ci
251662306a36Sopenharmony_ci				orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
251762306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_3_MASK;
251862306a36Sopenharmony_ci				if (orig != data)
251962306a36Sopenharmony_ci					si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
252062306a36Sopenharmony_ci
252162306a36Sopenharmony_ci				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
252262306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_0_MASK;
252362306a36Sopenharmony_ci				if (orig != data)
252462306a36Sopenharmony_ci					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
252562306a36Sopenharmony_ci
252662306a36Sopenharmony_ci				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
252762306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_1_MASK;
252862306a36Sopenharmony_ci				if (orig != data)
252962306a36Sopenharmony_ci					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
253062306a36Sopenharmony_ci
253162306a36Sopenharmony_ci				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
253262306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_2_MASK;
253362306a36Sopenharmony_ci				if (orig != data)
253462306a36Sopenharmony_ci					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_ci				orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
253762306a36Sopenharmony_ci				data &= ~PLL_RAMP_UP_TIME_3_MASK;
253862306a36Sopenharmony_ci				if (orig != data)
253962306a36Sopenharmony_ci					si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
254062306a36Sopenharmony_ci			}
254162306a36Sopenharmony_ci			orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
254262306a36Sopenharmony_ci			data &= ~LC_DYN_LANES_PWR_STATE_MASK;
254362306a36Sopenharmony_ci			data |= LC_DYN_LANES_PWR_STATE(3);
254462306a36Sopenharmony_ci			if (orig != data)
254562306a36Sopenharmony_ci				WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
254662306a36Sopenharmony_ci
254762306a36Sopenharmony_ci			orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
254862306a36Sopenharmony_ci			data &= ~LS2_EXIT_TIME_MASK;
254962306a36Sopenharmony_ci			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
255062306a36Sopenharmony_ci				data |= LS2_EXIT_TIME(5);
255162306a36Sopenharmony_ci			if (orig != data)
255262306a36Sopenharmony_ci				si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_ci			orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
255562306a36Sopenharmony_ci			data &= ~LS2_EXIT_TIME_MASK;
255662306a36Sopenharmony_ci			if ((adev->asic_type == CHIP_OLAND) || (adev->asic_type == CHIP_HAINAN))
255762306a36Sopenharmony_ci				data |= LS2_EXIT_TIME(5);
255862306a36Sopenharmony_ci			if (orig != data)
255962306a36Sopenharmony_ci				si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
256062306a36Sopenharmony_ci
256162306a36Sopenharmony_ci			if (!disable_clkreq &&
256262306a36Sopenharmony_ci			    !pci_is_root_bus(adev->pdev->bus)) {
256362306a36Sopenharmony_ci				struct pci_dev *root = adev->pdev->bus->self;
256462306a36Sopenharmony_ci				u32 lnkcap;
256562306a36Sopenharmony_ci
256662306a36Sopenharmony_ci				clk_req_support = false;
256762306a36Sopenharmony_ci				pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
256862306a36Sopenharmony_ci				if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
256962306a36Sopenharmony_ci					clk_req_support = true;
257062306a36Sopenharmony_ci			} else {
257162306a36Sopenharmony_ci				clk_req_support = false;
257262306a36Sopenharmony_ci			}
257362306a36Sopenharmony_ci
257462306a36Sopenharmony_ci			if (clk_req_support) {
257562306a36Sopenharmony_ci				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
257662306a36Sopenharmony_ci				data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
257762306a36Sopenharmony_ci				if (orig != data)
257862306a36Sopenharmony_ci					WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci				orig = data = RREG32(THM_CLK_CNTL);
258162306a36Sopenharmony_ci				data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
258262306a36Sopenharmony_ci				data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
258362306a36Sopenharmony_ci				if (orig != data)
258462306a36Sopenharmony_ci					WREG32(THM_CLK_CNTL, data);
258562306a36Sopenharmony_ci
258662306a36Sopenharmony_ci				orig = data = RREG32(MISC_CLK_CNTL);
258762306a36Sopenharmony_ci				data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
258862306a36Sopenharmony_ci				data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
258962306a36Sopenharmony_ci				if (orig != data)
259062306a36Sopenharmony_ci					WREG32(MISC_CLK_CNTL, data);
259162306a36Sopenharmony_ci
259262306a36Sopenharmony_ci				orig = data = RREG32(CG_CLKPIN_CNTL);
259362306a36Sopenharmony_ci				data &= ~BCLK_AS_XCLK;
259462306a36Sopenharmony_ci				if (orig != data)
259562306a36Sopenharmony_ci					WREG32(CG_CLKPIN_CNTL, data);
259662306a36Sopenharmony_ci
259762306a36Sopenharmony_ci				orig = data = RREG32(CG_CLKPIN_CNTL_2);
259862306a36Sopenharmony_ci				data &= ~FORCE_BIF_REFCLK_EN;
259962306a36Sopenharmony_ci				if (orig != data)
260062306a36Sopenharmony_ci					WREG32(CG_CLKPIN_CNTL_2, data);
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci				orig = data = RREG32(MPLL_BYPASSCLK_SEL);
260362306a36Sopenharmony_ci				data &= ~MPLL_CLKOUT_SEL_MASK;
260462306a36Sopenharmony_ci				data |= MPLL_CLKOUT_SEL(4);
260562306a36Sopenharmony_ci				if (orig != data)
260662306a36Sopenharmony_ci					WREG32(MPLL_BYPASSCLK_SEL, data);
260762306a36Sopenharmony_ci
260862306a36Sopenharmony_ci				orig = data = RREG32(SPLL_CNTL_MODE);
260962306a36Sopenharmony_ci				data &= ~SPLL_REFCLK_SEL_MASK;
261062306a36Sopenharmony_ci				if (orig != data)
261162306a36Sopenharmony_ci					WREG32(SPLL_CNTL_MODE, data);
261262306a36Sopenharmony_ci			}
261362306a36Sopenharmony_ci		}
261462306a36Sopenharmony_ci	} else {
261562306a36Sopenharmony_ci		if (orig != data)
261662306a36Sopenharmony_ci			WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
261762306a36Sopenharmony_ci	}
261862306a36Sopenharmony_ci
261962306a36Sopenharmony_ci	orig = data = RREG32_PCIE(PCIE_CNTL2);
262062306a36Sopenharmony_ci	data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
262162306a36Sopenharmony_ci	if (orig != data)
262262306a36Sopenharmony_ci		WREG32_PCIE(PCIE_CNTL2, data);
262362306a36Sopenharmony_ci
262462306a36Sopenharmony_ci	if (!disable_l0s) {
262562306a36Sopenharmony_ci		data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
262662306a36Sopenharmony_ci		if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
262762306a36Sopenharmony_ci			data = RREG32_PCIE(PCIE_LC_STATUS1);
262862306a36Sopenharmony_ci			if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
262962306a36Sopenharmony_ci				orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
263062306a36Sopenharmony_ci				data &= ~LC_L0S_INACTIVITY_MASK;
263162306a36Sopenharmony_ci				if (orig != data)
263262306a36Sopenharmony_ci					WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
263362306a36Sopenharmony_ci			}
263462306a36Sopenharmony_ci		}
263562306a36Sopenharmony_ci	}
263662306a36Sopenharmony_ci}
263762306a36Sopenharmony_ci
263862306a36Sopenharmony_cistatic void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
263962306a36Sopenharmony_ci{
264062306a36Sopenharmony_ci	int readrq;
264162306a36Sopenharmony_ci	u16 v;
264262306a36Sopenharmony_ci
264362306a36Sopenharmony_ci	readrq = pcie_get_readrq(adev->pdev);
264462306a36Sopenharmony_ci	v = ffs(readrq) - 8;
264562306a36Sopenharmony_ci	if ((v == 0) || (v == 6) || (v == 7))
264662306a36Sopenharmony_ci		pcie_set_readrq(adev->pdev, 512);
264762306a36Sopenharmony_ci}
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_cistatic int si_common_hw_init(void *handle)
265062306a36Sopenharmony_ci{
265162306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_ci	si_fix_pci_max_read_req_size(adev);
265462306a36Sopenharmony_ci	si_init_golden_registers(adev);
265562306a36Sopenharmony_ci	si_pcie_gen3_enable(adev);
265662306a36Sopenharmony_ci	si_program_aspm(adev);
265762306a36Sopenharmony_ci
265862306a36Sopenharmony_ci	return 0;
265962306a36Sopenharmony_ci}
266062306a36Sopenharmony_ci
266162306a36Sopenharmony_cistatic int si_common_hw_fini(void *handle)
266262306a36Sopenharmony_ci{
266362306a36Sopenharmony_ci	return 0;
266462306a36Sopenharmony_ci}
266562306a36Sopenharmony_ci
266662306a36Sopenharmony_cistatic int si_common_suspend(void *handle)
266762306a36Sopenharmony_ci{
266862306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
266962306a36Sopenharmony_ci
267062306a36Sopenharmony_ci	return si_common_hw_fini(adev);
267162306a36Sopenharmony_ci}
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_cistatic int si_common_resume(void *handle)
267462306a36Sopenharmony_ci{
267562306a36Sopenharmony_ci	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
267662306a36Sopenharmony_ci
267762306a36Sopenharmony_ci	return si_common_hw_init(adev);
267862306a36Sopenharmony_ci}
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_cistatic bool si_common_is_idle(void *handle)
268162306a36Sopenharmony_ci{
268262306a36Sopenharmony_ci	return true;
268362306a36Sopenharmony_ci}
268462306a36Sopenharmony_ci
268562306a36Sopenharmony_cistatic int si_common_wait_for_idle(void *handle)
268662306a36Sopenharmony_ci{
268762306a36Sopenharmony_ci	return 0;
268862306a36Sopenharmony_ci}
268962306a36Sopenharmony_ci
269062306a36Sopenharmony_cistatic int si_common_soft_reset(void *handle)
269162306a36Sopenharmony_ci{
269262306a36Sopenharmony_ci	return 0;
269362306a36Sopenharmony_ci}
269462306a36Sopenharmony_ci
269562306a36Sopenharmony_cistatic int si_common_set_clockgating_state(void *handle,
269662306a36Sopenharmony_ci					    enum amd_clockgating_state state)
269762306a36Sopenharmony_ci{
269862306a36Sopenharmony_ci	return 0;
269962306a36Sopenharmony_ci}
270062306a36Sopenharmony_ci
270162306a36Sopenharmony_cistatic int si_common_set_powergating_state(void *handle,
270262306a36Sopenharmony_ci					    enum amd_powergating_state state)
270362306a36Sopenharmony_ci{
270462306a36Sopenharmony_ci	return 0;
270562306a36Sopenharmony_ci}
270662306a36Sopenharmony_ci
270762306a36Sopenharmony_cistatic const struct amd_ip_funcs si_common_ip_funcs = {
270862306a36Sopenharmony_ci	.name = "si_common",
270962306a36Sopenharmony_ci	.early_init = si_common_early_init,
271062306a36Sopenharmony_ci	.late_init = NULL,
271162306a36Sopenharmony_ci	.sw_init = si_common_sw_init,
271262306a36Sopenharmony_ci	.sw_fini = si_common_sw_fini,
271362306a36Sopenharmony_ci	.hw_init = si_common_hw_init,
271462306a36Sopenharmony_ci	.hw_fini = si_common_hw_fini,
271562306a36Sopenharmony_ci	.suspend = si_common_suspend,
271662306a36Sopenharmony_ci	.resume = si_common_resume,
271762306a36Sopenharmony_ci	.is_idle = si_common_is_idle,
271862306a36Sopenharmony_ci	.wait_for_idle = si_common_wait_for_idle,
271962306a36Sopenharmony_ci	.soft_reset = si_common_soft_reset,
272062306a36Sopenharmony_ci	.set_clockgating_state = si_common_set_clockgating_state,
272162306a36Sopenharmony_ci	.set_powergating_state = si_common_set_powergating_state,
272262306a36Sopenharmony_ci};
272362306a36Sopenharmony_ci
272462306a36Sopenharmony_cistatic const struct amdgpu_ip_block_version si_common_ip_block =
272562306a36Sopenharmony_ci{
272662306a36Sopenharmony_ci	.type = AMD_IP_BLOCK_TYPE_COMMON,
272762306a36Sopenharmony_ci	.major = 1,
272862306a36Sopenharmony_ci	.minor = 0,
272962306a36Sopenharmony_ci	.rev = 0,
273062306a36Sopenharmony_ci	.funcs = &si_common_ip_funcs,
273162306a36Sopenharmony_ci};
273262306a36Sopenharmony_ci
273362306a36Sopenharmony_ciint si_set_ip_blocks(struct amdgpu_device *adev)
273462306a36Sopenharmony_ci{
273562306a36Sopenharmony_ci	switch (adev->asic_type) {
273662306a36Sopenharmony_ci	case CHIP_VERDE:
273762306a36Sopenharmony_ci	case CHIP_TAHITI:
273862306a36Sopenharmony_ci	case CHIP_PITCAIRN:
273962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
274062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
274162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
274262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
274362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
274462306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
274562306a36Sopenharmony_ci		if (adev->enable_virtual_display)
274662306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
274762306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
274862306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
274962306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
275062306a36Sopenharmony_ci#endif
275162306a36Sopenharmony_ci		else
275262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
275362306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
275462306a36Sopenharmony_ci		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
275562306a36Sopenharmony_ci		break;
275662306a36Sopenharmony_ci	case CHIP_OLAND:
275762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
275862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
275962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
276062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
276162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
276262306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
276362306a36Sopenharmony_ci		if (adev->enable_virtual_display)
276462306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
276562306a36Sopenharmony_ci#if defined(CONFIG_DRM_AMD_DC) && defined(CONFIG_DRM_AMD_DC_SI)
276662306a36Sopenharmony_ci		else if (amdgpu_device_has_dc_support(adev))
276762306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dm_ip_block);
276862306a36Sopenharmony_ci#endif
276962306a36Sopenharmony_ci		else
277062306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
277162306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block);
277262306a36Sopenharmony_ci		/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
277362306a36Sopenharmony_ci		break;
277462306a36Sopenharmony_ci	case CHIP_HAINAN:
277562306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_common_ip_block);
277662306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
277762306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
277862306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
277962306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
278062306a36Sopenharmony_ci		amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
278162306a36Sopenharmony_ci		if (adev->enable_virtual_display)
278262306a36Sopenharmony_ci			amdgpu_device_ip_block_add(adev, &amdgpu_vkms_ip_block);
278362306a36Sopenharmony_ci		break;
278462306a36Sopenharmony_ci	default:
278562306a36Sopenharmony_ci		BUG();
278662306a36Sopenharmony_ci	}
278762306a36Sopenharmony_ci	return 0;
278862306a36Sopenharmony_ci}
278962306a36Sopenharmony_ci
2790