Home | History | Annotate | Line # | Download | only in amdgpu
      1 /*	$NetBSD: amdgpu_mmhub_v9_4.c,v 1.2 2021/12/18 23:44:58 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2018 Advanced Micro Devices, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  */
     25 #include <sys/cdefs.h>
     26 __KERNEL_RCSID(0, "$NetBSD: amdgpu_mmhub_v9_4.c,v 1.2 2021/12/18 23:44:58 riastradh Exp $");
     27 
     28 #include "amdgpu.h"
     29 #include "amdgpu_ras.h"
     30 #include "mmhub_v9_4.h"
     31 
     32 #include "mmhub/mmhub_9_4_1_offset.h"
     33 #include "mmhub/mmhub_9_4_1_sh_mask.h"
     34 #include "mmhub/mmhub_9_4_1_default.h"
     35 #include "athub/athub_1_0_offset.h"
     36 #include "athub/athub_1_0_sh_mask.h"
     37 #include "vega10_enum.h"
     38 #include "soc15.h"
     39 #include "soc15_common.h"
     40 
     41 #define MMHUB_NUM_INSTANCES			2
     42 #define MMHUB_INSTANCE_REGISTER_OFFSET		0x3000
     43 
     44 u64 mmhub_v9_4_get_fb_location(struct amdgpu_device *adev)
     45 {
     46 	/* The base should be same b/t 2 mmhubs on Acrturus. Read one here. */
     47 	u64 base = RREG32_SOC15(MMHUB, 0, mmVMSHAREDVC0_MC_VM_FB_LOCATION_BASE);
     48 	u64 top = RREG32_SOC15(MMHUB, 0, mmVMSHAREDVC0_MC_VM_FB_LOCATION_TOP);
     49 
     50 	base &= VMSHAREDVC0_MC_VM_FB_LOCATION_BASE__FB_BASE_MASK;
     51 	base <<= 24;
     52 
     53 	top &= VMSHAREDVC0_MC_VM_FB_LOCATION_TOP__FB_TOP_MASK;
     54 	top <<= 24;
     55 
     56 	adev->gmc.fb_start = base;
     57 	adev->gmc.fb_end = top;
     58 
     59 	return base;
     60 }
     61 
     62 static void mmhub_v9_4_setup_hubid_vm_pt_regs(struct amdgpu_device *adev, int hubid,
     63 				uint32_t vmid, uint64_t value)
     64 {
     65 	/* two registers distance between mmVML2VC0_VM_CONTEXT0_* to
     66 	 * mmVML2VC0_VM_CONTEXT1_*
     67 	 */
     68 	int dist = mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32
     69 			- mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
     70 
     71 	WREG32_SOC15_OFFSET(MMHUB, 0,
     72 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,
     73 			    dist * vmid + hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
     74 			    lower_32_bits(value));
     75 
     76 	WREG32_SOC15_OFFSET(MMHUB, 0,
     77 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32,
     78 			    dist * vmid + hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
     79 			    upper_32_bits(value));
     80 
     81 }
     82 
     83 static void mmhub_v9_4_init_gart_aperture_regs(struct amdgpu_device *adev,
     84 					       int hubid)
     85 {
     86 	uint64_t pt_base = amdgpu_gmc_pd_addr(adev->gart.bo);
     87 
     88 	mmhub_v9_4_setup_hubid_vm_pt_regs(adev, hubid, 0, pt_base);
     89 
     90 	WREG32_SOC15_OFFSET(MMHUB, 0,
     91 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
     92 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
     93 			    (u32)(adev->gmc.gart_start >> 12));
     94 	WREG32_SOC15_OFFSET(MMHUB, 0,
     95 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32,
     96 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
     97 			    (u32)(adev->gmc.gart_start >> 44));
     98 
     99 	WREG32_SOC15_OFFSET(MMHUB, 0,
    100 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32,
    101 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    102 			    (u32)(adev->gmc.gart_end >> 12));
    103 	WREG32_SOC15_OFFSET(MMHUB, 0,
    104 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32,
    105 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    106 			    (u32)(adev->gmc.gart_end >> 44));
    107 }
    108 
    109 void mmhub_v9_4_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
    110 				uint64_t page_table_base)
    111 {
    112 	int i;
    113 
    114 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++)
    115 		mmhub_v9_4_setup_hubid_vm_pt_regs(adev, i, vmid,
    116 				page_table_base);
    117 }
    118 
    119 static void mmhub_v9_4_init_system_aperture_regs(struct amdgpu_device *adev,
    120 					         int hubid)
    121 {
    122 	uint64_t value;
    123 	uint32_t tmp;
    124 
    125 	/* Program the AGP BAR */
    126 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVMSHAREDVC0_MC_VM_AGP_BASE,
    127 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    128 			    0);
    129 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVMSHAREDVC0_MC_VM_AGP_TOP,
    130 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    131 			    adev->gmc.agp_end >> 24);
    132 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVMSHAREDVC0_MC_VM_AGP_BOT,
    133 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    134 			    adev->gmc.agp_start >> 24);
    135 
    136 	if (!amdgpu_sriov_vf(adev)) {
    137 		/* Program the system aperture low logical page number. */
    138 		WREG32_SOC15_OFFSET(
    139 			MMHUB, 0, mmVMSHAREDVC0_MC_VM_SYSTEM_APERTURE_LOW_ADDR,
    140 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    141 			min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);
    142 		WREG32_SOC15_OFFSET(
    143 			MMHUB, 0, mmVMSHAREDVC0_MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
    144 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    145 			max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18);
    146 
    147 		/* Set default page address. */
    148 		value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start +
    149 			adev->vm_manager.vram_base_offset;
    150 		WREG32_SOC15_OFFSET(
    151 			MMHUB, 0,
    152 			mmVMSHAREDPF0_MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB,
    153 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    154 			(u32)(value >> 12));
    155 		WREG32_SOC15_OFFSET(
    156 			MMHUB, 0,
    157 			mmVMSHAREDPF0_MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB,
    158 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    159 			(u32)(value >> 44));
    160 
    161 		/* Program "protection fault". */
    162 		WREG32_SOC15_OFFSET(
    163 			MMHUB, 0,
    164 			mmVML2PF0_VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32,
    165 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    166 			(u32)(adev->dummy_page_addr >> 12));
    167 		WREG32_SOC15_OFFSET(
    168 			MMHUB, 0,
    169 			mmVML2PF0_VM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32,
    170 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    171 			(u32)((u64)adev->dummy_page_addr >> 44));
    172 
    173 		tmp = RREG32_SOC15_OFFSET(
    174 			MMHUB, 0, mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL2,
    175 			hubid * MMHUB_INSTANCE_REGISTER_OFFSET);
    176 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL2,
    177 				    ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1);
    178 		WREG32_SOC15_OFFSET(MMHUB, 0,
    179 				    mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL2,
    180 				    hubid * MMHUB_INSTANCE_REGISTER_OFFSET,
    181 				    tmp);
    182 	}
    183 }
    184 
    185 static void mmhub_v9_4_init_tlb_regs(struct amdgpu_device *adev, int hubid)
    186 {
    187 	uint32_t tmp;
    188 
    189 	/* Setup TLB control */
    190 	tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
    191 			   mmVMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    192 			   hubid * MMHUB_INSTANCE_REGISTER_OFFSET);
    193 
    194 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    195 			    ENABLE_L1_TLB, 1);
    196 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    197 			    SYSTEM_ACCESS_MODE, 3);
    198 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    199 			    ENABLE_ADVANCED_DRIVER_MODEL, 1);
    200 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    201 			    SYSTEM_APERTURE_UNMAPPED_ACCESS, 0);
    202 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    203 			    ECO_BITS, 0);
    204 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    205 			    MTYPE, MTYPE_UC);/* XXX for emulation. */
    206 	tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    207 			    ATC_EN, 1);
    208 
    209 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    210 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    211 }
    212 
    213 static void mmhub_v9_4_init_cache_regs(struct amdgpu_device *adev, int hubid)
    214 {
    215 	uint32_t tmp;
    216 
    217 	/* Setup L2 cache */
    218 	tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL,
    219 				  hubid * MMHUB_INSTANCE_REGISTER_OFFSET);
    220 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    221 			    ENABLE_L2_CACHE, 1);
    222 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    223 			    ENABLE_L2_FRAGMENT_PROCESSING, 1);
    224 	/* XXX for emulation, Refer to closed source code.*/
    225 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    226 			    L2_PDE0_CACHE_TAG_GENERATION_MODE, 0);
    227 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    228 			    PDE_FAULT_CLASSIFICATION, 0);
    229 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    230 			    CONTEXT1_IDENTITY_ACCESS_MODE, 1);
    231 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    232 			    IDENTITY_MODE_FRAGMENT_SIZE, 0);
    233 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL,
    234 		     hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    235 
    236 	tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL2,
    237 				  hubid * MMHUB_INSTANCE_REGISTER_OFFSET);
    238 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL2,
    239 			    INVALIDATE_ALL_L1_TLBS, 1);
    240 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL2,
    241 			    INVALIDATE_L2_CACHE, 1);
    242 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL2,
    243 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    244 
    245 	tmp = mmVML2PF0_VM_L2_CNTL3_DEFAULT;
    246 	if (adev->gmc.translate_further) {
    247 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL3, BANK_SELECT, 12);
    248 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL3,
    249 				    L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
    250 	} else {
    251 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL3, BANK_SELECT, 9);
    252 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL3,
    253 				    L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
    254 	}
    255 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL3,
    256 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    257 
    258 	tmp = mmVML2PF0_VM_L2_CNTL4_DEFAULT;
    259 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL4,
    260 			    VMC_TAP_PDE_REQUEST_PHYSICAL, 0);
    261 	tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL4,
    262 			    VMC_TAP_PTE_REQUEST_PHYSICAL, 0);
    263 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL4,
    264 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    265 }
    266 
    267 static void mmhub_v9_4_enable_system_domain(struct amdgpu_device *adev,
    268 					    int hubid)
    269 {
    270 	uint32_t tmp;
    271 
    272 	tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVML2VC0_VM_CONTEXT0_CNTL,
    273 				  hubid * MMHUB_INSTANCE_REGISTER_OFFSET);
    274 	tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1);
    275 	tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, 0);
    276 	tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT0_CNTL,
    277 			    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);
    278 	WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2VC0_VM_CONTEXT0_CNTL,
    279 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    280 }
    281 
    282 static void mmhub_v9_4_disable_identity_aperture(struct amdgpu_device *adev,
    283 						 int hubid)
    284 {
    285 	WREG32_SOC15_OFFSET(MMHUB, 0,
    286 		    mmVML2PF0_VM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32,
    287 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0XFFFFFFFF);
    288 	WREG32_SOC15_OFFSET(MMHUB, 0,
    289 		    mmVML2PF0_VM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32,
    290 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0x0000000F);
    291 
    292 	WREG32_SOC15_OFFSET(MMHUB, 0,
    293 		    mmVML2PF0_VM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32,
    294 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0);
    295 	WREG32_SOC15_OFFSET(MMHUB, 0,
    296 		    mmVML2PF0_VM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32,
    297 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0);
    298 
    299 	WREG32_SOC15_OFFSET(MMHUB, 0,
    300 		    mmVML2PF0_VM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32,
    301 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0);
    302 	WREG32_SOC15_OFFSET(MMHUB, 0,
    303 		    mmVML2PF0_VM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32,
    304 		    hubid * MMHUB_INSTANCE_REGISTER_OFFSET, 0);
    305 }
    306 
    307 static void mmhub_v9_4_setup_vmid_config(struct amdgpu_device *adev, int hubid)
    308 {
    309 	uint32_t tmp;
    310 	int i;
    311 
    312 	for (i = 0; i <= 14; i++) {
    313 		tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVML2VC0_VM_CONTEXT1_CNTL,
    314 				hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i);
    315 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    316 				    ENABLE_CONTEXT, 1);
    317 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    318 				    PAGE_TABLE_DEPTH,
    319 				    adev->vm_manager.num_level);
    320 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    321 				    RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    322 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    323 				    DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT,
    324 				    1);
    325 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    326 				    PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    327 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    328 				    VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    329 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    330 				    READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    331 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    332 				    WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    333 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    334 				    EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
    335 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    336 				    PAGE_TABLE_BLOCK_SIZE,
    337 				    adev->vm_manager.block_size - 9);
    338 		/* Send no-retry XNACK on fault to suppress VM fault storm. */
    339 		tmp = REG_SET_FIELD(tmp, VML2VC0_VM_CONTEXT1_CNTL,
    340 				    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT,
    341 				    !amdgpu_noretry);
    342 		WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2VC0_VM_CONTEXT1_CNTL,
    343 				    hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i,
    344 				    tmp);
    345 		WREG32_SOC15_OFFSET(MMHUB, 0,
    346 			    mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32,
    347 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i*2, 0);
    348 		WREG32_SOC15_OFFSET(MMHUB, 0,
    349 			    mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32,
    350 			    hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i*2, 0);
    351 		WREG32_SOC15_OFFSET(MMHUB, 0,
    352 				mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32,
    353 				hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i*2,
    354 				lower_32_bits(adev->vm_manager.max_pfn - 1));
    355 		WREG32_SOC15_OFFSET(MMHUB, 0,
    356 				mmVML2VC0_VM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32,
    357 				hubid * MMHUB_INSTANCE_REGISTER_OFFSET + i*2,
    358 				upper_32_bits(adev->vm_manager.max_pfn - 1));
    359 	}
    360 }
    361 
    362 static void mmhub_v9_4_program_invalidation(struct amdgpu_device *adev,
    363 					    int hubid)
    364 {
    365 	unsigned i;
    366 
    367 	for (i = 0; i < 18; ++i) {
    368 		WREG32_SOC15_OFFSET(MMHUB, 0,
    369 				mmVML2VC0_VM_INVALIDATE_ENG0_ADDR_RANGE_LO32,
    370 				hubid * MMHUB_INSTANCE_REGISTER_OFFSET + 2 * i,
    371 				0xffffffff);
    372 		WREG32_SOC15_OFFSET(MMHUB, 0,
    373 				mmVML2VC0_VM_INVALIDATE_ENG0_ADDR_RANGE_HI32,
    374 				hubid * MMHUB_INSTANCE_REGISTER_OFFSET + 2 * i,
    375 				0x1f);
    376 	}
    377 }
    378 
    379 int mmhub_v9_4_gart_enable(struct amdgpu_device *adev)
    380 {
    381 	int i;
    382 
    383 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
    384 		/* GART Enable. */
    385 		mmhub_v9_4_init_gart_aperture_regs(adev, i);
    386 		mmhub_v9_4_init_system_aperture_regs(adev, i);
    387 		mmhub_v9_4_init_tlb_regs(adev, i);
    388 		if (!amdgpu_sriov_vf(adev))
    389 			mmhub_v9_4_init_cache_regs(adev, i);
    390 
    391 		mmhub_v9_4_enable_system_domain(adev, i);
    392 		if (!amdgpu_sriov_vf(adev))
    393 			mmhub_v9_4_disable_identity_aperture(adev, i);
    394 		mmhub_v9_4_setup_vmid_config(adev, i);
    395 		mmhub_v9_4_program_invalidation(adev, i);
    396 	}
    397 
    398 	return 0;
    399 }
    400 
    401 void mmhub_v9_4_gart_disable(struct amdgpu_device *adev)
    402 {
    403 	u32 tmp;
    404 	u32 i, j;
    405 
    406 	for (j = 0; j < MMHUB_NUM_INSTANCES; j++) {
    407 		/* Disable all tables */
    408 		for (i = 0; i < 16; i++)
    409 			WREG32_SOC15_OFFSET(MMHUB, 0,
    410 					    mmVML2VC0_VM_CONTEXT0_CNTL,
    411 					    j * MMHUB_INSTANCE_REGISTER_OFFSET +
    412 					    i, 0);
    413 
    414 		/* Setup TLB control */
    415 		tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
    416 				   mmVMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    417 				   j * MMHUB_INSTANCE_REGISTER_OFFSET);
    418 		tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    419 				    ENABLE_L1_TLB, 0);
    420 		tmp = REG_SET_FIELD(tmp,
    421 				    VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    422 				    ENABLE_ADVANCED_DRIVER_MODEL, 0);
    423 		WREG32_SOC15_OFFSET(MMHUB, 0,
    424 				    mmVMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL,
    425 				    j * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    426 
    427 		/* Setup L2 cache */
    428 		tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL,
    429 					  j * MMHUB_INSTANCE_REGISTER_OFFSET);
    430 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_CNTL,
    431 				    ENABLE_L2_CACHE, 0);
    432 		WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL,
    433 				    j * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    434 		WREG32_SOC15_OFFSET(MMHUB, 0, mmVML2PF0_VM_L2_CNTL3,
    435 				    j * MMHUB_INSTANCE_REGISTER_OFFSET, 0);
    436 	}
    437 }
    438 
    439 /**
    440  * mmhub_v1_0_set_fault_enable_default - update GART/VM fault handling
    441  *
    442  * @adev: amdgpu_device pointer
    443  * @value: true redirects VM faults to the default page
    444  */
    445 void mmhub_v9_4_set_fault_enable_default(struct amdgpu_device *adev, bool value)
    446 {
    447 	u32 tmp;
    448 	int i;
    449 
    450 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
    451 		tmp = RREG32_SOC15_OFFSET(MMHUB, 0,
    452 					  mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    453 					  i * MMHUB_INSTANCE_REGISTER_OFFSET);
    454 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    455 				    RANGE_PROTECTION_FAULT_ENABLE_DEFAULT,
    456 				    value);
    457 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    458 				    PDE0_PROTECTION_FAULT_ENABLE_DEFAULT,
    459 				    value);
    460 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    461 				    PDE1_PROTECTION_FAULT_ENABLE_DEFAULT,
    462 				    value);
    463 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    464 				    PDE2_PROTECTION_FAULT_ENABLE_DEFAULT,
    465 				    value);
    466 		tmp = REG_SET_FIELD(tmp,
    467 			    VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    468 			    TRANSLATE_FURTHER_PROTECTION_FAULT_ENABLE_DEFAULT,
    469 			    value);
    470 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    471 				    NACK_PROTECTION_FAULT_ENABLE_DEFAULT,
    472 				    value);
    473 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    474 				    DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT,
    475 				    value);
    476 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    477 				    VALID_PROTECTION_FAULT_ENABLE_DEFAULT,
    478 				    value);
    479 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    480 				    READ_PROTECTION_FAULT_ENABLE_DEFAULT,
    481 				    value);
    482 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    483 				    WRITE_PROTECTION_FAULT_ENABLE_DEFAULT,
    484 				    value);
    485 		tmp = REG_SET_FIELD(tmp, VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    486 				    EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT,
    487 				    value);
    488 		if (!value) {
    489 			tmp = REG_SET_FIELD(tmp,
    490 					    VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    491 					    CRASH_ON_NO_RETRY_FAULT, 1);
    492 			tmp = REG_SET_FIELD(tmp,
    493 					    VML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    494 					    CRASH_ON_RETRY_FAULT, 1);
    495 		}
    496 
    497 		WREG32_SOC15_OFFSET(MMHUB, 0,
    498 				    mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL,
    499 				    i * MMHUB_INSTANCE_REGISTER_OFFSET, tmp);
    500 	}
    501 }
    502 
    503 void mmhub_v9_4_init(struct amdgpu_device *adev)
    504 {
    505 	struct amdgpu_vmhub *hub[MMHUB_NUM_INSTANCES] =
    506 		{&adev->vmhub[AMDGPU_MMHUB_0], &adev->vmhub[AMDGPU_MMHUB_1]};
    507 	int i;
    508 
    509 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
    510 		hub[i]->ctx0_ptb_addr_lo32 =
    511 			SOC15_REG_OFFSET(MMHUB, 0,
    512 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32) +
    513 			    i * MMHUB_INSTANCE_REGISTER_OFFSET;
    514 		hub[i]->ctx0_ptb_addr_hi32 =
    515 			SOC15_REG_OFFSET(MMHUB, 0,
    516 			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32) +
    517 			    i * MMHUB_INSTANCE_REGISTER_OFFSET;
    518 		hub[i]->vm_inv_eng0_sem =
    519 			SOC15_REG_OFFSET(MMHUB, 0,
    520 					 mmVML2VC0_VM_INVALIDATE_ENG0_SEM) +
    521 					 i * MMHUB_INSTANCE_REGISTER_OFFSET;
    522 		hub[i]->vm_inv_eng0_req =
    523 			SOC15_REG_OFFSET(MMHUB, 0,
    524 					 mmVML2VC0_VM_INVALIDATE_ENG0_REQ) +
    525 					 i * MMHUB_INSTANCE_REGISTER_OFFSET;
    526 		hub[i]->vm_inv_eng0_ack =
    527 			SOC15_REG_OFFSET(MMHUB, 0,
    528 					 mmVML2VC0_VM_INVALIDATE_ENG0_ACK) +
    529 					 i * MMHUB_INSTANCE_REGISTER_OFFSET;
    530 		hub[i]->vm_context0_cntl =
    531 			SOC15_REG_OFFSET(MMHUB, 0,
    532 					 mmVML2VC0_VM_CONTEXT0_CNTL) +
    533 					 i * MMHUB_INSTANCE_REGISTER_OFFSET;
    534 		hub[i]->vm_l2_pro_fault_status =
    535 			SOC15_REG_OFFSET(MMHUB, 0,
    536 				    mmVML2PF0_VM_L2_PROTECTION_FAULT_STATUS) +
    537 				    i * MMHUB_INSTANCE_REGISTER_OFFSET;
    538 		hub[i]->vm_l2_pro_fault_cntl =
    539 			SOC15_REG_OFFSET(MMHUB, 0,
    540 				    mmVML2PF0_VM_L2_PROTECTION_FAULT_CNTL) +
    541 				    i * MMHUB_INSTANCE_REGISTER_OFFSET;
    542 	}
    543 }
    544 
    545 static void mmhub_v9_4_update_medium_grain_clock_gating(struct amdgpu_device *adev,
    546 							bool enable)
    547 {
    548 	uint32_t def, data, def1, data1;
    549 	int i, j;
    550 	int dist = mmDAGB1_CNTL_MISC2 - mmDAGB0_CNTL_MISC2;
    551 
    552 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
    553 		def = data = RREG32_SOC15_OFFSET(MMHUB, 0,
    554 					mmATCL2_0_ATC_L2_MISC_CG,
    555 					i * MMHUB_INSTANCE_REGISTER_OFFSET);
    556 
    557 		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))
    558 			data |= ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK;
    559 		else
    560 			data &= ~ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK;
    561 
    562 		if (def != data)
    563 			WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG,
    564 				i * MMHUB_INSTANCE_REGISTER_OFFSET, data);
    565 
    566 		for (j = 0; j < 5; j++) {
    567 			def1 = data1 = RREG32_SOC15_OFFSET(MMHUB, 0,
    568 					mmDAGB0_CNTL_MISC2,
    569 					i * MMHUB_INSTANCE_REGISTER_OFFSET +
    570 					j * dist);
    571 			if (enable &&
    572 			    (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) {
    573 				data1 &=
    574 				    ~(DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
    575 				    DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
    576 				    DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
    577 				    DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
    578 				    DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
    579 				    DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK);
    580 			} else {
    581 				data1 |=
    582 				    (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
    583 				    DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
    584 				    DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
    585 				    DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
    586 				    DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
    587 				    DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK);
    588 			}
    589 
    590 			if (def1 != data1)
    591 				WREG32_SOC15_OFFSET(MMHUB, 0,
    592 					mmDAGB0_CNTL_MISC2,
    593 					i * MMHUB_INSTANCE_REGISTER_OFFSET +
    594 					j * dist, data1);
    595 
    596 			if (i == 1 && j == 3)
    597 				break;
    598 		}
    599 	}
    600 }
    601 
    602 static void mmhub_v9_4_update_medium_grain_light_sleep(struct amdgpu_device *adev,
    603 						       bool enable)
    604 {
    605 	uint32_t def, data;
    606 	int i;
    607 
    608 	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
    609 		def = data = RREG32_SOC15_OFFSET(MMHUB, 0,
    610 					mmATCL2_0_ATC_L2_MISC_CG,
    611 					i * MMHUB_INSTANCE_REGISTER_OFFSET);
    612 
    613 		if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS))
    614 			data |= ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
    615 		else
    616 			data &= ~ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
    617 
    618 		if (def != data)
    619 			WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG,
    620 				i * MMHUB_INSTANCE_REGISTER_OFFSET, data);
    621 	}
    622 }
    623 
    624 int mmhub_v9_4_set_clockgating(struct amdgpu_device *adev,
    625 			       enum amd_clockgating_state state)
    626 {
    627 	if (amdgpu_sriov_vf(adev))
    628 		return 0;
    629 
    630 	switch (adev->asic_type) {
    631 	case CHIP_ARCTURUS:
    632 		mmhub_v9_4_update_medium_grain_clock_gating(adev,
    633 				state == AMD_CG_STATE_GATE);
    634 		mmhub_v9_4_update_medium_grain_light_sleep(adev,
    635 				state == AMD_CG_STATE_GATE);
    636 		break;
    637 	default:
    638 		break;
    639 	}
    640 
    641 	return 0;
    642 }
    643 
    644 void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags)
    645 {
    646 	int data, data1;
    647 
    648 	if (amdgpu_sriov_vf(adev))
    649 		*flags = 0;
    650 
    651 	/* AMD_CG_SUPPORT_MC_MGCG */
    652 	data = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG);
    653 
    654 	data1 = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG);
    655 
    656 	if ((data & ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK) &&
    657 	    !(data1 & (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
    658 		       DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
    659 		       DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
    660 		       DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
    661 		       DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
    662 		       DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK)))
    663 		*flags |= AMD_CG_SUPPORT_MC_MGCG;
    664 
    665 	/* AMD_CG_SUPPORT_MC_LS */
    666 	if (data & ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK)
    667 		*flags |= AMD_CG_SUPPORT_MC_LS;
    668 }
    669 
    670 static const struct soc15_ras_field_entry mmhub_v9_4_ras_fields[] = {
    671 	/* MMHUB Range 0 */
    672 	{ "MMEA0_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    673 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
    674 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
    675 	},
    676 	{ "MMEA0_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    677 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
    678 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
    679 	},
    680 	{ "MMEA0_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    681 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
    682 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
    683 	},
    684 	{ "MMEA0_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    685 	SOC15_REG_FIELD(MMEA0_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
    686 	SOC15_REG_FIELD(MMEA0_EDC_CNT, RRET_TAGMEM_DED_COUNT),
    687 	},
    688 	{ "MMEA0_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    689 	SOC15_REG_FIELD(MMEA0_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
    690 	SOC15_REG_FIELD(MMEA0_EDC_CNT, WRET_TAGMEM_DED_COUNT),
    691 	},
    692 	{ "MMEA0_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    693 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
    694 	0, 0,
    695 	},
    696 	{ "MMEA0_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    697 	SOC15_REG_FIELD(MMEA0_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
    698 	0, 0,
    699 	},
    700 	{ "MMEA0_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    701 	SOC15_REG_FIELD(MMEA0_EDC_CNT, IORD_CMDMEM_SED_COUNT),
    702 	0, 0,
    703 	},
    704 	{ "MMEA0_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    705 	SOC15_REG_FIELD(MMEA0_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
    706 	0, 0,
    707 	},
    708 	{ "MMEA0_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT),
    709 	SOC15_REG_FIELD(MMEA0_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
    710 	0, 0,
    711 	},
    712 	{ "MMEA0_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    713 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
    714 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
    715 	},
    716 	{ "MMEA0_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    717 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
    718 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
    719 	},
    720 	{ "MMEA0_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    721 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
    722 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
    723 	},
    724 	{ "MMEA0_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    725 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
    726 	0, 0,
    727 	},
    728 	{ "MMEA0_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    729 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
    730 	0, 0,
    731 	},
    732 	{ "MMEA0_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    733 	0, 0,
    734 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
    735 	},
    736 	{ "MMEA0_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    737 	0, 0,
    738 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
    739 	},
    740 	{ "MMEA0_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    741 	0, 0,
    742 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
    743 	},
    744 	{ "MMEA0_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    745 	0, 0,
    746 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
    747 	},
    748 	{ "MMEA0_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    749 	0, 0,
    750 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
    751 	},
    752 	{ "MMEA0_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    753 	0, 0,
    754 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
    755 	},
    756 	{ "MMEA0_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3),
    757 	0, 0,
    758 	SOC15_REG_FIELD(MMEA0_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
    759 	},
    760 	{ "MMEA0_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    761 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D0MEM_SED_COUNT),
    762 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D0MEM_DED_COUNT),
    763 	},
    764 	{ "MMEA0_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    765 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D1MEM_SED_COUNT),
    766 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D1MEM_DED_COUNT),
    767 	},
    768 	{ "MMEA0_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    769 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D2MEM_SED_COUNT),
    770 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D2MEM_DED_COUNT),
    771 	},
    772 	{ "MMEA0_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2),
    773 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D3MEM_SED_COUNT),
    774 	SOC15_REG_FIELD(MMEA0_EDC_CNT2, MAM_D3MEM_DED_COUNT),
    775 	},
    776 
    777 	/* MMHUB Range 1 */
    778 	{ "MMEA1_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    779 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
    780 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
    781 	},
    782 	{ "MMEA1_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    783 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
    784 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
    785 	},
    786 	{ "MMEA1_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    787 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
    788 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
    789 	},
    790 	{ "MMEA1_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    791 	SOC15_REG_FIELD(MMEA1_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
    792 	SOC15_REG_FIELD(MMEA1_EDC_CNT, RRET_TAGMEM_DED_COUNT),
    793 	},
    794 	{ "MMEA1_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    795 	SOC15_REG_FIELD(MMEA1_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
    796 	SOC15_REG_FIELD(MMEA1_EDC_CNT, WRET_TAGMEM_DED_COUNT),
    797 	},
    798 	{ "MMEA1_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    799 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
    800 	0, 0,
    801 	},
    802 	{ "MMEA1_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    803 	SOC15_REG_FIELD(MMEA1_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
    804 	0, 0,
    805 	},
    806 	{ "MMEA1_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    807 	SOC15_REG_FIELD(MMEA1_EDC_CNT, IORD_CMDMEM_SED_COUNT),
    808 	0, 0,
    809 	},
    810 	{ "MMEA1_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    811 	SOC15_REG_FIELD(MMEA1_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
    812 	0, 0,
    813 	},
    814 	{ "MMEA1_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT),
    815 	SOC15_REG_FIELD(MMEA1_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
    816 	0, 0,
    817 	},
    818 	{ "MMEA1_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    819 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
    820 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
    821 	},
    822 	{ "MMEA1_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    823 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
    824 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
    825 	},
    826 	{ "MMEA1_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    827 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
    828 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
    829 	},
    830 	{ "MMEA1_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    831 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
    832 	0, 0,
    833 	},
    834 	{ "MMEA1_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    835 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
    836 	0, 0,
    837 	},
    838 	{ "MMEA1_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    839 	0, 0,
    840 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
    841 	},
    842 	{ "MMEA1_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    843 	0, 0,
    844 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
    845 	},
    846 	{ "MMEA1_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    847 	0, 0,
    848 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
    849 	},
    850 	{ "MMEA1_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    851 	0, 0,
    852 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
    853 	},
    854 	{ "MMEA1_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    855 	0, 0,
    856 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
    857 	},
    858 	{ "MMEA1_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    859 	0, 0,
    860 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
    861 	},
    862 	{ "MMEA1_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3),
    863 	0, 0,
    864 	SOC15_REG_FIELD(MMEA1_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
    865 	},
    866 	{ "MMEA1_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    867 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D0MEM_SED_COUNT),
    868 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D0MEM_DED_COUNT),
    869 	},
    870 	{ "MMEA1_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    871 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D1MEM_SED_COUNT),
    872 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D1MEM_DED_COUNT),
    873 	},
    874 	{ "MMEA1_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    875 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D2MEM_SED_COUNT),
    876 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D2MEM_DED_COUNT),
    877 	},
    878 	{ "MMEA1_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2),
    879 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D3MEM_SED_COUNT),
    880 	SOC15_REG_FIELD(MMEA1_EDC_CNT2, MAM_D3MEM_DED_COUNT),
    881 	},
    882 
    883 	/* MMHAB Range 2*/
    884 	{ "MMEA2_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    885 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
    886 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
    887 	},
    888 	{ "MMEA2_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    889 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
    890 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
    891 	},
    892 	{ "MMEA2_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    893 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
    894 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
    895 	},
    896 	{ "MMEA2_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    897 	SOC15_REG_FIELD(MMEA2_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
    898 	SOC15_REG_FIELD(MMEA2_EDC_CNT, RRET_TAGMEM_DED_COUNT),
    899 	},
    900 	{ "MMEA2_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    901 	SOC15_REG_FIELD(MMEA2_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
    902 	SOC15_REG_FIELD(MMEA2_EDC_CNT, WRET_TAGMEM_DED_COUNT),
    903 	},
    904 	{ "MMEA2_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    905 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
    906 	0, 0,
    907 	},
    908 	{ "MMEA2_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    909 	SOC15_REG_FIELD(MMEA2_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
    910 	0, 0,
    911 	},
    912 	{ "MMEA2_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    913 	SOC15_REG_FIELD(MMEA2_EDC_CNT, IORD_CMDMEM_SED_COUNT),
    914 	0, 0,
    915 	},
    916 	{ "MMEA2_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    917 	SOC15_REG_FIELD(MMEA2_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
    918 	0, 0,
    919 	},
    920 	{ "MMEA2_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT),
    921 	SOC15_REG_FIELD(MMEA2_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
    922 	0, 0,
    923 	},
    924 	{ "MMEA2_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    925 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
    926 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
    927 	},
    928 	{ "MMEA2_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    929 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
    930 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
    931 	},
    932 	{ "MMEA2_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    933 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
    934 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
    935 	},
    936 	{ "MMEA2_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    937 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
    938 	0, 0,
    939 	},
    940 	{ "MMEA2_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    941 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
    942 	0, 0,
    943 	},
    944 	{ "MMEA2_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    945 	0, 0,
    946 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
    947 	},
    948 	{ "MMEA2_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    949 	0, 0,
    950 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
    951 	},
    952 	{ "MMEA2_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    953 	0, 0,
    954 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
    955 	},
    956 	{ "MMEA2_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    957 	0, 0,
    958 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
    959 	},
    960 	{ "MMEA2_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    961 	0, 0,
    962 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
    963 	},
    964 	{ "MMEA2_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    965 	0, 0,
    966 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
    967 	},
    968 	{ "MMEA2_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3),
    969 	0, 0,
    970 	SOC15_REG_FIELD(MMEA2_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
    971 	},
    972 	{ "MMEA2_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    973 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D0MEM_SED_COUNT),
    974 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D0MEM_DED_COUNT),
    975 	},
    976 	{ "MMEA2_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    977 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D1MEM_SED_COUNT),
    978 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D1MEM_DED_COUNT),
    979 	},
    980 	{ "MMEA2_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    981 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D2MEM_SED_COUNT),
    982 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D2MEM_DED_COUNT),
    983 	},
    984 	{ "MMEA2_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2),
    985 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D3MEM_SED_COUNT),
    986 	SOC15_REG_FIELD(MMEA2_EDC_CNT2, MAM_D3MEM_DED_COUNT),
    987 	},
    988 
    989 	/* MMHUB Rang 3 */
    990 	{ "MMEA3_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
    991 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
    992 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
    993 	},
    994 	{ "MMEA3_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
    995 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
    996 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
    997 	},
    998 	{ "MMEA3_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
    999 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
   1000 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
   1001 	},
   1002 	{ "MMEA3_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1003 	SOC15_REG_FIELD(MMEA3_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
   1004 	SOC15_REG_FIELD(MMEA3_EDC_CNT, RRET_TAGMEM_DED_COUNT),
   1005 	},
   1006 	{ "MMEA3_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1007 	SOC15_REG_FIELD(MMEA3_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
   1008 	SOC15_REG_FIELD(MMEA3_EDC_CNT, WRET_TAGMEM_DED_COUNT),
   1009 	},
   1010 	{ "MMEA3_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1011 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
   1012 	0, 0,
   1013 	},
   1014 	{ "MMEA3_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1015 	SOC15_REG_FIELD(MMEA3_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
   1016 	0, 0,
   1017 	},
   1018 	{ "MMEA3_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1019 	SOC15_REG_FIELD(MMEA3_EDC_CNT, IORD_CMDMEM_SED_COUNT),
   1020 	0, 0,
   1021 	},
   1022 	{ "MMEA3_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1023 	SOC15_REG_FIELD(MMEA3_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
   1024 	0, 0,
   1025 	},
   1026 	{ "MMEA3_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT),
   1027 	SOC15_REG_FIELD(MMEA3_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
   1028 	0, 0,
   1029 	},
   1030 	{ "MMEA3_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1031 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
   1032 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
   1033 	},
   1034 	{ "MMEA3_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1035 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
   1036 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
   1037 	},
   1038 	{ "MMEA3_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1039 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
   1040 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
   1041 	},
   1042 	{ "MMEA3_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1043 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
   1044 	0, 0,
   1045 	},
   1046 	{ "MMEA3_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1047 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
   1048 	0, 0,
   1049 	},
   1050 	{ "MMEA3_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1051 	0, 0,
   1052 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
   1053 	},
   1054 	{ "MMEA3_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1055 	0, 0,
   1056 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
   1057 	},
   1058 	{ "MMEA3_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1059 	0, 0,
   1060 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
   1061 	},
   1062 	{ "MMEA3_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1063 	0, 0,
   1064 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
   1065 	},
   1066 	{ "MMEA3_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1067 	0, 0,
   1068 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
   1069 	},
   1070 	{ "MMEA3_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1071 	0, 0,
   1072 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
   1073 	},
   1074 	{ "MMEA3_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3),
   1075 	0, 0,
   1076 	SOC15_REG_FIELD(MMEA3_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
   1077 	},
   1078 	{ "MMEA3_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1079 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D0MEM_SED_COUNT),
   1080 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D0MEM_DED_COUNT),
   1081 	},
   1082 	{ "MMEA3_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1083 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D1MEM_SED_COUNT),
   1084 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D1MEM_DED_COUNT),
   1085 	},
   1086 	{ "MMEA3_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1087 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D2MEM_SED_COUNT),
   1088 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D2MEM_DED_COUNT),
   1089 	},
   1090 	{ "MMEA3_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2),
   1091 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D3MEM_SED_COUNT),
   1092 	SOC15_REG_FIELD(MMEA3_EDC_CNT2, MAM_D3MEM_DED_COUNT),
   1093 	},
   1094 
   1095 	/* MMHUB Range 4 */
   1096 	{ "MMEA4_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1097 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
   1098 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
   1099 	},
   1100 	{ "MMEA4_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1101 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
   1102 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
   1103 	},
   1104 	{ "MMEA4_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1105 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
   1106 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
   1107 	},
   1108 	{ "MMEA4_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1109 	SOC15_REG_FIELD(MMEA4_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
   1110 	SOC15_REG_FIELD(MMEA4_EDC_CNT, RRET_TAGMEM_DED_COUNT),
   1111 	},
   1112 	{ "MMEA4_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1113 	SOC15_REG_FIELD(MMEA4_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
   1114 	SOC15_REG_FIELD(MMEA4_EDC_CNT, WRET_TAGMEM_DED_COUNT),
   1115 	},
   1116 	{ "MMEA4_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1117 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
   1118 	0, 0,
   1119 	},
   1120 	{ "MMEA4_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1121 	SOC15_REG_FIELD(MMEA4_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
   1122 	0, 0,
   1123 	},
   1124 	{ "MMEA4_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1125 	SOC15_REG_FIELD(MMEA4_EDC_CNT, IORD_CMDMEM_SED_COUNT),
   1126 	0, 0,
   1127 	},
   1128 	{ "MMEA4_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1129 	SOC15_REG_FIELD(MMEA4_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
   1130 	0, 0,
   1131 	},
   1132 	{ "MMEA4_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT),
   1133 	SOC15_REG_FIELD(MMEA4_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
   1134 	0, 0,
   1135 	},
   1136 	{ "MMEA4_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1137 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
   1138 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
   1139 	},
   1140 	{ "MMEA4_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1141 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
   1142 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
   1143 	},
   1144 	{ "MMEA4_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1145 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
   1146 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
   1147 	},
   1148 	{ "MMEA4_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1149 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
   1150 	0, 0,
   1151 	},
   1152 	{ "MMEA4_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1153 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
   1154 	0, 0,
   1155 	},
   1156 	{ "MMEA4_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1157 	0, 0,
   1158 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
   1159 	},
   1160 	{ "MMEA4_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1161 	0, 0,
   1162 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
   1163 	},
   1164 	{ "MMEA4_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1165 	0, 0,
   1166 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
   1167 	},
   1168 	{ "MMEA4_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1169 	0, 0,
   1170 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
   1171 	},
   1172 	{ "MMEA4_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1173 	0, 0,
   1174 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
   1175 	},
   1176 	{ "MMEA4_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1177 	0, 0,
   1178 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
   1179 	},
   1180 	{ "MMEA4_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3),
   1181 	0, 0,
   1182 	SOC15_REG_FIELD(MMEA4_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
   1183 	},
   1184 	{ "MMEA4_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1185 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D0MEM_SED_COUNT),
   1186 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D0MEM_DED_COUNT),
   1187 	},
   1188 	{ "MMEA4_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1189 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D1MEM_SED_COUNT),
   1190 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D1MEM_DED_COUNT),
   1191 	},
   1192 	{ "MMEA4_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1193 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D2MEM_SED_COUNT),
   1194 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D2MEM_DED_COUNT),
   1195 	},
   1196 	{ "MMEA4_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2),
   1197 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D3MEM_SED_COUNT),
   1198 	SOC15_REG_FIELD(MMEA4_EDC_CNT2, MAM_D3MEM_DED_COUNT),
   1199 	},
   1200 
   1201 	/* MMHUAB Range 5 */
   1202 	{ "MMEA5_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1203 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
   1204 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
   1205 	},
   1206 	{ "MMEA5_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1207 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
   1208 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
   1209 	},
   1210 	{ "MMEA5_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1211 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
   1212 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
   1213 	},
   1214 	{ "MMEA5_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1215 	SOC15_REG_FIELD(MMEA5_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
   1216 	SOC15_REG_FIELD(MMEA5_EDC_CNT, RRET_TAGMEM_DED_COUNT),
   1217 	},
   1218 	{ "MMEA5_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1219 	SOC15_REG_FIELD(MMEA5_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
   1220 	SOC15_REG_FIELD(MMEA5_EDC_CNT, WRET_TAGMEM_DED_COUNT),
   1221 	},
   1222 	{ "MMEA5_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1223 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
   1224 	0, 0,
   1225 	},
   1226 	{ "MMEA5_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1227 	SOC15_REG_FIELD(MMEA5_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
   1228 	0, 0,
   1229 	},
   1230 	{ "MMEA5_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1231 	SOC15_REG_FIELD(MMEA5_EDC_CNT, IORD_CMDMEM_SED_COUNT),
   1232 	0, 0,
   1233 	},
   1234 	{ "MMEA5_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1235 	SOC15_REG_FIELD(MMEA5_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
   1236 	0, 0,
   1237 	},
   1238 	{ "MMEA5_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT),
   1239 	SOC15_REG_FIELD(MMEA5_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
   1240 	0, 0,
   1241 	},
   1242 	{ "MMEA5_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1243 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
   1244 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
   1245 	},
   1246 	{ "MMEA5_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1247 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
   1248 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
   1249 	},
   1250 	{ "MMEA5_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1251 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
   1252 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
   1253 	},
   1254 	{ "MMEA5_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1255 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
   1256 	0, 0,
   1257 	},
   1258 	{ "MMEA5_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1259 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
   1260 	0, 0,
   1261 	},
   1262 	{ "MMEA5_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1263 	0, 0,
   1264 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
   1265 	},
   1266 	{ "MMEA5_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1267 	0, 0,
   1268 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
   1269 	},
   1270 	{ "MMEA5_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1271 	0, 0,
   1272 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
   1273 	},
   1274 	{ "MMEA5_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1275 	0, 0,
   1276 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
   1277 	},
   1278 	{ "MMEA5_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1279 	0, 0,
   1280 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
   1281 	},
   1282 	{ "MMEA5_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1283 	0, 0,
   1284 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
   1285 	},
   1286 	{ "MMEA5_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3),
   1287 	0, 0,
   1288 	SOC15_REG_FIELD(MMEA5_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
   1289 	},
   1290 	{ "MMEA5_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1291 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D0MEM_SED_COUNT),
   1292 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D0MEM_DED_COUNT),
   1293 	},
   1294 	{ "MMEA5_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1295 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D1MEM_SED_COUNT),
   1296 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D1MEM_DED_COUNT),
   1297 	},
   1298 	{ "MMEA5_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1299 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D2MEM_SED_COUNT),
   1300 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D2MEM_DED_COUNT),
   1301 	},
   1302 	{ "MMEA5_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2),
   1303 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D3MEM_SED_COUNT),
   1304 	SOC15_REG_FIELD(MMEA5_EDC_CNT2, MAM_D3MEM_DED_COUNT),
   1305 	},
   1306 
   1307 	/* MMHUB Range 6 */
   1308 	{ "MMEA6_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1309 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
   1310 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
   1311 	},
   1312 	{ "MMEA6_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1313 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
   1314 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
   1315 	},
   1316 	{ "MMEA6_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1317 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
   1318 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
   1319 	},
   1320 	{ "MMEA6_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1321 	SOC15_REG_FIELD(MMEA6_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
   1322 	SOC15_REG_FIELD(MMEA6_EDC_CNT, RRET_TAGMEM_DED_COUNT),
   1323 	},
   1324 	{ "MMEA6_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1325 	SOC15_REG_FIELD(MMEA6_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
   1326 	SOC15_REG_FIELD(MMEA6_EDC_CNT, WRET_TAGMEM_DED_COUNT),
   1327 	},
   1328 	{ "MMEA6_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1329 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
   1330 	0, 0,
   1331 	},
   1332 	{ "MMEA6_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1333 	SOC15_REG_FIELD(MMEA6_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
   1334 	0, 0,
   1335 	},
   1336 	{ "MMEA6_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1337 	SOC15_REG_FIELD(MMEA6_EDC_CNT, IORD_CMDMEM_SED_COUNT),
   1338 	0, 0,
   1339 	},
   1340 	{ "MMEA6_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1341 	SOC15_REG_FIELD(MMEA6_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
   1342 	0, 0,
   1343 	},
   1344 	{ "MMEA6_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT),
   1345 	SOC15_REG_FIELD(MMEA6_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
   1346 	0, 0,
   1347 	},
   1348 	{ "MMEA6_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1349 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
   1350 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
   1351 	},
   1352 	{ "MMEA6_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1353 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
   1354 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
   1355 	},
   1356 	{ "MMEA6_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1357 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
   1358 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
   1359 	},
   1360 	{ "MMEA6_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1361 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
   1362 	0, 0,
   1363 	},
   1364 	{ "MMEA6_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1365 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
   1366 	0, 0,
   1367 	},
   1368 	{ "MMEA6_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1369 	0, 0,
   1370 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
   1371 	},
   1372 	{ "MMEA6_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1373 	0, 0,
   1374 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
   1375 	},
   1376 	{ "MMEA6_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1377 	0, 0,
   1378 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
   1379 	},
   1380 	{ "MMEA6_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1381 	0, 0,
   1382 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
   1383 	},
   1384 	{ "MMEA6_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1385 	0, 0,
   1386 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
   1387 	},
   1388 	{ "MMEA6_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1389 	0, 0,
   1390 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
   1391 	},
   1392 	{ "MMEA6_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3),
   1393 	0, 0,
   1394 	SOC15_REG_FIELD(MMEA6_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
   1395 	},
   1396 	{ "MMEA6_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1397 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D0MEM_SED_COUNT),
   1398 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D0MEM_DED_COUNT),
   1399 	},
   1400 	{ "MMEA6_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1401 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D1MEM_SED_COUNT),
   1402 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D1MEM_DED_COUNT),
   1403 	},
   1404 	{ "MMEA6_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1405 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D2MEM_SED_COUNT),
   1406 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D2MEM_DED_COUNT),
   1407 	},
   1408 	{ "MMEA6_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2),
   1409 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D3MEM_SED_COUNT),
   1410 	SOC15_REG_FIELD(MMEA6_EDC_CNT2, MAM_D3MEM_DED_COUNT),
   1411 	},
   1412 
   1413 	/* MMHUB Range 7*/
   1414 	{ "MMEA7_DRAMRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1415 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMRD_CMDMEM_SEC_COUNT),
   1416 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMRD_CMDMEM_DED_COUNT),
   1417 	},
   1418 	{ "MMEA7_DRAMWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1419 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMWR_CMDMEM_SEC_COUNT),
   1420 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMWR_CMDMEM_DED_COUNT),
   1421 	},
   1422 	{ "MMEA7_DRAMWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1423 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMWR_DATAMEM_SEC_COUNT),
   1424 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMWR_DATAMEM_DED_COUNT),
   1425 	},
   1426 	{ "MMEA7_RRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1427 	SOC15_REG_FIELD(MMEA7_EDC_CNT, RRET_TAGMEM_SEC_COUNT),
   1428 	SOC15_REG_FIELD(MMEA7_EDC_CNT, RRET_TAGMEM_DED_COUNT),
   1429 	},
   1430 	{ "MMEA7_WRET_TAGMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1431 	SOC15_REG_FIELD(MMEA7_EDC_CNT, WRET_TAGMEM_SEC_COUNT),
   1432 	SOC15_REG_FIELD(MMEA7_EDC_CNT, WRET_TAGMEM_DED_COUNT),
   1433 	},
   1434 	{ "MMEA7_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1435 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMRD_PAGEMEM_SED_COUNT),
   1436 	0, 0,
   1437 	},
   1438 	{ "MMEA7_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1439 	SOC15_REG_FIELD(MMEA7_EDC_CNT, DRAMWR_PAGEMEM_SED_COUNT),
   1440 	0, 0,
   1441 	},
   1442 	{ "MMEA7_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1443 	SOC15_REG_FIELD(MMEA7_EDC_CNT, IORD_CMDMEM_SED_COUNT),
   1444 	0, 0,
   1445 	},
   1446 	{ "MMEA7_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1447 	SOC15_REG_FIELD(MMEA7_EDC_CNT, IOWR_CMDMEM_SED_COUNT),
   1448 	0, 0,
   1449 	},
   1450 	{ "MMEA7_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT),
   1451 	SOC15_REG_FIELD(MMEA7_EDC_CNT, IOWR_DATAMEM_SED_COUNT),
   1452 	0, 0,
   1453 	},
   1454 	{ "MMEA7_GMIRD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1455 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIRD_CMDMEM_SEC_COUNT),
   1456 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIRD_CMDMEM_DED_COUNT),
   1457 	},
   1458 	{ "MMEA7_GMIWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1459 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIWR_CMDMEM_SEC_COUNT),
   1460 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIWR_CMDMEM_DED_COUNT),
   1461 	},
   1462 	{ "MMEA7_GMIWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1463 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIWR_DATAMEM_SEC_COUNT),
   1464 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIWR_DATAMEM_DED_COUNT),
   1465 	},
   1466 	{ "MMEA7_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1467 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIRD_PAGEMEM_SED_COUNT),
   1468 	0, 0,
   1469 	},
   1470 	{ "MMEA7_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1471 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, GMIWR_PAGEMEM_SED_COUNT),
   1472 	0, 0,
   1473 	},
   1474 	{ "MMEA7_DRAMRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1475 	0, 0,
   1476 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, DRAMRD_PAGEMEM_DED_COUNT),
   1477 	},
   1478 	{ "MMEA7_DRAMWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1479 	0, 0,
   1480 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, DRAMWR_PAGEMEM_DED_COUNT),
   1481 	},
   1482 	{ "MMEA7_IORD_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1483 	0, 0,
   1484 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, IORD_CMDMEM_DED_COUNT),
   1485 	},
   1486 	{ "MMEA7_IOWR_CMDMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1487 	0, 0,
   1488 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, IOWR_CMDMEM_DED_COUNT),
   1489 	},
   1490 	{ "MMEA7_IOWR_DATAMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1491 	0, 0,
   1492 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, IOWR_DATAMEM_DED_COUNT),
   1493 	},
   1494 	{ "MMEA7_GMIRD_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1495 	0, 0,
   1496 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, GMIRD_PAGEMEM_DED_COUNT),
   1497 	},
   1498 	{ "MMEA7_GMIWR_PAGEMEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3),
   1499 	0, 0,
   1500 	SOC15_REG_FIELD(MMEA7_EDC_CNT3, GMIWR_PAGEMEM_DED_COUNT),
   1501 	},
   1502 	{ "MMEA7_MAM_D0MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1503 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D0MEM_SED_COUNT),
   1504 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D0MEM_DED_COUNT),
   1505 	},
   1506 	{ "MMEA7_MAM_D1MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1507 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D1MEM_SED_COUNT),
   1508 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D1MEM_DED_COUNT),
   1509 	},
   1510 	{ "MMEA7_MAM_D2MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1511 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D2MEM_SED_COUNT),
   1512 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D2MEM_DED_COUNT),
   1513 	},
   1514 	{ "MMEA7_MAM_D3MEM", SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2),
   1515 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D3MEM_SED_COUNT),
   1516 	SOC15_REG_FIELD(MMEA7_EDC_CNT2, MAM_D3MEM_DED_COUNT),
   1517 	}
   1518 };
   1519 
   1520 static const struct soc15_reg_entry mmhub_v9_4_edc_cnt_regs[] = {
   1521 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT), 0, 0, 0 },
   1522 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT2), 0, 0, 0 },
   1523 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA0_EDC_CNT3), 0, 0, 0 },
   1524 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT), 0, 0, 0 },
   1525 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2), 0, 0, 0 },
   1526 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT3), 0, 0, 0 },
   1527 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT), 0, 0, 0 },
   1528 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT2), 0, 0, 0 },
   1529 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA2_EDC_CNT3), 0, 0, 0 },
   1530 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT), 0, 0, 0 },
   1531 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT2), 0, 0, 0 },
   1532 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA3_EDC_CNT3), 0, 0, 0 },
   1533 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT), 0, 0, 0 },
   1534 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT2), 0, 0, 0 },
   1535 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA4_EDC_CNT3), 0, 0, 0 },
   1536 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT), 0, 0, 0 },
   1537 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT2), 0, 0, 0 },
   1538 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA5_EDC_CNT3), 0, 0, 0 },
   1539 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT), 0, 0, 0 },
   1540 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT2), 0, 0, 0 },
   1541 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA6_EDC_CNT3), 0, 0, 0 },
   1542 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT), 0, 0, 0 },
   1543 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT2), 0, 0, 0 },
   1544 	{ SOC15_REG_ENTRY(MMHUB, 0, mmMMEA7_EDC_CNT3), 0, 0, 0 },
   1545 };
   1546 
   1547 static int mmhub_v9_4_get_ras_error_count(const struct soc15_reg_entry *reg,
   1548 	uint32_t value, uint32_t *sec_count, uint32_t *ded_count)
   1549 {
   1550 	uint32_t i;
   1551 	uint32_t sec_cnt, ded_cnt;
   1552 
   1553 	for (i = 0; i < ARRAY_SIZE(mmhub_v9_4_ras_fields); i++) {
   1554 		if(mmhub_v9_4_ras_fields[i].reg_offset != reg->reg_offset)
   1555 			continue;
   1556 
   1557 		sec_cnt = (value &
   1558 				mmhub_v9_4_ras_fields[i].sec_count_mask) >>
   1559 				mmhub_v9_4_ras_fields[i].sec_count_shift;
   1560 		if (sec_cnt) {
   1561 			DRM_INFO("MMHUB SubBlock %s, SEC %d\n",
   1562 				mmhub_v9_4_ras_fields[i].name,
   1563 				sec_cnt);
   1564 			*sec_count += sec_cnt;
   1565 		}
   1566 
   1567 		ded_cnt = (value &
   1568 				mmhub_v9_4_ras_fields[i].ded_count_mask) >>
   1569 				mmhub_v9_4_ras_fields[i].ded_count_shift;
   1570 		if (ded_cnt) {
   1571 			DRM_INFO("MMHUB SubBlock %s, DED %d\n",
   1572 				mmhub_v9_4_ras_fields[i].name,
   1573 				ded_cnt);
   1574 			*ded_count += ded_cnt;
   1575 		}
   1576 	}
   1577 
   1578 	return 0;
   1579 }
   1580 
   1581 static void mmhub_v9_4_query_ras_error_count(struct amdgpu_device *adev,
   1582 					   void *ras_error_status)
   1583 {
   1584 	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
   1585 	uint32_t sec_count = 0, ded_count = 0;
   1586 	uint32_t i;
   1587 	uint32_t reg_value;
   1588 
   1589 	err_data->ue_count = 0;
   1590 	err_data->ce_count = 0;
   1591 
   1592 	for (i = 0; i < ARRAY_SIZE(mmhub_v9_4_edc_cnt_regs); i++) {
   1593 		reg_value =
   1594 			RREG32(SOC15_REG_ENTRY_OFFSET(mmhub_v9_4_edc_cnt_regs[i]));
   1595 		if (reg_value)
   1596 			mmhub_v9_4_get_ras_error_count(&mmhub_v9_4_edc_cnt_regs[i],
   1597 				reg_value, &sec_count, &ded_count);
   1598 	}
   1599 
   1600 	err_data->ce_count += sec_count;
   1601 	err_data->ue_count += ded_count;
   1602 }
   1603 
   1604 const struct amdgpu_mmhub_funcs mmhub_v9_4_funcs = {
   1605 	.ras_late_init = amdgpu_mmhub_ras_late_init,
   1606 	.query_ras_error_count = mmhub_v9_4_query_ras_error_count,
   1607 };
   1608