2017-03-09 11:36:26 -05:00
/*
* Copyright 2016 Advanced Micro Devices , Inc .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE .
*
*/
# include "amdgpu.h"
# include "mmhub_v1_0.h"
2017-11-23 14:30:43 +08:00
# include "mmhub/mmhub_1_0_offset.h"
# include "mmhub/mmhub_1_0_sh_mask.h"
# include "mmhub/mmhub_1_0_default.h"
2017-11-16 17:50:10 +08:00
# include "athub/athub_1_0_offset.h"
# include "athub/athub_1_0_sh_mask.h"
2017-11-24 12:31:36 +08:00
# include "vega10_enum.h"
2017-03-09 11:36:26 -05:00
# include "soc15_common.h"
2017-02-08 17:07:59 +08:00
# define mmDAGB0_CNTL_MISC2_RV 0x008f
# define mmDAGB0_CNTL_MISC2_RV_BASE_IDX 0
2017-03-09 11:36:26 -05:00
u64 mmhub_v1_0_get_fb_location ( struct amdgpu_device * adev )
{
2017-06-01 15:30:04 +08:00
u64 base = RREG32_SOC15 ( MMHUB , 0 , mmMC_VM_FB_LOCATION_BASE ) ;
2017-03-09 11:36:26 -05:00
base & = MC_VM_FB_LOCATION_BASE__FB_BASE_MASK ;
base < < = 24 ;
return base ;
}
2017-05-31 16:20:48 +08:00
static void mmhub_v1_0_init_gart_pt_regs ( struct amdgpu_device * adev )
{
uint64_t value ;
BUG_ON ( adev - > gart . table_addr & ( ~ 0x0000FFFFFFFFF000ULL ) ) ;
2018-01-12 14:52:22 +01:00
value = adev - > gart . table_addr - adev - > gmc . vram_start +
2017-05-31 16:20:48 +08:00
adev - > vm_manager . vram_base_offset ;
value & = 0x0000FFFFFFFFF000ULL ;
value | = 0x1 ; /* valid bit */
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 ,
lower_32_bits ( value ) ) ;
2017-05-31 16:20:48 +08:00
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 ,
upper_32_bits ( value ) ) ;
2017-05-31 16:20:48 +08:00
}
2017-05-31 16:40:14 +08:00
static void mmhub_v1_0_init_gart_aperture_regs ( struct amdgpu_device * adev )
{
mmhub_v1_0_init_gart_pt_regs ( adev ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32 ,
2018-01-12 14:52:22 +01:00
( u32 ) ( adev - > gmc . gart_start > > 12 ) ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32 ,
2018-01-12 14:52:22 +01:00
( u32 ) ( adev - > gmc . gart_start > > 44 ) ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32 ,
2018-01-12 14:52:22 +01:00
( u32 ) ( adev - > gmc . gart_end > > 12 ) ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32 ,
2018-01-12 14:52:22 +01:00
( u32 ) ( adev - > gmc . gart_end > > 44 ) ) ;
2017-05-31 16:40:14 +08:00
}
2017-05-31 17:04:28 +08:00
static void mmhub_v1_0_init_system_aperture_regs ( struct amdgpu_device * adev )
2017-03-09 11:36:26 -05:00
{
2017-05-31 17:04:28 +08:00
uint64_t value ;
uint32_t tmp ;
2017-03-09 11:36:26 -05:00
2017-05-31 17:04:28 +08:00
/* Disable AGP. */
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_AGP_BASE , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_AGP_TOP , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_AGP_BOT , 0x00FFFFFF ) ;
2017-05-31 16:20:48 +08:00
2017-05-31 17:04:28 +08:00
/* Program the system aperture low logical page number. */
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_SYSTEM_APERTURE_LOW_ADDR ,
2018-01-12 14:52:22 +01:00
adev - > gmc . vram_start > > 18 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR ,
2018-01-12 14:52:22 +01:00
adev - > gmc . vram_end > > 18 ) ;
2017-05-31 17:04:28 +08:00
/* Set default page address. */
2018-01-12 14:52:22 +01:00
value = adev - > vram_scratch . gpu_addr - adev - > gmc . vram_start +
2017-03-09 11:36:26 -05:00
adev - > vm_manager . vram_base_offset ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB ,
( u32 ) ( value > > 12 ) ) ;
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB ,
( u32 ) ( value > > 44 ) ) ;
2017-05-31 17:04:28 +08:00
/* Program "protection fault". */
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32 ,
2018-02-22 08:35:11 +01:00
( u32 ) ( adev - > dummy_page_addr > > 12 ) ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32 ,
2018-02-22 08:35:11 +01:00
( u32 ) ( ( u64 ) adev - > dummy_page_addr > > 44 ) ) ;
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_CNTL2 ) ;
2017-05-31 17:04:28 +08:00
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL2 ,
ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY , 1 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_CNTL2 , tmp ) ;
2017-05-31 17:04:28 +08:00
}
2017-05-31 17:19:01 +08:00
static void mmhub_v1_0_init_tlb_regs ( struct amdgpu_device * adev )
{
uint32_t tmp ;
/* Setup TLB control */
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmMC_VM_MX_L1_TLB_CNTL ) ;
2017-05-31 17:19:01 +08:00
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL , ENABLE_L1_TLB , 1 ) ;
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL , SYSTEM_ACCESS_MODE , 3 ) ;
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL ,
ENABLE_ADVANCED_DRIVER_MODEL , 1 ) ;
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL ,
SYSTEM_APERTURE_UNMAPPED_ACCESS , 0 ) ;
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL , ECO_BITS , 0 ) ;
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL ,
MTYPE , MTYPE_UC ) ; /* XXX for emulation. */
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL , ATC_EN , 1 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_MX_L1_TLB_CNTL , tmp ) ;
2017-05-31 17:19:01 +08:00
}
2017-05-31 18:07:48 +08:00
static void mmhub_v1_0_init_cache_regs ( struct amdgpu_device * adev )
{
2017-08-24 14:57:57 +08:00
uint32_t tmp ;
2017-05-31 18:07:48 +08:00
/* Setup L2 cache */
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL ) ;
2017-05-31 18:07:48 +08:00
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , ENABLE_L2_CACHE , 1 ) ;
2017-05-23 18:35:22 +02:00
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , ENABLE_L2_FRAGMENT_PROCESSING , 1 ) ;
2017-05-31 18:07:48 +08:00
/* XXX for emulation, Refer to closed source code.*/
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , L2_PDE0_CACHE_TAG_GENERATION_MODE ,
0 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , PDE_FAULT_CLASSIFICATION , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , CONTEXT1_IDENTITY_ACCESS_MODE , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , IDENTITY_MODE_FRAGMENT_SIZE , 0 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL , tmp ) ;
2017-05-31 18:07:48 +08:00
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL2 ) ;
2017-05-31 18:07:48 +08:00
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL2 , INVALIDATE_ALL_L1_TLBS , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL2 , INVALIDATE_L2_CACHE , 1 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL2 , tmp ) ;
2017-05-31 18:07:48 +08:00
2018-01-12 14:52:22 +01:00
if ( adev - > gmc . translate_further ) {
2017-12-05 15:23:26 +01:00
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL3 , BANK_SELECT , 12 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL3 ,
L2_CACHE_BIGK_FRAGMENT_SIZE , 9 ) ;
} else {
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL3 , BANK_SELECT , 9 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL3 ,
L2_CACHE_BIGK_FRAGMENT_SIZE , 6 ) ;
}
2017-05-31 18:07:48 +08:00
tmp = mmVM_L2_CNTL4_DEFAULT ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL4 , VMC_TAP_PDE_REQUEST_PHYSICAL , 0 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL4 , VMC_TAP_PTE_REQUEST_PHYSICAL , 0 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL4 , tmp ) ;
2017-05-31 18:07:48 +08:00
}
2017-05-31 21:39:10 +08:00
static void mmhub_v1_0_enable_system_domain ( struct amdgpu_device * adev )
{
uint32_t tmp ;
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_CNTL ) ;
2017-05-31 21:39:10 +08:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT0_CNTL , ENABLE_CONTEXT , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT0_CNTL , PAGE_TABLE_DEPTH , 0 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_CONTEXT0_CNTL , tmp ) ;
2017-05-31 21:39:10 +08:00
}
2017-05-31 21:52:00 +08:00
static void mmhub_v1_0_disable_identity_aperture ( struct amdgpu_device * adev )
{
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32 ,
0 XFFFFFFFF ) ;
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32 ,
0x0000000F ) ;
WREG32_SOC15 ( MMHUB , 0 ,
mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32 , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 ,
mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32 , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32 ,
0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32 ,
0 ) ;
2017-05-31 21:52:00 +08:00
}
2017-05-31 22:17:11 +08:00
static void mmhub_v1_0_setup_vmid_config ( struct amdgpu_device * adev )
2017-05-31 17:04:28 +08:00
{
2017-12-05 15:23:26 +01:00
unsigned num_level , block_size ;
2017-05-31 22:17:11 +08:00
uint32_t tmp ;
2017-12-05 15:23:26 +01:00
int i ;
num_level = adev - > vm_manager . num_level ;
block_size = adev - > vm_manager . block_size ;
2018-01-12 14:52:22 +01:00
if ( adev - > gmc . translate_further )
2017-12-05 15:23:26 +01:00
num_level - = 1 ;
else
block_size - = 9 ;
2017-03-09 11:36:26 -05:00
for ( i = 0 ; i < = 14 ; i + + ) {
2017-06-12 12:34:28 -04:00
tmp = RREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_CNTL , i ) ;
2017-12-05 15:23:26 +01:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL , ENABLE_CONTEXT , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL , PAGE_TABLE_DEPTH ,
num_level ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT ,
1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
VALID_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
READ_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT , 1 ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
2017-12-05 15:23:26 +01:00
PAGE_TABLE_BLOCK_SIZE ,
block_size ) ;
2017-04-26 14:51:57 -05:00
/* Send no-retry XNACK on fault to suppress VM fault storm. */
tmp = REG_SET_FIELD ( tmp , VM_CONTEXT1_CNTL ,
RETRY_PERMISSION_OR_INVALID_PAGE_FAULT , 0 ) ;
2017-06-12 12:34:28 -04:00
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_CNTL , i , tmp ) ;
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32 , i * 2 , 0 ) ;
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32 , i * 2 , 0 ) ;
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32 , i * 2 ,
2017-03-28 20:24:53 -04:00
lower_32_bits ( adev - > vm_manager . max_pfn - 1 ) ) ;
2017-06-12 12:34:28 -04:00
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32 , i * 2 ,
2017-03-28 20:24:53 -04:00
upper_32_bits ( adev - > vm_manager . max_pfn - 1 ) ) ;
2017-03-09 11:36:26 -05:00
}
2017-05-31 22:17:11 +08:00
}
2017-05-31 22:32:35 +08:00
static void mmhub_v1_0_program_invalidation ( struct amdgpu_device * adev )
{
unsigned i ;
for ( i = 0 ; i < 18 ; + + i ) {
2017-06-12 12:34:28 -04:00
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_INVALIDATE_ENG0_ADDR_RANGE_LO32 ,
2 * i , 0xffffffff ) ;
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_INVALIDATE_ENG0_ADDR_RANGE_HI32 ,
2 * i , 0x1f ) ;
2017-05-31 22:32:35 +08:00
}
}
2017-06-19 14:19:07 +08:00
struct pctl_data {
2017-06-29 18:27:38 +08:00
uint32_t index ;
uint32_t data ;
2017-06-19 14:19:07 +08:00
} ;
2017-07-06 10:15:46 -04:00
static const struct pctl_data pctl0_data [ ] = {
2017-06-29 18:27:38 +08:00
{ 0x0 , 0x7a640 } ,
{ 0x9 , 0x2a64a } ,
{ 0xd , 0x2a680 } ,
{ 0x11 , 0x6a684 } ,
{ 0x19 , 0xea68e } ,
{ 0x29 , 0xa69e } ,
2017-12-21 16:19:03 -05:00
{ 0x2b , 0x0010a6c0 } ,
{ 0x3d , 0x83a707 } ,
{ 0xc2 , 0x8a7a4 } ,
{ 0xcc , 0x1a7b8 } ,
{ 0xcf , 0xfa7cc } ,
{ 0xe0 , 0x17a7dd } ,
{ 0xf9 , 0xa7dc } ,
{ 0xfb , 0x12a7f5 } ,
{ 0x10f , 0xa808 } ,
{ 0x111 , 0x12a810 } ,
{ 0x125 , 0x7a82c }
2017-06-19 14:19:07 +08:00
} ;
2017-09-13 13:31:09 +05:30
# define PCTL0_DATA_LEN (ARRAY_SIZE(pctl0_data))
2017-06-19 14:19:07 +08:00
2017-12-21 16:19:03 -05:00
# define PCTL0_RENG_EXEC_END_PTR 0x12d
2017-06-19 14:19:07 +08:00
# define PCTL0_STCTRL_REG_SAVE_RANGE0_BASE 0xa640
# define PCTL0_STCTRL_REG_SAVE_RANGE0_LIMIT 0xa833
2017-07-06 10:15:46 -04:00
static const struct pctl_data pctl1_data [ ] = {
2017-06-29 18:27:38 +08:00
{ 0x0 , 0x39a000 } ,
{ 0x3b , 0x44a040 } ,
{ 0x81 , 0x2a08d } ,
{ 0x85 , 0x6ba094 } ,
{ 0xf2 , 0x18a100 } ,
{ 0x10c , 0x4a132 } ,
{ 0x112 , 0xca141 } ,
{ 0x120 , 0x2fa158 } ,
{ 0x151 , 0x17a1d0 } ,
{ 0x16a , 0x1a1e9 } ,
{ 0x16d , 0x13a1ec } ,
{ 0x182 , 0x7a201 } ,
{ 0x18b , 0x3a20a } ,
{ 0x190 , 0x7a580 } ,
{ 0x199 , 0xa590 } ,
{ 0x19b , 0x4a594 } ,
{ 0x1a1 , 0x1a59c } ,
{ 0x1a4 , 0x7a82c } ,
{ 0x1ad , 0xfa7cc } ,
{ 0x1be , 0x17a7dd } ,
{ 0x1d7 , 0x12a810 } ,
{ 0x1eb , 0x4000a7e1 } ,
{ 0x1ec , 0x5000a7f5 } ,
{ 0x1ed , 0x4000a7e2 } ,
{ 0x1ee , 0x5000a7dc } ,
{ 0x1ef , 0x4000a7e3 } ,
{ 0x1f0 , 0x5000a7f6 } ,
{ 0x1f1 , 0x5000a7e4 }
2017-06-19 14:19:07 +08:00
} ;
2017-09-13 13:31:09 +05:30
# define PCTL1_DATA_LEN (ARRAY_SIZE(pctl1_data))
2017-06-19 14:19:07 +08:00
2017-06-29 18:27:38 +08:00
# define PCTL1_RENG_EXEC_END_PTR 0x1f1
2017-06-19 14:19:07 +08:00
# define PCTL1_STCTRL_REG_SAVE_RANGE0_BASE 0xa000
# define PCTL1_STCTRL_REG_SAVE_RANGE0_LIMIT 0xa20d
# define PCTL1_STCTRL_REG_SAVE_RANGE1_BASE 0xa580
# define PCTL1_STCTRL_REG_SAVE_RANGE1_LIMIT 0xa59d
# define PCTL1_STCTRL_REG_SAVE_RANGE2_BASE 0xa82c
# define PCTL1_STCTRL_REG_SAVE_RANGE2_LIMIT 0xa833
static void mmhub_v1_0_power_gating_write_save_ranges ( struct amdgpu_device * adev )
{
uint32_t tmp = 0 ;
/* PCTL0_STCTRL_REGISTER_SAVE_RANGE0 */
tmp = REG_SET_FIELD ( tmp , PCTL0_STCTRL_REGISTER_SAVE_RANGE0 ,
STCTRL_REGISTER_SAVE_BASE ,
PCTL0_STCTRL_REG_SAVE_RANGE0_BASE ) ;
tmp = REG_SET_FIELD ( tmp , PCTL0_STCTRL_REGISTER_SAVE_RANGE0 ,
STCTRL_REGISTER_SAVE_LIMIT ,
PCTL0_STCTRL_REG_SAVE_RANGE0_LIMIT ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_STCTRL_REGISTER_SAVE_RANGE0 , tmp ) ;
/* PCTL1_STCTRL_REGISTER_SAVE_RANGE0 */
tmp = 0 ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE0 ,
STCTRL_REGISTER_SAVE_BASE ,
PCTL1_STCTRL_REG_SAVE_RANGE0_BASE ) ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE0 ,
STCTRL_REGISTER_SAVE_LIMIT ,
PCTL1_STCTRL_REG_SAVE_RANGE0_LIMIT ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_STCTRL_REGISTER_SAVE_RANGE0 , tmp ) ;
/* PCTL1_STCTRL_REGISTER_SAVE_RANGE1 */
tmp = 0 ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE1 ,
STCTRL_REGISTER_SAVE_BASE ,
PCTL1_STCTRL_REG_SAVE_RANGE1_BASE ) ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE1 ,
STCTRL_REGISTER_SAVE_LIMIT ,
PCTL1_STCTRL_REG_SAVE_RANGE1_LIMIT ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_STCTRL_REGISTER_SAVE_RANGE1 , tmp ) ;
/* PCTL1_STCTRL_REGISTER_SAVE_RANGE2 */
tmp = 0 ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE2 ,
STCTRL_REGISTER_SAVE_BASE ,
PCTL1_STCTRL_REG_SAVE_RANGE2_BASE ) ;
tmp = REG_SET_FIELD ( tmp , PCTL1_STCTRL_REGISTER_SAVE_RANGE2 ,
STCTRL_REGISTER_SAVE_LIMIT ,
PCTL1_STCTRL_REG_SAVE_RANGE2_LIMIT ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_STCTRL_REGISTER_SAVE_RANGE2 , tmp ) ;
}
void mmhub_v1_0_initialize_power_gating ( struct amdgpu_device * adev )
{
uint32_t pctl0_misc = 0 ;
uint32_t pctl0_reng_execute = 0 ;
uint32_t pctl1_misc = 0 ;
uint32_t pctl1_reng_execute = 0 ;
int i = 0 ;
if ( amdgpu_sriov_vf ( adev ) )
return ;
2017-12-21 16:19:03 -05:00
/****************** pctl0 **********************/
2017-06-19 14:19:07 +08:00
pctl0_misc = RREG32_SOC15 ( MMHUB , 0 , mmPCTL0_MISC ) ;
pctl0_reng_execute = RREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_EXECUTE ) ;
/* Light sleep must be disabled before writing to pctl0 registers */
pctl0_misc & = ~ PCTL0_MISC__RENG_MEM_LS_ENABLE_MASK ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_MISC , pctl0_misc ) ;
/* Write data used to access ram of register engine */
for ( i = 0 ; i < PCTL0_DATA_LEN ; i + + ) {
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_RAM_INDEX ,
pctl0_data [ i ] . index ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_RAM_DATA ,
pctl0_data [ i ] . data ) ;
}
2017-12-21 16:19:03 -05:00
/* Re-enable light sleep */
pctl0_misc | = PCTL0_MISC__RENG_MEM_LS_ENABLE_MASK ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_MISC , pctl0_misc ) ;
/****************** pctl1 **********************/
pctl1_misc = RREG32_SOC15 ( MMHUB , 0 , mmPCTL1_MISC ) ;
pctl1_reng_execute = RREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_EXECUTE ) ;
2017-06-19 14:19:07 +08:00
/* Light sleep must be disabled before writing to pctl1 registers */
pctl1_misc & = ~ PCTL1_MISC__RENG_MEM_LS_ENABLE_MASK ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_MISC , pctl1_misc ) ;
/* Write data used to access ram of register engine */
for ( i = 0 ; i < PCTL1_DATA_LEN ; i + + ) {
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_RAM_INDEX ,
pctl1_data [ i ] . index ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_RAM_DATA ,
pctl1_data [ i ] . data ) ;
}
2017-12-21 16:19:03 -05:00
/* Re-enable light sleep */
pctl1_misc | = PCTL1_MISC__RENG_MEM_LS_ENABLE_MASK ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_MISC , pctl1_misc ) ;
mmhub_v1_0_power_gating_write_save_ranges ( adev ) ;
/* Set the reng execute end ptr for pctl0 */
pctl0_reng_execute = REG_SET_FIELD ( pctl0_reng_execute ,
PCTL0_RENG_EXECUTE ,
RENG_EXECUTE_END_PTR ,
PCTL0_RENG_EXEC_END_PTR ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_EXECUTE , pctl0_reng_execute ) ;
2017-06-19 14:19:07 +08:00
/* Set the reng execute end ptr for pctl1 */
pctl1_reng_execute = REG_SET_FIELD ( pctl1_reng_execute ,
PCTL1_RENG_EXECUTE ,
RENG_EXECUTE_END_PTR ,
PCTL1_RENG_EXEC_END_PTR ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_EXECUTE , pctl1_reng_execute ) ;
}
2017-06-16 21:31:43 +08:00
void mmhub_v1_0_update_power_gating ( struct amdgpu_device * adev ,
bool enable )
{
uint32_t pctl0_reng_execute = 0 ;
uint32_t pctl1_reng_execute = 0 ;
if ( amdgpu_sriov_vf ( adev ) )
return ;
pctl0_reng_execute = RREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_EXECUTE ) ;
pctl1_reng_execute = RREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_EXECUTE ) ;
2017-06-19 14:39:02 +08:00
if ( enable & & adev - > pg_flags & AMD_PG_SUPPORT_MMHUB ) {
2017-06-16 21:31:43 +08:00
pctl0_reng_execute = REG_SET_FIELD ( pctl0_reng_execute ,
PCTL0_RENG_EXECUTE ,
RENG_EXECUTE_ON_PWR_UP , 1 ) ;
pctl0_reng_execute = REG_SET_FIELD ( pctl0_reng_execute ,
PCTL0_RENG_EXECUTE ,
RENG_EXECUTE_ON_REG_UPDATE , 1 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_EXECUTE , pctl0_reng_execute ) ;
pctl1_reng_execute = REG_SET_FIELD ( pctl1_reng_execute ,
PCTL1_RENG_EXECUTE ,
RENG_EXECUTE_ON_PWR_UP , 1 ) ;
pctl1_reng_execute = REG_SET_FIELD ( pctl1_reng_execute ,
PCTL1_RENG_EXECUTE ,
RENG_EXECUTE_ON_REG_UPDATE , 1 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_EXECUTE , pctl1_reng_execute ) ;
2018-02-06 16:21:05 -05:00
if ( adev - > powerplay . pp_funcs - > set_mmhub_powergating_by_smu )
amdgpu_dpm_set_mmhub_powergating_by_smu ( adev ) ;
2017-06-16 21:31:43 +08:00
} else {
pctl0_reng_execute = REG_SET_FIELD ( pctl0_reng_execute ,
PCTL0_RENG_EXECUTE ,
RENG_EXECUTE_ON_PWR_UP , 0 ) ;
pctl0_reng_execute = REG_SET_FIELD ( pctl0_reng_execute ,
PCTL0_RENG_EXECUTE ,
RENG_EXECUTE_ON_REG_UPDATE , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL0_RENG_EXECUTE , pctl0_reng_execute ) ;
pctl1_reng_execute = REG_SET_FIELD ( pctl1_reng_execute ,
PCTL1_RENG_EXECUTE ,
RENG_EXECUTE_ON_PWR_UP , 0 ) ;
pctl1_reng_execute = REG_SET_FIELD ( pctl1_reng_execute ,
PCTL1_RENG_EXECUTE ,
RENG_EXECUTE_ON_REG_UPDATE , 0 ) ;
WREG32_SOC15 ( MMHUB , 0 , mmPCTL1_RENG_EXECUTE , pctl1_reng_execute ) ;
}
}
2017-05-31 22:17:11 +08:00
int mmhub_v1_0_gart_enable ( struct amdgpu_device * adev )
{
if ( amdgpu_sriov_vf ( adev ) ) {
/*
* MC_VM_FB_LOCATION_BASE / TOP is NULL for VF , becuase they are
* VF copy registers so vbios post doesn ' t program them , for
* SRIOV driver need to program them
*/
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_FB_LOCATION_BASE ,
2018-01-12 14:52:22 +01:00
adev - > gmc . vram_start > > 24 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_FB_LOCATION_TOP ,
2018-01-12 14:52:22 +01:00
adev - > gmc . vram_end > > 24 ) ;
2017-05-31 22:17:11 +08:00
}
/* GART Enable. */
mmhub_v1_0_init_gart_aperture_regs ( adev ) ;
mmhub_v1_0_init_system_aperture_regs ( adev ) ;
mmhub_v1_0_init_tlb_regs ( adev ) ;
mmhub_v1_0_init_cache_regs ( adev ) ;
mmhub_v1_0_enable_system_domain ( adev ) ;
mmhub_v1_0_disable_identity_aperture ( adev ) ;
mmhub_v1_0_setup_vmid_config ( adev ) ;
2017-05-31 22:32:35 +08:00
mmhub_v1_0_program_invalidation ( adev ) ;
2017-03-09 11:36:26 -05:00
return 0 ;
}
void mmhub_v1_0_gart_disable ( struct amdgpu_device * adev )
{
u32 tmp ;
u32 i ;
/* Disable all tables */
for ( i = 0 ; i < 16 ; i + + )
2017-06-12 12:34:28 -04:00
WREG32_SOC15_OFFSET ( MMHUB , 0 , mmVM_CONTEXT0_CNTL , i , 0 ) ;
2017-03-09 11:36:26 -05:00
/* Setup TLB control */
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmMC_VM_MX_L1_TLB_CNTL ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , MC_VM_MX_L1_TLB_CNTL , ENABLE_L1_TLB , 0 ) ;
tmp = REG_SET_FIELD ( tmp ,
MC_VM_MX_L1_TLB_CNTL ,
ENABLE_ADVANCED_DRIVER_MODEL ,
0 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmMC_VM_MX_L1_TLB_CNTL , tmp ) ;
2017-03-09 11:36:26 -05:00
/* Setup L2 cache */
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_L2_CNTL , ENABLE_L2_CACHE , 0 ) ;
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL , tmp ) ;
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_CNTL3 , 0 ) ;
2017-03-09 11:36:26 -05:00
}
/**
* mmhub_v1_0_set_fault_enable_default - update GART / VM fault handling
*
* @ adev : amdgpu_device pointer
* @ value : true redirects VM faults to the default page
*/
void mmhub_v1_0_set_fault_enable_default ( struct amdgpu_device * adev , bool value )
{
u32 tmp ;
2017-06-01 15:30:04 +08:00
tmp = RREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_CNTL ) ;
2017-03-09 11:36:26 -05:00
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
PDE1_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
PDE2_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp ,
VM_L2_PROTECTION_FAULT_CNTL ,
TRANSLATE_FURTHER_PROTECTION_FAULT_ENABLE_DEFAULT ,
value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
NACK_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
VALID_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
READ_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT , value ) ;
2017-07-04 16:40:58 +08:00
if ( ! value ) {
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
CRASH_ON_NO_RETRY_FAULT , 1 ) ;
tmp = REG_SET_FIELD ( tmp , VM_L2_PROTECTION_FAULT_CNTL ,
CRASH_ON_RETRY_FAULT , 1 ) ;
}
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_CNTL , tmp ) ;
2017-03-09 11:36:26 -05:00
}
2017-05-31 22:59:18 +08:00
void mmhub_v1_0_init ( struct amdgpu_device * adev )
2017-03-09 11:36:26 -05:00
{
struct amdgpu_vmhub * hub = & adev - > vmhub [ AMDGPU_MMHUB ] ;
hub - > ctx0_ptb_addr_lo32 =
SOC15_REG_OFFSET ( MMHUB , 0 ,
mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 ) ;
hub - > ctx0_ptb_addr_hi32 =
SOC15_REG_OFFSET ( MMHUB , 0 ,
mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 ) ;
hub - > vm_inv_eng0_req =
SOC15_REG_OFFSET ( MMHUB , 0 , mmVM_INVALIDATE_ENG0_REQ ) ;
hub - > vm_inv_eng0_ack =
SOC15_REG_OFFSET ( MMHUB , 0 , mmVM_INVALIDATE_ENG0_ACK ) ;
hub - > vm_context0_cntl =
SOC15_REG_OFFSET ( MMHUB , 0 , mmVM_CONTEXT0_CNTL ) ;
hub - > vm_l2_pro_fault_status =
SOC15_REG_OFFSET ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_STATUS ) ;
hub - > vm_l2_pro_fault_cntl =
SOC15_REG_OFFSET ( MMHUB , 0 , mmVM_L2_PROTECTION_FAULT_CNTL ) ;
2017-05-31 22:59:18 +08:00
}
2017-03-09 11:36:26 -05:00
static void mmhub_v1_0_update_medium_grain_clock_gating ( struct amdgpu_device * adev ,
bool enable )
{
2017-02-08 17:07:59 +08:00
uint32_t def , data , def1 , data1 , def2 = 0 , data2 = 0 ;
2017-03-09 11:36:26 -05:00
2017-06-01 15:30:04 +08:00
def = data = RREG32_SOC15 ( MMHUB , 0 , mmATC_L2_MISC_CG ) ;
2017-02-08 17:07:59 +08:00
if ( adev - > asic_type ! = CHIP_RAVEN ) {
2017-06-01 15:30:04 +08:00
def1 = data1 = RREG32_SOC15 ( MMHUB , 0 , mmDAGB0_CNTL_MISC2 ) ;
def2 = data2 = RREG32_SOC15 ( MMHUB , 0 , mmDAGB1_CNTL_MISC2 ) ;
2017-02-08 17:07:59 +08:00
} else
2017-06-01 15:30:04 +08:00
def1 = data1 = RREG32_SOC15 ( MMHUB , 0 , mmDAGB0_CNTL_MISC2_RV ) ;
2017-03-09 11:36:26 -05:00
if ( enable & & ( adev - > cg_flags & AMD_CG_SUPPORT_MC_MGCG ) ) {
data | = ATC_L2_MISC_CG__ENABLE_MASK ;
data1 & = ~ ( DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK ) ;
2017-02-08 17:07:59 +08:00
if ( adev - > asic_type ! = CHIP_RAVEN )
data2 & = ~ ( DAGB1_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_TLBRD_CG_MASK ) ;
2017-03-09 11:36:26 -05:00
} else {
data & = ~ ATC_L2_MISC_CG__ENABLE_MASK ;
data1 | = ( DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK ) ;
2017-02-08 17:07:59 +08:00
if ( adev - > asic_type ! = CHIP_RAVEN )
data2 | = ( DAGB1_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
DAGB1_CNTL_MISC2__DISABLE_TLBRD_CG_MASK ) ;
2017-03-09 11:36:26 -05:00
}
if ( def ! = data )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmATC_L2_MISC_CG , data ) ;
2017-03-09 11:36:26 -05:00
2017-02-08 17:07:59 +08:00
if ( def1 ! = data1 ) {
if ( adev - > asic_type ! = CHIP_RAVEN )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmDAGB0_CNTL_MISC2 , data1 ) ;
2017-02-08 17:07:59 +08:00
else
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmDAGB0_CNTL_MISC2_RV , data1 ) ;
2017-02-08 17:07:59 +08:00
}
2017-03-09 11:36:26 -05:00
2017-02-08 17:07:59 +08:00
if ( adev - > asic_type ! = CHIP_RAVEN & & def2 ! = data2 )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmDAGB1_CNTL_MISC2 , data2 ) ;
2017-03-09 11:36:26 -05:00
}
static void athub_update_medium_grain_clock_gating ( struct amdgpu_device * adev ,
bool enable )
{
uint32_t def , data ;
2017-06-01 15:30:04 +08:00
def = data = RREG32_SOC15 ( ATHUB , 0 , mmATHUB_MISC_CNTL ) ;
2017-03-09 11:36:26 -05:00
if ( enable & & ( adev - > cg_flags & AMD_CG_SUPPORT_MC_MGCG ) )
data | = ATHUB_MISC_CNTL__CG_ENABLE_MASK ;
else
data & = ~ ATHUB_MISC_CNTL__CG_ENABLE_MASK ;
if ( def ! = data )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( ATHUB , 0 , mmATHUB_MISC_CNTL , data ) ;
2017-03-09 11:36:26 -05:00
}
static void mmhub_v1_0_update_medium_grain_light_sleep ( struct amdgpu_device * adev ,
bool enable )
{
uint32_t def , data ;
2017-06-01 15:30:04 +08:00
def = data = RREG32_SOC15 ( MMHUB , 0 , mmATC_L2_MISC_CG ) ;
2017-03-09 11:36:26 -05:00
if ( enable & & ( adev - > cg_flags & AMD_CG_SUPPORT_MC_LS ) )
data | = ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK ;
else
data & = ~ ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK ;
if ( def ! = data )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( MMHUB , 0 , mmATC_L2_MISC_CG , data ) ;
2017-03-09 11:36:26 -05:00
}
static void athub_update_medium_grain_light_sleep ( struct amdgpu_device * adev ,
bool enable )
{
uint32_t def , data ;
2017-06-01 15:30:04 +08:00
def = data = RREG32_SOC15 ( ATHUB , 0 , mmATHUB_MISC_CNTL ) ;
2017-03-09 11:36:26 -05:00
if ( enable & & ( adev - > cg_flags & AMD_CG_SUPPORT_MC_LS ) & &
( adev - > cg_flags & AMD_CG_SUPPORT_HDP_LS ) )
data | = ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK ;
else
data & = ~ ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK ;
if ( def ! = data )
2017-06-01 15:30:04 +08:00
WREG32_SOC15 ( ATHUB , 0 , mmATHUB_MISC_CNTL , data ) ;
2017-03-09 11:36:26 -05:00
}
2017-05-31 23:13:34 +08:00
int mmhub_v1_0_set_clockgating ( struct amdgpu_device * adev ,
enum amd_clockgating_state state )
2017-03-09 11:36:26 -05:00
{
2017-04-14 17:40:57 +08:00
if ( amdgpu_sriov_vf ( adev ) )
return 0 ;
2017-03-09 11:36:26 -05:00
switch ( adev - > asic_type ) {
case CHIP_VEGA10 :
2017-09-01 16:39:10 -04:00
case CHIP_VEGA12 :
2018-04-20 13:58:09 +08:00
case CHIP_VEGA20 :
2017-02-08 17:07:59 +08:00
case CHIP_RAVEN :
2017-03-09 11:36:26 -05:00
mmhub_v1_0_update_medium_grain_clock_gating ( adev ,
state = = AMD_CG_STATE_GATE ? true : false ) ;
athub_update_medium_grain_clock_gating ( adev ,
state = = AMD_CG_STATE_GATE ? true : false ) ;
mmhub_v1_0_update_medium_grain_light_sleep ( adev ,
state = = AMD_CG_STATE_GATE ? true : false ) ;
athub_update_medium_grain_light_sleep ( adev ,
state = = AMD_CG_STATE_GATE ? true : false ) ;
break ;
default :
break ;
}
return 0 ;
}
2017-05-31 23:35:44 +08:00
void mmhub_v1_0_get_clockgating ( struct amdgpu_device * adev , u32 * flags )
2017-03-24 11:52:23 +08:00
{
int data ;
if ( amdgpu_sriov_vf ( adev ) )
* flags = 0 ;
/* AMD_CG_SUPPORT_MC_MGCG */
2017-06-01 15:30:04 +08:00
data = RREG32_SOC15 ( ATHUB , 0 , mmATHUB_MISC_CNTL ) ;
2017-03-24 11:52:23 +08:00
if ( data & ATHUB_MISC_CNTL__CG_ENABLE_MASK )
* flags | = AMD_CG_SUPPORT_MC_MGCG ;
/* AMD_CG_SUPPORT_MC_LS */
2017-06-01 15:30:04 +08:00
data = RREG32_SOC15 ( MMHUB , 0 , mmATC_L2_MISC_CG ) ;
2017-03-24 11:52:23 +08:00
if ( data & ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK )
* flags | = AMD_CG_SUPPORT_MC_LS ;
}