diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
463 files changed, 44589 insertions, 7721 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig index 12adca8c7819..b91e79c721e2 100644 --- a/drivers/gpu/drm/amd/amdgpu/Kconfig +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig @@ -69,6 +69,16 @@ config DRM_AMDGPU_USERPTR  	  This option selects CONFIG_HMM and CONFIG_HMM_MIRROR if it  	  isn't already selected to enabled full userptr support. +config DRM_AMDGPU_WERROR +	bool "Force the compiler to throw an error instead of a warning when compiling" +	depends on DRM_AMDGPU +	depends on EXPERT +	depends on !COMPILE_TEST +	default n +	help +	  Add -Werror to the build flags for amdgpu.ko. +	  Only enable this if you are warning code for amdgpu.ko. +  source "drivers/gpu/drm/amd/acp/Kconfig"  source "drivers/gpu/drm/amd/display/Kconfig"  source "drivers/gpu/drm/amd/amdkfd/Kconfig" diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index 415a7fa395c4..86b833085f19 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -39,6 +39,15 @@ ccflags-y := -I$(FULL_AMD_PATH)/include/asic_reg \  	-I$(FULL_AMD_DISPLAY_PATH)/amdgpu_dm \  	-I$(FULL_AMD_PATH)/amdkfd +subdir-ccflags-y := -Wextra +subdir-ccflags-y += $(call cc-option, -Wunused-but-set-variable) +subdir-ccflags-y += -Wno-unused-parameter +subdir-ccflags-y += -Wno-type-limits +subdir-ccflags-y += -Wno-sign-compare +subdir-ccflags-y += -Wno-missing-field-initializers +subdir-ccflags-y += -Wno-override-init +subdir-ccflags-$(CONFIG_DRM_AMDGPU_WERROR) += -Werror +  amdgpu-y := amdgpu_drv.o  # add KMS driver @@ -60,7 +69,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \  	amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o amdgpu_rap.o \  	amdgpu_fw_attestation.o amdgpu_securedisplay.o \  	amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o amdgpu_lsdma.o \ -	amdgpu_ring_mux.o +	amdgpu_ring_mux.o amdgpu_xcp.o  amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o @@ -78,7 +87,7 @@ amdgpu-y += \  	vega20_reg_init.o nbio_v7_4.o nbio_v2_3.o nv.o arct_reg_init.o mxgpu_nv.o \  	nbio_v7_2.o hdp_v4_0.o hdp_v5_0.o aldebaran_reg_init.o aldebaran.o soc21.o \  	sienna_cichlid.o smu_v13_0_10.o nbio_v4_3.o hdp_v6_0.o nbio_v7_7.o hdp_v5_2.o lsdma_v6_0.o \ -	nbio_v7_9.o +	nbio_v7_9.o aqua_vanjaram_reg_init.o  # add DF block  amdgpu-y += \ @@ -183,12 +192,14 @@ amdgpu-y += \  	vcn_v2_5.o \  	vcn_v3_0.o \  	vcn_v4_0.o \ +	vcn_v4_0_3.o \  	amdgpu_jpeg.o \  	jpeg_v1_0.o \  	jpeg_v2_0.o \  	jpeg_v2_5.o \  	jpeg_v3_0.o \ -	jpeg_v4_0.o +	jpeg_v4_0.o \ +	jpeg_v4_0_3.o  # add ATHUB block  amdgpu-y += \ @@ -203,6 +214,7 @@ amdgpu-y += \  	smuio_v11_0.o \  	smuio_v11_0_6.o \  	smuio_v13_0.o \ +	smuio_v13_0_3.o \  	smuio_v13_0_6.o  # add reset block @@ -228,6 +240,7 @@ amdgpu-y += \  	amdgpu_amdkfd_gfx_v9.o \  	amdgpu_amdkfd_arcturus.o \  	amdgpu_amdkfd_aldebaran.o \ +	amdgpu_amdkfd_gc_9_4_3.o \  	amdgpu_amdkfd_gfx_v10.o \  	amdgpu_amdkfd_gfx_v10_3.o \  	amdgpu_amdkfd_gfx_v11.o diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 02b827785e39..a84bd4a0c421 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -107,8 +107,9 @@  #include "amdgpu_fdinfo.h"  #include "amdgpu_mca.h"  #include "amdgpu_ras.h" +#include "amdgpu_xcp.h" -#define MAX_GPU_INSTANCE		16 +#define MAX_GPU_INSTANCE		64  struct amdgpu_gpu_instance  { @@ -212,6 +213,8 @@ extern int amdgpu_noretry;  extern int amdgpu_force_asic_type;  extern int amdgpu_smartshift_bias;  extern int amdgpu_use_xgmi_p2p; +extern int amdgpu_mtype_local; +extern bool enforce_isolation;  #ifdef CONFIG_HSA_AMD  extern int sched_policy;  extern bool debug_evictions; @@ -242,9 +245,10 @@ extern int amdgpu_num_kcq;  extern int amdgpu_vcnfw_log;  extern int amdgpu_sg_display; +extern int amdgpu_user_partt_mode; +  #define AMDGPU_VM_MAX_NUM_CTX			4096  #define AMDGPU_SG_THRESHOLD			(256*1024*1024) -#define AMDGPU_DEFAULT_GTT_SIZE_MB		3072ULL /* 3GB by default */  #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS	        3000  #define AMDGPU_MAX_USEC_TIMEOUT			100000	/* 100 ms */  #define AMDGPU_FENCE_JIFFIES_TIMEOUT		(HZ / 2) @@ -282,6 +286,7 @@ extern int amdgpu_sg_display;  #define AMDGPU_SMARTSHIFT_MAX_BIAS (100)  #define AMDGPU_SMARTSHIFT_MIN_BIAS (-100) +struct amdgpu_xcp_mgr;  struct amdgpu_device;  struct amdgpu_irq_src;  struct amdgpu_fpriv; @@ -463,6 +468,8 @@ struct amdgpu_fpriv {  	struct mutex		bo_list_lock;  	struct idr		bo_list_handles;  	struct amdgpu_ctx_mgr	ctx_mgr; +	/** GPU partition selection */ +	uint32_t		xcp_id;  };  int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv); @@ -573,6 +580,8 @@ struct amdgpu_asic_funcs {  	/* query video codecs */  	int (*query_video_codecs)(struct amdgpu_device *adev, bool encode,  				  const struct amdgpu_video_codecs **codecs); +	/* encode "> 32bits" smn addressing */ +	u64 (*encode_ext_smn_addressing)(int ext_id);  };  /* @@ -607,6 +616,9 @@ void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device);  typedef uint32_t (*amdgpu_rreg_t)(struct amdgpu_device*, uint32_t);  typedef void (*amdgpu_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t); +typedef uint32_t (*amdgpu_rreg_ext_t)(struct amdgpu_device*, uint64_t); +typedef void (*amdgpu_wreg_ext_t)(struct amdgpu_device*, uint64_t, uint32_t); +  typedef uint64_t (*amdgpu_rreg64_t)(struct amdgpu_device*, uint32_t);  typedef void (*amdgpu_wreg64_t)(struct amdgpu_device*, uint32_t, uint64_t); @@ -657,7 +669,7 @@ enum amd_hw_ip_block_type {  	MAX_HWIP  }; -#define HWIP_MAX_INSTANCE	28 +#define HWIP_MAX_INSTANCE	44  #define HW_ID_MAX		300  #define IP_VERSION(mj, mn, rv) (((mj) << 16) | ((mn) << 8) | (rv)) @@ -665,6 +677,17 @@ enum amd_hw_ip_block_type {  #define IP_VERSION_MIN(ver) (((ver) >> 8) & 0xFF)  #define IP_VERSION_REV(ver) ((ver) & 0xFF) +struct amdgpu_ip_map_info { +	/* Map of logical to actual dev instances/mask */ +	uint32_t 		dev_inst[MAX_HWIP][HWIP_MAX_INSTANCE]; +	int8_t (*logical_to_dev_inst)(struct amdgpu_device *adev, +				      enum amd_hw_ip_block_type block, +				      int8_t inst); +	uint32_t (*logical_to_dev_mask)(struct amdgpu_device *adev, +					enum amd_hw_ip_block_type block, +					uint32_t mask); +}; +  struct amd_powerplay {  	void *pp_handle;  	const struct amd_pm_funcs *pp_funcs; @@ -750,6 +773,7 @@ struct amdgpu_device {  	struct amdgpu_acp		acp;  #endif  	struct amdgpu_hive_info *hive; +	struct amdgpu_xcp_mgr *xcp_mgr;  	/* ASIC */  	enum amd_asic_type		asic_type;  	uint32_t			family; @@ -797,6 +821,8 @@ struct amdgpu_device {  	amdgpu_wreg_t			pcie_wreg;  	amdgpu_rreg_t			pciep_rreg;  	amdgpu_wreg_t			pciep_wreg; +	amdgpu_rreg_ext_t		pcie_rreg_ext; +	amdgpu_wreg_ext_t		pcie_wreg_ext;  	amdgpu_rreg64_t			pcie_rreg64;  	amdgpu_wreg64_t			pcie_wreg64;  	/* protects concurrent UVD register access */ @@ -830,7 +856,7 @@ struct amdgpu_device {  	dma_addr_t			dummy_page_addr;  	struct amdgpu_vm_manager	vm_manager;  	struct amdgpu_vmhub             vmhub[AMDGPU_MAX_VMHUBS]; -	unsigned			num_vmhubs; +	DECLARE_BITMAP(vmhubs_mask, AMDGPU_MAX_VMHUBS);  	/* memory management */  	struct amdgpu_mman		mman; @@ -962,6 +988,7 @@ struct amdgpu_device {  	/* soc15 register offset based on ip, instance and  segment */  	uint32_t		*reg_offset[MAX_HWIP][HWIP_MAX_INSTANCE]; +	struct amdgpu_ip_map_info	ip_map;  	/* delayed work_func for deferring clockgating during resume */  	struct delayed_work     delayed_init_work; @@ -1020,6 +1047,9 @@ struct amdgpu_device {  	struct pci_saved_state          *pci_state;  	pci_channel_state_t		pci_channel_state; +	/* Track auto wait count on s_barrier settings */ +	bool				barrier_has_auto_waitcnt; +  	struct amdgpu_reset_control     *reset_cntl;  	uint32_t                        ip_versions[MAX_HWIP][HWIP_MAX_INSTANCE]; @@ -1050,6 +1080,8 @@ struct amdgpu_device {  	bool                            job_hang;  	bool                            dc_enabled; +	/* Mask of active clusters */ +	uint32_t			aid_mask;  };  static inline struct amdgpu_device *drm_to_adev(struct drm_device *ddev) @@ -1081,11 +1113,18 @@ size_t amdgpu_device_aper_access(struct amdgpu_device *adev, loff_t pos,  void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,  			       void *buf, size_t size, bool write); +uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev, +			    uint32_t inst, uint32_t reg_addr, char reg_name[], +			    uint32_t expected_value, uint32_t mask);  uint32_t amdgpu_device_rreg(struct amdgpu_device *adev,  			    uint32_t reg, uint32_t acc_flags); +u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, +				    u64 reg_addr);  void amdgpu_device_wreg(struct amdgpu_device *adev,  			uint32_t reg, uint32_t v,  			uint32_t acc_flags); +void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev, +				     u64 reg_addr, u32 reg_data);  void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev,  			     uint32_t reg, uint32_t v);  void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value); @@ -1137,6 +1176,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define WREG32_PCIE(reg, v) adev->pcie_wreg(adev, (reg), (v))  #define RREG32_PCIE_PORT(reg) adev->pciep_rreg(adev, (reg))  #define WREG32_PCIE_PORT(reg, v) adev->pciep_wreg(adev, (reg), (v)) +#define RREG32_PCIE_EXT(reg) adev->pcie_rreg_ext(adev, (reg)) +#define WREG32_PCIE_EXT(reg, v) adev->pcie_wreg_ext(adev, (reg), (v))  #define RREG64_PCIE(reg) adev->pcie_rreg64(adev, (reg))  #define WREG64_PCIE(reg, v) adev->pcie_wreg64(adev, (reg), (v))  #define RREG32_SMC(reg) adev->smc_rreg(adev, (reg)) @@ -1204,7 +1245,8 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  /*   * ASICs macro.   */ -#define amdgpu_asic_set_vga_state(adev, state) (adev)->asic_funcs->set_vga_state((adev), (state)) +#define amdgpu_asic_set_vga_state(adev, state) \ +    ((adev)->asic_funcs->set_vga_state ? (adev)->asic_funcs->set_vga_state((adev), (state)) : 0)  #define amdgpu_asic_reset(adev) (adev)->asic_funcs->reset((adev))  #define amdgpu_asic_reset_method(adev) (adev)->asic_funcs->reset_method((adev))  #define amdgpu_asic_get_xclk(adev) (adev)->asic_funcs->get_xclk((adev)) @@ -1235,6 +1277,10 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  #define amdgpu_inc_vram_lost(adev) atomic_inc(&((adev)->vram_lost_counter)); +#define for_each_inst(i, inst_mask)                                            \ +	for (i = ffs(inst_mask) - 1; inst_mask;                                \ +	     inst_mask &= ~(1U << i), i = ffs(inst_mask) - 1) +  #define MIN(X, Y) ((X) < (Y) ? (X) : (Y))  /* Common functions */ @@ -1348,6 +1394,12 @@ struct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock);  /* amdgpu_acpi.c */ +struct amdgpu_numa_info { +	uint64_t size; +	int pxm; +	int nid; +}; +  /* ATCS Device/Driver State */  #define AMDGPU_ATCS_PSC_DEV_STATE_D0		0  #define AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT	3 @@ -1365,15 +1417,32 @@ int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,  				    u8 dev_state, bool drv_state);  int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state);  int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev); +int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset, +			     u64 *tmr_size); +int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, int xcc_id, +			     struct amdgpu_numa_info *numa_info);  void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps);  bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev);  void amdgpu_acpi_detect(void); +void amdgpu_acpi_release(void);  #else  static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; } +static inline int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, +					   u64 *tmr_offset, u64 *tmr_size) +{ +	return -EINVAL; +} +static inline int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, +					   int xcc_id, +					   struct amdgpu_numa_info *numa_info) +{ +	return -EINVAL; +}  static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { }  static inline bool amdgpu_acpi_should_gpu_reset(struct amdgpu_device *adev) { return false; }  static inline void amdgpu_acpi_detect(void) { } +static inline void amdgpu_acpi_release(void) { }  static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; }  static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev,  						  u8 dev_state, bool drv_state) { return 0; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c index aeeec211861c..385c6acb5728 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c @@ -26,6 +26,7 @@  #include <linux/acpi.h>  #include <linux/backlight.h>  #include <linux/slab.h> +#include <linux/xarray.h>  #include <linux/power_supply.h>  #include <linux/pm_runtime.h>  #include <linux/suspend.h> @@ -38,6 +39,45 @@  #include "amd_acpi.h"  #include "atom.h" +/* Declare GUID for AMD _DSM method for XCCs */ +static const guid_t amd_xcc_dsm_guid = GUID_INIT(0x8267f5d5, 0xa556, 0x44f2, +						 0xb8, 0xb4, 0x45, 0x56, 0x2e, +						 0x8c, 0x5b, 0xec); + +#define AMD_XCC_HID_START 3000 +#define AMD_XCC_DSM_GET_NUM_FUNCS 0 +#define AMD_XCC_DSM_GET_SUPP_MODE 1 +#define AMD_XCC_DSM_GET_XCP_MODE 2 +#define AMD_XCC_DSM_GET_VF_XCC_MAPPING 4 +#define AMD_XCC_DSM_GET_TMR_INFO 5 +#define AMD_XCC_DSM_NUM_FUNCS 5 + +#define AMD_XCC_MAX_HID 24 + +struct xarray numa_info_xa; + +/* Encapsulates the XCD acpi object information */ +struct amdgpu_acpi_xcc_info { +	struct list_head list; +	struct amdgpu_numa_info *numa_info; +	uint8_t xcp_node; +	uint8_t phy_id; +	acpi_handle handle; +}; + +struct amdgpu_acpi_dev_info { +	struct list_head list; +	struct list_head xcc_list; +	uint16_t bdf; +	uint16_t supp_xcp_mode; +	uint16_t xcp_mode; +	uint16_t mem_mode; +	uint64_t tmr_base; +	uint64_t tmr_size; +}; + +struct list_head amdgpu_acpi_dev_list; +  struct amdgpu_atif_notification_cfg {  	bool enabled;  	int command_code; @@ -801,6 +841,343 @@ int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_sta  	return r;  } +#ifdef CONFIG_ACPI_NUMA +static inline uint64_t amdgpu_acpi_get_numa_size(int nid) +{ +	/* This is directly using si_meminfo_node implementation as the +	 * function is not exported. +	 */ +	int zone_type; +	uint64_t managed_pages = 0; + +	pg_data_t *pgdat = NODE_DATA(nid); + +	for (zone_type = 0; zone_type < MAX_NR_ZONES; zone_type++) +		managed_pages += +			zone_managed_pages(&pgdat->node_zones[zone_type]); +	return managed_pages * PAGE_SIZE; +} + +static struct amdgpu_numa_info *amdgpu_acpi_get_numa_info(uint32_t pxm) +{ +	struct amdgpu_numa_info *numa_info; +	int nid; + +	numa_info = xa_load(&numa_info_xa, pxm); + +	if (!numa_info) { +		struct sysinfo info; + +		numa_info = kzalloc(sizeof *numa_info, GFP_KERNEL); +		if (!numa_info) +			return NULL; + +		nid = pxm_to_node(pxm); +		numa_info->pxm = pxm; +		numa_info->nid = nid; + +		if (numa_info->nid == NUMA_NO_NODE) { +			si_meminfo(&info); +			numa_info->size = info.totalram * info.mem_unit; +		} else { +			numa_info->size = amdgpu_acpi_get_numa_size(nid); +		} +		xa_store(&numa_info_xa, numa_info->pxm, numa_info, GFP_KERNEL); +	} + +	return numa_info; +} +#endif + +/** + * amdgpu_acpi_get_node_id - obtain the NUMA node id for corresponding amdgpu + * acpi device handle + * + * @handle: acpi handle + * @numa_info: amdgpu_numa_info structure holding numa information + * + * Queries the ACPI interface to fetch the corresponding NUMA Node ID for a + * given amdgpu acpi device. + * + * Returns ACPI STATUS OK with Node ID on success or the corresponding failure reason + */ +static acpi_status amdgpu_acpi_get_node_id(acpi_handle handle, +				    struct amdgpu_numa_info **numa_info) +{ +#ifdef CONFIG_ACPI_NUMA +	u64 pxm; +	acpi_status status; + +	if (!numa_info) +		return_ACPI_STATUS(AE_ERROR); + +	status = acpi_evaluate_integer(handle, "_PXM", NULL, &pxm); + +	if (ACPI_FAILURE(status)) +		return status; + +	*numa_info = amdgpu_acpi_get_numa_info(pxm); + +	if (!*numa_info) +		return_ACPI_STATUS(AE_ERROR); + +	return_ACPI_STATUS(AE_OK); +#else +	return_ACPI_STATUS(AE_NOT_EXIST); +#endif +} + +static struct amdgpu_acpi_dev_info *amdgpu_acpi_get_dev(u16 bdf) +{ +	struct amdgpu_acpi_dev_info *acpi_dev; + +	if (list_empty(&amdgpu_acpi_dev_list)) +		return NULL; + +	list_for_each_entry(acpi_dev, &amdgpu_acpi_dev_list, list) +		if (acpi_dev->bdf == bdf) +			return acpi_dev; + +	return NULL; +} + +static int amdgpu_acpi_dev_init(struct amdgpu_acpi_dev_info **dev_info, +				struct amdgpu_acpi_xcc_info *xcc_info, u16 bdf) +{ +	struct amdgpu_acpi_dev_info *tmp; +	union acpi_object *obj; +	int ret = -ENOENT; + +	*dev_info = NULL; +	tmp = kzalloc(sizeof(struct amdgpu_acpi_dev_info), GFP_KERNEL); +	if (!tmp) +		return -ENOMEM; + +	INIT_LIST_HEAD(&tmp->xcc_list); +	INIT_LIST_HEAD(&tmp->list); +	tmp->bdf = bdf; + +	obj = acpi_evaluate_dsm_typed(xcc_info->handle, &amd_xcc_dsm_guid, 0, +				      AMD_XCC_DSM_GET_SUPP_MODE, NULL, +				      ACPI_TYPE_INTEGER); + +	if (!obj) { +		acpi_handle_debug(xcc_info->handle, +				  "_DSM function %d evaluation failed", +				  AMD_XCC_DSM_GET_SUPP_MODE); +		ret = -ENOENT; +		goto out; +	} + +	tmp->supp_xcp_mode = obj->integer.value & 0xFFFF; +	ACPI_FREE(obj); + +	obj = acpi_evaluate_dsm_typed(xcc_info->handle, &amd_xcc_dsm_guid, 0, +				      AMD_XCC_DSM_GET_XCP_MODE, NULL, +				      ACPI_TYPE_INTEGER); + +	if (!obj) { +		acpi_handle_debug(xcc_info->handle, +				  "_DSM function %d evaluation failed", +				  AMD_XCC_DSM_GET_XCP_MODE); +		ret = -ENOENT; +		goto out; +	} + +	tmp->xcp_mode = obj->integer.value & 0xFFFF; +	tmp->mem_mode = (obj->integer.value >> 32) & 0xFFFF; +	ACPI_FREE(obj); + +	/* Evaluate DSMs and fill XCC information */ +	obj = acpi_evaluate_dsm_typed(xcc_info->handle, &amd_xcc_dsm_guid, 0, +				      AMD_XCC_DSM_GET_TMR_INFO, NULL, +				      ACPI_TYPE_PACKAGE); + +	if (!obj || obj->package.count < 2) { +		acpi_handle_debug(xcc_info->handle, +				  "_DSM function %d evaluation failed", +				  AMD_XCC_DSM_GET_TMR_INFO); +		ret = -ENOENT; +		goto out; +	} + +	tmp->tmr_base = obj->package.elements[0].integer.value; +	tmp->tmr_size = obj->package.elements[1].integer.value; +	ACPI_FREE(obj); + +	DRM_DEBUG_DRIVER( +		"New dev(%x): Supported xcp mode: %x curr xcp_mode : %x mem mode : %x, tmr base: %llx tmr size: %llx  ", +		tmp->bdf, tmp->supp_xcp_mode, tmp->xcp_mode, tmp->mem_mode, +		tmp->tmr_base, tmp->tmr_size); +	list_add_tail(&tmp->list, &amdgpu_acpi_dev_list); +	*dev_info = tmp; + +	return 0; + +out: +	if (obj) +		ACPI_FREE(obj); +	kfree(tmp); + +	return ret; +} + +static int amdgpu_acpi_get_xcc_info(struct amdgpu_acpi_xcc_info *xcc_info, +				    u16 *bdf) +{ +	union acpi_object *obj; +	acpi_status status; +	int ret = -ENOENT; + +	obj = acpi_evaluate_dsm_typed(xcc_info->handle, &amd_xcc_dsm_guid, 0, +				      AMD_XCC_DSM_GET_NUM_FUNCS, NULL, +				      ACPI_TYPE_INTEGER); + +	if (!obj || obj->integer.value != AMD_XCC_DSM_NUM_FUNCS) +		goto out; +	ACPI_FREE(obj); + +	/* Evaluate DSMs and fill XCC information */ +	obj = acpi_evaluate_dsm_typed(xcc_info->handle, &amd_xcc_dsm_guid, 0, +				      AMD_XCC_DSM_GET_VF_XCC_MAPPING, NULL, +				      ACPI_TYPE_INTEGER); + +	if (!obj) { +		acpi_handle_debug(xcc_info->handle, +				  "_DSM function %d evaluation failed", +				  AMD_XCC_DSM_GET_VF_XCC_MAPPING); +		ret = -EINVAL; +		goto out; +	} + +	/* PF xcc id [39:32] */ +	xcc_info->phy_id = (obj->integer.value >> 32) & 0xFF; +	/* xcp node of this xcc [47:40] */ +	xcc_info->xcp_node = (obj->integer.value >> 40) & 0xFF; +	/* PF bus/dev/fn of this xcc [63:48] */ +	*bdf = (obj->integer.value >> 48) & 0xFFFF; +	ACPI_FREE(obj); +	obj = NULL; + +	status = +		amdgpu_acpi_get_node_id(xcc_info->handle, &xcc_info->numa_info); + +	/* TODO: check if this check is required */ +	if (ACPI_SUCCESS(status)) +		ret = 0; +out: +	if (obj) +		ACPI_FREE(obj); + +	return ret; +} + +static int amdgpu_acpi_enumerate_xcc(void) +{ +	struct amdgpu_acpi_dev_info *dev_info = NULL; +	struct amdgpu_acpi_xcc_info *xcc_info; +	struct acpi_device *acpi_dev; +	char hid[ACPI_ID_LEN]; +	int ret, id; +	u16 bdf; + +	INIT_LIST_HEAD(&amdgpu_acpi_dev_list); +	xa_init(&numa_info_xa); + +	for (id = 0; id < AMD_XCC_MAX_HID; id++) { +		sprintf(hid, "%s%d", "AMD", AMD_XCC_HID_START + id); +		acpi_dev = acpi_dev_get_first_match_dev(hid, NULL, -1); +		/* These ACPI objects are expected to be in sequential order. If +		 * one is not found, no need to check the rest. +		 */ +		if (!acpi_dev) { +			DRM_DEBUG_DRIVER("No matching acpi device found for %s", +					 hid); +			break; +		} + +		xcc_info = kzalloc(sizeof(struct amdgpu_acpi_xcc_info), +				   GFP_KERNEL); +		if (!xcc_info) { +			DRM_ERROR("Failed to allocate memory for xcc info\n"); +			return -ENOMEM; +		} + +		INIT_LIST_HEAD(&xcc_info->list); +		xcc_info->handle = acpi_device_handle(acpi_dev); +		acpi_dev_put(acpi_dev); + +		ret = amdgpu_acpi_get_xcc_info(xcc_info, &bdf); +		if (ret) { +			kfree(xcc_info); +			continue; +		} + +		dev_info = amdgpu_acpi_get_dev(bdf); + +		if (!dev_info) +			ret = amdgpu_acpi_dev_init(&dev_info, xcc_info, bdf); + +		if (ret == -ENOMEM) +			return ret; + +		if (!dev_info) { +			kfree(xcc_info); +			continue; +		} + +		list_add_tail(&xcc_info->list, &dev_info->xcc_list); +	} + +	return 0; +} + +int amdgpu_acpi_get_tmr_info(struct amdgpu_device *adev, u64 *tmr_offset, +			     u64 *tmr_size) +{ +	struct amdgpu_acpi_dev_info *dev_info; +	u16 bdf; + +	if (!tmr_offset || !tmr_size) +		return -EINVAL; + +	bdf = (adev->pdev->bus->number << 8) | adev->pdev->devfn; +	dev_info = amdgpu_acpi_get_dev(bdf); +	if (!dev_info) +		return -ENOENT; + +	*tmr_offset = dev_info->tmr_base; +	*tmr_size = dev_info->tmr_size; + +	return 0; +} + +int amdgpu_acpi_get_mem_info(struct amdgpu_device *adev, int xcc_id, +			     struct amdgpu_numa_info *numa_info) +{ +	struct amdgpu_acpi_dev_info *dev_info; +	struct amdgpu_acpi_xcc_info *xcc_info; +	u16 bdf; + +	if (!numa_info) +		return -EINVAL; + +	bdf = (adev->pdev->bus->number << 8) | adev->pdev->devfn; +	dev_info = amdgpu_acpi_get_dev(bdf); +	if (!dev_info) +		return -ENOENT; + +	list_for_each_entry(xcc_info, &dev_info->xcc_list, list) { +		if (xcc_info->phy_id == xcc_id) { +			memcpy(numa_info, xcc_info->numa_info, +			       sizeof(*numa_info)); +			return 0; +		} +	} + +	return -ENOENT; +} +  /**   * amdgpu_acpi_event - handle notify events   * @@ -1054,6 +1431,36 @@ void amdgpu_acpi_detect(void)  	} else {  		atif->backlight_caps.caps_valid = false;  	} + +	amdgpu_acpi_enumerate_xcc(); +} + +void amdgpu_acpi_release(void) +{ +	struct amdgpu_acpi_dev_info *dev_info, *dev_tmp; +	struct amdgpu_acpi_xcc_info *xcc_info, *xcc_tmp; +	struct amdgpu_numa_info *numa_info; +	unsigned long index; + +	xa_for_each(&numa_info_xa, index, numa_info) { +		kfree(numa_info); +		xa_erase(&numa_info_xa, index); +	} + +	if (list_empty(&amdgpu_acpi_dev_list)) +		return; + +	list_for_each_entry_safe(dev_info, dev_tmp, &amdgpu_acpi_dev_list, +				 list) { +		list_for_each_entry_safe(xcc_info, xcc_tmp, &dev_info->xcc_list, +					 list) { +			list_del(&xcc_info->list); +			kfree(xcc_info); +		} + +		list_del(&dev_info->list); +		kfree(dev_info); +	}  }  #if IS_ENABLED(CONFIG_SUSPEND) @@ -1092,16 +1499,20 @@ bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev)  	 * S0ix even though the system is suspending to idle, so return false  	 * in that case.  	 */ -	if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) -		dev_warn_once(adev->dev, +	if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)) { +		dev_err_once(adev->dev,  			      "Power consumption will be higher as BIOS has not been configured for suspend-to-idle.\n"  			      "To use suspend-to-idle change the sleep mode in BIOS setup.\n"); +		return false; +	}  #if !IS_ENABLED(CONFIG_AMD_PMC) -	dev_warn_once(adev->dev, +	dev_err_once(adev->dev,  		      "Power consumption will be higher as the kernel has not been compiled with CONFIG_AMD_PMC.\n"); -#endif /* CONFIG_AMD_PMC */ +	return false; +#else  	return true; +#endif /* CONFIG_AMD_PMC */  }  #endif /* CONFIG_SUSPEND */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 0385f7f69278..b4fcad0e62f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -53,7 +53,6 @@ int amdgpu_amdkfd_init(void)  	amdgpu_amdkfd_total_mem_size *= si.mem_unit;  	ret = kgd2kfd_init(); -	amdgpu_amdkfd_gpuvm_init_mem_limits();  	kfd_initialized = !ret;  	return ret; @@ -143,6 +142,8 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)  	int i;  	int last_valid_bit; +	amdgpu_amdkfd_gpuvm_init_mem_limits(); +  	if (adev->kfd.dev) {  		struct kgd2kfd_shared_resources gpu_resources = {  			.compute_vmid_bitmap = @@ -162,7 +163,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)  		 * clear  		 */  		bitmap_complement(gpu_resources.cp_queue_bitmap, -				  adev->gfx.mec.queue_bitmap, +				  adev->gfx.mec_bitmap[0].queue_bitmap,  				  KGD_MAX_QUEUES);  		/* According to linux/bitmap.h we shouldn't use bitmap_clear if @@ -427,14 +428,23 @@ uint32_t amdgpu_amdkfd_get_fw_version(struct amdgpu_device *adev,  }  void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev, -				      struct kfd_local_mem_info *mem_info) +				      struct kfd_local_mem_info *mem_info, +				      struct amdgpu_xcp *xcp)  {  	memset(mem_info, 0, sizeof(*mem_info)); -	mem_info->local_mem_size_public = adev->gmc.visible_vram_size; -	mem_info->local_mem_size_private = adev->gmc.real_vram_size - +	if (xcp) { +		if (adev->gmc.real_vram_size == adev->gmc.visible_vram_size) +			mem_info->local_mem_size_public = +					KFD_XCP_MEMORY_SIZE(adev, xcp->id); +		else +			mem_info->local_mem_size_private = +					KFD_XCP_MEMORY_SIZE(adev, xcp->id); +	} else { +		mem_info->local_mem_size_public = adev->gmc.visible_vram_size; +		mem_info->local_mem_size_private = adev->gmc.real_vram_size -  						adev->gmc.visible_vram_size; - +	}  	mem_info->vram_width = adev->gmc.vram_width;  	pr_debug("Address base: %pap public 0x%llx private 0x%llx\n", @@ -497,7 +507,7 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,  				  struct amdgpu_device **dmabuf_adev,  				  uint64_t *bo_size, void *metadata_buffer,  				  size_t buffer_size, uint32_t *metadata_size, -				  uint32_t *flags) +				  uint32_t *flags, int8_t *xcp_id)  {  	struct dma_buf *dma_buf;  	struct drm_gem_object *obj; @@ -541,6 +551,8 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,  		if (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)  			*flags |= KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC;  	} +	if (xcp_id) +		*xcp_id = bo->xcp_id;  out_put:  	dma_buf_put(dma_buf); @@ -732,17 +744,19 @@ int amdgpu_amdkfd_flush_gpu_tlb_vmid(struct amdgpu_device *adev,  	if (adev->family == AMDGPU_FAMILY_AI) {  		int i; -		for (i = 0; i < adev->num_vmhubs; i++) +		for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  			amdgpu_gmc_flush_gpu_tlb(adev, vmid, i, 0);  	} else { -		amdgpu_gmc_flush_gpu_tlb(adev, vmid, AMDGPU_GFXHUB_0, 0); +		amdgpu_gmc_flush_gpu_tlb(adev, vmid, AMDGPU_GFXHUB(0), 0);  	}  	return 0;  }  int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct amdgpu_device *adev, -				      uint16_t pasid, enum TLB_FLUSH_TYPE flush_type) +				      uint16_t pasid, +				      enum TLB_FLUSH_TYPE flush_type, +				      uint32_t inst)  {  	bool all_hub = false; @@ -750,7 +764,7 @@ int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  	    adev->family == AMDGPU_FAMILY_RV)  		all_hub = true; -	return amdgpu_gmc_flush_gpu_tlb_pasid(adev, pasid, flush_type, all_hub); +	return amdgpu_gmc_flush_gpu_tlb_pasid(adev, pasid, flush_type, all_hub, inst);  }  bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev) @@ -758,11 +772,32 @@ bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev)  	return adev->have_atomics_support;  } +void amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev) +{ +	amdgpu_device_flush_hdp(adev, NULL); +} +  void amdgpu_amdkfd_ras_poison_consumption_handler(struct amdgpu_device *adev, bool reset)  {  	amdgpu_umc_poison_handler(adev, reset);  } +int amdgpu_amdkfd_send_close_event_drain_irq(struct amdgpu_device *adev, +					uint32_t *payload) +{ +	int ret; + +	/* Device or IH ring is not ready so bail. */ +	ret = amdgpu_ih_wait_on_checkpoint_process_ts(adev, &adev->irq.ih); +	if (ret) +		return ret; + +	/* Send payload to fence KFD interrupts */ +	amdgpu_amdkfd_interrupt(adev, payload); + +	return 0; +} +  bool amdgpu_amdkfd_ras_query_utcl2_poison_status(struct amdgpu_device *adev)  {  	if (adev->gfx.ras && adev->gfx.ras->query_utcl2_poison_status) @@ -770,3 +805,28 @@ bool amdgpu_amdkfd_ras_query_utcl2_poison_status(struct amdgpu_device *adev)  	else  		return false;  } + +int amdgpu_amdkfd_check_and_lock_kfd(struct amdgpu_device *adev) +{ +	return kgd2kfd_check_and_lock_kfd(); +} + +void amdgpu_amdkfd_unlock_kfd(struct amdgpu_device *adev) +{ +	kgd2kfd_unlock_kfd(); +} + + +u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id) +{ +	u64 tmp; +	s8 mem_id = KFD_XCP_MEM_ID(adev, xcp_id); + +	if (adev->gmc.num_mem_partitions && xcp_id >= 0 && mem_id >= 0) { +		tmp = adev->gmc.mem_partitions[mem_id].size; +		do_div(tmp, adev->xcp_mgr->num_xcp_per_mem_partition); +		return ALIGN_DOWN(tmp, PAGE_SIZE); +	} else { +		return adev->gmc.real_vram_size; +	} +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 01ba3589b60a..2d0406bff84e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -30,10 +30,12 @@  #include <linux/kthread.h>  #include <linux/workqueue.h>  #include <linux/mmu_notifier.h> +#include <linux/memremap.h>  #include <kgd_kfd_interface.h>  #include <drm/ttm/ttm_execbuf_util.h>  #include "amdgpu_sync.h"  #include "amdgpu_vm.h" +#include "amdgpu_xcp.h"  extern uint64_t amdgpu_amdkfd_total_mem_size; @@ -97,10 +99,13 @@ struct amdgpu_amdkfd_fence {  struct amdgpu_kfd_dev {  	struct kfd_dev *dev; -	int64_t vram_used; -	uint64_t vram_used_aligned; +	int64_t vram_used[MAX_XCP]; +	uint64_t vram_used_aligned[MAX_XCP];  	bool init_complete;  	struct work_struct reset_work; + +	/* HMM page migration MEMORY_DEVICE_PRIVATE mapping */ +	struct dev_pagemap pgmap;  };  enum kgd_engine_type { @@ -151,6 +156,8 @@ void amdgpu_amdkfd_interrupt(struct amdgpu_device *adev,  void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev);  void amdgpu_amdkfd_device_init(struct amdgpu_device *adev);  void amdgpu_amdkfd_device_fini_sw(struct amdgpu_device *adev); +int amdgpu_amdkfd_check_and_lock_kfd(struct amdgpu_device *adev); +void amdgpu_amdkfd_unlock_kfd(struct amdgpu_device *adev);  int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,  				enum kgd_engine_type engine,  				uint32_t vmid, uint64_t gpu_addr, @@ -160,7 +167,8 @@ bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev);  int amdgpu_amdkfd_flush_gpu_tlb_vmid(struct amdgpu_device *adev,  				uint16_t vmid);  int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct amdgpu_device *adev, -				uint16_t pasid, enum TLB_FLUSH_TYPE flush_type); +				uint16_t pasid, enum TLB_FLUSH_TYPE flush_type, +				uint32_t inst);  bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid); @@ -224,7 +232,8 @@ int amdgpu_amdkfd_remove_gws_from_process(void *info, void *mem);  uint32_t amdgpu_amdkfd_get_fw_version(struct amdgpu_device *adev,  				      enum kgd_engine_type type);  void amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev, -				      struct kfd_local_mem_info *mem_info); +				      struct kfd_local_mem_info *mem_info, +				      struct amdgpu_xcp *xcp);  uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct amdgpu_device *adev);  uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev); @@ -234,13 +243,15 @@ int amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,  				  struct amdgpu_device **dmabuf_adev,  				  uint64_t *bo_size, void *metadata_buffer,  				  size_t buffer_size, uint32_t *metadata_size, -				  uint32_t *flags); +				  uint32_t *flags, int8_t *xcp_id);  uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct amdgpu_device *dst,  					  struct amdgpu_device *src);  int amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(struct amdgpu_device *dst,  					    struct amdgpu_device *src,  					    bool is_min);  int amdgpu_amdkfd_get_pcie_bandwidth_mbytes(struct amdgpu_device *adev, bool is_min); +int amdgpu_amdkfd_send_close_event_drain_irq(struct amdgpu_device *adev, +					uint32_t *payload);  /* Read user wptr from a specified user address space with page fault   * disabled. The memory must be pinned and mapped to the hardware when @@ -279,7 +290,8 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev,  void amdgpu_amdkfd_gpuvm_release_process_vm(struct amdgpu_device *adev,  					void *drm_priv);  uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *drm_priv); -size_t amdgpu_amdkfd_get_available_memory(struct amdgpu_device *adev); +size_t amdgpu_amdkfd_get_available_memory(struct amdgpu_device *adev, +					uint8_t xcp_id);  int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  		struct amdgpu_device *adev, uint64_t va, uint64_t size,  		void *drm_priv, struct kgd_mem **mem, @@ -310,6 +322,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,  				      uint64_t *mmap_offset);  int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_mem *mem,  				      struct dma_buf **dmabuf); +void amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev);  int amdgpu_amdkfd_get_tile_config(struct amdgpu_device *adev,  				struct tile_config *config);  void amdgpu_amdkfd_ras_poison_consumption_handler(struct amdgpu_device *adev, @@ -319,9 +332,18 @@ void amdgpu_amdkfd_block_mmu_notifications(void *p);  int amdgpu_amdkfd_criu_resume(void *p);  bool amdgpu_amdkfd_ras_query_utcl2_poison_status(struct amdgpu_device *adev);  int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev, -		uint64_t size, u32 alloc_flag); +		uint64_t size, u32 alloc_flag, int8_t xcp_id);  void amdgpu_amdkfd_unreserve_mem_limit(struct amdgpu_device *adev, -		uint64_t size, u32 alloc_flag); +		uint64_t size, u32 alloc_flag, int8_t xcp_id); + +u64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id); + +#define KFD_XCP_MEM_ID(adev, xcp_id) \ +		((adev)->xcp_mgr && (xcp_id) >= 0 ?\ +		(adev)->xcp_mgr->xcp[(xcp_id)].mem_id : -1) + +#define KFD_XCP_MEMORY_SIZE(adev, xcp_id) amdgpu_amdkfd_xcp_memory_size((adev), (xcp_id)) +  #if IS_ENABLED(CONFIG_HSA_AMD)  void amdgpu_amdkfd_gpuvm_init_mem_limits(void); @@ -352,6 +374,17 @@ void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)  {  }  #endif + +#if IS_ENABLED(CONFIG_HSA_AMD_SVM) +int kgd2kfd_init_zone_device(struct amdgpu_device *adev); +#else +static inline +int kgd2kfd_init_zone_device(struct amdgpu_device *adev) +{ +	return 0; +} +#endif +  /* KGD2KFD callbacks */  int kgd2kfd_quiesce_mm(struct mm_struct *mm, uint32_t trigger);  int kgd2kfd_resume_mm(struct mm_struct *mm); @@ -372,6 +405,8 @@ int kgd2kfd_post_reset(struct kfd_dev *kfd);  void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry);  void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd);  void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask); +int kgd2kfd_check_and_lock_kfd(void); +void kgd2kfd_unlock_kfd(void);  #else  static inline int kgd2kfd_init(void)  { @@ -437,5 +472,14 @@ static inline  void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)  {  } + +static inline int kgd2kfd_check_and_lock_kfd(void) +{ +	return 0; +} + +static inline void kgd2kfd_unlock_kfd(void) +{ +}  #endif  #endif /* AMDGPU_AMDKFD_H_INCLUDED */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c index 4485bb29bec9..60f9e027fb66 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.c @@ -23,6 +23,149 @@  #include "amdgpu_amdkfd.h"  #include "amdgpu_amdkfd_arcturus.h"  #include "amdgpu_amdkfd_gfx_v9.h" +#include "gc/gc_9_4_2_offset.h" +#include "gc/gc_9_4_2_sh_mask.h" +#include <uapi/linux/kfd_ioctl.h> + +/* + * Returns TRAP_EN, EXCP_EN and EXCP_REPLACE. + * + * restore_dbg_registers is ignored here but is a general interface requirement + * for devices that support GFXOFF and where the RLC save/restore list + * does not support hw registers for debugging i.e. the driver has to manually + * initialize the debug mode registers after it has disabled GFX off during the + * debug session. + */ +static uint32_t kgd_aldebaran_enable_debug_trap(struct amdgpu_device *adev, +					    bool restore_dbg_registers, +					    uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, 0); + +	return data; +} + +/* returns TRAP_EN, EXCP_EN and EXCP_REPLACE. */ +static uint32_t kgd_aldebaran_disable_debug_trap(struct amdgpu_device *adev, +						bool keep_trap_enabled, +						uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, keep_trap_enabled); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, 0); + +	return data; +} + +static int kgd_aldebaran_validate_trap_override_request(struct amdgpu_device *adev, +							uint32_t trap_override, +							uint32_t *trap_mask_supported) +{ +	*trap_mask_supported &= KFD_DBG_TRAP_MASK_FP_INVALID | +				KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL | +				KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO | +				KFD_DBG_TRAP_MASK_FP_OVERFLOW | +				KFD_DBG_TRAP_MASK_FP_UNDERFLOW | +				KFD_DBG_TRAP_MASK_FP_INEXACT | +				KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO | +				KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH | +				KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION; + +	if (trap_override != KFD_DBG_TRAP_OVERRIDE_OR && +			trap_override != KFD_DBG_TRAP_OVERRIDE_REPLACE) +		return -EPERM; + +	return 0; +} + +/* returns TRAP_EN, EXCP_EN and EXCP_RPLACE. */ +static uint32_t kgd_aldebaran_set_wave_launch_trap_override(struct amdgpu_device *adev, +					uint32_t vmid, +					uint32_t trap_override, +					uint32_t trap_mask_bits, +					uint32_t trap_mask_request, +					uint32_t *trap_mask_prev, +					uint32_t kfd_dbg_trap_cntl_prev) + +{ +	uint32_t data = 0; + +	*trap_mask_prev = REG_GET_FIELD(kfd_dbg_trap_cntl_prev, SPI_GDBG_PER_VMID_CNTL, EXCP_EN); +	trap_mask_bits = (trap_mask_bits & trap_mask_request) | +		(*trap_mask_prev & ~trap_mask_request); + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, trap_mask_bits); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, trap_override); + +	return data; +} + +static uint32_t kgd_aldebaran_set_wave_launch_mode(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, LAUNCH_MODE, wave_launch_mode); + +	return data; +} + +#define TCP_WATCH_STRIDE (regTCP_WATCH1_ADDR_H - regTCP_WATCH0_ADDR_H) +static uint32_t kgd_gfx_aldebaran_set_address_watch( +					struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid) +{ +	uint32_t watch_address_high; +	uint32_t watch_address_low; +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; +	watch_address_low = lower_32_bits(watch_address); +	watch_address_high = upper_32_bits(watch_address) & 0xffff; + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MODE, +			watch_mode); + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MASK, +			watch_address_mask >> 6); + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			1); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, regTCP_WATCH0_ADDR_H) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_high); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, regTCP_WATCH0_ADDR_L) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_low); + +	return watch_address_cntl; +} + +static uint32_t kgd_gfx_aldebaran_clear_address_watch(struct amdgpu_device *adev, +						      uint32_t watch_id) +{ +	return 0; +}  const struct kfd2kgd_calls aldebaran_kfd2kgd = {  	.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings, @@ -42,5 +185,14 @@ const struct kfd2kgd_calls aldebaran_kfd2kgd = {  				kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,  	.set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,  	.get_cu_occupancy = kgd_gfx_v9_get_cu_occupancy, -	.program_trap_handler_settings = kgd_gfx_v9_program_trap_handler_settings +	.enable_debug_trap = kgd_aldebaran_enable_debug_trap, +	.disable_debug_trap = kgd_aldebaran_disable_debug_trap, +	.validate_trap_override_request = kgd_aldebaran_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_aldebaran_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_aldebaran_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_aldebaran_set_address_watch, +	.clear_address_watch = kgd_gfx_aldebaran_clear_address_watch, +	.get_iq_wait_times = kgd_gfx_v9_get_iq_wait_times, +	.build_grace_period_packet_info = kgd_gfx_v9_build_grace_period_packet_info, +	.program_trap_handler_settings = kgd_gfx_v9_program_trap_handler_settings,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c index 4191af5a3f13..625db444df1c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c @@ -26,6 +26,7 @@  #include "amdgpu.h"  #include "amdgpu_amdkfd.h"  #include "amdgpu_amdkfd_arcturus.h" +#include "amdgpu_reset.h"  #include "sdma0/sdma0_4_2_2_offset.h"  #include "sdma0/sdma0_4_2_2_sh_mask.h"  #include "sdma1/sdma1_4_2_2_offset.h" @@ -48,6 +49,8 @@  #include "amdgpu_amdkfd_gfx_v9.h"  #include "gfxhub_v1_0.h"  #include "mmhub_v9_4.h" +#include "gc/gc_9_0_offset.h" +#include "gc/gc_9_0_sh_mask.h"  #define HQD_N_REGS 56  #define DUMP_REG(addr) do {				\ @@ -276,6 +279,117 @@ int kgd_arcturus_hqd_sdma_destroy(struct amdgpu_device *adev, void *mqd,  	return 0;  } +/* + * Helper used to suspend/resume gfx pipe for image post process work to set + * barrier behaviour. + */ +static int suspend_resume_compute_scheduler(struct amdgpu_device *adev, bool suspend) +{ +	int i, r = 0; + +	for (i = 0; i < adev->gfx.num_compute_rings; i++) { +		struct amdgpu_ring *ring = &adev->gfx.compute_ring[i]; + +		if (!(ring && ring->sched.thread)) +			continue; + +		/* stop secheduler and drain ring. */ +		if (suspend) { +			drm_sched_stop(&ring->sched, NULL); +			r = amdgpu_fence_wait_empty(ring); +			if (r) +				goto out; +		} else { +			drm_sched_start(&ring->sched, false); +		} +	} + +out: +	/* return on resume or failure to drain rings. */ +	if (!suspend || r) +		return r; + +	return amdgpu_device_ip_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GFX); +} + +static void set_barrier_auto_waitcnt(struct amdgpu_device *adev, bool enable_waitcnt) +{ +	uint32_t data; + +	WRITE_ONCE(adev->barrier_has_auto_waitcnt, enable_waitcnt); + +	if (!down_read_trylock(&adev->reset_domain->sem)) +		return; + +	amdgpu_amdkfd_suspend(adev, false); + +	if (suspend_resume_compute_scheduler(adev, true)) +		goto out; + +	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_CONFIG)); +	data = REG_SET_FIELD(data, SQ_CONFIG, DISABLE_BARRIER_WAITCNT, +						!enable_waitcnt); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_CONFIG), data); + +out: +	suspend_resume_compute_scheduler(adev, false); + +	amdgpu_amdkfd_resume(adev, false); + +	up_read(&adev->reset_domain->sem); +} + +/* + * restore_dbg_registers is ignored here but is a general interface requirement + * for devices that support GFXOFF and where the RLC save/restore list + * does not support hw registers for debugging i.e. the driver has to manually + * initialize the debug mode registers after it has disabled GFX off during the + * debug session. + */ +static uint32_t kgd_arcturus_enable_debug_trap(struct amdgpu_device *adev, +				bool restore_dbg_registers, +				uint32_t vmid) +{ +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	set_barrier_auto_waitcnt(adev, true); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +/* + * keep_trap_enabled is ignored here but is a general interface requirement + * for devices that support multi-process debugging where the performance + * overhead from trap temporary setup needs to be bypassed when the debug + * session has ended. + */ +static uint32_t kgd_arcturus_disable_debug_trap(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid) +{ + +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	set_barrier_auto_waitcnt(adev, false); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +}  const struct kfd2kgd_calls arcturus_kfd2kgd = {  	.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings,  	.set_pasid_vmid_mapping = kgd_gfx_v9_set_pasid_vmid_mapping, @@ -294,6 +408,15 @@ const struct kfd2kgd_calls arcturus_kfd2kgd = {  				kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,  	.set_vm_context_page_table_base =  				kgd_gfx_v9_set_vm_context_page_table_base, +	.enable_debug_trap = kgd_arcturus_enable_debug_trap, +	.disable_debug_trap = kgd_arcturus_disable_debug_trap, +	.validate_trap_override_request = kgd_gfx_v9_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_gfx_v9_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_gfx_v9_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_v9_set_address_watch, +	.clear_address_watch = kgd_gfx_v9_clear_address_watch, +	.get_iq_wait_times = kgd_gfx_v9_get_iq_wait_times, +	.build_grace_period_packet_info = kgd_gfx_v9_build_grace_period_packet_info,  	.get_cu_occupancy = kgd_gfx_v9_get_cu_occupancy,  	.program_trap_handler_settings = kgd_gfx_v9_program_trap_handler_settings  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c new file mode 100644 index 000000000000..5b4b7f8b92a5 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c @@ -0,0 +1,384 @@ +/* + * Copyright 2021 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 "amdgpu_amdkfd.h" +#include "amdgpu_amdkfd_gfx_v9.h" +#include "gc/gc_9_4_3_offset.h" +#include "gc/gc_9_4_3_sh_mask.h" +#include "athub/athub_1_8_0_offset.h" +#include "athub/athub_1_8_0_sh_mask.h" +#include "oss/osssys_4_4_2_offset.h" +#include "oss/osssys_4_4_2_sh_mask.h" +#include "v9_structs.h" +#include "soc15.h" +#include "sdma/sdma_4_4_2_offset.h" +#include "sdma/sdma_4_4_2_sh_mask.h" + +static inline struct v9_sdma_mqd *get_sdma_mqd(void *mqd) +{ +	return (struct v9_sdma_mqd *)mqd; +} + +static uint32_t get_sdma_rlc_reg_offset(struct amdgpu_device *adev, +					unsigned int engine_id, +					unsigned int queue_id) +{ +	uint32_t sdma_engine_reg_base = +		SOC15_REG_OFFSET(SDMA0, GET_INST(SDMA0, engine_id), +				 regSDMA_RLC0_RB_CNTL) - +		regSDMA_RLC0_RB_CNTL; +	uint32_t retval = sdma_engine_reg_base + +		  queue_id * (regSDMA_RLC1_RB_CNTL - regSDMA_RLC0_RB_CNTL); + +	pr_debug("RLC register offset for SDMA%d RLC%d: 0x%x\n", engine_id, +							queue_id, retval); +	return retval; +} + +static int kgd_gfx_v9_4_3_hqd_sdma_load(struct amdgpu_device *adev, void *mqd, +				 uint32_t __user *wptr, struct mm_struct *mm) +{ +	struct v9_sdma_mqd *m; +	uint32_t sdma_rlc_reg_offset; +	unsigned long end_jiffies; +	uint32_t data; +	uint64_t data64; +	uint64_t __user *wptr64 = (uint64_t __user *)wptr; + +	m = get_sdma_mqd(mqd); +	sdma_rlc_reg_offset = get_sdma_rlc_reg_offset(adev, m->sdma_engine_id, +							m->sdma_queue_id); + +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL, +		m->sdmax_rlcx_rb_cntl & (~SDMA_RLC0_RB_CNTL__RB_ENABLE_MASK)); + +	end_jiffies = msecs_to_jiffies(2000) + jiffies; +	while (true) { +		data = RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_CONTEXT_STATUS); +		if (data & SDMA_RLC0_CONTEXT_STATUS__IDLE_MASK) +			break; +		if (time_after(jiffies, end_jiffies)) { +			pr_err("SDMA RLC not idle in %s\n", __func__); +			return -ETIME; +		} +		usleep_range(500, 1000); +	} + +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_DOORBELL_OFFSET, +		m->sdmax_rlcx_doorbell_offset); + +	data = REG_SET_FIELD(m->sdmax_rlcx_doorbell, SDMA_RLC0_DOORBELL, +				ENABLE, 1); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_DOORBELL, data); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR, +					m->sdmax_rlcx_rb_rptr); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR_HI, +					m->sdmax_rlcx_rb_rptr_hi); + +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_MINOR_PTR_UPDATE, 1); +	if (read_user_wptr(mm, wptr64, data64)) { +		WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_WPTR, +			lower_32_bits(data64)); +		WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_WPTR_HI, +			upper_32_bits(data64)); +	} else { +		WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_WPTR, +			m->sdmax_rlcx_rb_rptr); +		WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_WPTR_HI, +			m->sdmax_rlcx_rb_rptr_hi); +	} +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_MINOR_PTR_UPDATE, 0); + +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_BASE, m->sdmax_rlcx_rb_base); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_BASE_HI, +			m->sdmax_rlcx_rb_base_hi); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR_ADDR_LO, +			m->sdmax_rlcx_rb_rptr_addr_lo); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR_ADDR_HI, +			m->sdmax_rlcx_rb_rptr_addr_hi); + +	data = REG_SET_FIELD(m->sdmax_rlcx_rb_cntl, SDMA_RLC0_RB_CNTL, +				RB_ENABLE, 1); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL, data); + +	return 0; +} + +static int kgd_gfx_v9_4_3_hqd_sdma_dump(struct amdgpu_device *adev, +				 uint32_t engine_id, uint32_t queue_id, +				 uint32_t (**dump)[2], uint32_t *n_regs) +{ +	uint32_t sdma_rlc_reg_offset = get_sdma_rlc_reg_offset(adev, +							engine_id, queue_id); +	uint32_t i = 0, reg; +#undef HQD_N_REGS +#define HQD_N_REGS (19+6+7+12) +#define DUMP_REG(addr) do {				\ +		if (WARN_ON_ONCE(i >= HQD_N_REGS))      \ +			break;				\ +		(*dump)[i][0] = (addr) << 2;            \ +		(*dump)[i++][1] = RREG32(addr);         \ +	} while (0) + +	*dump = kmalloc_array(HQD_N_REGS * 2, sizeof(uint32_t), GFP_KERNEL); +	if (*dump == NULL) +		return -ENOMEM; + +	for (reg = regSDMA_RLC0_RB_CNTL; reg <= regSDMA_RLC0_DOORBELL; reg++) +		DUMP_REG(sdma_rlc_reg_offset + reg); +	for (reg = regSDMA_RLC0_STATUS; reg <= regSDMA_RLC0_CSA_ADDR_HI; reg++) +		DUMP_REG(sdma_rlc_reg_offset + reg); +	for (reg = regSDMA_RLC0_IB_SUB_REMAIN; +	     reg <= regSDMA_RLC0_MINOR_PTR_UPDATE; reg++) +		DUMP_REG(sdma_rlc_reg_offset + reg); +	for (reg = regSDMA_RLC0_MIDCMD_DATA0; +	     reg <= regSDMA_RLC0_MIDCMD_CNTL; reg++) +		DUMP_REG(sdma_rlc_reg_offset + reg); + +	WARN_ON_ONCE(i != HQD_N_REGS); +	*n_regs = i; + +	return 0; +} + +static bool kgd_gfx_v9_4_3_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd) +{ +	struct v9_sdma_mqd *m; +	uint32_t sdma_rlc_reg_offset; +	uint32_t sdma_rlc_rb_cntl; + +	m = get_sdma_mqd(mqd); +	sdma_rlc_reg_offset = get_sdma_rlc_reg_offset(adev, m->sdma_engine_id, +							m->sdma_queue_id); + +	sdma_rlc_rb_cntl = RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL); + +	if (sdma_rlc_rb_cntl & SDMA_RLC0_RB_CNTL__RB_ENABLE_MASK) +		return true; + +	return false; +} + +static int kgd_gfx_v9_4_3_hqd_sdma_destroy(struct amdgpu_device *adev, void *mqd, +				    unsigned int utimeout) +{ +	struct v9_sdma_mqd *m; +	uint32_t sdma_rlc_reg_offset; +	uint32_t temp; +	unsigned long end_jiffies = (utimeout * HZ / 1000) + jiffies; + +	m = get_sdma_mqd(mqd); +	sdma_rlc_reg_offset = get_sdma_rlc_reg_offset(adev, m->sdma_engine_id, +							m->sdma_queue_id); + +	temp = RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL); +	temp = temp & ~SDMA_RLC0_RB_CNTL__RB_ENABLE_MASK; +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL, temp); + +	while (true) { +		temp = RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_CONTEXT_STATUS); +		if (temp & SDMA_RLC0_CONTEXT_STATUS__IDLE_MASK) +			break; +		if (time_after(jiffies, end_jiffies)) { +			pr_err("SDMA RLC not idle in %s\n", __func__); +			return -ETIME; +		} +		usleep_range(500, 1000); +	} + +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_DOORBELL, 0); +	WREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL, +		RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_CNTL) | +		SDMA_RLC0_RB_CNTL__RB_ENABLE_MASK); + +	m->sdmax_rlcx_rb_rptr = +			RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR); +	m->sdmax_rlcx_rb_rptr_hi = +			RREG32(sdma_rlc_reg_offset + regSDMA_RLC0_RB_RPTR_HI); + +	return 0; +} + +static int kgd_gfx_v9_4_3_set_pasid_vmid_mapping(struct amdgpu_device *adev, +			u32 pasid, unsigned int vmid, uint32_t xcc_inst) +{ +	unsigned long timeout; +	unsigned int reg; +	unsigned int phy_inst = GET_INST(GC, xcc_inst); +	/* Every two XCCs share one AID */ +	unsigned int aid = phy_inst / 2; + +	/* +	 * We have to assume that there is no outstanding mapping. +	 * The ATC_VMID_PASID_MAPPING_UPDATE_STATUS bit could be 0 because +	 * a mapping is in progress or because a mapping finished +	 * and the SW cleared it. +	 * So the protocol is to always wait & clear. +	 */ +	uint32_t pasid_mapping = (pasid == 0) ? 0 : (uint32_t)pasid | +			ATC_VMID0_PASID_MAPPING__VALID_MASK; + +	WREG32(SOC15_REG_OFFSET(ATHUB, 0, +		regATC_VMID0_PASID_MAPPING) + vmid, pasid_mapping); + +	timeout = jiffies + msecs_to_jiffies(10); +	while (!(RREG32(SOC15_REG_OFFSET(ATHUB, 0, +			regATC_VMID_PASID_MAPPING_UPDATE_STATUS)) & +			(1U << vmid))) { +		if (time_after(jiffies, timeout)) { +			pr_err("Fail to program VMID-PASID mapping\n"); +			return -ETIME; +		} +		cpu_relax(); +	} + +	WREG32(SOC15_REG_OFFSET(ATHUB, 0, +		regATC_VMID_PASID_MAPPING_UPDATE_STATUS), +		1U << vmid); + +	reg = RREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_LUT_INDEX)); +	/* Every 4 numbers is a cycle. 1st is AID, 2nd and 3rd are XCDs, +	 * and the 4th is reserved. Therefore "aid * 4 + (xcc_inst % 2) + 1" +	 * programs _LUT for XCC and "aid * 4" for AID where the XCC connects +	 * to. +	 */ +	WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_LUT_INDEX), +		aid * 4 + (phy_inst % 2) + 1); +	WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid, +		pasid_mapping); +	WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_LUT_INDEX), +		aid * 4); +	WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT_MM) + vmid, +		pasid_mapping); +	WREG32(SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_LUT_INDEX), reg); + +	return 0; +} + +static inline struct v9_mqd *get_mqd(void *mqd) +{ +	return (struct v9_mqd *)mqd; +} + +static int kgd_gfx_v9_4_3_hqd_load(struct amdgpu_device *adev, void *mqd, +			uint32_t pipe_id, uint32_t queue_id, +			uint32_t __user *wptr, uint32_t wptr_shift, +			uint32_t wptr_mask, struct mm_struct *mm, uint32_t inst) +{ +	struct v9_mqd *m; +	uint32_t *mqd_hqd; +	uint32_t reg, hqd_base, hqd_end, data; + +	m = get_mqd(mqd); + +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst); + +	/* HQD registers extend to CP_HQD_AQL_DISPATCH_ID_HI */ +	mqd_hqd = &m->cp_mqd_base_addr_lo; +	hqd_base = SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_MQD_BASE_ADDR); +	hqd_end = SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_AQL_DISPATCH_ID_HI); + +	for (reg = hqd_base; reg <= hqd_end; reg++) +		WREG32_RLC(reg, mqd_hqd[reg - hqd_base]); + + +	/* Activate doorbell logic before triggering WPTR poll. */ +	data = REG_SET_FIELD(m->cp_hqd_pq_doorbell_control, +			     CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_PQ_DOORBELL_CONTROL), +				data); + +	if (wptr) { +		/* Don't read wptr with get_user because the user +		 * context may not be accessible (if this function +		 * runs in a work queue). Instead trigger a one-shot +		 * polling read from memory in the CP. This assumes +		 * that wptr is GPU-accessible in the queue's VMID via +		 * ATC or SVM. WPTR==RPTR before starting the poll so +		 * the CP starts fetching new commands from the right +		 * place. +		 * +		 * Guessing a 64-bit WPTR from a 32-bit RPTR is a bit +		 * tricky. Assume that the queue didn't overflow. The +		 * number of valid bits in the 32-bit RPTR depends on +		 * the queue size. The remaining bits are taken from +		 * the saved 64-bit WPTR. If the WPTR wrapped, add the +		 * queue size. +		 */ +		uint32_t queue_size = +			2 << REG_GET_FIELD(m->cp_hqd_pq_control, +					   CP_HQD_PQ_CONTROL, QUEUE_SIZE); +		uint64_t guessed_wptr = m->cp_hqd_pq_rptr & (queue_size - 1); + +		if ((m->cp_hqd_pq_wptr_lo & (queue_size - 1)) < guessed_wptr) +			guessed_wptr += queue_size; +		guessed_wptr += m->cp_hqd_pq_wptr_lo & ~(queue_size - 1); +		guessed_wptr += (uint64_t)m->cp_hqd_pq_wptr_hi << 32; + +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_PQ_WPTR_LO), +		       lower_32_bits(guessed_wptr)); +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_PQ_WPTR_HI), +		       upper_32_bits(guessed_wptr)); +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_PQ_WPTR_POLL_ADDR), +		       lower_32_bits((uintptr_t)wptr)); +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), +			regCP_HQD_PQ_WPTR_POLL_ADDR_HI), +			upper_32_bits((uintptr_t)wptr)); +		WREG32(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_PQ_WPTR_POLL_CNTL1), +		       (uint32_t)kgd_gfx_v9_get_queue_mask(adev, pipe_id, +			       queue_id)); +	} + +	/* Start the EOP fetcher */ +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_EOP_RPTR), +	       REG_SET_FIELD(m->cp_hqd_eop_rptr, +			     CP_HQD_EOP_RPTR, INIT_FETCHER, 1)); + +	data = REG_SET_FIELD(m->cp_hqd_active, CP_HQD_ACTIVE, ACTIVE, 1); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), regCP_HQD_ACTIVE), data); + +	kgd_gfx_v9_release_queue(adev, inst); + +	return 0; +} + +const struct kfd2kgd_calls gc_9_4_3_kfd2kgd = { +	.program_sh_mem_settings = kgd_gfx_v9_program_sh_mem_settings, +	.set_pasid_vmid_mapping = kgd_gfx_v9_4_3_set_pasid_vmid_mapping, +	.init_interrupts = kgd_gfx_v9_init_interrupts, +	.hqd_load = kgd_gfx_v9_4_3_hqd_load, +	.hiq_mqd_load = kgd_gfx_v9_hiq_mqd_load, +	.hqd_sdma_load = kgd_gfx_v9_4_3_hqd_sdma_load, +	.hqd_dump = kgd_gfx_v9_hqd_dump, +	.hqd_sdma_dump = kgd_gfx_v9_4_3_hqd_sdma_dump, +	.hqd_is_occupied = kgd_gfx_v9_hqd_is_occupied, +	.hqd_sdma_is_occupied = kgd_gfx_v9_4_3_hqd_sdma_is_occupied, +	.hqd_destroy = kgd_gfx_v9_hqd_destroy, +	.hqd_sdma_destroy = kgd_gfx_v9_4_3_hqd_sdma_destroy, +	.wave_control_execute = kgd_gfx_v9_wave_control_execute, +	.get_atc_vmid_pasid_mapping_info = +				kgd_gfx_v9_get_atc_vmid_pasid_mapping_info, +	.set_vm_context_page_table_base = +				kgd_gfx_v9_set_vm_context_page_table_base, +	.program_trap_handler_settings = +				kgd_gfx_v9_program_trap_handler_settings +}; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c index 9378fc79e9ea..8ad7a7779e14 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c @@ -21,6 +21,7 @@   */  #include "amdgpu.h"  #include "amdgpu_amdkfd.h" +#include "amdgpu_amdkfd_gfx_v10.h"  #include "gc/gc_10_1_0_offset.h"  #include "gc/gc_10_1_0_sh_mask.h"  #include "athub/athub_2_0_0_offset.h" @@ -31,6 +32,7 @@  #include "v10_structs.h"  #include "nv.h"  #include "nvd.h" +#include <uapi/linux/kfd_ioctl.h>  enum hqd_dequeue_request_type {  	NO_ACTION = 0, @@ -79,7 +81,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -91,7 +93,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  }  static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	/*  	 * We have to assume that there is no outstanding mapping. @@ -135,7 +137,8 @@ static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid,   * but still works   */ -static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id) +static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -205,7 +208,7 @@ static inline struct v10_sdma_mqd *get_sdma_mqd(void *mqd)  static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  			uint32_t pipe_id, uint32_t queue_id,  			uint32_t __user *wptr, uint32_t wptr_shift, -			uint32_t wptr_mask, struct mm_struct *mm) +			uint32_t wptr_mask, struct mm_struct *mm, uint32_t inst)  {  	struct v10_compute_mqd *m;  	uint32_t *mqd_hqd; @@ -286,9 +289,9 @@ static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  static int kgd_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  			    uint32_t pipe_id, uint32_t queue_id, -			    uint32_t doorbell_off) +			    uint32_t doorbell_off, uint32_t inst)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	struct v10_compute_mqd *m;  	uint32_t mec, pipe;  	int r; @@ -303,7 +306,7 @@ static int kgd_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  	pr_debug("kfd: set HIQ, mec:%d, pipe:%d, queue:%d.\n",  		 mec, pipe, queue_id); -	spin_lock(&adev->gfx.kiq.ring_lock); +	spin_lock(&adev->gfx.kiq[0].ring_lock);  	r = amdgpu_ring_alloc(kiq_ring, 7);  	if (r) {  		pr_err("Failed to alloc KIQ (%d).\n", r); @@ -330,7 +333,7 @@ static int kgd_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  	amdgpu_ring_commit(kiq_ring);  out_unlock: -	spin_unlock(&adev->gfx.kiq.ring_lock); +	spin_unlock(&adev->gfx.kiq[0].ring_lock);  	release_queue(adev);  	return r; @@ -338,7 +341,7 @@ out_unlock:  static int kgd_hqd_dump(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS 56 @@ -469,7 +472,7 @@ static int kgd_hqd_sdma_dump(struct amdgpu_device *adev,  static bool kgd_hqd_is_occupied(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false; @@ -510,7 +513,7 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)  static int kgd_hqd_destroy(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	enum hqd_dequeue_request_type type;  	unsigned long end_jiffies; @@ -673,7 +676,7 @@ static bool get_atc_vmid_pasid_mapping_info(struct amdgpu_device *adev,  static int kgd_wave_control_execute(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data = 0; @@ -708,8 +711,295 @@ static void set_vm_context_page_table_base(struct amdgpu_device *adev,  	adev->gfxhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);  } +/* + * GFX10 helper for wave launch stall requirements on debug trap setting. + * + * vmid: + *   Target VMID to stall/unstall. + * + * stall: + *   0-unstall wave launch (enable), 1-stall wave launch (disable). + *   After wavefront launch has been stalled, allocated waves must drain from + *   SPI in order for debug trap settings to take effect on those waves. + *   This is roughly a ~3500 clock cycle wait on SPI where a read on + *   SPI_GDBG_WAVE_CNTL translates to ~32 clock cycles. + *   KGD_GFX_V10_WAVE_LAUNCH_SPI_DRAIN_LATENCY indicates the number of reads required. + * + *   NOTE: We can afford to clear the entire STALL_VMID field on unstall + *   because current GFX10 chips cannot support multi-process debugging due to + *   trap configuration and masking being limited to global scope.  Always + *   assume single process conditions. + * + */ + +#define KGD_GFX_V10_WAVE_LAUNCH_SPI_DRAIN_LATENCY	110 +static void kgd_gfx_v10_set_wave_launch_stall(struct amdgpu_device *adev, uint32_t vmid, bool stall) +{ +	uint32_t data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); +	int i; + +	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_VMID, +							stall ? 1 << vmid : 0); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); + +	if (!stall) +		return; + +	for (i = 0; i < KGD_GFX_V10_WAVE_LAUNCH_SPI_DRAIN_LATENCY; i++) +		RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); +} + +uint32_t kgd_gfx_v10_enable_debug_trap(struct amdgpu_device *adev, +				bool restore_dbg_registers, +				uint32_t vmid) +{ + +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, true); + +	/* assume gfx off is disabled for the debug session if rlc restore not supported. */ +	if (restore_dbg_registers) { +		uint32_t data = 0; + +		data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG, +				VMID_SEL, 1 << vmid); +		data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG, +				TRAP_EN, 1); +		WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_CONFIG), data); +		WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA0), 0); +		WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA1), 0); + +		kgd_gfx_v10_set_wave_launch_stall(adev, vmid, false); + +		mutex_unlock(&adev->grbm_idx_mutex); + +		return 0; +	} + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +uint32_t kgd_gfx_v10_disable_debug_trap(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid) +{ +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, true); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +int kgd_gfx_v10_validate_trap_override_request(struct amdgpu_device *adev, +					      uint32_t trap_override, +					      uint32_t *trap_mask_supported) +{ +	*trap_mask_supported &= KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH; + +	/* The SPI_GDBG_TRAP_MASK register is global and affects all +	 * processes. Only allow OR-ing the address-watch bit, since +	 * this only affects processes under the debugger. Other bits +	 * should stay 0 to avoid the debugger interfering with other +	 * processes. +	 */ +	if (trap_override != KFD_DBG_TRAP_OVERRIDE_OR) +		return -EINVAL; + +	return 0; +} + +uint32_t kgd_gfx_v10_set_wave_launch_trap_override(struct amdgpu_device *adev, +					      uint32_t vmid, +					      uint32_t trap_override, +					      uint32_t trap_mask_bits, +					      uint32_t trap_mask_request, +					      uint32_t *trap_mask_prev, +					      uint32_t kfd_dbg_trap_cntl_prev) +{ +	uint32_t data, wave_cntl_prev; + +	mutex_lock(&adev->grbm_idx_mutex); + +	wave_cntl_prev = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, true); + +	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK)); +	*trap_mask_prev = REG_GET_FIELD(data, SPI_GDBG_TRAP_MASK, EXCP_EN); + +	trap_mask_bits = (trap_mask_bits & trap_mask_request) | +		(*trap_mask_prev & ~trap_mask_request); + +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, EXCP_EN, trap_mask_bits); +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, REPLACE, trap_override); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), data); + +	/* We need to preserve wave launch mode stall settings. */ +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), wave_cntl_prev); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +uint32_t kgd_gfx_v10_set_wave_launch_mode(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid) +{ +	uint32_t data = 0; +	bool is_mode_set = !!wave_launch_mode; + +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, true); + +	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, +			VMID_MASK, is_mode_set ? 1 << vmid : 0); +	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, +			MODE, is_mode_set ? wave_launch_mode : 0); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL2), data); + +	kgd_gfx_v10_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +#define TCP_WATCH_STRIDE (mmTCP_WATCH1_ADDR_H - mmTCP_WATCH0_ADDR_H) +uint32_t kgd_gfx_v10_set_address_watch(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid) +{ +	uint32_t watch_address_high; +	uint32_t watch_address_low; +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; + +	watch_address_low = lower_32_bits(watch_address); +	watch_address_high = upper_32_bits(watch_address) & 0xffff; + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VMID, +			debug_vmid); +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MODE, +			watch_mode); +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MASK, +			watch_address_mask >> 7); + +	/* Turning off this watch point until we set all the registers */ +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			0); + +	WREG32((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	WREG32((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_ADDR_H) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_high); + +	WREG32((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_ADDR_L) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_low); + +	/* Enable the watch point */ +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			1); + +	WREG32((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	return 0; +} + +uint32_t kgd_gfx_v10_clear_address_watch(struct amdgpu_device *adev, +					uint32_t watch_id) +{ +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; + +	WREG32((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	return 0; +} + + +/* kgd_gfx_v10_get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values + * The values read are: + *     ib_offload_wait_time     -- Wait Count for Indirect Buffer Offloads. + *     atomic_offload_wait_time -- Wait Count for L2 and GDS Atomics Offloads. + *     wrm_offload_wait_time    -- Wait Count for WAIT_REG_MEM Offloads. + *     gws_wait_time            -- Wait Count for Global Wave Syncs. + *     que_sleep_wait_time      -- Wait Count for Dequeue Retry. + *     sch_wave_wait_time       -- Wait Count for Scheduling Wave Message. + *     sem_rearm_wait_time      -- Wait Count for Semaphore re-arm. + *     deq_retry_wait_time      -- Wait Count for Global Wave Syncs. + */ +void kgd_gfx_v10_get_iq_wait_times(struct amdgpu_device *adev, +					uint32_t *wait_times) + +{ +	*wait_times = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2)); +} + +void kgd_gfx_v10_build_grace_period_packet_info(struct amdgpu_device *adev, +						uint32_t wait_times, +						uint32_t grace_period, +						uint32_t *reg_offset, +						uint32_t *reg_data) +{ +	*reg_data = wait_times; + +	/* +	 * The CP cannont handle a 0 grace period input and will result in +	 * an infinite grace period being set so set to 1 to prevent this. +	 */ +	if (grace_period == 0) +		grace_period = 1; + +	*reg_data = REG_SET_FIELD(*reg_data, +			CP_IQ_WAIT_TIME2, +			SCH_WAVE, +			grace_period); + +	*reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2); +} +  static void program_trap_handler_settings(struct amdgpu_device *adev, -		uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr) +		uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr, +		uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -750,5 +1040,14 @@ const struct kfd2kgd_calls gfx_v10_kfd2kgd = {  	.get_atc_vmid_pasid_mapping_info =  			get_atc_vmid_pasid_mapping_info,  	.set_vm_context_page_table_base = set_vm_context_page_table_base, +	.enable_debug_trap = kgd_gfx_v10_enable_debug_trap, +	.disable_debug_trap = kgd_gfx_v10_disable_debug_trap, +	.validate_trap_override_request = kgd_gfx_v10_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_gfx_v10_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_gfx_v10_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_v10_set_address_watch, +	.clear_address_watch = kgd_gfx_v10_clear_address_watch, +	.get_iq_wait_times = kgd_gfx_v10_get_iq_wait_times, +	.build_grace_period_packet_info = kgd_gfx_v10_build_grace_period_packet_info,  	.program_trap_handler_settings = program_trap_handler_settings,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h new file mode 100644 index 000000000000..e6b70196071a --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.h @@ -0,0 +1,55 @@ +/* + * Copyright 2023 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. + */ + +uint32_t kgd_gfx_v10_enable_debug_trap(struct amdgpu_device *adev, +				      bool restore_dbg_registers, +				      uint32_t vmid); +uint32_t kgd_gfx_v10_disable_debug_trap(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid); +int kgd_gfx_v10_validate_trap_override_request(struct amdgpu_device *adev, +					     uint32_t trap_override, +					     uint32_t *trap_mask_supported); +uint32_t kgd_gfx_v10_set_wave_launch_trap_override(struct amdgpu_device *adev, +					     uint32_t vmid, +					     uint32_t trap_override, +					     uint32_t trap_mask_bits, +					     uint32_t trap_mask_request, +					     uint32_t *trap_mask_prev, +					     uint32_t kfd_dbg_trap_cntl_prev); +uint32_t kgd_gfx_v10_set_wave_launch_mode(struct amdgpu_device *adev, +					 uint8_t wave_launch_mode, +					 uint32_t vmid); +uint32_t kgd_gfx_v10_set_address_watch(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid); +uint32_t kgd_gfx_v10_clear_address_watch(struct amdgpu_device *adev, +					uint32_t watch_id); +void kgd_gfx_v10_get_iq_wait_times(struct amdgpu_device *adev, uint32_t *wait_times); +void kgd_gfx_v10_build_grace_period_packet_info(struct amdgpu_device *adev, +					       uint32_t wait_times, +					       uint32_t grace_period, +					       uint32_t *reg_offset, +					       uint32_t *reg_data); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c index ba21ec6b35e0..8c8437a4383f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c @@ -22,6 +22,7 @@  #include <linux/mmu_context.h>  #include "amdgpu.h"  #include "amdgpu_amdkfd.h" +#include "amdgpu_amdkfd_gfx_v10.h"  #include "gc/gc_10_3_0_offset.h"  #include "gc/gc_10_3_0_sh_mask.h"  #include "oss/osssys_5_0_0_offset.h" @@ -80,7 +81,7 @@ static void program_sh_mem_settings_v10_3(struct amdgpu_device *adev, uint32_t v  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -93,7 +94,7 @@ static void program_sh_mem_settings_v10_3(struct amdgpu_device *adev, uint32_t v  /* ATC is defeatured on Sienna_Cichlid */  static int set_pasid_vmid_mapping_v10_3(struct amdgpu_device *adev, unsigned int pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	uint32_t value = pasid << IH_VMID_0_LUT__PASID__SHIFT; @@ -105,7 +106,8 @@ static int set_pasid_vmid_mapping_v10_3(struct amdgpu_device *adev, unsigned int  	return 0;  } -static int init_interrupts_v10_3(struct amdgpu_device *adev, uint32_t pipe_id) +static int init_interrupts_v10_3(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -177,7 +179,7 @@ static inline struct v10_sdma_mqd *get_sdma_mqd(void *mqd)  static int hqd_load_v10_3(struct amdgpu_device *adev, void *mqd,  			uint32_t pipe_id, uint32_t queue_id,  			uint32_t __user *wptr, uint32_t wptr_shift, -			uint32_t wptr_mask, struct mm_struct *mm) +			uint32_t wptr_mask, struct mm_struct *mm, uint32_t inst)  {  	struct v10_compute_mqd *m;  	uint32_t *mqd_hqd; @@ -273,9 +275,9 @@ static int hqd_load_v10_3(struct amdgpu_device *adev, void *mqd,  static int hiq_mqd_load_v10_3(struct amdgpu_device *adev, void *mqd,  			    uint32_t pipe_id, uint32_t queue_id, -			    uint32_t doorbell_off) +			    uint32_t doorbell_off, uint32_t inst)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	struct v10_compute_mqd *m;  	uint32_t mec, pipe;  	int r; @@ -290,7 +292,7 @@ static int hiq_mqd_load_v10_3(struct amdgpu_device *adev, void *mqd,  	pr_debug("kfd: set HIQ, mec:%d, pipe:%d, queue:%d.\n",  		 mec, pipe, queue_id); -	spin_lock(&adev->gfx.kiq.ring_lock); +	spin_lock(&adev->gfx.kiq[0].ring_lock);  	r = amdgpu_ring_alloc(kiq_ring, 7);  	if (r) {  		pr_err("Failed to alloc KIQ (%d).\n", r); @@ -317,7 +319,7 @@ static int hiq_mqd_load_v10_3(struct amdgpu_device *adev, void *mqd,  	amdgpu_ring_commit(kiq_ring);  out_unlock: -	spin_unlock(&adev->gfx.kiq.ring_lock); +	spin_unlock(&adev->gfx.kiq[0].ring_lock);  	release_queue(adev);  	return r; @@ -325,7 +327,7 @@ out_unlock:  static int hqd_dump_v10_3(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS 56 @@ -456,7 +458,7 @@ static int hqd_sdma_dump_v10_3(struct amdgpu_device *adev,  static bool hqd_is_occupied_v10_3(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false; @@ -498,7 +500,7 @@ static bool hqd_sdma_is_occupied_v10_3(struct amdgpu_device *adev,  static int hqd_destroy_v10_3(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	enum hqd_dequeue_request_type type;  	unsigned long end_jiffies; @@ -586,7 +588,7 @@ static int hqd_sdma_destroy_v10_3(struct amdgpu_device *adev, void *mqd,  static int wave_control_execute_v10_3(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data = 0; @@ -628,7 +630,8 @@ static void set_vm_context_page_table_base_v10_3(struct amdgpu_device *adev,  }  static void program_trap_handler_settings_v10_3(struct amdgpu_device *adev, -			uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr) +			uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr, +			uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -652,142 +655,6 @@ static void program_trap_handler_settings_v10_3(struct amdgpu_device *adev,  	unlock_srbm(adev);  } -#if 0 -uint32_t enable_debug_trap_v10_3(struct amdgpu_device *adev, -				uint32_t trap_debug_wave_launch_mode, -				uint32_t vmid) -{ -	uint32_t data = 0; -	uint32_t orig_wave_cntl_value; -	uint32_t orig_stall_vmid; - -	mutex_lock(&adev->grbm_idx_mutex); - -	orig_wave_cntl_value = RREG32(SOC15_REG_OFFSET(GC, -				0, -				mmSPI_GDBG_WAVE_CNTL)); -	orig_stall_vmid = REG_GET_FIELD(orig_wave_cntl_value, -			SPI_GDBG_WAVE_CNTL, -			STALL_VMID); - -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_RA, 1); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); - -	data = 0; -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), data); - -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), orig_stall_vmid); - -	mutex_unlock(&adev->grbm_idx_mutex); - -	return 0; -} - -uint32_t disable_debug_trap_v10_3(struct amdgpu_device *adev) -{ -	mutex_lock(&adev->grbm_idx_mutex); - -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); - -	mutex_unlock(&adev->grbm_idx_mutex); - -	return 0; -} - -uint32_t set_wave_launch_trap_override_v10_3(struct amdgpu_device *adev, -						uint32_t trap_override, -						uint32_t trap_mask) -{ -	uint32_t data = 0; - -	mutex_lock(&adev->grbm_idx_mutex); - -	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_RA, 1); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); - -	data = 0; -	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, -			EXCP_EN, trap_mask); -	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, -			REPLACE, trap_override); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), data); - -	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_RA, 0); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); - -	mutex_unlock(&adev->grbm_idx_mutex); - -	return 0; -} - -uint32_t set_wave_launch_mode_v10_3(struct amdgpu_device *adev, -					uint8_t wave_launch_mode, -					uint32_t vmid) -{ -	uint32_t data = 0; -	bool is_stall_mode; -	bool is_mode_set; - -	is_stall_mode = (wave_launch_mode == 4); -	is_mode_set = (wave_launch_mode != 0 && wave_launch_mode != 4); - -	mutex_lock(&adev->grbm_idx_mutex); - -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, -			VMID_MASK, is_mode_set ? 1 << vmid : 0); -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, -			MODE, is_mode_set ? wave_launch_mode : 0); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL2), data); - -	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, -			STALL_VMID, is_stall_mode ? 1 << vmid : 0); -	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, -			STALL_RA, is_stall_mode ? 1 : 0); -	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); - -	mutex_unlock(&adev->grbm_idx_mutex); - -	return 0; -} - -/* kgd_get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values - * The values read are: - *	ib_offload_wait_time     -- Wait Count for Indirect Buffer Offloads. - *	atomic_offload_wait_time -- Wait Count for L2 and GDS Atomics Offloads. - *	wrm_offload_wait_time    -- Wait Count for WAIT_REG_MEM Offloads. - *	gws_wait_time            -- Wait Count for Global Wave Syncs. - *	que_sleep_wait_time      -- Wait Count for Dequeue Retry. - *	sch_wave_wait_time       -- Wait Count for Scheduling Wave Message. - *	sem_rearm_wait_time      -- Wait Count for Semaphore re-arm. - *	deq_retry_wait_time      -- Wait Count for Global Wave Syncs. - */ -void get_iq_wait_times_v10_3(struct amdgpu_device *adev, -					uint32_t *wait_times) - -{ -	*wait_times = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2)); -} - -void build_grace_period_packet_info_v10_3(struct amdgpu_device *adev, -						uint32_t wait_times, -						uint32_t grace_period, -						uint32_t *reg_offset, -						uint32_t *reg_data) -{ -	*reg_data = wait_times; - -	*reg_data = REG_SET_FIELD(*reg_data, -			CP_IQ_WAIT_TIME2, -			SCH_WAVE, -			grace_period); - -	*reg_offset = mmCP_IQ_WAIT_TIME2; -} -#endif -  const struct kfd2kgd_calls gfx_v10_3_kfd2kgd = {  	.program_sh_mem_settings = program_sh_mem_settings_v10_3,  	.set_pasid_vmid_mapping = set_pasid_vmid_mapping_v10_3, @@ -805,12 +672,13 @@ const struct kfd2kgd_calls gfx_v10_3_kfd2kgd = {  	.get_atc_vmid_pasid_mapping_info = get_atc_vmid_pasid_mapping_info_v10_3,  	.set_vm_context_page_table_base = set_vm_context_page_table_base_v10_3,  	.program_trap_handler_settings = program_trap_handler_settings_v10_3, -#if 0 -	.enable_debug_trap = enable_debug_trap_v10_3, -	.disable_debug_trap = disable_debug_trap_v10_3, -	.set_wave_launch_trap_override = set_wave_launch_trap_override_v10_3, -	.set_wave_launch_mode = set_wave_launch_mode_v10_3, -	.get_iq_wait_times = get_iq_wait_times_v10_3, -	.build_grace_period_packet_info = build_grace_period_packet_info_v10_3, -#endif +	.get_iq_wait_times = kgd_gfx_v10_get_iq_wait_times, +	.build_grace_period_packet_info = kgd_gfx_v10_build_grace_period_packet_info, +	.enable_debug_trap = kgd_gfx_v10_enable_debug_trap, +	.disable_debug_trap = kgd_gfx_v10_disable_debug_trap, +	.validate_trap_override_request = kgd_gfx_v10_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_gfx_v10_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_gfx_v10_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_v10_set_address_watch, +	.clear_address_watch = kgd_gfx_v10_clear_address_watch  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c index 7e80caa05060..91c3574ebed3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.c @@ -30,6 +30,7 @@  #include "soc15d.h"  #include "v11_structs.h"  #include "soc21.h" +#include <uapi/linux/kfd_ioctl.h>  enum hqd_dequeue_request_type {  	NO_ACTION = 0, @@ -78,7 +79,7 @@ static void program_sh_mem_settings_v11(struct amdgpu_device *adev, uint32_t vmi  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -89,7 +90,7 @@ static void program_sh_mem_settings_v11(struct amdgpu_device *adev, uint32_t vmi  }  static int set_pasid_vmid_mapping_v11(struct amdgpu_device *adev, unsigned int pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	uint32_t value = pasid << IH_VMID_0_LUT__PASID__SHIFT; @@ -101,7 +102,8 @@ static int set_pasid_vmid_mapping_v11(struct amdgpu_device *adev, unsigned int p  	return 0;  } -static int init_interrupts_v11(struct amdgpu_device *adev, uint32_t pipe_id) +static int init_interrupts_v11(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -162,7 +164,7 @@ static inline struct v11_sdma_mqd *get_sdma_mqd(void *mqd)  static int hqd_load_v11(struct amdgpu_device *adev, void *mqd, uint32_t pipe_id,  			uint32_t queue_id, uint32_t __user *wptr,  			uint32_t wptr_shift, uint32_t wptr_mask, -			struct mm_struct *mm) +			struct mm_struct *mm, uint32_t inst)  {  	struct v11_compute_mqd *m;  	uint32_t *mqd_hqd; @@ -258,9 +260,9 @@ static int hqd_load_v11(struct amdgpu_device *adev, void *mqd, uint32_t pipe_id,  static int hiq_mqd_load_v11(struct amdgpu_device *adev, void *mqd,  			      uint32_t pipe_id, uint32_t queue_id, -			      uint32_t doorbell_off) +			      uint32_t doorbell_off, uint32_t inst)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	struct v11_compute_mqd *m;  	uint32_t mec, pipe;  	int r; @@ -275,7 +277,7 @@ static int hiq_mqd_load_v11(struct amdgpu_device *adev, void *mqd,  	pr_debug("kfd: set HIQ, mec:%d, pipe:%d, queue:%d.\n",  		 mec, pipe, queue_id); -	spin_lock(&adev->gfx.kiq.ring_lock); +	spin_lock(&adev->gfx.kiq[0].ring_lock);  	r = amdgpu_ring_alloc(kiq_ring, 7);  	if (r) {  		pr_err("Failed to alloc KIQ (%d).\n", r); @@ -302,7 +304,7 @@ static int hiq_mqd_load_v11(struct amdgpu_device *adev, void *mqd,  	amdgpu_ring_commit(kiq_ring);  out_unlock: -	spin_unlock(&adev->gfx.kiq.ring_lock); +	spin_unlock(&adev->gfx.kiq[0].ring_lock);  	release_queue(adev);  	return r; @@ -310,7 +312,7 @@ out_unlock:  static int hqd_dump_v11(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS 56 @@ -445,7 +447,7 @@ static int hqd_sdma_dump_v11(struct amdgpu_device *adev,  }  static bool hqd_is_occupied_v11(struct amdgpu_device *adev, uint64_t queue_address, -				uint32_t pipe_id, uint32_t queue_id) +				uint32_t pipe_id, uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false; @@ -486,7 +488,7 @@ static bool hqd_sdma_is_occupied_v11(struct amdgpu_device *adev, void *mqd)  static int hqd_destroy_v11(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	enum hqd_dequeue_request_type type;  	unsigned long end_jiffies; @@ -571,7 +573,7 @@ static int hqd_sdma_destroy_v11(struct amdgpu_device *adev, void *mqd,  static int wave_control_execute_v11(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data = 0; @@ -606,6 +608,183 @@ static void set_vm_context_page_table_base_v11(struct amdgpu_device *adev,  	adev->gfxhub.funcs->setup_vm_pt_regs(adev, vmid, page_table_base);  } +/* + * Returns TRAP_EN, EXCP_EN and EXCP_REPLACE. + * + * restore_dbg_registers is ignored here but is a general interface requirement + * for devices that support GFXOFF and where the RLC save/restore list + * does not support hw registers for debugging i.e. the driver has to manually + * initialize the debug mode registers after it has disabled GFX off during the + * debug session. + */ +static uint32_t kgd_gfx_v11_enable_debug_trap(struct amdgpu_device *adev, +					    bool restore_dbg_registers, +					    uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, 0); + +	return data; +} + +/* Returns TRAP_EN, EXCP_EN and EXCP_REPLACE. */ +static uint32_t kgd_gfx_v11_disable_debug_trap(struct amdgpu_device *adev, +						bool keep_trap_enabled, +						uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, keep_trap_enabled); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, 0); + +	return data; +} + +static int kgd_gfx_v11_validate_trap_override_request(struct amdgpu_device *adev, +							uint32_t trap_override, +							uint32_t *trap_mask_supported) +{ +	*trap_mask_supported &= KFD_DBG_TRAP_MASK_FP_INVALID | +				KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL | +				KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO | +				KFD_DBG_TRAP_MASK_FP_OVERFLOW | +				KFD_DBG_TRAP_MASK_FP_UNDERFLOW | +				KFD_DBG_TRAP_MASK_FP_INEXACT | +				KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO | +				KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH | +				KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION; + +	if (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 4)) +		*trap_mask_supported |= KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START | +					KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END; + +	if (trap_override != KFD_DBG_TRAP_OVERRIDE_OR && +			trap_override != KFD_DBG_TRAP_OVERRIDE_REPLACE) +		return -EPERM; + +	return 0; +} + +static uint32_t trap_mask_map_sw_to_hw(uint32_t mask) +{ +	uint32_t trap_on_start = (mask & KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START) ? 1 : 0; +	uint32_t trap_on_end = (mask & KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END) ? 1 : 0; +	uint32_t excp_en = mask & (KFD_DBG_TRAP_MASK_FP_INVALID | +			KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL | +			KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO | +			KFD_DBG_TRAP_MASK_FP_OVERFLOW | +			KFD_DBG_TRAP_MASK_FP_UNDERFLOW | +			KFD_DBG_TRAP_MASK_FP_INEXACT | +			KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO | +			KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH | +			KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION); +	uint32_t ret; + +	ret = REG_SET_FIELD(0, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, excp_en); +	ret = REG_SET_FIELD(ret, SPI_GDBG_PER_VMID_CNTL, TRAP_ON_START, trap_on_start); +	ret = REG_SET_FIELD(ret, SPI_GDBG_PER_VMID_CNTL, TRAP_ON_END, trap_on_end); + +	return ret; +} + +static uint32_t trap_mask_map_hw_to_sw(uint32_t mask) +{ +	uint32_t ret = REG_GET_FIELD(mask, SPI_GDBG_PER_VMID_CNTL, EXCP_EN); + +	if (REG_GET_FIELD(mask, SPI_GDBG_PER_VMID_CNTL, TRAP_ON_START)) +		ret |= KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START; + +	if (REG_GET_FIELD(mask, SPI_GDBG_PER_VMID_CNTL, TRAP_ON_END)) +		ret |= KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END; + +	return ret; +} + +/* Returns TRAP_EN, EXCP_EN and EXCP_REPLACE. */ +static uint32_t kgd_gfx_v11_set_wave_launch_trap_override(struct amdgpu_device *adev, +					uint32_t vmid, +					uint32_t trap_override, +					uint32_t trap_mask_bits, +					uint32_t trap_mask_request, +					uint32_t *trap_mask_prev, +					uint32_t kfd_dbg_trap_cntl_prev) +{ +	uint32_t data = 0; + +	*trap_mask_prev = trap_mask_map_hw_to_sw(kfd_dbg_trap_cntl_prev); + +	data = (trap_mask_bits & trap_mask_request) | (*trap_mask_prev & ~trap_mask_request); +	data = trap_mask_map_sw_to_hw(data); + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, trap_override); + +	return data; +} + +static uint32_t kgd_gfx_v11_set_wave_launch_mode(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid) +{ +	uint32_t data = 0; + +	data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, LAUNCH_MODE, wave_launch_mode); + +	return data; +} + +#define TCP_WATCH_STRIDE (regTCP_WATCH1_ADDR_H - regTCP_WATCH0_ADDR_H) +static uint32_t kgd_gfx_v11_set_address_watch(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid) +{ +	uint32_t watch_address_high; +	uint32_t watch_address_low; +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; +	watch_address_low = lower_32_bits(watch_address); +	watch_address_high = upper_32_bits(watch_address) & 0xffff; + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MODE, +			watch_mode); + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MASK, +			watch_address_mask >> 7); + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			1); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, regTCP_WATCH0_ADDR_H) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_high); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, regTCP_WATCH0_ADDR_L) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_low); + +	return watch_address_cntl; +} + +static uint32_t kgd_gfx_v11_clear_address_watch(struct amdgpu_device *adev, +						uint32_t watch_id) +{ +	return 0; +} +  const struct kfd2kgd_calls gfx_v11_kfd2kgd = {  	.program_sh_mem_settings = program_sh_mem_settings_v11,  	.set_pasid_vmid_mapping = set_pasid_vmid_mapping_v11, @@ -622,4 +801,11 @@ const struct kfd2kgd_calls gfx_v11_kfd2kgd = {  	.wave_control_execute = wave_control_execute_v11,  	.get_atc_vmid_pasid_mapping_info = NULL,  	.set_vm_context_page_table_base = set_vm_context_page_table_base_v11, +	.enable_debug_trap = kgd_gfx_v11_enable_debug_trap, +	.disable_debug_trap = kgd_gfx_v11_disable_debug_trap, +	.validate_trap_override_request = kgd_gfx_v11_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_gfx_v11_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_gfx_v11_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_v11_set_address_watch, +	.clear_address_watch = kgd_gfx_v11_clear_address_watch  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c index e83cb1c09610..6bf448ab3dff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -78,7 +78,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -91,7 +91,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  }  static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	/*  	 * We have to assume that there is no outstanding mapping. @@ -114,7 +114,8 @@ static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid,  	return 0;  } -static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id) +static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -158,7 +159,7 @@ static inline struct cik_sdma_rlc_registers *get_sdma_mqd(void *mqd)  static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  			uint32_t pipe_id, uint32_t queue_id,  			uint32_t __user *wptr, uint32_t wptr_shift, -			uint32_t wptr_mask, struct mm_struct *mm) +			uint32_t wptr_mask, struct mm_struct *mm, uint32_t inst)  {  	struct cik_mqd *m;  	uint32_t *mqd_hqd; @@ -202,7 +203,7 @@ static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  static int kgd_hqd_dump(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS (35+4) @@ -318,7 +319,7 @@ static int kgd_hqd_sdma_dump(struct amdgpu_device *adev,  static bool kgd_hqd_is_occupied(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false; @@ -358,7 +359,7 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)  static int kgd_hqd_destroy(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t temp;  	enum hqd_dequeue_request_type type; @@ -494,7 +495,7 @@ static int kgd_hqd_sdma_destroy(struct amdgpu_device *adev, void *mqd,  static int kgd_wave_control_execute(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c index 870f352837fc..cd06e4a6d1da 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c @@ -72,7 +72,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  {  	lock_srbm(adev, 0, 0, 0, vmid); @@ -85,7 +85,7 @@ static void kgd_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmi  }  static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	/*  	 * We have to assume that there is no outstanding mapping. @@ -109,7 +109,8 @@ static int kgd_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid,  	return 0;  } -static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id) +static int kgd_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -153,7 +154,7 @@ static inline struct vi_sdma_mqd *get_sdma_mqd(void *mqd)  static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  			uint32_t pipe_id, uint32_t queue_id,  			uint32_t __user *wptr, uint32_t wptr_shift, -			uint32_t wptr_mask, struct mm_struct *mm) +			uint32_t wptr_mask, struct mm_struct *mm, uint32_t inst)  {  	struct vi_mqd *m;  	uint32_t *mqd_hqd; @@ -226,7 +227,7 @@ static int kgd_hqd_load(struct amdgpu_device *adev, void *mqd,  static int kgd_hqd_dump(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS (54+4) @@ -350,7 +351,7 @@ static int kgd_hqd_sdma_dump(struct amdgpu_device *adev,  static bool kgd_hqd_is_occupied(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false; @@ -390,7 +391,7 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)  static int kgd_hqd_destroy(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t temp;  	enum hqd_dequeue_request_type type; @@ -540,7 +541,7 @@ static bool get_atc_vmid_pasid_mapping_info(struct amdgpu_device *adev,  static int kgd_wave_control_execute(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data = 0; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c index e92b93557c13..51d93fb13ea3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c @@ -38,6 +38,7 @@  #include "soc15d.h"  #include "gfx_v9_0.h"  #include "amdgpu_amdkfd_gfx_v9.h" +#include <uapi/linux/kfd_ioctl.h>  enum hqd_dequeue_request_type {  	NO_ACTION = 0, @@ -46,29 +47,29 @@ enum hqd_dequeue_request_type {  	SAVE_WAVES  }; -static void lock_srbm(struct amdgpu_device *adev, uint32_t mec, uint32_t pipe, -			uint32_t queue, uint32_t vmid) +static void kgd_gfx_v9_lock_srbm(struct amdgpu_device *adev, uint32_t mec, uint32_t pipe, +			uint32_t queue, uint32_t vmid, uint32_t inst)  {  	mutex_lock(&adev->srbm_mutex); -	soc15_grbm_select(adev, mec, pipe, queue, vmid); +	soc15_grbm_select(adev, mec, pipe, queue, vmid, GET_INST(GC, inst));  } -static void unlock_srbm(struct amdgpu_device *adev) +static void kgd_gfx_v9_unlock_srbm(struct amdgpu_device *adev, uint32_t inst)  { -	soc15_grbm_select(adev, 0, 0, 0, 0); +	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, inst));  	mutex_unlock(&adev->srbm_mutex);  } -static void acquire_queue(struct amdgpu_device *adev, uint32_t pipe_id, -				uint32_t queue_id) +void kgd_gfx_v9_acquire_queue(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t queue_id, uint32_t inst)  {  	uint32_t mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;  	uint32_t pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec); -	lock_srbm(adev, mec, pipe, queue_id, 0); +	kgd_gfx_v9_lock_srbm(adev, mec, pipe, queue_id, 0, inst);  } -static uint64_t get_queue_mask(struct amdgpu_device *adev, +uint64_t kgd_gfx_v9_get_queue_mask(struct amdgpu_device *adev,  			       uint32_t pipe_id, uint32_t queue_id)  {  	unsigned int bit = pipe_id * adev->gfx.mec.num_queue_per_pipe + @@ -77,28 +78,28 @@ static uint64_t get_queue_mask(struct amdgpu_device *adev,  	return 1ull << bit;  } -static void release_queue(struct amdgpu_device *adev) +void kgd_gfx_v9_release_queue(struct amdgpu_device *adev, uint32_t inst)  { -	unlock_srbm(adev); +	kgd_gfx_v9_unlock_srbm(adev, inst);  }  void kgd_gfx_v9_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmid,  					uint32_t sh_mem_config,  					uint32_t sh_mem_ape1_base,  					uint32_t sh_mem_ape1_limit, -					uint32_t sh_mem_bases) +					uint32_t sh_mem_bases, uint32_t inst)  { -	lock_srbm(adev, 0, 0, 0, vmid); +	kgd_gfx_v9_lock_srbm(adev, 0, 0, 0, vmid, inst); -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG), sh_mem_config); -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_BASES), sh_mem_bases); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmSH_MEM_CONFIG), sh_mem_config); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmSH_MEM_BASES), sh_mem_bases);  	/* APE1 no longer exists on GFX9 */ -	unlock_srbm(adev); +	kgd_gfx_v9_unlock_srbm(adev, inst);  }  int kgd_gfx_v9_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid, -					unsigned int vmid) +					unsigned int vmid, uint32_t inst)  {  	/*  	 * We have to assume that there is no outstanding mapping. @@ -156,7 +157,8 @@ int kgd_gfx_v9_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid,   * but still works   */ -int kgd_gfx_v9_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id) +int kgd_gfx_v9_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst)  {  	uint32_t mec;  	uint32_t pipe; @@ -164,13 +166,13 @@ int kgd_gfx_v9_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id)  	mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;  	pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec); -	lock_srbm(adev, mec, pipe, 0, 0); +	kgd_gfx_v9_lock_srbm(adev, mec, pipe, 0, 0, inst); -	WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, +	WREG32_SOC15(GC, GET_INST(GC, inst), mmCPC_INT_CNTL,  		CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK |  		CP_INT_CNTL_RING0__OPCODE_ERROR_INT_ENABLE_MASK); -	unlock_srbm(adev); +	kgd_gfx_v9_unlock_srbm(adev, inst);  	return 0;  } @@ -220,7 +222,8 @@ static inline struct v9_sdma_mqd *get_sdma_mqd(void *mqd)  int kgd_gfx_v9_hqd_load(struct amdgpu_device *adev, void *mqd,  			uint32_t pipe_id, uint32_t queue_id,  			uint32_t __user *wptr, uint32_t wptr_shift, -			uint32_t wptr_mask, struct mm_struct *mm) +			uint32_t wptr_mask, struct mm_struct *mm, +			uint32_t inst)  {  	struct v9_mqd *m;  	uint32_t *mqd_hqd; @@ -228,21 +231,22 @@ int kgd_gfx_v9_hqd_load(struct amdgpu_device *adev, void *mqd,  	m = get_mqd(mqd); -	acquire_queue(adev, pipe_id, queue_id); +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst);  	/* HQD registers extend from CP_MQD_BASE_ADDR to CP_HQD_EOP_WPTR_MEM. */  	mqd_hqd = &m->cp_mqd_base_addr_lo; -	hqd_base = SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR); +	hqd_base = SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_MQD_BASE_ADDR);  	for (reg = hqd_base; -	     reg <= SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI); reg++) +	     reg <= SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_HI); reg++)  		WREG32_RLC(reg, mqd_hqd[reg - hqd_base]);  	/* Activate doorbell logic before triggering WPTR poll. */  	data = REG_SET_FIELD(m->cp_hqd_pq_doorbell_control,  			     CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1); -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), data); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_DOORBELL_CONTROL), +					data);  	if (wptr) {  		/* Don't read wptr with get_user because the user @@ -271,43 +275,43 @@ int kgd_gfx_v9_hqd_load(struct amdgpu_device *adev, void *mqd,  		guessed_wptr += m->cp_hqd_pq_wptr_lo & ~(queue_size - 1);  		guessed_wptr += (uint64_t)m->cp_hqd_pq_wptr_hi << 32; -		WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_LO),  		       lower_32_bits(guessed_wptr)); -		WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_HI),  		       upper_32_bits(guessed_wptr)); -		WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR), +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_POLL_ADDR),  		       lower_32_bits((uintptr_t)wptr)); -		WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI), +		WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_POLL_ADDR_HI),  		       upper_32_bits((uintptr_t)wptr)); -		WREG32_SOC15(GC, 0, mmCP_PQ_WPTR_POLL_CNTL1, -		       (uint32_t)get_queue_mask(adev, pipe_id, queue_id)); +		WREG32_SOC15(GC, GET_INST(GC, inst), mmCP_PQ_WPTR_POLL_CNTL1, +		       (uint32_t)kgd_gfx_v9_get_queue_mask(adev, pipe_id, queue_id));  	}  	/* Start the EOP fetcher */ -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_RPTR), +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_EOP_RPTR),  	       REG_SET_FIELD(m->cp_hqd_eop_rptr,  			     CP_HQD_EOP_RPTR, INIT_FETCHER, 1));  	data = REG_SET_FIELD(m->cp_hqd_active, CP_HQD_ACTIVE, ACTIVE, 1); -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), data); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_ACTIVE), data); -	release_queue(adev); +	kgd_gfx_v9_release_queue(adev, inst);  	return 0;  }  int kgd_gfx_v9_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  			    uint32_t pipe_id, uint32_t queue_id, -			    uint32_t doorbell_off) +			    uint32_t doorbell_off, uint32_t inst)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[inst].ring;  	struct v9_mqd *m;  	uint32_t mec, pipe;  	int r;  	m = get_mqd(mqd); -	acquire_queue(adev, pipe_id, queue_id); +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst);  	mec = (pipe_id / adev->gfx.mec.num_pipe_per_mec) + 1;  	pipe = (pipe_id % adev->gfx.mec.num_pipe_per_mec); @@ -315,7 +319,7 @@ int kgd_gfx_v9_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  	pr_debug("kfd: set HIQ, mec:%d, pipe:%d, queue:%d.\n",  		 mec, pipe, queue_id); -	spin_lock(&adev->gfx.kiq.ring_lock); +	spin_lock(&adev->gfx.kiq[inst].ring_lock);  	r = amdgpu_ring_alloc(kiq_ring, 7);  	if (r) {  		pr_err("Failed to alloc KIQ (%d).\n", r); @@ -342,15 +346,15 @@ int kgd_gfx_v9_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  	amdgpu_ring_commit(kiq_ring);  out_unlock: -	spin_unlock(&adev->gfx.kiq.ring_lock); -	release_queue(adev); +	spin_unlock(&adev->gfx.kiq[inst].ring_lock); +	kgd_gfx_v9_release_queue(adev, inst);  	return r;  }  int kgd_gfx_v9_hqd_dump(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs) +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst)  {  	uint32_t i = 0, reg;  #define HQD_N_REGS 56 @@ -365,13 +369,13 @@ int kgd_gfx_v9_hqd_dump(struct amdgpu_device *adev,  	if (*dump == NULL)  		return -ENOMEM; -	acquire_queue(adev, pipe_id, queue_id); +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst); -	for (reg = SOC15_REG_OFFSET(GC, 0, mmCP_MQD_BASE_ADDR); -	     reg <= SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI); reg++) +	for (reg = SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_MQD_BASE_ADDR); +	     reg <= SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_PQ_WPTR_HI); reg++)  		DUMP_REG(reg); -	release_queue(adev); +	kgd_gfx_v9_release_queue(adev, inst);  	WARN_ON_ONCE(i != HQD_N_REGS);  	*n_regs = i; @@ -481,23 +485,23 @@ static int kgd_hqd_sdma_dump(struct amdgpu_device *adev,  bool kgd_gfx_v9_hqd_is_occupied(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	uint32_t act;  	bool retval = false;  	uint32_t low, high; -	acquire_queue(adev, pipe_id, queue_id); -	act = RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE); +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst); +	act = RREG32_SOC15(GC, GET_INST(GC, inst), mmCP_HQD_ACTIVE);  	if (act) {  		low = lower_32_bits(queue_address >> 8);  		high = upper_32_bits(queue_address >> 8); -		if (low == RREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE) && -		   high == RREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE_HI)) +		if (low == RREG32_SOC15(GC, GET_INST(GC, inst), mmCP_HQD_PQ_BASE) && +		   high == RREG32_SOC15(GC, GET_INST(GC, inst), mmCP_HQD_PQ_BASE_HI))  			retval = true;  	} -	release_queue(adev); +	kgd_gfx_v9_release_queue(adev, inst);  	return retval;  } @@ -522,7 +526,7 @@ static bool kgd_hqd_sdma_is_occupied(struct amdgpu_device *adev, void *mqd)  int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id) +				uint32_t queue_id, uint32_t inst)  {  	enum hqd_dequeue_request_type type;  	unsigned long end_jiffies; @@ -532,10 +536,10 @@ int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,  	if (amdgpu_in_reset(adev))  		return -EIO; -	acquire_queue(adev, pipe_id, queue_id); +	kgd_gfx_v9_acquire_queue(adev, pipe_id, queue_id, inst);  	if (m->cp_hqd_vmid == 0) -		WREG32_FIELD15_RLC(GC, 0, RLC_CP_SCHEDULERS, scheduler1, 0); +		WREG32_FIELD15_RLC(GC, GET_INST(GC, inst), RLC_CP_SCHEDULERS, scheduler1, 0);  	switch (reset_type) {  	case KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN: @@ -552,22 +556,22 @@ int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,  		break;  	} -	WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), type); +	WREG32_RLC(SOC15_REG_OFFSET(GC, GET_INST(GC, inst), mmCP_HQD_DEQUEUE_REQUEST), type);  	end_jiffies = (utimeout * HZ / 1000) + jiffies;  	while (true) { -		temp = RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE); +		temp = RREG32_SOC15(GC, GET_INST(GC, inst), mmCP_HQD_ACTIVE);  		if (!(temp & CP_HQD_ACTIVE__ACTIVE_MASK))  			break;  		if (time_after(jiffies, end_jiffies)) {  			pr_err("cp queue preemption time out.\n"); -			release_queue(adev); +			kgd_gfx_v9_release_queue(adev, inst);  			return -ETIME;  		}  		usleep_range(500, 1000);  	} -	release_queue(adev); +	kgd_gfx_v9_release_queue(adev, inst);  	return 0;  } @@ -624,14 +628,14 @@ bool kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(struct amdgpu_device *adev,  int kgd_gfx_v9_wave_control_execute(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd) +					uint32_t sq_cmd, uint32_t inst)  {  	uint32_t data = 0;  	mutex_lock(&adev->grbm_idx_mutex); -	WREG32_SOC15_RLC_SHADOW(GC, 0, mmGRBM_GFX_INDEX, gfx_index_val); -	WREG32_SOC15(GC, 0, mmSQ_CMD, sq_cmd); +	WREG32_SOC15_RLC_SHADOW(GC, GET_INST(GC, inst), mmGRBM_GFX_INDEX, gfx_index_val); +	WREG32_SOC15(GC, GET_INST(GC, inst), mmSQ_CMD, sq_cmd);  	data = REG_SET_FIELD(data, GRBM_GFX_INDEX,  		INSTANCE_BROADCAST_WRITES, 1); @@ -640,12 +644,271 @@ int kgd_gfx_v9_wave_control_execute(struct amdgpu_device *adev,  	data = REG_SET_FIELD(data, GRBM_GFX_INDEX,  		SE_BROADCAST_WRITES, 1); -	WREG32_SOC15_RLC_SHADOW(GC, 0, mmGRBM_GFX_INDEX, data); +	WREG32_SOC15_RLC_SHADOW(GC, GET_INST(GC, inst), mmGRBM_GFX_INDEX, data);  	mutex_unlock(&adev->grbm_idx_mutex);  	return 0;  } +/* + * GFX9 helper for wave launch stall requirements on debug trap setting. + * + * vmid: + *   Target VMID to stall/unstall. + * + * stall: + *   0-unstall wave launch (enable), 1-stall wave launch (disable). + *   After wavefront launch has been stalled, allocated waves must drain from + *   SPI in order for debug trap settings to take effect on those waves. + *   This is roughly a ~96 clock cycle wait on SPI where a read on + *   SPI_GDBG_WAVE_CNTL translates to ~32 clock cycles. + *   KGD_GFX_V9_WAVE_LAUNCH_SPI_DRAIN_LATENCY indicates the number of reads required. + * + *   NOTE: We can afford to clear the entire STALL_VMID field on unstall + *   because GFX9.4.1 cannot support multi-process debugging due to trap + *   configuration and masking being limited to global scope.  Always assume + *   single process conditions. + */ +#define KGD_GFX_V9_WAVE_LAUNCH_SPI_DRAIN_LATENCY	3 +void kgd_gfx_v9_set_wave_launch_stall(struct amdgpu_device *adev, +					uint32_t vmid, +					bool stall) +{ +	int i; +	uint32_t data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); + +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1)) +		data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_VMID, +							stall ? 1 << vmid : 0); +	else +		data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL, STALL_RA, +							stall ? 1 : 0); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), data); + +	if (!stall) +		return; + +	for (i = 0; i < KGD_GFX_V9_WAVE_LAUNCH_SPI_DRAIN_LATENCY; i++) +		RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); +} + +/* + * restore_dbg_registers is ignored here but is a general interface requirement + * for devices that support GFXOFF and where the RLC save/restore list + * does not support hw registers for debugging i.e. the driver has to manually + * initialize the debug mode registers after it has disabled GFX off during the + * debug session. + */ +uint32_t kgd_gfx_v9_enable_debug_trap(struct amdgpu_device *adev, +				bool restore_dbg_registers, +				uint32_t vmid) +{ +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +/* + * keep_trap_enabled is ignored here but is a general interface requirement + * for devices that support multi-process debugging where the performance + * overhead from trap temporary setup needs to be bypassed when the debug + * session has ended. + */ +uint32_t kgd_gfx_v9_disable_debug_trap(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid) +{ +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +int kgd_gfx_v9_validate_trap_override_request(struct amdgpu_device *adev, +					uint32_t trap_override, +					uint32_t *trap_mask_supported) +{ +	*trap_mask_supported &= KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH; + +	/* The SPI_GDBG_TRAP_MASK register is global and affects all +	 * processes. Only allow OR-ing the address-watch bit, since +	 * this only affects processes under the debugger. Other bits +	 * should stay 0 to avoid the debugger interfering with other +	 * processes. +	 */ +	if (trap_override != KFD_DBG_TRAP_OVERRIDE_OR) +		return -EINVAL; + +	return 0; +} + +uint32_t kgd_gfx_v9_set_wave_launch_trap_override(struct amdgpu_device *adev, +					     uint32_t vmid, +					     uint32_t trap_override, +					     uint32_t trap_mask_bits, +					     uint32_t trap_mask_request, +					     uint32_t *trap_mask_prev, +					     uint32_t kfd_dbg_cntl_prev) +{ +	uint32_t data, wave_cntl_prev; + +	mutex_lock(&adev->grbm_idx_mutex); + +	wave_cntl_prev = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL)); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	data = RREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK)); +	*trap_mask_prev = REG_GET_FIELD(data, SPI_GDBG_TRAP_MASK, EXCP_EN); + +	trap_mask_bits = (trap_mask_bits & trap_mask_request) | +		(*trap_mask_prev & ~trap_mask_request); + +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, EXCP_EN, trap_mask_bits); +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_MASK, REPLACE, trap_override); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), data); + +	/* We need to preserve wave launch mode stall settings. */ +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL), wave_cntl_prev); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +uint32_t kgd_gfx_v9_set_wave_launch_mode(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid) +{ +	uint32_t data = 0; +	bool is_mode_set = !!wave_launch_mode; + +	mutex_lock(&adev->grbm_idx_mutex); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, true); + +	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, +		VMID_MASK, is_mode_set ? 1 << vmid : 0); +	data = REG_SET_FIELD(data, SPI_GDBG_WAVE_CNTL2, +		MODE, is_mode_set ? wave_launch_mode : 0); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_WAVE_CNTL2), data); + +	kgd_gfx_v9_set_wave_launch_stall(adev, vmid, false); + +	mutex_unlock(&adev->grbm_idx_mutex); + +	return 0; +} + +#define TCP_WATCH_STRIDE (mmTCP_WATCH1_ADDR_H - mmTCP_WATCH0_ADDR_H) +uint32_t kgd_gfx_v9_set_address_watch(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid) +{ +	uint32_t watch_address_high; +	uint32_t watch_address_low; +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; + +	watch_address_low = lower_32_bits(watch_address); +	watch_address_high = upper_32_bits(watch_address) & 0xffff; + +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VMID, +			debug_vmid); +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MODE, +			watch_mode); +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			MASK, +			watch_address_mask >> 6); + +	/* Turning off this watch point until we set all the registers */ +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			0); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_ADDR_H) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_high); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_ADDR_L) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_low); + +	/* Enable the watch point */ +	watch_address_cntl = REG_SET_FIELD(watch_address_cntl, +			TCP_WATCH0_CNTL, +			VALID, +			1); + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	return 0; +} + +uint32_t kgd_gfx_v9_clear_address_watch(struct amdgpu_device *adev, +					uint32_t watch_id) +{ +	uint32_t watch_address_cntl; + +	watch_address_cntl = 0; + +	WREG32_RLC((SOC15_REG_OFFSET(GC, 0, mmTCP_WATCH0_CNTL) + +			(watch_id * TCP_WATCH_STRIDE)), +			watch_address_cntl); + +	return 0; +} + +/* kgd_gfx_v9_get_iq_wait_times: Returns the mmCP_IQ_WAIT_TIME1/2 values + * The values read are: + *     ib_offload_wait_time     -- Wait Count for Indirect Buffer Offloads. + *     atomic_offload_wait_time -- Wait Count for L2 and GDS Atomics Offloads. + *     wrm_offload_wait_time    -- Wait Count for WAIT_REG_MEM Offloads. + *     gws_wait_time            -- Wait Count for Global Wave Syncs. + *     que_sleep_wait_time      -- Wait Count for Dequeue Retry. + *     sch_wave_wait_time       -- Wait Count for Scheduling Wave Message. + *     sem_rearm_wait_time      -- Wait Count for Semaphore re-arm. + *     deq_retry_wait_time      -- Wait Count for Global Wave Syncs. + */ +void kgd_gfx_v9_get_iq_wait_times(struct amdgpu_device *adev, +					uint32_t *wait_times) + +{ +	*wait_times = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2)); +} +  void kgd_gfx_v9_set_vm_context_page_table_base(struct amdgpu_device *adev,  			uint32_t vmid, uint64_t page_table_base)  { @@ -682,10 +945,11 @@ static void unlock_spi_csq_mutexes(struct amdgpu_device *adev)   * @queue_idx: Index of queue in the queue-map bit-field   * @wave_cnt: Output parameter updated with number of waves in flight   * @vmid: Output parameter updated with VMID of queue whose wave count - * is being collected + *        is being collected + * @inst: xcc's instance number on a multi-XCC setup   */  static void get_wave_count(struct amdgpu_device *adev, int queue_idx, -		int *wave_cnt, int *vmid) +		int *wave_cnt, int *vmid, uint32_t inst)  {  	int pipe_idx;  	int queue_slot; @@ -700,12 +964,12 @@ static void get_wave_count(struct amdgpu_device *adev, int queue_idx,  	*wave_cnt = 0;  	pipe_idx = queue_idx / adev->gfx.mec.num_queue_per_pipe;  	queue_slot = queue_idx % adev->gfx.mec.num_queue_per_pipe; -	soc15_grbm_select(adev, 1, pipe_idx, queue_slot, 0); -	reg_val = RREG32_SOC15_IP(GC, SOC15_REG_OFFSET(GC, 0, mmSPI_CSQ_WF_ACTIVE_COUNT_0) + +	soc15_grbm_select(adev, 1, pipe_idx, queue_slot, 0, inst); +	reg_val = RREG32_SOC15_IP(GC, SOC15_REG_OFFSET(GC, inst, mmSPI_CSQ_WF_ACTIVE_COUNT_0) +  			 queue_slot);  	*wave_cnt = reg_val & SPI_CSQ_WF_ACTIVE_COUNT_0__COUNT_MASK;  	if (*wave_cnt != 0) -		*vmid = (RREG32_SOC15(GC, 0, mmCP_HQD_VMID) & +		*vmid = (RREG32_SOC15(GC, inst, mmCP_HQD_VMID) &  			 CP_HQD_VMID__VMID_MASK) >> CP_HQD_VMID__VMID__SHIFT;  } @@ -718,9 +982,10 @@ static void get_wave_count(struct amdgpu_device *adev, int queue_idx,   * @adev: Handle of device from which to get number of waves in flight   * @pasid: Identifies the process for which this query call is invoked   * @pasid_wave_cnt: Output parameter updated with number of waves in flight that - * belong to process with given pasid + *                  belong to process with given pasid   * @max_waves_per_cu: Output parameter updated with maximum number of waves - * possible per Compute Unit + *                    possible per Compute Unit + * @inst: xcc's instance number on a multi-XCC setup   *   * Note: It's possible that the device has too many queues (oversubscription)   * in which case a VMID could be remapped to a different PASID. This could lead @@ -756,7 +1021,7 @@ static void get_wave_count(struct amdgpu_device *adev, int queue_idx,   *  Reading registers referenced above involves programming GRBM appropriately   */  void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid, -		int *pasid_wave_cnt, int *max_waves_per_cu) +		int *pasid_wave_cnt, int *max_waves_per_cu, uint32_t inst)  {  	int qidx;  	int vmid; @@ -772,13 +1037,13 @@ void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid,  	DECLARE_BITMAP(cp_queue_bitmap, KGD_MAX_QUEUES);  	lock_spi_csq_mutexes(adev); -	soc15_grbm_select(adev, 1, 0, 0, 0); +	soc15_grbm_select(adev, 1, 0, 0, 0, inst);  	/*  	 * Iterate through the shader engines and arrays of the device  	 * to get number of waves in flight  	 */ -	bitmap_complement(cp_queue_bitmap, adev->gfx.mec.queue_bitmap, +	bitmap_complement(cp_queue_bitmap, adev->gfx.mec_bitmap[0].queue_bitmap,  			  KGD_MAX_QUEUES);  	max_queue_cnt = adev->gfx.mec.num_pipe_per_mec *  			adev->gfx.mec.num_queue_per_pipe; @@ -787,8 +1052,8 @@ void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid,  	for (se_idx = 0; se_idx < se_cnt; se_idx++) {  		for (sh_idx = 0; sh_idx < sh_cnt; sh_idx++) { -			amdgpu_gfx_select_se_sh(adev, se_idx, sh_idx, 0xffffffff); -			queue_map = RREG32_SOC15(GC, 0, mmSPI_CSQ_WF_ACTIVE_STATUS); +			amdgpu_gfx_select_se_sh(adev, se_idx, sh_idx, 0xffffffff, inst); +			queue_map = RREG32_SOC15(GC, inst, mmSPI_CSQ_WF_ACTIVE_STATUS);  			/*  			 * Assumption: queue map encodes following schema: four @@ -808,10 +1073,11 @@ void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid,  					continue;  				/* Get number of waves in flight and aggregate them */ -				get_wave_count(adev, qidx, &wave_cnt, &vmid); +				get_wave_count(adev, qidx, &wave_cnt, &vmid, +						inst);  				if (wave_cnt != 0) {  					pasid_tmp = -					  RREG32(SOC15_REG_OFFSET(OSSSYS, 0, +					  RREG32(SOC15_REG_OFFSET(OSSSYS, inst,  						 mmIH_VMID_0_LUT) + vmid);  					if (pasid_tmp == pasid)  						vmid_wave_cnt += wave_cnt; @@ -820,8 +1086,8 @@ void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid,  		}  	} -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); -	soc15_grbm_select(adev, 0, 0, 0, 0); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, inst); +	soc15_grbm_select(adev, 0, 0, 0, 0, inst);  	unlock_spi_csq_mutexes(adev);  	/* Update the output parameters and return */ @@ -830,28 +1096,51 @@ void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid,  				adev->gfx.cu_info.max_waves_per_simd;  } +void kgd_gfx_v9_build_grace_period_packet_info(struct amdgpu_device *adev, +		uint32_t wait_times, +		uint32_t grace_period, +		uint32_t *reg_offset, +		uint32_t *reg_data) +{ +	*reg_data = wait_times; + +	/* +	 * The CP cannont handle a 0 grace period input and will result in +	 * an infinite grace period being set so set to 1 to prevent this. +	 */ +	if (grace_period == 0) +		grace_period = 1; + +	*reg_data = REG_SET_FIELD(*reg_data, +			CP_IQ_WAIT_TIME2, +			SCH_WAVE, +			grace_period); + +	*reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_IQ_WAIT_TIME2); +} +  void kgd_gfx_v9_program_trap_handler_settings(struct amdgpu_device *adev, -                        uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr) +		uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr, uint32_t inst)  { -	lock_srbm(adev, 0, 0, 0, vmid); +	kgd_gfx_v9_lock_srbm(adev, 0, 0, 0, vmid, inst);  	/*  	 * Program TBA registers  	 */ -	WREG32_SOC15(GC, 0, mmSQ_SHADER_TBA_LO, +	WREG32_SOC15(GC, GET_INST(GC, inst), mmSQ_SHADER_TBA_LO,                          lower_32_bits(tba_addr >> 8)); -	WREG32_SOC15(GC, 0, mmSQ_SHADER_TBA_HI, +	WREG32_SOC15(GC, GET_INST(GC, inst), mmSQ_SHADER_TBA_HI,                          upper_32_bits(tba_addr >> 8));  	/*  	 * Program TMA registers  	 */ -	WREG32_SOC15(GC, 0, mmSQ_SHADER_TMA_LO, +	WREG32_SOC15(GC, GET_INST(GC, inst), mmSQ_SHADER_TMA_LO,  			lower_32_bits(tma_addr >> 8)); -	WREG32_SOC15(GC, 0, mmSQ_SHADER_TMA_HI, +	WREG32_SOC15(GC, GET_INST(GC, inst), mmSQ_SHADER_TMA_HI,  			upper_32_bits(tma_addr >> 8)); -	unlock_srbm(adev); +	kgd_gfx_v9_unlock_srbm(adev, inst);  }  const struct kfd2kgd_calls gfx_v9_kfd2kgd = { @@ -871,6 +1160,15 @@ const struct kfd2kgd_calls gfx_v9_kfd2kgd = {  	.get_atc_vmid_pasid_mapping_info =  			kgd_gfx_v9_get_atc_vmid_pasid_mapping_info,  	.set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base, +	.enable_debug_trap = kgd_gfx_v9_enable_debug_trap, +	.disable_debug_trap = kgd_gfx_v9_disable_debug_trap, +	.validate_trap_override_request = kgd_gfx_v9_validate_trap_override_request, +	.set_wave_launch_trap_override = kgd_gfx_v9_set_wave_launch_trap_override, +	.set_wave_launch_mode = kgd_gfx_v9_set_wave_launch_mode, +	.set_address_watch = kgd_gfx_v9_set_address_watch, +	.clear_address_watch = kgd_gfx_v9_clear_address_watch, +	.get_iq_wait_times = kgd_gfx_v9_get_iq_wait_times, +	.build_grace_period_packet_info = kgd_gfx_v9_build_grace_period_packet_info,  	.get_cu_occupancy = kgd_gfx_v9_get_cu_occupancy,  	.program_trap_handler_settings = kgd_gfx_v9_program_trap_handler_settings,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h index c7ed3bc9053c..5f54bff0db49 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h @@ -20,41 +20,81 @@   * OTHER DEALINGS IN THE SOFTWARE.   */ - -  void kgd_gfx_v9_program_sh_mem_settings(struct amdgpu_device *adev, uint32_t vmid,  		uint32_t sh_mem_config,  		uint32_t sh_mem_ape1_base, uint32_t sh_mem_ape1_limit, -		uint32_t sh_mem_bases); +		uint32_t sh_mem_bases, uint32_t inst);  int kgd_gfx_v9_set_pasid_vmid_mapping(struct amdgpu_device *adev, u32 pasid, -		unsigned int vmid); -int kgd_gfx_v9_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id); +		unsigned int vmid, uint32_t inst); +int kgd_gfx_v9_init_interrupts(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t inst);  int kgd_gfx_v9_hqd_load(struct amdgpu_device *adev, void *mqd, uint32_t pipe_id,  			uint32_t queue_id, uint32_t __user *wptr,  			uint32_t wptr_shift, uint32_t wptr_mask, -			struct mm_struct *mm); +			struct mm_struct *mm, uint32_t inst);  int kgd_gfx_v9_hiq_mqd_load(struct amdgpu_device *adev, void *mqd,  			    uint32_t pipe_id, uint32_t queue_id, -			    uint32_t doorbell_off); +			    uint32_t doorbell_off, uint32_t inst);  int kgd_gfx_v9_hqd_dump(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs); +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst);  bool kgd_gfx_v9_hqd_is_occupied(struct amdgpu_device *adev,  			uint64_t queue_address, uint32_t pipe_id, -			uint32_t queue_id); +			uint32_t queue_id, uint32_t inst);  int kgd_gfx_v9_hqd_destroy(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int utimeout, uint32_t pipe_id, -				uint32_t queue_id); +				uint32_t queue_id, uint32_t inst);  int kgd_gfx_v9_wave_control_execute(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd); +					uint32_t sq_cmd, uint32_t inst);  bool kgd_gfx_v9_get_atc_vmid_pasid_mapping_info(struct amdgpu_device *adev,  					uint8_t vmid, uint16_t *p_pasid); -  void kgd_gfx_v9_set_vm_context_page_table_base(struct amdgpu_device *adev,  			uint32_t vmid, uint64_t page_table_base);  void kgd_gfx_v9_get_cu_occupancy(struct amdgpu_device *adev, int pasid, -		int *pasid_wave_cnt, int *max_waves_per_cu); +		int *pasid_wave_cnt, int *max_waves_per_cu, uint32_t inst);  void kgd_gfx_v9_program_trap_handler_settings(struct amdgpu_device *adev, -		uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr); +		uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr, +		uint32_t inst); +void kgd_gfx_v9_acquire_queue(struct amdgpu_device *adev, uint32_t pipe_id, +				uint32_t queue_id, uint32_t inst); +uint64_t kgd_gfx_v9_get_queue_mask(struct amdgpu_device *adev, +				uint32_t pipe_id, uint32_t queue_id); +void kgd_gfx_v9_release_queue(struct amdgpu_device *adev, uint32_t inst); +void kgd_gfx_v9_set_wave_launch_stall(struct amdgpu_device *adev, +					uint32_t vmid, +					bool stall); +uint32_t kgd_gfx_v9_enable_debug_trap(struct amdgpu_device *adev, +				      bool restore_dbg_registers, +				      uint32_t vmid); +uint32_t kgd_gfx_v9_disable_debug_trap(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid); +int kgd_gfx_v9_validate_trap_override_request(struct amdgpu_device *adev, +					     uint32_t trap_override, +					     uint32_t *trap_mask_supported); +uint32_t kgd_gfx_v9_set_wave_launch_mode(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid); +uint32_t kgd_gfx_v9_set_wave_launch_trap_override(struct amdgpu_device *adev, +					     uint32_t vmid, +					     uint32_t trap_override, +					     uint32_t trap_mask_bits, +					     uint32_t trap_mask_request, +					     uint32_t *trap_mask_prev, +					     uint32_t kfd_dbg_trap_cntl_prev); +uint32_t kgd_gfx_v9_set_address_watch(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid); +uint32_t kgd_gfx_v9_clear_address_watch(struct amdgpu_device *adev, +					uint32_t watch_id); +void kgd_gfx_v9_get_iq_wait_times(struct amdgpu_device *adev, uint32_t *wait_times); +void kgd_gfx_v9_build_grace_period_packet_info(struct amdgpu_device *adev, +					       uint32_t wait_times, +					       uint32_t grace_period, +					       uint32_t *reg_offset, +					       uint32_t *reg_data); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 83a83ced2439..f61527b800e6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -35,7 +35,9 @@  #include "amdgpu_dma_buf.h"  #include <uapi/linux/kfd_ioctl.h>  #include "amdgpu_xgmi.h" +#include "kfd_priv.h"  #include "kfd_smi_events.h" +#include <drm/ttm/ttm_tt.h>  /* Userptr restore delay, just long enough to allow consecutive VM   * changes to accumulate @@ -110,13 +112,16 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)  	struct sysinfo si;  	uint64_t mem; +	if (kfd_mem_limit.max_system_mem_limit) +		return; +  	si_meminfo(&si);  	mem = si.freeram - si.freehigh;  	mem *= si.mem_unit;  	spin_lock_init(&kfd_mem_limit.mem_limit_lock);  	kfd_mem_limit.max_system_mem_limit = mem - (mem >> 4); -	kfd_mem_limit.max_ttm_mem_limit = (mem >> 1) - (mem >> 3); +	kfd_mem_limit.max_ttm_mem_limit = ttm_tt_pages_limit() << PAGE_SHIFT;  	pr_debug("Kernel memory limit %lluM, TTM limit %lluM\n",  		(kfd_mem_limit.max_system_mem_limit >> 20),  		(kfd_mem_limit.max_ttm_mem_limit >> 20)); @@ -148,16 +153,20 @@ void amdgpu_amdkfd_reserve_system_mem(uint64_t size)   * @size: Size of buffer, in bytes, encapsulated by B0. This should be   * equivalent to amdgpu_bo_size(BO)   * @alloc_flag: Flag used in allocating a BO as noted above + * @xcp_id: xcp_id is used to get xcp from xcp manager, one xcp is + * managed as one compute node in driver for app   * - * Return: returns -ENOMEM in case of error, ZERO otherwise + * Return: + *	returns -ENOMEM in case of error, ZERO otherwise   */  int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev, -		uint64_t size, u32 alloc_flag) +		uint64_t size, u32 alloc_flag, int8_t xcp_id)  {  	uint64_t reserved_for_pt =  		ESTIMATE_PT_SIZE(amdgpu_amdkfd_total_mem_size);  	size_t system_mem_needed, ttm_mem_needed, vram_needed;  	int ret = 0; +	uint64_t vram_size = 0;  	system_mem_needed = 0;  	ttm_mem_needed = 0; @@ -172,6 +181,17 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,  		 * 2M BO chunk.  		 */  		vram_needed = size; +		/* +		 * For GFX 9.4.3, get the VRAM size from XCP structs +		 */ +		if (WARN_ONCE(xcp_id < 0, "invalid XCP ID %d", xcp_id)) +			return -EINVAL; + +		vram_size = KFD_XCP_MEMORY_SIZE(adev, xcp_id); +		if (adev->gmc.is_app_apu) { +			system_mem_needed = size; +			ttm_mem_needed = size; +		}  	} else if (alloc_flag & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {  		system_mem_needed = size;  	} else if (!(alloc_flag & @@ -191,8 +211,8 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,  	     kfd_mem_limit.max_system_mem_limit && !no_system_mem_limit) ||  	    (kfd_mem_limit.ttm_mem_used + ttm_mem_needed >  	     kfd_mem_limit.max_ttm_mem_limit) || -	    (adev && adev->kfd.vram_used + vram_needed > -	     adev->gmc.real_vram_size - reserved_for_pt)) { +	    (adev && xcp_id >= 0 && adev->kfd.vram_used[xcp_id] + vram_needed > +	     vram_size - reserved_for_pt)) {  		ret = -ENOMEM;  		goto release;  	} @@ -202,9 +222,11 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,  	 */  	WARN_ONCE(vram_needed && !adev,  		  "adev reference can't be null when vram is used"); -	if (adev) { -		adev->kfd.vram_used += vram_needed; -		adev->kfd.vram_used_aligned += ALIGN(vram_needed, VRAM_AVAILABLITY_ALIGN); +	if (adev && xcp_id >= 0) { +		adev->kfd.vram_used[xcp_id] += vram_needed; +		adev->kfd.vram_used_aligned[xcp_id] += adev->gmc.is_app_apu ? +				vram_needed : +				ALIGN(vram_needed, VRAM_AVAILABLITY_ALIGN);  	}  	kfd_mem_limit.system_mem_used += system_mem_needed;  	kfd_mem_limit.ttm_mem_used += ttm_mem_needed; @@ -215,7 +237,7 @@ release:  }  void amdgpu_amdkfd_unreserve_mem_limit(struct amdgpu_device *adev, -		uint64_t size, u32 alloc_flag) +		uint64_t size, u32 alloc_flag, int8_t xcp_id)  {  	spin_lock(&kfd_mem_limit.mem_limit_lock); @@ -225,9 +247,19 @@ void amdgpu_amdkfd_unreserve_mem_limit(struct amdgpu_device *adev,  	} else if (alloc_flag & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {  		WARN_ONCE(!adev,  			  "adev reference can't be null when alloc mem flags vram is set"); +		if (WARN_ONCE(xcp_id < 0, "invalid XCP ID %d", xcp_id)) +			goto release; +  		if (adev) { -			adev->kfd.vram_used -= size; -			adev->kfd.vram_used_aligned -= ALIGN(size, VRAM_AVAILABLITY_ALIGN); +			adev->kfd.vram_used[xcp_id] -= size; +			if (adev->gmc.is_app_apu) { +				adev->kfd.vram_used_aligned[xcp_id] -= size; +				kfd_mem_limit.system_mem_used -= size; +				kfd_mem_limit.ttm_mem_used -= size; +			} else { +				adev->kfd.vram_used_aligned[xcp_id] -= +					ALIGN(size, VRAM_AVAILABLITY_ALIGN); +			}  		}  	} else if (alloc_flag & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) {  		kfd_mem_limit.system_mem_used -= size; @@ -237,8 +269,8 @@ void amdgpu_amdkfd_unreserve_mem_limit(struct amdgpu_device *adev,  		pr_err("%s: Invalid BO type %#x\n", __func__, alloc_flag);  		goto release;  	} -	WARN_ONCE(adev && adev->kfd.vram_used < 0, -		  "KFD VRAM memory accounting unbalanced"); +	WARN_ONCE(adev && xcp_id >= 0 && adev->kfd.vram_used[xcp_id] < 0, +		  "KFD VRAM memory accounting unbalanced for xcp: %d", xcp_id);  	WARN_ONCE(kfd_mem_limit.ttm_mem_used < 0,  		  "KFD TTM memory accounting unbalanced");  	WARN_ONCE(kfd_mem_limit.system_mem_used < 0, @@ -254,14 +286,16 @@ void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)  	u32 alloc_flags = bo->kfd_bo->alloc_flags;  	u64 size = amdgpu_bo_size(bo); -	amdgpu_amdkfd_unreserve_mem_limit(adev, size, alloc_flags); +	amdgpu_amdkfd_unreserve_mem_limit(adev, size, alloc_flags, +					  bo->xcp_id);  	kfree(bo->kfd_bo);  }  /** - * @create_dmamap_sg_bo: Creates a amdgpu_bo object to reflect information + * create_dmamap_sg_bo() - Creates a amdgpu_bo object to reflect information   * about USERPTR or DOOREBELL or MMIO BO. + *   * @adev: Device for which dmamap BO is being created   * @mem: BO of peer device that is being DMA mapped. Provides parameters   *	 in building the dmamap BO @@ -285,7 +319,7 @@ create_dmamap_sg_bo(struct amdgpu_device *adev,  	ret = amdgpu_gem_object_create(adev, mem->bo->tbo.base.size, 1,  			AMDGPU_GEM_DOMAIN_CPU, AMDGPU_GEM_CREATE_PREEMPTIBLE | flags, -			ttm_bo_type_sg, mem->bo->tbo.base.resv, &gem_obj); +			ttm_bo_type_sg, mem->bo->tbo.base.resv, &gem_obj, 0);  	amdgpu_bo_unreserve(mem->bo); @@ -527,6 +561,12 @@ kfd_mem_dmamap_dmabuf(struct kfd_mem_attachment *attachment)  {  	struct ttm_operation_ctx ctx = {.interruptible = true};  	struct amdgpu_bo *bo = attachment->bo_va->base.bo; +	int ret; + +	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_CPU); +	ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); +	if (ret) +		return ret;  	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT);  	return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); @@ -659,11 +699,10 @@ kfd_mem_dmaunmap_userptr(struct kgd_mem *mem,  static void  kfd_mem_dmaunmap_dmabuf(struct kfd_mem_attachment *attachment)  { -	struct ttm_operation_ctx ctx = {.interruptible = true}; -	struct amdgpu_bo *bo = attachment->bo_va->base.bo; - -	amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_CPU); -	ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); +	/* This is a no-op. We don't want to trigger eviction fences when +	 * unmapping DMABufs. Therefore the invalidation (moving to system +	 * domain) is done in kfd_mem_dmamap_dmabuf. +	 */  }  /** @@ -804,7 +843,7 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,  	 * if peer device has large BAR. In contrast, access over xGMI is  	 * allowed for both small and large BAR configurations of peer device  	 */ -	if ((adev != bo_adev) && +	if ((adev != bo_adev && !adev->gmc.is_app_apu) &&  	    ((mem->domain == AMDGPU_GEM_DOMAIN_VRAM) ||  	     (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL) ||  	     (mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP))) { @@ -1599,23 +1638,42 @@ out_unlock:  	return ret;  } -size_t amdgpu_amdkfd_get_available_memory(struct amdgpu_device *adev) +size_t amdgpu_amdkfd_get_available_memory(struct amdgpu_device *adev, +					  uint8_t xcp_id)  {  	uint64_t reserved_for_pt =  		ESTIMATE_PT_SIZE(amdgpu_amdkfd_total_mem_size);  	ssize_t available; +	uint64_t vram_available, system_mem_available, ttm_mem_available;  	spin_lock(&kfd_mem_limit.mem_limit_lock); -	available = adev->gmc.real_vram_size -		- adev->kfd.vram_used_aligned +	vram_available = KFD_XCP_MEMORY_SIZE(adev, xcp_id) +		- adev->kfd.vram_used_aligned[xcp_id]  		- atomic64_read(&adev->vram_pin_size)  		- reserved_for_pt; + +	if (adev->gmc.is_app_apu) { +		system_mem_available = no_system_mem_limit ? +					kfd_mem_limit.max_system_mem_limit : +					kfd_mem_limit.max_system_mem_limit - +					kfd_mem_limit.system_mem_used; + +		ttm_mem_available = kfd_mem_limit.max_ttm_mem_limit - +				kfd_mem_limit.ttm_mem_used; + +		available = min3(system_mem_available, ttm_mem_available, +				 vram_available); +		available = ALIGN_DOWN(available, PAGE_SIZE); +	} else { +		available = ALIGN_DOWN(vram_available, VRAM_AVAILABLITY_ALIGN); +	} +  	spin_unlock(&kfd_mem_limit.mem_limit_lock);  	if (available < 0)  		available = 0; -	return ALIGN_DOWN(available, VRAM_AVAILABLITY_ALIGN); +	return available;  }  int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( @@ -1624,6 +1682,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  		uint64_t *offset, uint32_t flags, bool criu_resume)  {  	struct amdgpu_vm *avm = drm_priv_to_vm(drm_priv); +	struct amdgpu_fpriv *fpriv = container_of(avm, struct amdgpu_fpriv, vm);  	enum ttm_bo_type bo_type = ttm_bo_type_device;  	struct sg_table *sg = NULL;  	uint64_t user_addr = 0; @@ -1631,6 +1690,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	struct drm_gem_object *gobj = NULL;  	u32 domain, alloc_domain;  	uint64_t aligned_size; +	int8_t xcp_id = -1;  	u64 alloc_flags;  	int ret; @@ -1639,9 +1699,17 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	 */  	if (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) {  		domain = alloc_domain = AMDGPU_GEM_DOMAIN_VRAM; -		alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE; -		alloc_flags |= (flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) ? + +		if (adev->gmc.is_app_apu) { +			domain = AMDGPU_GEM_DOMAIN_GTT; +			alloc_domain = AMDGPU_GEM_DOMAIN_GTT; +			alloc_flags = 0; +		} else { +			alloc_flags = AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE; +			alloc_flags |= (flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) ?  			AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED : 0; +		} +		xcp_id = fpriv->xcp_id == ~0 ? 0 : fpriv->xcp_id;  	} else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_GTT) {  		domain = alloc_domain = AMDGPU_GEM_DOMAIN_GTT;  		alloc_flags = 0; @@ -1693,17 +1761,19 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	amdgpu_sync_create(&(*mem)->sync); -	ret = amdgpu_amdkfd_reserve_mem_limit(adev, aligned_size, flags); +	ret = amdgpu_amdkfd_reserve_mem_limit(adev, aligned_size, flags, +					      xcp_id);  	if (ret) {  		pr_debug("Insufficient memory\n");  		goto err_reserve_limit;  	} -	pr_debug("\tcreate BO VA 0x%llx size 0x%llx domain %s\n", -			va, (*mem)->aql_queue ? size << 1 : size, domain_string(alloc_domain)); +	pr_debug("\tcreate BO VA 0x%llx size 0x%llx domain %s xcp_id %d\n", +		 va, (*mem)->aql_queue ? size << 1 : size, +		 domain_string(alloc_domain), xcp_id);  	ret = amdgpu_gem_object_create(adev, aligned_size, 1, alloc_domain, alloc_flags, -				       bo_type, NULL, &gobj); +				       bo_type, NULL, &gobj, xcp_id + 1);  	if (ret) {  		pr_debug("Failed to create BO on domain %s. ret %d\n",  			 domain_string(alloc_domain), ret); @@ -1728,6 +1798,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  	(*mem)->domain = domain;  	(*mem)->mapped_to_gpu_memory = 0;  	(*mem)->process_info = avm->process_info; +  	add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, user_addr);  	if (user_addr) { @@ -1759,7 +1830,7 @@ err_node_allow:  	/* Don't unreserve system mem limit twice */  	goto err_reserve_limit;  err_bo_create: -	amdgpu_amdkfd_unreserve_mem_limit(adev, aligned_size, flags); +	amdgpu_amdkfd_unreserve_mem_limit(adev, aligned_size, flags, xcp_id);  err_reserve_limit:  	mutex_destroy(&(*mem)->lock);  	if (gobj) @@ -1855,11 +1926,14 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  	}  	/* Update the size of the BO being freed if it was allocated from -	 * VRAM and is not imported. +	 * VRAM and is not imported. For APP APU VRAM allocations are done +	 * in GTT domain  	 */  	if (size) { -		if ((mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_VRAM) && -		    (!is_imported)) +		if (!is_imported && +		   (mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_VRAM || +		   (adev->gmc.is_app_apu && +		    mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_GTT)))  			*size = bo_size;  		else  			*size = 0; @@ -2282,8 +2356,9 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,  	(*mem)->dmabuf = dma_buf;  	(*mem)->bo = bo;  	(*mem)->va = va; -	(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ? +	(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) && !adev->gmc.is_app_apu ?  		AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT; +  	(*mem)->mapped_to_gpu_memory = 0;  	(*mem)->process_info = avm->process_info;  	add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, false); @@ -2445,7 +2520,9 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,  			ret = -EAGAIN;  			goto unlock_out;  		} -		mem->invalid = 0; +		 /* set mem valid if mem has hmm range associated */ +		if (mem->range) +			mem->invalid = 0;  	}  unlock_out: @@ -2577,8 +2654,15 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i  	list_for_each_entry_safe(mem, tmp_mem,  				 &process_info->userptr_inval_list,  				 validate_list.head) { -		bool valid = amdgpu_ttm_tt_get_user_pages_done( -				mem->bo->tbo.ttm, mem->range); +		bool valid; + +		/* keep mem without hmm range at userptr_inval_list */ +		if (!mem->range) +			 continue; + +		/* Only check mem with hmm range associated */ +		valid = amdgpu_ttm_tt_get_user_pages_done( +					mem->bo->tbo.ttm, mem->range);  		mem->range = NULL;  		if (!valid) { @@ -2586,7 +2670,12 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i  			ret = -EAGAIN;  			continue;  		} -		WARN(mem->invalid, "Valid BO is marked invalid"); + +		if (mem->invalid) { +			WARN(1, "Valid BO is marked invalid"); +			ret = -EAGAIN; +			continue; +		}  		list_move_tail(&mem->validate_list.head,  			       &process_info->userptr_valid_list); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index ac6fe0ae4609..ef4b9a41f20a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -272,6 +272,7 @@ static int convert_atom_mem_type_to_vram_type(struct amdgpu_device *adev,  			break;  		case ATOM_DGPU_VRAM_TYPE_HBM2:  		case ATOM_DGPU_VRAM_TYPE_HBM2E: +		case ATOM_DGPU_VRAM_TYPE_HBM3:  			vram_type = AMDGPU_VRAM_TYPE_HBM;  			break;  		case ATOM_DGPU_VRAM_TYPE_GDDR6: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c index 30c28a69e847..b582b83c4984 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c @@ -104,9 +104,8 @@ static bool igp_read_bios_from_vram(struct amdgpu_device *adev)  	adev->bios = NULL;  	vram_base = pci_resource_start(adev->pdev, 0);  	bios = ioremap_wc(vram_base, size); -	if (!bios) { +	if (!bios)  		return false; -	}  	adev->bios = kmalloc(size, GFP_KERNEL);  	if (!adev->bios) { @@ -133,9 +132,8 @@ bool amdgpu_read_bios(struct amdgpu_device *adev)  	adev->bios = NULL;  	/* XXX: some cards may return 0 for rom size? ddx has a workaround */  	bios = pci_map_rom(adev->pdev, &size); -	if (!bios) { +	if (!bios)  		return false; -	}  	adev->bios = kzalloc(size, GFP_KERNEL);  	if (adev->bios == NULL) { @@ -168,9 +166,9 @@ static bool amdgpu_read_bios_from_rom(struct amdgpu_device *adev)  	header[AMD_VBIOS_SIGNATURE_END] = 0;  	if ((!AMD_IS_VALID_VBIOS(header)) || -	    0 != memcmp((char *)&header[AMD_VBIOS_SIGNATURE_OFFSET], -			AMD_VBIOS_SIGNATURE, -			strlen(AMD_VBIOS_SIGNATURE))) +		memcmp((char *)&header[AMD_VBIOS_SIGNATURE_OFFSET], +		       AMD_VBIOS_SIGNATURE, +		       strlen(AMD_VBIOS_SIGNATURE)) != 0)  		return false;  	/* valid vbios, go on */ @@ -264,7 +262,7 @@ static int amdgpu_atrm_call(acpi_handle atrm_handle, uint8_t *bios,  	status = acpi_evaluate_object(atrm_handle, NULL, &atrm_arg, &buffer);  	if (ACPI_FAILURE(status)) { -		printk("failed to evaluate ATRM got %s\n", acpi_format_exception(status)); +		DRM_ERROR("failed to evaluate ATRM got %s\n", acpi_format_exception(status));  		return -ENODEV;  	} @@ -363,7 +361,7 @@ static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)  	struct acpi_table_header *hdr;  	acpi_size tbl_size;  	UEFI_ACPI_VFCT *vfct; -	unsigned offset; +	unsigned int offset;  	if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))  		return false; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index 6be30dcb029d..d34037b85cf8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c @@ -593,11 +593,20 @@ static int amdgpu_connector_set_property(struct drm_connector *connector,  		switch (val) {  		default: -		case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break; -		case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break; -		case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break; -		case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break; +		case DRM_MODE_SCALE_NONE: +			rmx_type = RMX_OFF; +			break; +		case DRM_MODE_SCALE_CENTER: +			rmx_type = RMX_CENTER; +			break; +		case DRM_MODE_SCALE_ASPECT: +			rmx_type = RMX_ASPECT; +			break; +		case DRM_MODE_SCALE_FULLSCREEN: +			rmx_type = RMX_FULL; +			break;  		} +  		if (amdgpu_encoder->rmx_type == rmx_type)  			return 0; @@ -799,12 +808,21 @@ static int amdgpu_connector_set_lcd_property(struct drm_connector *connector,  	}  	switch (value) { -	case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break; -	case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break; -	case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break; +	case DRM_MODE_SCALE_NONE: +		rmx_type = RMX_OFF; +		break; +	case DRM_MODE_SCALE_CENTER: +		rmx_type = RMX_CENTER; +		break; +	case DRM_MODE_SCALE_ASPECT: +		rmx_type = RMX_ASPECT; +		break;  	default: -	case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break; +	case DRM_MODE_SCALE_FULLSCREEN: +		rmx_type = RMX_FULL; +		break;  	} +  	if (amdgpu_encoder->rmx_type == rmx_type)  		return 0; @@ -1127,7 +1145,8 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)  					/* assume digital unless load detected otherwise */  					amdgpu_connector->use_digital = true;  					lret = encoder_funcs->detect(encoder, connector); -					DRM_DEBUG_KMS("load_detect %x returned: %x\n",encoder->encoder_type,lret); +					DRM_DEBUG_KMS("load_detect %x returned: %x\n", +						      encoder->encoder_type, lret);  					if (lret == connector_status_connected)  						amdgpu_connector->use_digital = false;  				} @@ -1991,7 +2010,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,  	if (amdgpu_connector->hpd.hpd == AMDGPU_HPD_NONE) {  		if (i2c_bus->valid) {  			connector->polled = DRM_CONNECTOR_POLL_CONNECT | -			                    DRM_CONNECTOR_POLL_DISCONNECT; +						DRM_CONNECTOR_POLL_DISCONNECT;  		}  	} else  		connector->polled = DRM_CONNECTOR_POLL_HPD; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 2eb2c66843a8..6e1d331af01f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -112,6 +112,9 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,  	if (r < 0)  		return r; +	if (num_ibs[r] >= amdgpu_ring_max_ibs(chunk_ib->ip_type)) +		return -EINVAL; +  	++(num_ibs[r]);  	p->gang_leader_idx = r;  	return 0; @@ -192,7 +195,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,  	uint64_t *chunk_array_user;  	uint64_t *chunk_array;  	uint32_t uf_offset = 0; -	unsigned int size; +	size_t size;  	int ret;  	int i; @@ -285,6 +288,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,  		case AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES:  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT:  		case AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL: +		case AMDGPU_CHUNK_ID_CP_GFX_SHADOW:  			break;  		default: @@ -393,7 +397,7 @@ static int amdgpu_cs_p2_dependencies(struct amdgpu_cs_parser *p,  {  	struct drm_amdgpu_cs_chunk_dep *deps = chunk->kdata;  	struct amdgpu_fpriv *fpriv = p->filp->driver_priv; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -464,7 +468,7 @@ static int amdgpu_cs_p2_syncobj_in(struct amdgpu_cs_parser *p,  				   struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_sem *deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -482,7 +486,7 @@ static int amdgpu_cs_p2_syncobj_timeline_wait(struct amdgpu_cs_parser *p,  					      struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i, r;  	num_deps = chunk->length_dw * 4 / @@ -502,7 +506,7 @@ static int amdgpu_cs_p2_syncobj_out(struct amdgpu_cs_parser *p,  				    struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_sem *deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i;  	num_deps = chunk->length_dw * 4 / @@ -536,7 +540,7 @@ static int amdgpu_cs_p2_syncobj_timeline_signal(struct amdgpu_cs_parser *p,  						struct amdgpu_cs_chunk *chunk)  {  	struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps = chunk->kdata; -	unsigned num_deps; +	unsigned int num_deps;  	int i;  	num_deps = chunk->length_dw * 4 / @@ -575,6 +579,26 @@ static int amdgpu_cs_p2_syncobj_timeline_signal(struct amdgpu_cs_parser *p,  	return 0;  } +static int amdgpu_cs_p2_shadow(struct amdgpu_cs_parser *p, +			       struct amdgpu_cs_chunk *chunk) +{ +	struct drm_amdgpu_cs_chunk_cp_gfx_shadow *shadow = chunk->kdata; +	int i; + +	if (shadow->flags & ~AMDGPU_CS_CHUNK_CP_GFX_SHADOW_FLAGS_INIT_SHADOW) +		return -EINVAL; + +	for (i = 0; i < p->gang_size; ++i) { +		p->jobs[i]->shadow_va = shadow->shadow_va; +		p->jobs[i]->csa_va = shadow->csa_va; +		p->jobs[i]->gds_va = shadow->gds_va; +		p->jobs[i]->init_shadow = +			shadow->flags & AMDGPU_CS_CHUNK_CP_GFX_SHADOW_FLAGS_INIT_SHADOW; +	} + +	return 0; +} +  static int amdgpu_cs_pass2(struct amdgpu_cs_parser *p)  {  	unsigned int ce_preempt = 0, de_preempt = 0; @@ -617,6 +641,11 @@ static int amdgpu_cs_pass2(struct amdgpu_cs_parser *p)  			if (r)  				return r;  			break; +		case AMDGPU_CHUNK_ID_CP_GFX_SHADOW: +			r = amdgpu_cs_p2_shadow(p, chunk); +			if (r) +				return r; +			break;  		}  	} @@ -729,6 +758,7 @@ static void amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev,  		if (used_vis_vram < total_vis_vram) {  			u64 free_vis_vram = total_vis_vram - used_vis_vram; +  			adev->mm_stats.accum_us_vis = min(adev->mm_stats.accum_us_vis +  							  increment_us, us_upper_bound); @@ -1047,9 +1077,8 @@ static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p,  		/* the IB should be reserved at this point */  		r = amdgpu_bo_kmap(aobj, (void **)&kptr); -		if (r) { +		if (r)  			return r; -		}  		kptr += va_start - (m->start * AMDGPU_GPU_PAGE_SIZE); @@ -1356,7 +1385,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  /* Cleanup the parser structure */  static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser)  { -	unsigned i; +	unsigned int i;  	amdgpu_sync_free(&parser->sync);  	for (i = 0; i < parser->num_post_deps; i++) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c index c6d4d41c4393..23d054526e7c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c @@ -106,3 +106,41 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	ttm_eu_backoff_reservation(&ticket, &list);  	return 0;  } + +int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm, +			    struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va, +			    uint64_t csa_addr) +{ +	struct ww_acquire_ctx ticket; +	struct list_head list; +	struct amdgpu_bo_list_entry pd; +	struct ttm_validate_buffer csa_tv; +	int r; + +	INIT_LIST_HEAD(&list); +	INIT_LIST_HEAD(&csa_tv.head); +	csa_tv.bo = &bo->tbo; +	csa_tv.num_shared = 1; + +	list_add(&csa_tv.head, &list); +	amdgpu_vm_get_pd_bo(vm, &list, &pd); + +	r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); +	if (r) { +		DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); +		return r; +	} + +	r = amdgpu_vm_bo_unmap(adev, bo_va, csa_addr); +	if (r) { +		DRM_ERROR("failed to do bo_unmap on static CSA, err=%d\n", r); +		ttm_eu_backoff_reservation(&ticket, &list); +		return r; +	} + +	amdgpu_vm_bo_del(adev, bo_va); + +	ttm_eu_backoff_reservation(&ticket, &list); + +	return 0; +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h index 524b4437a021..7dfc1f2012eb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h @@ -34,6 +34,9 @@ int amdgpu_allocate_static_csa(struct amdgpu_device *adev, struct amdgpu_bo **bo  int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  			  struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,  			  uint64_t csa_addr, uint32_t size); +int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm, +			    struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va, +			    uint64_t csa_addr);  void amdgpu_free_static_csa(struct amdgpu_bo **bo);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index d2139ac12159..410acdd4554c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c @@ -222,8 +222,19 @@ static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, u32 hw_ip,  	drm_prio = amdgpu_ctx_to_drm_sched_prio(ctx_prio);  	hw_ip = array_index_nospec(hw_ip, AMDGPU_HW_IP_NUM); -	scheds = adev->gpu_sched[hw_ip][hw_prio].sched; -	num_scheds = adev->gpu_sched[hw_ip][hw_prio].num_scheds; + +	if (!(adev)->xcp_mgr) { +		scheds = adev->gpu_sched[hw_ip][hw_prio].sched; +		num_scheds = adev->gpu_sched[hw_ip][hw_prio].num_scheds; +	} else { +		struct amdgpu_fpriv *fpriv; + +		fpriv = container_of(ctx->ctx_mgr, struct amdgpu_fpriv, ctx_mgr); +		r = amdgpu_xcp_select_scheds(adev, hw_ip, hw_prio, fpriv, +						&num_scheds, &scheds); +		if (r) +			goto cleanup_entity; +	}  	/* disable load balance if the hw engine retains context among dependent jobs */  	if (hw_ip == AMDGPU_HW_IP_VCN_ENC || @@ -255,7 +266,8 @@ error_free_entity:  	return r;  } -static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity) +static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_device *adev, +				  struct amdgpu_ctx_entity *entity)  {  	ktime_t res = ns_to_ktime(0);  	int i; @@ -268,6 +280,8 @@ static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity)  		dma_fence_put(entity->fences[i]);  	} +	amdgpu_xcp_release_sched(adev, entity); +  	kfree(entity);  	return res;  } @@ -303,6 +317,7 @@ static int amdgpu_ctx_get_stable_pstate(struct amdgpu_ctx *ctx,  static int amdgpu_ctx_init(struct amdgpu_ctx_mgr *mgr, int32_t priority,  			   struct drm_file *filp, struct amdgpu_ctx *ctx)  { +	struct amdgpu_fpriv *fpriv = filp->driver_priv;  	u32 current_stable_pstate;  	int r; @@ -331,6 +346,7 @@ static int amdgpu_ctx_init(struct amdgpu_ctx_mgr *mgr, int32_t priority,  	else  		ctx->stable_pstate = current_stable_pstate; +	ctx->ctx_mgr = &(fpriv->ctx_mgr);  	return 0;  } @@ -399,7 +415,7 @@ static void amdgpu_ctx_fini(struct kref *ref)  		for (j = 0; j < AMDGPU_MAX_ENTITY_NUM; ++j) {  			ktime_t spend; -			spend = amdgpu_ctx_fini_entity(ctx->entities[i][j]); +			spend = amdgpu_ctx_fini_entity(adev, ctx->entities[i][j]);  			atomic64_add(ktime_to_ns(spend), &mgr->time_spend[i]);  		}  	} @@ -576,6 +592,9 @@ static int amdgpu_ctx_query2(struct amdgpu_device *adev,  	if (atomic_read(&ctx->guilty))  		out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_GUILTY; +	if (amdgpu_in_reset(adev)) +		out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RESET_IN_PROGRESS; +  	if (adev->ras_enabled && con) {  		/* Return the cached values in O(1),  		 * and schedule delayed work to cache diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h index 0fa0e56daf67..f1e27b6e16f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h @@ -57,6 +57,7 @@ struct amdgpu_ctx {  	unsigned long			ras_counter_ce;  	unsigned long			ras_counter_ue;  	uint32_t			stable_pstate; +	struct amdgpu_ctx_mgr		*ctx_mgr;  };  struct amdgpu_ctx_mgr { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index f60753f97ac5..56e89e76ff17 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -56,14 +56,14 @@   *   * Bit 62:  Indicates a GRBM bank switch is needed   * Bit 61:  Indicates a SRBM bank switch is needed (implies bit 62 is - * 	    zero) + *	    zero)   * Bits 24..33: The SE or ME selector if needed   * Bits 34..43: The SH (or SA) or PIPE selector if needed   * Bits 44..53: The INSTANCE (or CU/WGP) or QUEUE selector if needed   *   * Bit 23:  Indicates that the PM power gating lock should be held - * 	    This is necessary to read registers that might be - * 	    unreliable during a power gating transistion. + *	    This is necessary to read registers that might be + *	    unreliable during a power gating transistion.   *   * The lower bits are the BYTE offset of the register to read.  This   * allows reading multiple registers in a single call and having @@ -76,7 +76,7 @@ static int  amdgpu_debugfs_process_reg_op(bool read, struct file *f,  	ssize_t result = 0;  	int r;  	bool pm_pg_lock, use_bank, use_ring; -	unsigned instance_bank, sh_bank, se_bank, me, pipe, queue, vmid; +	unsigned int instance_bank, sh_bank, se_bank, me, pipe, queue, vmid;  	pm_pg_lock = use_bank = use_ring = false;  	instance_bank = sh_bank = se_bank = me = pipe = queue = vmid = 0; @@ -136,10 +136,10 @@ static int  amdgpu_debugfs_process_reg_op(bool read, struct file *f,  		}  		mutex_lock(&adev->grbm_idx_mutex);  		amdgpu_gfx_select_se_sh(adev, se_bank, -					sh_bank, instance_bank); +					sh_bank, instance_bank, 0);  	} else if (use_ring) {  		mutex_lock(&adev->srbm_mutex); -		amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue, vmid); +		amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue, vmid, 0);  	}  	if (pm_pg_lock) @@ -169,10 +169,10 @@ static int  amdgpu_debugfs_process_reg_op(bool read, struct file *f,  end:  	if (use_bank) { -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		mutex_unlock(&adev->grbm_idx_mutex);  	} else if (use_ring) { -		amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0); +		amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  	} @@ -208,7 +208,7 @@ static int amdgpu_debugfs_regs2_open(struct inode *inode, struct file *file)  {  	struct amdgpu_debugfs_regs2_data *rd; -	rd = kzalloc(sizeof *rd, GFP_KERNEL); +	rd = kzalloc(sizeof(*rd), GFP_KERNEL);  	if (!rd)  		return -ENOMEM;  	rd->adev = file_inode(file)->i_private; @@ -221,6 +221,7 @@ static int amdgpu_debugfs_regs2_open(struct inode *inode, struct file *file)  static int amdgpu_debugfs_regs2_release(struct inode *inode, struct file *file)  {  	struct amdgpu_debugfs_regs2_data *rd = file->private_data; +  	mutex_destroy(&rd->lock);  	kfree(file->private_data);  	return 0; @@ -262,14 +263,14 @@ static ssize_t amdgpu_debugfs_regs2_op(struct file *f, char __user *buf, u32 off  		}  		mutex_lock(&adev->grbm_idx_mutex);  		amdgpu_gfx_select_se_sh(adev, rd->id.grbm.se, -								rd->id.grbm.sh, -								rd->id.grbm.instance); +						  rd->id.grbm.sh, +						  rd->id.grbm.instance, rd->id.xcc_id);  	}  	if (rd->id.use_srbm) {  		mutex_lock(&adev->srbm_mutex);  		amdgpu_gfx_select_me_pipe_q(adev, rd->id.srbm.me, rd->id.srbm.pipe, -									rd->id.srbm.queue, rd->id.srbm.vmid); +					    rd->id.srbm.queue, rd->id.srbm.vmid, rd->id.xcc_id);  	}  	if (rd->id.pg_lock) @@ -295,12 +296,12 @@ static ssize_t amdgpu_debugfs_regs2_op(struct file *f, char __user *buf, u32 off  	}  end:  	if (rd->id.use_grbm) { -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, rd->id.xcc_id);  		mutex_unlock(&adev->grbm_idx_mutex);  	}  	if (rd->id.use_srbm) { -		amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0); +		amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, rd->id.xcc_id);  		mutex_unlock(&adev->srbm_mutex);  	} @@ -319,18 +320,45 @@ end:  static long amdgpu_debugfs_regs2_ioctl(struct file *f, unsigned int cmd, unsigned long data)  {  	struct amdgpu_debugfs_regs2_data *rd = f->private_data; +	struct amdgpu_debugfs_regs2_iocdata v1_data;  	int r; +	mutex_lock(&rd->lock); +  	switch (cmd) { +	case AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE_V2: +		r = copy_from_user(&rd->id, (struct amdgpu_debugfs_regs2_iocdata_v2 *)data, +				   sizeof(rd->id)); +		if (r) +			r = -EINVAL; +		goto done;  	case AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE: -		mutex_lock(&rd->lock); -		r = copy_from_user(&rd->id, (struct amdgpu_debugfs_regs2_iocdata *)data, sizeof rd->id); -		mutex_unlock(&rd->lock); -		return r ? -EINVAL : 0; +		r = copy_from_user(&v1_data, (struct amdgpu_debugfs_regs2_iocdata *)data, +				   sizeof(v1_data)); +		if (r) { +			r = -EINVAL; +			goto done; +		} +		goto v1_copy;  	default: -		return -EINVAL; +		r = -EINVAL; +		goto done;  	} -	return 0; + +v1_copy: +	rd->id.use_srbm = v1_data.use_srbm; +	rd->id.use_grbm = v1_data.use_grbm; +	rd->id.pg_lock = v1_data.pg_lock; +	rd->id.grbm.se = v1_data.grbm.se; +	rd->id.grbm.sh = v1_data.grbm.sh; +	rd->id.grbm.instance = v1_data.grbm.instance; +	rd->id.srbm.me = v1_data.srbm.me; +	rd->id.srbm.pipe = v1_data.srbm.pipe; +	rd->id.srbm.queue = v1_data.srbm.queue; +	rd->id.xcc_id = 0; +done: +	mutex_unlock(&rd->lock); +	return r;  }  static ssize_t amdgpu_debugfs_regs2_read(struct file *f, char __user *buf, size_t size, loff_t *pos) @@ -343,6 +371,136 @@ static ssize_t amdgpu_debugfs_regs2_write(struct file *f, const char __user *buf  	return amdgpu_debugfs_regs2_op(f, (char __user *)buf, *pos, size, 1);  } +static int amdgpu_debugfs_gprwave_open(struct inode *inode, struct file *file) +{ +	struct amdgpu_debugfs_gprwave_data *rd; + +	rd = kzalloc(sizeof *rd, GFP_KERNEL); +	if (!rd) +		return -ENOMEM; +	rd->adev = file_inode(file)->i_private; +	file->private_data = rd; +	mutex_init(&rd->lock); + +	return 0; +} + +static int amdgpu_debugfs_gprwave_release(struct inode *inode, struct file *file) +{ +	struct amdgpu_debugfs_gprwave_data *rd = file->private_data; +	mutex_destroy(&rd->lock); +	kfree(file->private_data); +	return 0; +} + +static ssize_t amdgpu_debugfs_gprwave_read(struct file *f, char __user *buf, size_t size, loff_t *pos) +{ +	struct amdgpu_debugfs_gprwave_data *rd = f->private_data; +	struct amdgpu_device *adev = rd->adev; +	ssize_t result = 0; +	int r; +	uint32_t *data, x; + +	if (size & 0x3 || *pos & 0x3) +		return -EINVAL; + +	r = pm_runtime_get_sync(adev_to_drm(adev)->dev); +	if (r < 0) { +		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); +		return r; +	} + +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) { +		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); +		return r; +	} + +	data = kcalloc(1024, sizeof(*data), GFP_KERNEL); +	if (!data) { +		pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); +		amdgpu_virt_disable_access_debugfs(adev); +		return -ENOMEM; +	} + +	/* switch to the specific se/sh/cu */ +	mutex_lock(&adev->grbm_idx_mutex); +	amdgpu_gfx_select_se_sh(adev, rd->id.se, rd->id.sh, rd->id.cu, rd->id.xcc_id); + +	if (!rd->id.gpr_or_wave) { +		x = 0; +		if (adev->gfx.funcs->read_wave_data) +			adev->gfx.funcs->read_wave_data(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, data, &x); +	} else { +		x = size >> 2; +		if (rd->id.gpr.vpgr_or_sgpr) { +			if (adev->gfx.funcs->read_wave_vgprs) +				adev->gfx.funcs->read_wave_vgprs(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, rd->id.gpr.thread, *pos, size>>2, data); +		} else { +			if (adev->gfx.funcs->read_wave_sgprs) +				adev->gfx.funcs->read_wave_sgprs(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, *pos, size>>2, data); +		} +	} + +	amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, rd->id.xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); + +	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); +	pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); + +	if (!x) { +		result = -EINVAL; +		goto done; +	} + +	while (size && (*pos < x * 4)) { +		uint32_t value; + +		value = data[*pos >> 2]; +		r = put_user(value, (uint32_t *)buf); +		if (r) { +			result = r; +			goto done; +		} + +		result += 4; +		buf += 4; +		*pos += 4; +		size -= 4; +	} + +done: +	amdgpu_virt_disable_access_debugfs(adev); +	kfree(data); +	return result; +} + +static long amdgpu_debugfs_gprwave_ioctl(struct file *f, unsigned int cmd, unsigned long data) +{ +	struct amdgpu_debugfs_gprwave_data *rd = f->private_data; +	int r = 0; + +	mutex_lock(&rd->lock); + +	switch (cmd) { +	case AMDGPU_DEBUGFS_GPRWAVE_IOC_SET_STATE: +		if (copy_from_user(&rd->id, +				   (struct amdgpu_debugfs_gprwave_iocdata *)data, +				   sizeof(rd->id))) +			r = -EFAULT; +		goto done; +	default: +		r = -EINVAL; +		goto done; +	} + +done: +	mutex_unlock(&rd->lock); +	return r; +} + + +  /**   * amdgpu_debugfs_regs_pcie_read - Read from a PCIE register @@ -863,7 +1021,7 @@ static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,   * The offset being sought changes which wave that the status data   * will be returned for.  The bits are used as follows:   * - * Bits 0..6: 	Byte offset into data + * Bits 0..6:	Byte offset into data   * Bits 7..14:	SE selector   * Bits 15..22:	SH/SA selector   * Bits 23..30: CU/{WGP+SIMD} selector @@ -907,13 +1065,13 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,  	/* switch to the specific se/sh/cu */  	mutex_lock(&adev->grbm_idx_mutex); -	amdgpu_gfx_select_se_sh(adev, se, sh, cu); +	amdgpu_gfx_select_se_sh(adev, se, sh, cu, 0);  	x = 0;  	if (adev->gfx.funcs->read_wave_data) -		adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x); +		adev->gfx.funcs->read_wave_data(adev, 0, simd, wave, data, &x); -	amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); +	amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); @@ -1001,17 +1159,17 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,  	/* switch to the specific se/sh/cu */  	mutex_lock(&adev->grbm_idx_mutex); -	amdgpu_gfx_select_se_sh(adev, se, sh, cu); +	amdgpu_gfx_select_se_sh(adev, se, sh, cu, 0);  	if (bank == 0) {  		if (adev->gfx.funcs->read_wave_vgprs) -			adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data); +			adev->gfx.funcs->read_wave_vgprs(adev, 0, simd, wave, thread, offset, size>>2, data);  	} else {  		if (adev->gfx.funcs->read_wave_sgprs) -			adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data); +			adev->gfx.funcs->read_wave_sgprs(adev, 0, simd, wave, offset, size>>2, data);  	} -	amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); +	amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); @@ -1339,6 +1497,15 @@ static const struct file_operations amdgpu_debugfs_regs2_fops = {  	.llseek = default_llseek  }; +static const struct file_operations amdgpu_debugfs_gprwave_fops = { +	.owner = THIS_MODULE, +	.unlocked_ioctl = amdgpu_debugfs_gprwave_ioctl, +	.read = amdgpu_debugfs_gprwave_read, +	.open = amdgpu_debugfs_gprwave_open, +	.release = amdgpu_debugfs_gprwave_release, +	.llseek = default_llseek +}; +  static const struct file_operations amdgpu_debugfs_regs_fops = {  	.owner = THIS_MODULE,  	.read = amdgpu_debugfs_regs_read, @@ -1416,6 +1583,7 @@ static const struct file_operations amdgpu_debugfs_gfxoff_residency_fops = {  static const struct file_operations *debugfs_regs[] = {  	&amdgpu_debugfs_regs_fops,  	&amdgpu_debugfs_regs2_fops, +	&amdgpu_debugfs_gprwave_fops,  	&amdgpu_debugfs_regs_didt_fops,  	&amdgpu_debugfs_regs_pcie_fops,  	&amdgpu_debugfs_regs_smc_fops, @@ -1429,9 +1597,10 @@ static const struct file_operations *debugfs_regs[] = {  	&amdgpu_debugfs_gfxoff_residency_fops,  }; -static const char *debugfs_regs_names[] = { +static const char * const debugfs_regs_names[] = {  	"amdgpu_regs",  	"amdgpu_regs2", +	"amdgpu_gprwave",  	"amdgpu_regs_didt",  	"amdgpu_regs_pcie",  	"amdgpu_regs_smc", @@ -1447,7 +1616,7 @@ static const char *debugfs_regs_names[] = {  /**   * amdgpu_debugfs_regs_init -	Initialize debugfs entries that provide - * 				register access. + *				register access.   *   * @adev: The device to attach the debugfs entries to   */ @@ -1459,7 +1628,7 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)  	for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {  		ent = debugfs_create_file(debugfs_regs_names[i], -					  S_IFREG | S_IRUGO, root, +					  S_IFREG | 0444, root,  					  adev, debugfs_regs[i]);  		if (!i && !IS_ERR_OR_NULL(ent))  			i_size_write(ent->d_inode, adev->rmmio_size); @@ -1470,7 +1639,7 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)  static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	struct drm_device *dev = adev_to_drm(adev);  	int r = 0, i; @@ -1494,12 +1663,12 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)  		kthread_park(ring->sched.thread);  	} -	seq_printf(m, "run ib test:\n"); +	seq_puts(m, "run ib test:\n");  	r = amdgpu_ib_ring_tests(adev);  	if (r)  		seq_printf(m, "ib ring tests failed (%d).\n", r);  	else -		seq_printf(m, "ib ring tests passed.\n"); +		seq_puts(m, "ib ring tests passed.\n");  	/* go on the scheduler */  	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { @@ -1581,7 +1750,7 @@ static int amdgpu_debugfs_benchmark(void *data, u64 val)  static int amdgpu_debugfs_vm_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	struct drm_device *dev = adev_to_drm(adev);  	struct drm_file *file;  	int r; @@ -1978,7 +2147,7 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)  		amdgpu_debugfs_ring_init(adev, ring);  	} -	for ( i = 0; i < adev->vcn.num_vcn_inst; i++) { +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) {  		if (!amdgpu_vcnfw_log)  			break; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 5c7d40873ee2..e25f085ee886 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -707,6 +707,48 @@ u32 amdgpu_device_indirect_rreg(struct amdgpu_device *adev,  	return r;  } +u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, +				    u64 reg_addr) +{ +	unsigned long flags, pcie_index, pcie_index_hi, pcie_data; +	u32 r; +	void __iomem *pcie_index_offset; +	void __iomem *pcie_index_hi_offset; +	void __iomem *pcie_data_offset; + +	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); +	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); +	if (adev->nbio.funcs->get_pcie_index_hi_offset) +		pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); +	else +		pcie_index_hi = 0; + +	spin_lock_irqsave(&adev->pcie_idx_lock, flags); +	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4; +	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4; +	if (pcie_index_hi != 0) +		pcie_index_hi_offset = (void __iomem *)adev->rmmio + +				pcie_index_hi * 4; + +	writel(reg_addr, pcie_index_offset); +	readl(pcie_index_offset); +	if (pcie_index_hi != 0) { +		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset); +		readl(pcie_index_hi_offset); +	} +	r = readl(pcie_data_offset); + +	/* clear the high bits */ +	if (pcie_index_hi != 0) { +		writel(0, pcie_index_hi_offset); +		readl(pcie_index_hi_offset); +	} + +	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); + +	return r; +} +  /**   * amdgpu_device_indirect_rreg64 - read a 64bits indirect register   * @@ -747,8 +789,6 @@ u64 amdgpu_device_indirect_rreg64(struct amdgpu_device *adev,   * amdgpu_device_indirect_wreg - write an indirect register address   *   * @adev: amdgpu_device pointer - * @pcie_index: mmio register offset - * @pcie_data: mmio register offset   * @reg_addr: indirect register offset   * @reg_data: indirect register data   * @@ -774,12 +814,50 @@ void amdgpu_device_indirect_wreg(struct amdgpu_device *adev,  	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);  } +void amdgpu_device_indirect_wreg_ext(struct amdgpu_device *adev, +				     u64 reg_addr, u32 reg_data) +{ +	unsigned long flags, pcie_index, pcie_index_hi, pcie_data; +	void __iomem *pcie_index_offset; +	void __iomem *pcie_index_hi_offset; +	void __iomem *pcie_data_offset; + +	pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); +	pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); +	if (adev->nbio.funcs->get_pcie_index_hi_offset) +		pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); +	else +		pcie_index_hi = 0; + +	spin_lock_irqsave(&adev->pcie_idx_lock, flags); +	pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4; +	pcie_data_offset = (void __iomem *)adev->rmmio + pcie_data * 4; +	if (pcie_index_hi != 0) +		pcie_index_hi_offset = (void __iomem *)adev->rmmio + +				pcie_index_hi * 4; + +	writel(reg_addr, pcie_index_offset); +	readl(pcie_index_offset); +	if (pcie_index_hi != 0) { +		writel((reg_addr >> 32) & 0xff, pcie_index_hi_offset); +		readl(pcie_index_hi_offset); +	} +	writel(reg_data, pcie_data_offset); +	readl(pcie_data_offset); + +	/* clear the high bits */ +	if (pcie_index_hi != 0) { +		writel(0, pcie_index_hi_offset); +		readl(pcie_index_hi_offset); +	} + +	spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); +} +  /**   * amdgpu_device_indirect_wreg64 - write a 64bits indirect register address   *   * @adev: amdgpu_device pointer - * @pcie_index: mmio register offset - * @pcie_data: mmio register offset   * @reg_addr: indirect register offset   * @reg_data: indirect register data   * @@ -840,6 +918,13 @@ static uint32_t amdgpu_invalid_rreg(struct amdgpu_device *adev, uint32_t reg)  	return 0;  } +static uint32_t amdgpu_invalid_rreg_ext(struct amdgpu_device *adev, uint64_t reg) +{ +	DRM_ERROR("Invalid callback to read register 0x%llX\n", reg); +	BUG(); +	return 0; +} +  /**   * amdgpu_invalid_wreg - dummy reg write function   * @@ -857,6 +942,13 @@ static void amdgpu_invalid_wreg(struct amdgpu_device *adev, uint32_t reg, uint32  	BUG();  } +static void amdgpu_invalid_wreg_ext(struct amdgpu_device *adev, uint64_t reg, uint32_t v) +{ +	DRM_ERROR("Invalid callback to write register 0x%llX with 0x%08X\n", +		  reg, v); +	BUG(); +} +  /**   * amdgpu_invalid_rreg64 - dummy 64 bit reg read function   * @@ -942,7 +1034,8 @@ static int amdgpu_device_asic_init(struct amdgpu_device *adev)  {  	amdgpu_asic_pre_asic_init(adev); -	if (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) || +	    adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0))  		return amdgpu_atomfirmware_asic_init(adev, true);  	else  		return amdgpu_atom_asic_init(adev->mode_info.atom_context); @@ -998,7 +1091,7 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,  	if (array_size % 3)  		return; -	for (i = 0; i < array_size; i +=3) { +	for (i = 0; i < array_size; i += 3) {  		reg = registers[i + 0];  		and_mask = registers[i + 1];  		or_mask = registers[i + 2]; @@ -1090,7 +1183,8 @@ static int amdgpu_device_doorbell_init(struct amdgpu_device *adev)  		 * doorbells are in the first page. So with paging queue enabled,  		 * the max num_kernel_doorbells should + 1 page (0x400 in dword)  		 */ -		if (adev->asic_type >= CHIP_VEGA10) +		if (adev->ip_versions[SDMA0_HWIP][0] >= IP_VERSION(4, 0, 0) && +		    adev->ip_versions[SDMA0_HWIP][0] < IP_VERSION(4, 2, 0))  			adev->doorbell.num_kernel_doorbells += 0x400;  	} @@ -1291,6 +1385,15 @@ int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev)  	return 0;  } +static bool amdgpu_device_read_bios(struct amdgpu_device *adev) +{ +	if (hweight32(adev->aid_mask) && (adev->flags & AMD_IS_APU)) { +		return false; +	} + +	return true; +} +  /*   * GPU helpers function.   */ @@ -1310,6 +1413,9 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)  	if (amdgpu_sriov_vf(adev))  		return false; +	if (!amdgpu_device_read_bios(adev)) +		return false; +  	if (amdgpu_passthrough(adev)) {  		/* for FIJI: In whole GPU pass-through virtualization case, after VM reboot  		 * some old smc fw still need driver do vPost otherwise gpu hang, while @@ -1547,7 +1653,7 @@ static int amdgpu_device_check_arguments(struct amdgpu_device *adev)  		dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",  			 amdgpu_sched_jobs);  		amdgpu_sched_jobs = 4; -	} else if (!is_power_of_2(amdgpu_sched_jobs)){ +	} else if (!is_power_of_2(amdgpu_sched_jobs)) {  		dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",  			 amdgpu_sched_jobs);  		amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs); @@ -2194,7 +2300,7 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)  	total = true;  	for (i = 0; i < adev->num_ip_blocks; i++) {  		if ((amdgpu_ip_block_mask & (1 << i)) == 0) { -			DRM_ERROR("disabled ip block: %d <%s>\n", +			DRM_WARN("disabled ip block: %d <%s>\n",  				  i, adev->ip_blocks[i].version->funcs->name);  			adev->ip_blocks[i].status.valid = false;  		} else { @@ -2220,14 +2326,16 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)  				return r;  			/* Read BIOS */ -			if (!amdgpu_get_bios(adev)) -				return -EINVAL; +			if (amdgpu_device_read_bios(adev)) { +				if (!amdgpu_get_bios(adev)) +					return -EINVAL; -			r = amdgpu_atombios_init(adev); -			if (r) { -				dev_err(adev->dev, "amdgpu_atombios_init failed\n"); -				amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0); -				return r; +				r = amdgpu_atombios_init(adev); +				if (r) { +					dev_err(adev->dev, "amdgpu_atombios_init failed\n"); +					amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_INIT_FAIL, 0, 0); +					return r; +				}  			}  			/*get pf2vf msg info at it's earliest time*/ @@ -2376,6 +2484,8 @@ static int amdgpu_device_init_schedulers(struct amdgpu_device *adev)  		}  	} +	amdgpu_xcp_update_partition_sched_list(adev); +  	return 0;  } @@ -2533,8 +2643,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  		goto init_failed;  	/* Don't init kfd if whole hive need to be reset during init */ -	if (!adev->gmc.xgmi.pending_reset) +	if (!adev->gmc.xgmi.pending_reset) { +		kgd2kfd_init_zone_device(adev);  		amdgpu_amdkfd_device_init(adev); +	}  	amdgpu_fru_get_product_info(adev); @@ -2759,8 +2871,9 @@ static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)  		DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);  	/* For passthrough configuration on arcturus and aldebaran, enable special handling SBR */ -	if (amdgpu_passthrough(adev) && ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1)|| -			       adev->asic_type == CHIP_ALDEBARAN )) +	if (amdgpu_passthrough(adev) && +	    ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1) || +	     adev->asic_type == CHIP_ALDEBARAN))  		amdgpu_dpm_handle_passthrough_sbr(adev, true);  	if (adev->gmc.xgmi.num_physical_nodes > 1) { @@ -3089,7 +3202,7 @@ static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)  		}  		adev->ip_blocks[i].status.hw = false;  		/* handle putting the SMC in the appropriate state */ -		if(!amdgpu_sriov_vf(adev)){ +		if (!amdgpu_sriov_vf(adev)) {  			if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {  				r = amdgpu_dpm_set_mp1_state(adev, adev->mp1_state);  				if (r) { @@ -3608,6 +3721,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	adev->smc_wreg = &amdgpu_invalid_wreg;  	adev->pcie_rreg = &amdgpu_invalid_rreg;  	adev->pcie_wreg = &amdgpu_invalid_wreg; +	adev->pcie_rreg_ext = &amdgpu_invalid_rreg_ext; +	adev->pcie_wreg_ext = &amdgpu_invalid_wreg_ext;  	adev->pciep_rreg = &amdgpu_invalid_rreg;  	adev->pciep_wreg = &amdgpu_invalid_wreg;  	adev->pcie_rreg64 = &amdgpu_invalid_rreg64; @@ -3633,6 +3748,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	mutex_init(&adev->srbm_mutex);  	mutex_init(&adev->gfx.pipe_reserve_mutex);  	mutex_init(&adev->gfx.gfx_off_mutex); +	mutex_init(&adev->gfx.partition_mutex);  	mutex_init(&adev->grbm_idx_mutex);  	mutex_init(&adev->mn_lock);  	mutex_init(&adev->virt.vf_errors.lock); @@ -3708,8 +3824,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);  	DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size); -	amdgpu_device_get_pcie_info(adev); -  	if (amdgpu_mcbp)  		DRM_INFO("MCBP is enabled\n"); @@ -3725,6 +3839,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	/* detect hw virtualization here */  	amdgpu_detect_virtualization(adev); +	amdgpu_device_get_pcie_info(adev); +  	r = amdgpu_device_get_job_timeout_settings(adev);  	if (r) {  		dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n"); @@ -3753,21 +3869,24 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	}  	/* enable PCIE atomic ops */ -	if (amdgpu_sriov_vf(adev)) -		adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *) -			adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags == -			(PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64); +	if (amdgpu_sriov_vf(adev)) { +		if (adev->virt.fw_reserve.p_pf2vf) +			adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *) +						      adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags == +				(PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64);  	/* APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is a  	 * internal path natively support atomics, set have_atomics_support to true.  	 */ -	else if ((adev->flags & AMD_IS_APU) && -		(adev->ip_versions[GC_HWIP][0] > IP_VERSION(9, 0, 0))) +	} else if ((adev->flags & AMD_IS_APU) && +		   (adev->ip_versions[GC_HWIP][0] > IP_VERSION(9, 0, 0))) {  		adev->have_atomics_support = true; -	else +	} else {  		adev->have_atomics_support =  			!pci_enable_atomic_ops_to_root(adev->pdev,  					  PCI_EXP_DEVCAP2_ATOMIC_COMP32 |  					  PCI_EXP_DEVCAP2_ATOMIC_COMP64); +	} +  	if (!adev->have_atomics_support)  		dev_info(adev->dev, "PCIE atomic ops is not supported\n"); @@ -3783,7 +3902,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	amdgpu_reset_init(adev);  	/* detect if we are with an SRIOV vbios */ -	amdgpu_device_detect_sriov_bios(adev); +	if (adev->bios) +		amdgpu_device_detect_sriov_bios(adev);  	/* check if we need to reset the asic  	 *  E.g., driver was not cleanly unloaded previously, etc. @@ -3835,25 +3955,27 @@ int amdgpu_device_init(struct amdgpu_device *adev,  		}  	} -	if (adev->is_atom_fw) { -		/* Initialize clocks */ -		r = amdgpu_atomfirmware_get_clock_info(adev); -		if (r) { -			dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n"); -			amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0); -			goto failed; -		} -	} else { -		/* Initialize clocks */ -		r = amdgpu_atombios_get_clock_info(adev); -		if (r) { -			dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n"); -			amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0); -			goto failed; +	if (adev->bios) { +		if (adev->is_atom_fw) { +			/* Initialize clocks */ +			r = amdgpu_atomfirmware_get_clock_info(adev); +			if (r) { +				dev_err(adev->dev, "amdgpu_atomfirmware_get_clock_info failed\n"); +				amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0); +				goto failed; +			} +		} else { +			/* Initialize clocks */ +			r = amdgpu_atombios_get_clock_info(adev); +			if (r) { +				dev_err(adev->dev, "amdgpu_atombios_get_clock_info failed\n"); +				amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_ATOMBIOS_GET_CLOCK_FAIL, 0, 0); +				goto failed; +			} +			/* init i2c buses */ +			if (!amdgpu_device_has_dc_support(adev)) +				amdgpu_atombios_i2c_init(adev);  		} -		/* init i2c buses */ -		if (!amdgpu_device_has_dc_support(adev)) -			amdgpu_atombios_i2c_init(adev);  	}  fence_driver_init: @@ -4019,7 +4141,7 @@ static void amdgpu_device_unmap_mmio(struct amdgpu_device *adev)  	adev->mman.aper_base_kaddr = NULL;  	/* Memory manager related */ -	if (!adev->gmc.xgmi.connected_to_cpu) { +	if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {  		arch_phys_wc_del(adev->gmc.vram_mtrr);  		arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);  	} @@ -4049,7 +4171,7 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)  	/* disable all interrupts */  	amdgpu_irq_disable_all(adev); -	if (adev->mode_info.mode_config_initialized){ +	if (adev->mode_info.mode_config_initialized) {  		if (!drm_drv_uses_atomic_modeset(adev_to_drm(adev)))  			drm_helper_force_disable_all(adev_to_drm(adev));  		else @@ -4714,42 +4836,42 @@ disabled:  int amdgpu_device_mode1_reset(struct amdgpu_device *adev)  { -        u32 i; -        int ret = 0; +	u32 i; +	int ret = 0; -        amdgpu_atombios_scratch_regs_engine_hung(adev, true); +	amdgpu_atombios_scratch_regs_engine_hung(adev, true); -        dev_info(adev->dev, "GPU mode1 reset\n"); +	dev_info(adev->dev, "GPU mode1 reset\n"); -        /* disable BM */ -        pci_clear_master(adev->pdev); +	/* disable BM */ +	pci_clear_master(adev->pdev); -        amdgpu_device_cache_pci_state(adev->pdev); +	amdgpu_device_cache_pci_state(adev->pdev); -        if (amdgpu_dpm_is_mode1_reset_supported(adev)) { -                dev_info(adev->dev, "GPU smu mode1 reset\n"); -                ret = amdgpu_dpm_mode1_reset(adev); -        } else { -                dev_info(adev->dev, "GPU psp mode1 reset\n"); -                ret = psp_gpu_reset(adev); -        } +	if (amdgpu_dpm_is_mode1_reset_supported(adev)) { +		dev_info(adev->dev, "GPU smu mode1 reset\n"); +		ret = amdgpu_dpm_mode1_reset(adev); +	} else { +		dev_info(adev->dev, "GPU psp mode1 reset\n"); +		ret = psp_gpu_reset(adev); +	} -        if (ret) -                dev_err(adev->dev, "GPU mode1 reset failed\n"); +	if (ret) +		dev_err(adev->dev, "GPU mode1 reset failed\n"); -        amdgpu_device_load_pci_state(adev->pdev); +	amdgpu_device_load_pci_state(adev->pdev); -        /* wait for asic to come out of reset */ -        for (i = 0; i < adev->usec_timeout; i++) { -                u32 memsize = adev->nbio.funcs->get_memsize(adev); +	/* wait for asic to come out of reset */ +	for (i = 0; i < adev->usec_timeout; i++) { +		u32 memsize = adev->nbio.funcs->get_memsize(adev); -                if (memsize != 0xffffffff) -                        break; -                udelay(1); -        } +		if (memsize != 0xffffffff) +			break; +		udelay(1); +	} -        amdgpu_atombios_scratch_regs_engine_hung(adev, false); -        return ret; +	amdgpu_atombios_scratch_regs_engine_hung(adev, false); +	return ret;  }  int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev, @@ -5478,7 +5600,7 @@ static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev)  		adev->pm.pcie_mlw_mask = amdgpu_pcie_lane_cap;  	/* covers APUs as well */ -	if (pci_is_root_bus(adev->pdev->bus)) { +	if (pci_is_root_bus(adev->pdev->bus) && !amdgpu_passthrough(adev)) {  		if (adev->pm.pcie_gen_mask == 0)  			adev->pm.pcie_gen_mask = AMDGPU_DEFAULT_PCIE_GEN_MASK;  		if (adev->pm.pcie_mlw_mask == 0) @@ -5959,6 +6081,7 @@ void amdgpu_device_halt(struct amdgpu_device *adev)  	struct pci_dev *pdev = adev->pdev;  	struct drm_device *ddev = adev_to_drm(adev); +	amdgpu_xcp_dev_unplug(adev);  	drm_dev_unplug(ddev);  	amdgpu_irq_disable_all(adev); @@ -6079,3 +6202,31 @@ bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)  		return true;  	}  } + +uint32_t amdgpu_device_wait_on_rreg(struct amdgpu_device *adev, +		uint32_t inst, uint32_t reg_addr, char reg_name[], +		uint32_t expected_value, uint32_t mask) +{ +	uint32_t ret = 0; +	uint32_t old_ = 0; +	uint32_t tmp_ = RREG32(reg_addr); +	uint32_t loop = adev->usec_timeout; + +	while ((tmp_ & (mask)) != (expected_value)) { +		if (old_ != tmp_) { +			loop = adev->usec_timeout; +			old_ = tmp_; +		} else +			udelay(1); +		tmp_ = RREG32(reg_addr); +		loop--; +		if (!loop) { +			DRM_WARN("Register(%d) [%s] failed to reach value 0x%08x != 0x%08xn", +				  inst, reg_name, (uint32_t)expected_value, +				  (uint32_t)(tmp_ & (mask))); +			ret = -ETIMEDOUT; +			break; +		} +	} +	return ret; +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index 0ecce0b92b82..859882109f55 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -30,6 +30,7 @@  #include "soc15.h"  #include "gfx_v9_0.h" +#include "gfx_v9_4_3.h"  #include "gmc_v9_0.h"  #include "df_v1_7.h"  #include "df_v3_6.h" @@ -76,12 +77,15 @@  #include "jpeg_v3_0.h"  #include "vcn_v4_0.h"  #include "jpeg_v4_0.h" +#include "vcn_v4_0_3.h" +#include "jpeg_v4_0_3.h"  #include "amdgpu_vkms.h"  #include "mes_v10_1.h"  #include "mes_v11_0.h"  #include "smuio_v11_0.h"  #include "smuio_v11_0_6.h"  #include "smuio_v13_0.h" +#include "smuio_v13_0_3.h"  #include "smuio_v13_0_6.h"  #define FIRMWARE_IP_DISCOVERY "amdgpu/ip_discovery.bin" @@ -200,14 +204,44 @@ static int hw_id_map[MAX_HWIP] = {  	[PCIE_HWIP]	= PCIE_HWID,  }; -static int amdgpu_discovery_read_binary_from_vram(struct amdgpu_device *adev, uint8_t *binary) +static int amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev, uint8_t *binary) +{ +	u64 tmr_offset, tmr_size, pos; +	void *discv_regn; +	int ret; + +	ret = amdgpu_acpi_get_tmr_info(adev, &tmr_offset, &tmr_size); +	if (ret) +		return ret; + +	pos = tmr_offset + tmr_size - DISCOVERY_TMR_OFFSET; + +	/* This region is read-only and reserved from system use */ +	discv_regn = memremap(pos, adev->mman.discovery_tmr_size, MEMREMAP_WC); +	if (discv_regn) { +		memcpy(binary, discv_regn, adev->mman.discovery_tmr_size); +		memunmap(discv_regn); +		return 0; +	} + +	return -ENOENT; +} + +static int amdgpu_discovery_read_binary_from_mem(struct amdgpu_device *adev, +						 uint8_t *binary)  {  	uint64_t vram_size = (uint64_t)RREG32(mmRCC_CONFIG_MEMSIZE) << 20; -	uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET; +	int ret = 0; -	amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, -				  adev->mman.discovery_tmr_size, false); -	return 0; +	if (vram_size) { +		uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET; +		amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, +					  adev->mman.discovery_tmr_size, false); +	} else { +		ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary); +	} + +	return ret;  }  static int amdgpu_discovery_read_binary_from_file(struct amdgpu_device *adev, uint8_t *binary) @@ -280,6 +314,7 @@ static void amdgpu_discovery_harvest_config_quirk(struct amdgpu_device *adev)  		case 0xCF:  		case 0xDF:  			adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN1; +			adev->vcn.inst_mask &= ~AMDGPU_VCN_HARVEST_VCN1;  			break;  		default:  			break; @@ -301,33 +336,30 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev)  	if (!adev->mman.discovery_bin)  		return -ENOMEM; -	r = amdgpu_discovery_read_binary_from_vram(adev, adev->mman.discovery_bin); -	if (r) { -		dev_err(adev->dev, "failed to read ip discovery binary from vram\n"); -		r = -EINVAL; -		goto out; -	} - -	if (!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin) || amdgpu_discovery == 2) { -		/* ignore the discovery binary from vram if discovery=2 in kernel module parameter */ -		if (amdgpu_discovery == 2) -			dev_info(adev->dev,"force read ip discovery binary from file"); -		else -			dev_warn(adev->dev, "get invalid ip discovery binary signature from vram\n"); - -		/* retry read ip discovery binary from file */ +	/* Read from file if it is the preferred option */ +	if (amdgpu_discovery == 2) { +		dev_info(adev->dev, "use ip discovery information from file");  		r = amdgpu_discovery_read_binary_from_file(adev, adev->mman.discovery_bin); +  		if (r) {  			dev_err(adev->dev, "failed to read ip discovery binary from file\n");  			r = -EINVAL;  			goto out;  		} -		/* check the ip discovery binary signature */ -		if(!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) { -			dev_warn(adev->dev, "get invalid ip discovery binary signature from file\n"); -			r = -EINVAL; + +	} else { +		r = amdgpu_discovery_read_binary_from_mem( +			adev, adev->mman.discovery_bin); +		if (r)  			goto out; -		} +	} + +	/* check the ip discovery binary signature */ +	if (!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) { +		dev_err(adev->dev, +			"get invalid ip discovery binary signature\n"); +		r = -EINVAL; +		goto out;  	}  	bhdr = (struct binary_header *)adev->mman.discovery_bin; @@ -471,11 +503,11 @@ void amdgpu_discovery_fini(struct amdgpu_device *adev)  	adev->mman.discovery_bin = NULL;  } -static int amdgpu_discovery_validate_ip(const struct ip *ip) +static int amdgpu_discovery_validate_ip(const struct ip_v4 *ip)  { -	if (ip->number_instance >= HWIP_MAX_INSTANCE) { -		DRM_ERROR("Unexpected number_instance (%d) from ip discovery blob\n", -			  ip->number_instance); +	if (ip->instance_number >= HWIP_MAX_INSTANCE) { +		DRM_ERROR("Unexpected instance_number (%d) from ip discovery blob\n", +			  ip->instance_number);  		return -EINVAL;  	}  	if (le16_to_cpu(ip->hw_id) >= HW_ID_MAX) { @@ -493,7 +525,7 @@ static void amdgpu_discovery_read_harvest_bit_per_ip(struct amdgpu_device *adev,  	struct binary_header *bhdr;  	struct ip_discovery_header *ihdr;  	struct die_header *dhdr; -	struct ip *ip; +	struct ip_v4 *ip;  	uint16_t die_offset, ip_offset, num_dies, num_ips;  	int i, j; @@ -510,29 +542,41 @@ static void amdgpu_discovery_read_harvest_bit_per_ip(struct amdgpu_device *adev,  		ip_offset = die_offset + sizeof(*dhdr);  		for (j = 0; j < num_ips; j++) { -			ip = (struct ip *)(adev->mman.discovery_bin + ip_offset); +			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);  			if (amdgpu_discovery_validate_ip(ip))  				goto next_ip; -			if (le16_to_cpu(ip->harvest) == 1) { +			if (le16_to_cpu(ip->variant) == 1) {  				switch (le16_to_cpu(ip->hw_id)) {  				case VCN_HWID:  					(*vcn_harvest_count)++; -					if (ip->number_instance == 0) +					if (ip->instance_number == 0) {  						adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN0; -					else +						adev->vcn.inst_mask &= +							~AMDGPU_VCN_HARVEST_VCN0; +						adev->jpeg.inst_mask &= +							~AMDGPU_VCN_HARVEST_VCN0; +					} else {  						adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN1; +						adev->vcn.inst_mask &= +							~AMDGPU_VCN_HARVEST_VCN1; +						adev->jpeg.inst_mask &= +							~AMDGPU_VCN_HARVEST_VCN1; +					}  					break;  				case DMU_HWID:  					adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;  					break;  				default:  					break; -                                } -                        } +				} +			}  next_ip: -			ip_offset += struct_size(ip, base_address, ip->num_base_address); +			if (ihdr->base_addr_64_bit) +				ip_offset += struct_size(ip, base_address_64, ip->num_base_address); +			else +				ip_offset += struct_size(ip, base_address, ip->num_base_address);  		}  	}  } @@ -564,10 +608,15 @@ static void amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,  		switch (le16_to_cpu(harvest_info->list[i].hw_id)) {  		case VCN_HWID:  			(*vcn_harvest_count)++; -			if (harvest_info->list[i].number_instance == 0) -				adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN0; -			else -				adev->vcn.harvest_config |= AMDGPU_VCN_HARVEST_VCN1; +			adev->vcn.harvest_config |= +				(1 << harvest_info->list[i].number_instance); +			adev->jpeg.harvest_config |= +				(1 << harvest_info->list[i].number_instance); + +			adev->vcn.inst_mask &= +				~(1U << harvest_info->list[i].number_instance); +			adev->jpeg.inst_mask &= +				~(1U << harvest_info->list[i].number_instance);  			break;  		case DMU_HWID:  			adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK; @@ -577,6 +626,14 @@ static void amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,  				1 << (le16_to_cpu(harvest_info->list[i].number_instance));  			(*umc_harvest_count)++;  			break; +		case GC_HWID: +			adev->gfx.xcc_mask &= +				~(1U << harvest_info->list[i].number_instance); +			break; +		case SDMA0_HWID: +			adev->sdma.sdma_mask &= +				~(1U << harvest_info->list[i].number_instance); +			break;  		default:  			break;  		} @@ -836,9 +893,40 @@ static void ip_disc_release(struct kobject *kobj)  	kfree(ip_top);  } +static uint8_t amdgpu_discovery_get_harvest_info(struct amdgpu_device *adev, +						 uint16_t hw_id, uint8_t inst) +{ +	uint8_t harvest = 0; + +	/* Until a uniform way is figured, get mask based on hwid */ +	switch (hw_id) { +	case VCN_HWID: +		harvest = ((1 << inst) & adev->vcn.inst_mask) == 0; +		break; +	case DMU_HWID: +		if (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK) +			harvest = 0x1; +		break; +	case UMC_HWID: +		/* TODO: It needs another parsing; for now, ignore.*/ +		break; +	case GC_HWID: +		harvest = ((1 << inst) & adev->gfx.xcc_mask) == 0; +		break; +	case SDMA0_HWID: +		harvest = ((1 << inst) & adev->sdma.sdma_mask) == 0; +		break; +	default: +		break; +	} + +	return harvest; +} +  static int amdgpu_discovery_sysfs_ips(struct amdgpu_device *adev,  				      struct ip_die_entry *ip_die_entry, -				      const size_t _ip_offset, const int num_ips) +				      const size_t _ip_offset, const int num_ips, +				      bool reg_base_64)  {  	int ii, jj, kk, res; @@ -852,10 +940,10 @@ static int amdgpu_discovery_sysfs_ips(struct amdgpu_device *adev,  		size_t ip_offset = _ip_offset;  		for (jj = 0; jj < num_ips; jj++) { -			struct ip *ip; +			struct ip_v4 *ip;  			struct ip_hw_instance *ip_hw_instance; -			ip = (struct ip *)(adev->mman.discovery_bin + ip_offset); +			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);  			if (amdgpu_discovery_validate_ip(ip) ||  			    le16_to_cpu(ip->hw_id) != ii)  				goto next_ip; @@ -903,22 +991,35 @@ static int amdgpu_discovery_sysfs_ips(struct amdgpu_device *adev,  				return -ENOMEM;  			}  			ip_hw_instance->hw_id = le16_to_cpu(ip->hw_id); /* == ii */ -			ip_hw_instance->num_instance = ip->number_instance; +			ip_hw_instance->num_instance = ip->instance_number;  			ip_hw_instance->major = ip->major;  			ip_hw_instance->minor = ip->minor;  			ip_hw_instance->revision = ip->revision; -			ip_hw_instance->harvest = ip->harvest; +			ip_hw_instance->harvest = +				amdgpu_discovery_get_harvest_info( +					adev, ip_hw_instance->hw_id, +					ip_hw_instance->num_instance);  			ip_hw_instance->num_base_addresses = ip->num_base_address; -			for (kk = 0; kk < ip_hw_instance->num_base_addresses; kk++) -				ip_hw_instance->base_addr[kk] = ip->base_address[kk]; +			for (kk = 0; kk < ip_hw_instance->num_base_addresses; kk++) { +				if (reg_base_64) +					ip_hw_instance->base_addr[kk] = +						lower_32_bits(le64_to_cpu(ip->base_address_64[kk])) & 0x3FFFFFFF; +				else +					ip_hw_instance->base_addr[kk] = ip->base_address[kk]; +			}  			kobject_init(&ip_hw_instance->kobj, &ip_hw_instance_ktype);  			ip_hw_instance->kobj.kset = &ip_hw_id->hw_id_kset;  			res = kobject_add(&ip_hw_instance->kobj, NULL,  					  "%d", ip_hw_instance->num_instance);  next_ip: -			ip_offset += struct_size(ip, base_address, ip->num_base_address); +			if (reg_base_64) +				ip_offset += struct_size(ip, base_address_64, +							 ip->num_base_address); +			else +				ip_offset += struct_size(ip, base_address, +							 ip->num_base_address);  		}  	} @@ -972,7 +1073,7 @@ static int amdgpu_discovery_sysfs_recurse(struct amdgpu_device *adev)  			return res;  		} -		amdgpu_discovery_sysfs_ips(adev, ip_die_entry, ip_offset, num_ips); +		amdgpu_discovery_sysfs_ips(adev, ip_die_entry, ip_offset, num_ips, !!ihdr->base_addr_64_bit);  	}  	return 0; @@ -983,6 +1084,9 @@ static int amdgpu_discovery_sysfs_init(struct amdgpu_device *adev)  	struct kset *die_kset;  	int res, ii; +	if (!adev->mman.discovery_bin) +		return -EINVAL; +  	adev->ip_top = kzalloc(sizeof(*adev->ip_top), GFP_KERNEL);  	if (!adev->ip_top)  		return -ENOMEM; @@ -1082,7 +1186,7 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  	struct binary_header *bhdr;  	struct ip_discovery_header *ihdr;  	struct die_header *dhdr; -	struct ip *ip; +	struct ip_v4 *ip;  	uint16_t die_offset;  	uint16_t ip_offset;  	uint16_t num_dies; @@ -1098,6 +1202,10 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  		return r;  	} +	adev->gfx.xcc_mask = 0; +	adev->sdma.sdma_mask = 0; +	adev->vcn.inst_mask = 0; +	adev->jpeg.inst_mask = 0;  	bhdr = (struct binary_header *)adev->mman.discovery_bin;  	ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +  			le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset)); @@ -1121,7 +1229,7 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  				le16_to_cpu(dhdr->die_id), num_ips);  		for (j = 0; j < num_ips; j++) { -			ip = (struct ip *)(adev->mman.discovery_bin + ip_offset); +			ip = (struct ip_v4 *)(adev->mman.discovery_bin + ip_offset);  			if (amdgpu_discovery_validate_ip(ip))  				goto next_ip; @@ -1131,7 +1239,7 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  			DRM_DEBUG("%s(%d) #%d v%d.%d.%d:\n",  				  hw_id_names[le16_to_cpu(ip->hw_id)],  				  le16_to_cpu(ip->hw_id), -				  ip->number_instance, +				  ip->instance_number,  				  ip->major, ip->minor,  				  ip->revision); @@ -1145,23 +1253,33 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  				adev->vcn.vcn_config[adev->vcn.num_vcn_inst] =  					ip->revision & 0xc0;  				ip->revision &= ~0xc0; -				if (adev->vcn.num_vcn_inst < AMDGPU_MAX_VCN_INSTANCES) +				if (adev->vcn.num_vcn_inst < +				    AMDGPU_MAX_VCN_INSTANCES) {  					adev->vcn.num_vcn_inst++; -				else +					adev->vcn.inst_mask |= +						(1U << ip->instance_number); +					adev->jpeg.inst_mask |= +						(1U << ip->instance_number); +				} else {  					dev_err(adev->dev, "Too many VCN instances: %d vs %d\n",  						adev->vcn.num_vcn_inst + 1,  						AMDGPU_MAX_VCN_INSTANCES); +				}  			}  			if (le16_to_cpu(ip->hw_id) == SDMA0_HWID ||  			    le16_to_cpu(ip->hw_id) == SDMA1_HWID ||  			    le16_to_cpu(ip->hw_id) == SDMA2_HWID ||  			    le16_to_cpu(ip->hw_id) == SDMA3_HWID) { -				if (adev->sdma.num_instances < AMDGPU_MAX_SDMA_INSTANCES) +				if (adev->sdma.num_instances < +				    AMDGPU_MAX_SDMA_INSTANCES) {  					adev->sdma.num_instances++; -				else +					adev->sdma.sdma_mask |= +						(1U << ip->instance_number); +				} else {  					dev_err(adev->dev, "Too many SDMA instances: %d vs %d\n",  						adev->sdma.num_instances + 1,  						AMDGPU_MAX_SDMA_INSTANCES); +				}  			}  			if (le16_to_cpu(ip->hw_id) == UMC_HWID) { @@ -1169,20 +1287,38 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  				adev->umc.node_inst_num++;  			} +			if (le16_to_cpu(ip->hw_id) == GC_HWID) +				adev->gfx.xcc_mask |= +					(1U << ip->instance_number); +  			for (k = 0; k < num_base_address; k++) {  				/*  				 * convert the endianness of base addresses in place,  				 * so that we don't need to convert them when accessing adev->reg_offset.  				 */ -				ip->base_address[k] = le32_to_cpu(ip->base_address[k]); +				if (ihdr->base_addr_64_bit) +					/* Truncate the 64bit base address from ip discovery +					 * and only store lower 32bit ip base in reg_offset[]. +					 * Bits > 32 follows ASIC specific format, thus just +					 * discard them and handle it within specific ASIC. +					 * By this way reg_offset[] and related helpers can +					 * stay unchanged. +					 * The base address is in dwords, thus clear the +					 * highest 2 bits to store. +					 */ +					ip->base_address[k] = +						lower_32_bits(le64_to_cpu(ip->base_address_64[k])) & 0x3FFFFFFF; +				else +					ip->base_address[k] = le32_to_cpu(ip->base_address[k]);  				DRM_DEBUG("\t0x%08x\n", ip->base_address[k]);  			}  			for (hw_ip = 0; hw_ip < MAX_HWIP; hw_ip++) { -				if (hw_id_map[hw_ip] == le16_to_cpu(ip->hw_id)) { +				if (hw_id_map[hw_ip] == le16_to_cpu(ip->hw_id) && +				    hw_id_map[hw_ip] != 0) {  					DRM_DEBUG("set register base offset for %s\n",  							hw_id_names[le16_to_cpu(ip->hw_id)]); -					adev->reg_offset[hw_ip][ip->number_instance] = +					adev->reg_offset[hw_ip][ip->instance_number] =  						ip->base_address;  					/* Instance support is somewhat inconsistent.  					 * SDMA is a good example.  Sienna cichlid has 4 total @@ -1193,69 +1329,22 @@ static int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  					 * example.  On most chips there are multiple instances  					 * with the same HWID.  					 */ -					adev->ip_versions[hw_ip][ip->number_instance] = +					adev->ip_versions[hw_ip][ip->instance_number] =  						IP_VERSION(ip->major, ip->minor, ip->revision);  				}  			}  next_ip: -			ip_offset += struct_size(ip, base_address, ip->num_base_address); +			if (ihdr->base_addr_64_bit) +				ip_offset += struct_size(ip, base_address_64, ip->num_base_address); +			else +				ip_offset += struct_size(ip, base_address, ip->num_base_address);  		}  	} -	amdgpu_discovery_sysfs_init(adev); -  	return 0;  } -int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id, int number_instance, -				    int *major, int *minor, int *revision) -{ -	struct binary_header *bhdr; -	struct ip_discovery_header *ihdr; -	struct die_header *dhdr; -	struct ip *ip; -	uint16_t die_offset; -	uint16_t ip_offset; -	uint16_t num_dies; -	uint16_t num_ips; -	int i, j; - -	if (!adev->mman.discovery_bin) { -		DRM_ERROR("ip discovery uninitialized\n"); -		return -EINVAL; -	} - -	bhdr = (struct binary_header *)adev->mman.discovery_bin; -	ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin + -			le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset)); -	num_dies = le16_to_cpu(ihdr->num_dies); - -	for (i = 0; i < num_dies; i++) { -		die_offset = le16_to_cpu(ihdr->die_info[i].die_offset); -		dhdr = (struct die_header *)(adev->mman.discovery_bin + die_offset); -		num_ips = le16_to_cpu(dhdr->num_ips); -		ip_offset = die_offset + sizeof(*dhdr); - -		for (j = 0; j < num_ips; j++) { -			ip = (struct ip *)(adev->mman.discovery_bin + ip_offset); - -			if ((le16_to_cpu(ip->hw_id) == hw_id) && (ip->number_instance == number_instance)) { -				if (major) -					*major = ip->major; -				if (minor) -					*minor = ip->minor; -				if (revision) -					*revision = ip->revision; -				return 0; -			} -			ip_offset += struct_size(ip, base_address, ip->num_base_address); -		} -	} - -	return -EINVAL; -} -  static void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)  {  	int vcn_harvest_count = 0; @@ -1266,7 +1355,8 @@ static void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)  	 * so read harvest bit per IP data structure to set  	 * harvest configuration.  	 */ -	if (adev->ip_versions[GC_HWIP][0] < IP_VERSION(10, 2, 0)) { +	if (adev->ip_versions[GC_HWIP][0] < IP_VERSION(10, 2, 0) && +	    adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 3)) {  		if ((adev->pdev->device == 0x731E &&  			(adev->pdev->revision == 0xC6 ||  			 adev->pdev->revision == 0xC7)) || @@ -1706,6 +1796,7 @@ static int amdgpu_discovery_set_smu_ip_blocks(struct amdgpu_device *adev)  	case IP_VERSION(13, 0, 3):  	case IP_VERSION(13, 0, 4):  	case IP_VERSION(13, 0, 5): +	case IP_VERSION(13, 0, 6):  	case IP_VERSION(13, 0, 7):  	case IP_VERSION(13, 0, 8):  	case IP_VERSION(13, 0, 10): @@ -1804,6 +1895,9 @@ static int amdgpu_discovery_set_gc_ip_blocks(struct amdgpu_device *adev)  	case IP_VERSION(9, 4, 2):  		amdgpu_device_ip_block_add(adev, &gfx_v9_0_ip_block);  		break; +	case IP_VERSION(9, 4, 3): +		amdgpu_device_ip_block_add(adev, &gfx_v9_4_3_ip_block); +		break;  	case IP_VERSION(10, 1, 10):  	case IP_VERSION(10, 1, 2):  	case IP_VERSION(10, 1, 1): @@ -1939,7 +2033,6 @@ static int amdgpu_discovery_set_mm_ip_blocks(struct amdgpu_device *adev)  		case IP_VERSION(3, 1, 1):  		case IP_VERSION(3, 1, 2):  		case IP_VERSION(3, 0, 2): -		case IP_VERSION(3, 0, 192):  			amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);  			if (!amdgpu_sriov_vf(adev))  				amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block); @@ -1952,7 +2045,11 @@ static int amdgpu_discovery_set_mm_ip_blocks(struct amdgpu_device *adev)  		case IP_VERSION(4, 0, 4):  			amdgpu_device_ip_block_add(adev, &vcn_v4_0_ip_block);  			amdgpu_device_ip_block_add(adev, &jpeg_v4_0_ip_block); -			return 0; +			break; +		case IP_VERSION(4, 0, 3): +			amdgpu_device_ip_block_add(adev, &vcn_v4_0_3_ip_block); +			amdgpu_device_ip_block_add(adev, &jpeg_v4_0_3_ip_block); +			break;  		default:  			dev_err(adev->dev,  				"Failed to add vcn/jpeg ip block(UVD_HWIP:0x%x)\n", @@ -2000,6 +2097,17 @@ static int amdgpu_discovery_set_mes_ip_blocks(struct amdgpu_device *adev)  	return 0;  } +static void amdgpu_discovery_init_soc_config(struct amdgpu_device *adev) +{ +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(9, 4, 3): +		aqua_vanjaram_init_soc_config(adev); +		break; +	default: +		break; +	} +} +  int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)  {  	int r; @@ -2177,6 +2285,9 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)  		break;  	} +	amdgpu_discovery_init_soc_config(adev); +	amdgpu_discovery_sysfs_init(adev); +  	switch (adev->ip_versions[GC_HWIP][0]) {  	case IP_VERSION(9, 0, 1):  	case IP_VERSION(9, 2, 1): @@ -2387,6 +2498,12 @@ int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev)  	case IP_VERSION(13, 0, 2):  		adev->smuio.funcs = &smuio_v13_0_funcs;  		break; +	case IP_VERSION(13, 0, 3): +		adev->smuio.funcs = &smuio_v13_0_3_funcs; +		if (adev->smuio.funcs->get_pkg_type(adev) == AMDGPU_PKG_TYPE_APU) { +			adev->flags |= AMD_IS_APU; +		} +		break;  	case IP_VERSION(13, 0, 6):  	case IP_VERSION(13, 0, 8):  		adev->smuio.funcs = &smuio_v13_0_6_funcs; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h index 8563dd4a7dc2..3a2f347bd50d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h @@ -24,12 +24,10 @@  #ifndef __AMDGPU_DISCOVERY__  #define __AMDGPU_DISCOVERY__ -#define DISCOVERY_TMR_SIZE      (4 << 10) +#define DISCOVERY_TMR_SIZE      (8 << 10)  #define DISCOVERY_TMR_OFFSET    (64 << 10)  void amdgpu_discovery_fini(struct amdgpu_device *adev); -int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id, int number_instance, -                                    int *major, int *minor, int *revision);  int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev);  #endif /* __AMDGPU_DISCOVERY__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index d60fe7eb5579..b702f499f5fb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -98,7 +98,7 @@ static void amdgpu_display_flip_callback(struct dma_fence *f,  static bool amdgpu_display_flip_handle_fence(struct amdgpu_flip_work *work,  					     struct dma_fence **f)  { -	struct dma_fence *fence= *f; +	struct dma_fence *fence = *f;  	if (fence == NULL)  		return false; @@ -1252,21 +1252,21 @@ const struct drm_mode_config_funcs amdgpu_mode_funcs = {  	.fb_create = amdgpu_display_user_framebuffer_create,  }; -static const struct drm_prop_enum_list amdgpu_underscan_enum_list[] = -{	{ UNDERSCAN_OFF, "off" }, +static const struct drm_prop_enum_list amdgpu_underscan_enum_list[] = { +	{ UNDERSCAN_OFF, "off" },  	{ UNDERSCAN_ON, "on" },  	{ UNDERSCAN_AUTO, "auto" },  }; -static const struct drm_prop_enum_list amdgpu_audio_enum_list[] = -{	{ AMDGPU_AUDIO_DISABLE, "off" }, +static const struct drm_prop_enum_list amdgpu_audio_enum_list[] = { +	{ AMDGPU_AUDIO_DISABLE, "off" },  	{ AMDGPU_AUDIO_ENABLE, "on" },  	{ AMDGPU_AUDIO_AUTO, "auto" },  };  /* XXX support different dither options? spatial, temporal, both, etc. */ -static const struct drm_prop_enum_list amdgpu_dither_enum_list[] = -{	{ AMDGPU_FMT_DITHER_DISABLE, "off" }, +static const struct drm_prop_enum_list amdgpu_dither_enum_list[] = { +	{ AMDGPU_FMT_DITHER_DISABLE, "off" },  	{ AMDGPU_FMT_DITHER_ENABLE, "on" },  }; @@ -1496,8 +1496,7 @@ int amdgpu_display_get_crtc_scanoutpos(struct drm_device *dev,  		ret |= DRM_SCANOUTPOS_ACCURATE;  		vbl_start = vbl & 0x1fff;  		vbl_end = (vbl >> 16) & 0x1fff; -	} -	else { +	} else {  		/* No: Fake something reasonable which gives at least ok results. */  		vbl_start = mode->crtc_vdisplay;  		vbl_end = 0; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index 0c001bb8fc2b..12210598e5b8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -149,7 +149,7 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach,  	if (!bo->tbo.pin_count) {  		/* move buffer into GTT or VRAM */  		struct ttm_operation_ctx ctx = { false, false }; -		unsigned domains = AMDGPU_GEM_DOMAIN_GTT; +		unsigned int domains = AMDGPU_GEM_DOMAIN_GTT;  		if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM &&  		    attach->peer2peer) { @@ -336,7 +336,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)  	ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,  				       AMDGPU_GEM_DOMAIN_CPU, flags, -				       ttm_bo_type_sg, resv, &gobj); +				       ttm_bo_type_sg, resv, &gobj, 0);  	if (ret)  		goto error; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h index 8fd11497faba..f637574644c0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_doorbell.h @@ -59,7 +59,7 @@ struct amdgpu_doorbell_index {  	uint32_t gfx_ring1;  	uint32_t gfx_userqueue_start;  	uint32_t gfx_userqueue_end; -	uint32_t sdma_engine[8]; +	uint32_t sdma_engine[16];  	uint32_t mes_ring0;  	uint32_t mes_ring1;  	uint32_t ih; @@ -86,6 +86,8 @@ struct amdgpu_doorbell_index {  	uint32_t max_assignment;  	/* Per engine SDMA doorbell size in dword */  	uint32_t sdma_doorbell_range; +	/* Per xcc doorbell size for KIQ/KCQ */ +	uint32_t xcc_doorbell_range;  };  typedef enum _AMDGPU_DOORBELL_ASSIGNMENT @@ -164,7 +166,15 @@ typedef enum _AMDGPU_VEGA20_DOORBELL_ASSIGNMENT  	AMDGPU_VEGA20_DOORBELL64_FIRST_NON_CP            = AMDGPU_VEGA20_DOORBELL_sDMA_ENGINE0,  	AMDGPU_VEGA20_DOORBELL64_LAST_NON_CP             = AMDGPU_VEGA20_DOORBELL64_VCE_RING6_7, -	AMDGPU_VEGA20_DOORBELL_MAX_ASSIGNMENT            = 0x18F, +	/* kiq/kcq from second XCD. Max 8 XCDs */ +	AMDGPU_VEGA20_DOORBELL_XCC1_KIQ_START             = 0x190, +	/* 8 compute rings per GC. Max to 0x1CE */ +	AMDGPU_VEGA20_DOORBELL_XCC1_MEC_RING0_START       = 0x197, + +	/* AID1 SDMA: 0x1D0 ~ 0x1F7 */ +	AMDGPU_VEGA20_DOORBELL_AID1_sDMA_START           = 0x1D0, + +	AMDGPU_VEGA20_DOORBELL_MAX_ASSIGNMENT            = 0x1F7,  	AMDGPU_VEGA20_DOORBELL_INVALID                   = 0xFFFF  } AMDGPU_VEGA20_DOORBELL_ASSIGNMENT; @@ -301,6 +311,36 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT  	AMDGPU_DOORBELL64_INVALID                 = 0xFFFF  } AMDGPU_DOORBELL64_ASSIGNMENT; +typedef enum _AMDGPU_DOORBELL_ASSIGNMENT_LAYOUT1 { +	/* XCC0: 0x00 ~20, XCC1: 20 ~ 2F ... */ + +	/* KIQ/HIQ/DIQ */ +	AMDGPU_DOORBELL_LAYOUT1_KIQ_START		= 0x000, +	AMDGPU_DOORBELL_LAYOUT1_HIQ			= 0x001, +	AMDGPU_DOORBELL_LAYOUT1_DIQ			= 0x002, +	/* Compute: 0x08 ~ 0x20  */ +	AMDGPU_DOORBELL_LAYOUT1_MEC_RING_START		= 0x008, +	AMDGPU_DOORBELL_LAYOUT1_MEC_RING_END		= 0x00F, +	AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_START		= 0x010, +	AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_END		= 0x01F, +	AMDGPU_DOORBELL_LAYOUT1_XCC_RANGE		= 0x020, + +	/* SDMA: 0x100 ~ 0x19F */ +	AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_START	= 0x100, +	AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_END		= 0x19F, +	/* IH: 0x1A0 ~ 0x1AF */ +	AMDGPU_DOORBELL_LAYOUT1_IH                      = 0x1A0, +	/* VCN: 0x1B0 ~ 0x1D4 */ +	AMDGPU_DOORBELL_LAYOUT1_VCN_START               = 0x1B0, +	AMDGPU_DOORBELL_LAYOUT1_VCN_END                 = 0x1D4, + +	AMDGPU_DOORBELL_LAYOUT1_FIRST_NON_CP		= AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_START, +	AMDGPU_DOORBELL_LAYOUT1_LAST_NON_CP		= AMDGPU_DOORBELL_LAYOUT1_VCN_END, + +	AMDGPU_DOORBELL_LAYOUT1_MAX_ASSIGNMENT          = 0x1D4, +	AMDGPU_DOORBELL_LAYOUT1_INVALID                 = 0xFFFF +} AMDGPU_DOORBELL_ASSIGNMENT_LAYOUT1; +  u32 amdgpu_mm_rdoorbell(struct amdgpu_device *adev, u32 index);  void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v);  u64 amdgpu_mm_rdoorbell64(struct amdgpu_device *adev, u32 index); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index c9a41c997c6c..3b711babd4e2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -50,6 +50,7 @@  #include "amdgpu_ras.h"  #include "amdgpu_xgmi.h"  #include "amdgpu_reset.h" +#include "../amdxcp/amdgpu_xcp_drv.h"  /*   * KMS wrapper. @@ -110,9 +111,11 @@   *   3.52.0 - Add AMDGPU_IDS_FLAGS_CONFORMANT_TRUNC_COORD, add device_info fields:   *            tcp_cache_size, num_sqc_per_wgp, sqc_data_cache_size, sqc_inst_cache_size,   *            gl1c_cache_size, gl2c_cache_size, mall_size, enabled_rb_pipes_mask_hi + *   3.53.0 - Support for GFX11 CP GFX shadowing + *   3.54.0 - Add AMDGPU_CTX_QUERY2_FLAGS_RESET_IN_PROGRESS support   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	52 +#define KMS_DRIVER_MINOR	54  #define KMS_DRIVER_PATCHLEVEL	0  unsigned int amdgpu_vram_limit = UINT_MAX; @@ -150,7 +153,7 @@ uint amdgpu_pg_mask = 0xffffffff;  uint amdgpu_sdma_phase_quantum = 32;  char *amdgpu_disable_cu;  char *amdgpu_virtual_display; - +bool enforce_isolation;  /*   * OverDrive(bit 14) disabled by default   * GFX DCS(bit 19) disabled by default @@ -191,6 +194,7 @@ int amdgpu_smartshift_bias;  int amdgpu_use_xgmi_p2p = 1;  int amdgpu_vcnfw_log;  int amdgpu_sg_display = -1; /* auto */ +int amdgpu_user_partt_mode = AMDGPU_AUTO_COMPUTE_PARTITION_MODE;  static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work); @@ -820,6 +824,13 @@ module_param_named(no_queue_eviction_on_vm_fault, amdgpu_no_queue_eviction_on_vm  #endif  /** + * DOC: mtype_local (int) + */ +int amdgpu_mtype_local; +MODULE_PARM_DESC(mtype_local, "MTYPE for local memory (0 = MTYPE_RW (default), 1 = MTYPE_NC, 2 = MTYPE_CC)"); +module_param_named(mtype_local, amdgpu_mtype_local, int, 0444); + +/**   * DOC: pcie_p2p (bool)   * Enable PCIe P2P (requires large-BAR). Default value: true (on)   */ @@ -948,6 +959,28 @@ MODULE_PARM_DESC(smu_pptable_id,  	"specify pptable id to be used (-1 = auto(default) value, 0 = use pptable from vbios, > 0 = soft pptable id)");  module_param_named(smu_pptable_id, amdgpu_smu_pptable_id, int, 0444); +/** + * DOC: partition_mode (int) + * Used to override the default SPX mode. + */ +MODULE_PARM_DESC( +	user_partt_mode, +	"specify partition mode to be used (-2 = AMDGPU_AUTO_COMPUTE_PARTITION_MODE(default value) \ +						0 = AMDGPU_SPX_PARTITION_MODE, \ +						1 = AMDGPU_DPX_PARTITION_MODE, \ +						2 = AMDGPU_TPX_PARTITION_MODE, \ +						3 = AMDGPU_QPX_PARTITION_MODE, \ +						4 = AMDGPU_CPX_PARTITION_MODE)"); +module_param_named(user_partt_mode, amdgpu_user_partt_mode, uint, 0444); + + +/** + * DOC: enforce_isolation (bool) + * enforce process isolation between graphics and compute via using the same reserved vmid. + */ +module_param(enforce_isolation, bool, 0444); +MODULE_PARM_DESC(enforce_isolation, "enforce process isolation between graphics and compute . enforce_isolation = on"); +  /* These devices are not supported by amdgpu.   * They are supported by the mach64, r128, radeon drivers   */ @@ -1615,6 +1648,7 @@ static const u16 amdgpu_unsupported_pciidlist[] = {  	0x5874,  	0x5940,  	0x5941, +	0x5b70,  	0x5b72,  	0x5b73,  	0x5b74, @@ -1660,7 +1694,7 @@ static const u16 amdgpu_unsupported_pciidlist[] = {  };  static const struct pci_device_id pciidlist[] = { -#ifdef  CONFIG_DRM_AMDGPU_SI +#ifdef CONFIG_DRM_AMDGPU_SI  	{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},  	{0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},  	{0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, @@ -2017,6 +2051,11 @@ static const struct pci_device_id pciidlist[] = {  	  .class_mask = 0xffffff,  	  .driver_data = CHIP_IP_DISCOVERY }, +	{ PCI_DEVICE(0x1002, PCI_ANY_ID), +	  .class = PCI_CLASS_ACCELERATOR_PROCESSING << 8, +	  .class_mask = 0xffffff, +	  .driver_data = CHIP_IP_DISCOVERY }, +  	{0, 0, 0}  }; @@ -2161,6 +2200,10 @@ retry_init:  		goto err_pci;  	} +	ret = amdgpu_xcp_dev_register(adev, ent); +	if (ret) +		goto err_pci; +  	/*  	 * 1. don't init fbdev on hw without DCE  	 * 2. don't init fbdev if there are no connectors @@ -2233,6 +2276,7 @@ amdgpu_pci_remove(struct pci_dev *pdev)  	struct drm_device *dev = pci_get_drvdata(pdev);  	struct amdgpu_device *adev = drm_to_adev(dev); +	amdgpu_xcp_dev_unplug(adev);  	drm_dev_unplug(dev);  	if (adev->pm.rpm_mode != AMDGPU_RUNPM_NONE) { @@ -2819,6 +2863,33 @@ static const struct drm_driver amdgpu_kms_driver = {  	.patchlevel = KMS_DRIVER_PATCHLEVEL,  }; +const struct drm_driver amdgpu_partition_driver = { +	.driver_features = +	    DRIVER_GEM | DRIVER_RENDER | DRIVER_SYNCOBJ | +	    DRIVER_SYNCOBJ_TIMELINE, +	.open = amdgpu_driver_open_kms, +	.postclose = amdgpu_driver_postclose_kms, +	.lastclose = amdgpu_driver_lastclose_kms, +	.ioctls = amdgpu_ioctls_kms, +	.num_ioctls = ARRAY_SIZE(amdgpu_ioctls_kms), +	.dumb_create = amdgpu_mode_dumb_create, +	.dumb_map_offset = amdgpu_mode_dumb_mmap, +	.fops = &amdgpu_driver_kms_fops, +	.release = &amdgpu_driver_release_kms, + +	.prime_handle_to_fd = drm_gem_prime_handle_to_fd, +	.prime_fd_to_handle = drm_gem_prime_fd_to_handle, +	.gem_prime_import = amdgpu_gem_prime_import, +	.gem_prime_mmap = drm_gem_prime_mmap, + +	.name = DRIVER_NAME, +	.desc = DRIVER_DESC, +	.date = DRIVER_DATE, +	.major = KMS_DRIVER_MAJOR, +	.minor = KMS_DRIVER_MINOR, +	.patchlevel = KMS_DRIVER_PATCHLEVEL, +}; +  static struct pci_error_handlers amdgpu_pci_err_handler = {  	.error_detected	= amdgpu_pci_error_detected,  	.mmio_enabled	= amdgpu_pci_mmio_enabled, @@ -2886,9 +2957,11 @@ static void __exit amdgpu_exit(void)  	amdgpu_amdkfd_fini();  	pci_unregister_driver(&amdgpu_kms_pci_driver);  	amdgpu_unregister_atpx_handler(); +	amdgpu_acpi_release();  	amdgpu_sync_fini();  	amdgpu_fence_slab_fini();  	mmu_notifier_synchronize(); +	amdgpu_xcp_drv_release();  }  module_init(amdgpu_init); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.h index 8178323e4bef..5bc2cb661af7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.h @@ -42,6 +42,8 @@  #define DRIVER_DESC		"AMD GPU"  #define DRIVER_DATE		"20150101" +extern const struct drm_driver amdgpu_partition_driver; +  long amdgpu_drm_ioctl(struct file *filp,  		      unsigned int cmd, unsigned long arg); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c index 27a782a9dc72..3aaeed2d3562 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c @@ -70,6 +70,7 @@ void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)  	drm_for_each_connector_iter(connector, &iter) {  		if (connector->encoder == encoder) {  			struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); +  			amdgpu_encoder->active_device = amdgpu_encoder->devices & amdgpu_connector->devices;  			DRM_DEBUG_KMS("setting active device to %08x from %08x %08x for encoder %d\n",  				  amdgpu_encoder->active_device, amdgpu_encoder->devices, @@ -165,12 +166,12 @@ void amdgpu_panel_mode_fixup(struct drm_encoder *encoder,  {  	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);  	struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode; -	unsigned hblank = native_mode->htotal - native_mode->hdisplay; -	unsigned vblank = native_mode->vtotal - native_mode->vdisplay; -	unsigned hover = native_mode->hsync_start - native_mode->hdisplay; -	unsigned vover = native_mode->vsync_start - native_mode->vdisplay; -	unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start; -	unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start; +	unsigned int hblank = native_mode->htotal - native_mode->hdisplay; +	unsigned int vblank = native_mode->vtotal - native_mode->vdisplay; +	unsigned int hover = native_mode->hsync_start - native_mode->hdisplay; +	unsigned int vover = native_mode->vsync_start - native_mode->vdisplay; +	unsigned int hsync_width = native_mode->hsync_end - native_mode->hsync_start; +	unsigned int vsync_width = native_mode->vsync_end - native_mode->vsync_start;  	adjusted_mode->clock = native_mode->clock;  	adjusted_mode->flags = native_mode->flags; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index f52d0ba91a77..876ec35b8f83 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -42,7 +42,6 @@  #include "amdgpu_reset.h"  /* - * Fences   * Fences mark an event in the GPUs pipeline and are used   * for GPU/CPU synchronization.  When the fence is written,   * it is expected that all buffers associated with that fence @@ -140,7 +139,7 @@ static u32 amdgpu_fence_read(struct amdgpu_ring *ring)   * Returns 0 on success, -ENOMEM on failure.   */  int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amdgpu_job *job, -		      unsigned flags) +		      unsigned int flags)  {  	struct amdgpu_device *adev = ring->adev;  	struct dma_fence *fence; @@ -174,11 +173,11 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amd  				       adev->fence_context + ring->idx, seq);  			/* Against remove in amdgpu_job_{free, free_cb} */  			dma_fence_get(fence); -		} -		else +		} else {  			dma_fence_init(fence, &amdgpu_fence_ops,  				       &ring->fence_drv.lock,  				       adev->fence_context + ring->idx, seq); +		}  	}  	amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr, @@ -377,14 +376,11 @@ signed long amdgpu_fence_wait_polling(struct amdgpu_ring *ring,  				      uint32_t wait_seq,  				      signed long timeout)  { -	uint32_t seq; - -	do { -		seq = amdgpu_fence_read(ring); -		udelay(5); -		timeout -= 5; -	} while ((int32_t)(wait_seq - seq) > 0 && timeout > 0); +	while ((int32_t)(wait_seq - amdgpu_fence_read(ring)) > 0 && timeout > 0) { +		udelay(2); +		timeout -= 2; +	}  	return timeout > 0 ? timeout : 0;  }  /** @@ -396,7 +392,7 @@ signed long amdgpu_fence_wait_polling(struct amdgpu_ring *ring,   * Returns the number of emitted fences on the ring.  Used by the   * dynpm code to ring track activity.   */ -unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring) +unsigned int amdgpu_fence_count_emitted(struct amdgpu_ring *ring)  {  	uint64_t emitted; @@ -475,7 +471,7 @@ void amdgpu_fence_update_start_timestamp(struct amdgpu_ring *ring, uint32_t seq,   */  int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,  				   struct amdgpu_irq_src *irq_src, -				   unsigned irq_type) +				   unsigned int irq_type)  {  	struct amdgpu_device *adev = ring->adev;  	uint64_t index; @@ -582,7 +578,8 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)  		if (r)  			amdgpu_fence_driver_force_completion(ring); -		if (ring->fence_drv.irq_src) +		if (!drm_dev_is_unplugged(adev_to_drm(adev)) && +		    ring->fence_drv.irq_src)  			amdgpu_irq_put(adev, ring->fence_drv.irq_src,  				       ring->fence_drv.irq_type); @@ -653,6 +650,7 @@ void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev)  	for (i = 0; i < AMDGPU_MAX_RINGS; i++) {  		struct amdgpu_ring *ring = adev->rings[i]; +  		if (!ring || !ring->fence_drv.initialized)  			continue; @@ -835,11 +833,12 @@ static const struct dma_fence_ops amdgpu_job_fence_ops = {  #if defined(CONFIG_DEBUG_FS)  static int amdgpu_debugfs_fence_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	int i;  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {  		struct amdgpu_ring *ring = adev->rings[i]; +  		if (!ring || !ring->fence_drv.initialized)  			continue; @@ -913,6 +912,7 @@ static void amdgpu_debugfs_reset_work(struct work_struct *work)  						  reset_work);  	struct amdgpu_reset_context reset_context; +  	memset(&reset_context, 0, sizeof(reset_context));  	reset_context.method = AMD_RESET_METHOD_NONE; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c index 01cb89ffbd56..73b8cca35bab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c @@ -35,6 +35,7 @@  #endif  #include "amdgpu.h"  #include <drm/drm_drv.h> +#include <drm/ttm/ttm_tt.h>  /*   * GART @@ -103,6 +104,142 @@ void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)  }  /** + * amdgpu_gart_table_ram_alloc - allocate system ram for gart page table + * + * @adev: amdgpu_device pointer + * + * Allocate system memory for GART page table for ASICs that don't have + * dedicated VRAM. + * Returns 0 for success, error for failure. + */ +int amdgpu_gart_table_ram_alloc(struct amdgpu_device *adev) +{ +	unsigned int order = get_order(adev->gart.table_size); +	gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO; +	struct amdgpu_bo *bo = NULL; +	struct sg_table *sg = NULL; +	struct amdgpu_bo_param bp; +	dma_addr_t dma_addr; +	struct page *p; +	int ret; + +	if (adev->gart.bo != NULL) +		return 0; + +	p = alloc_pages(gfp_flags, order); +	if (!p) +		return -ENOMEM; + +	/* If the hardware does not support UTCL2 snooping of the CPU caches +	 * then set_memory_wc() could be used as a workaround to mark the pages +	 * as write combine memory. +	 */ +	dma_addr = dma_map_page(&adev->pdev->dev, p, 0, adev->gart.table_size, +				DMA_BIDIRECTIONAL); +	if (dma_mapping_error(&adev->pdev->dev, dma_addr)) { +		dev_err(&adev->pdev->dev, "Failed to DMA MAP the GART BO page\n"); +		__free_pages(p, order); +		p = NULL; +		return -EFAULT; +	} + +	dev_info(adev->dev, "%s dma_addr:%pad\n", __func__, &dma_addr); +	/* Create SG table */ +	sg = kmalloc(sizeof(*sg), GFP_KERNEL); +	if (!sg) { +		ret = -ENOMEM; +		goto error; +	} +	ret = sg_alloc_table(sg, 1, GFP_KERNEL); +	if (ret) +		goto error; + +	sg_dma_address(sg->sgl) = dma_addr; +	sg->sgl->length = adev->gart.table_size; +#ifdef CONFIG_NEED_SG_DMA_LENGTH +	sg->sgl->dma_length = adev->gart.table_size; +#endif +	/* Create SG BO */ +	memset(&bp, 0, sizeof(bp)); +	bp.size = adev->gart.table_size; +	bp.byte_align = PAGE_SIZE; +	bp.domain = AMDGPU_GEM_DOMAIN_CPU; +	bp.type = ttm_bo_type_sg; +	bp.resv = NULL; +	bp.bo_ptr_size = sizeof(struct amdgpu_bo); +	bp.flags = 0; +	ret = amdgpu_bo_create(adev, &bp, &bo); +	if (ret) +		goto error; + +	bo->tbo.sg = sg; +	bo->tbo.ttm->sg = sg; +	bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT; +	bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT; + +	ret = amdgpu_bo_reserve(bo, true); +	if (ret) { +		dev_err(adev->dev, "(%d) failed to reserve bo for GART system bo\n", ret); +		goto error; +	} + +	ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT); +	WARN(ret, "Pinning the GART table failed"); +	if (ret) +		goto error_resv; + +	adev->gart.bo = bo; +	adev->gart.ptr = page_to_virt(p); +	/* Make GART table accessible in VMID0 */ +	ret = amdgpu_ttm_alloc_gart(&adev->gart.bo->tbo); +	if (ret) +		amdgpu_gart_table_ram_free(adev); +	amdgpu_bo_unreserve(bo); + +	return 0; + +error_resv: +	amdgpu_bo_unreserve(bo); +error: +	amdgpu_bo_unref(&bo); +	if (sg) { +		sg_free_table(sg); +		kfree(sg); +	} +	__free_pages(p, order); +	return ret; +} + +/** + * amdgpu_gart_table_ram_free - free gart page table system ram + * + * @adev: amdgpu_device pointer + * + * Free the system memory used for the GART page tableon ASICs that don't + * have dedicated VRAM. + */ +void amdgpu_gart_table_ram_free(struct amdgpu_device *adev) +{ +	unsigned int order = get_order(adev->gart.table_size); +	struct sg_table *sg = adev->gart.bo->tbo.sg; +	struct page *p; +	int ret; + +	ret = amdgpu_bo_reserve(adev->gart.bo, false); +	if (!ret) { +		amdgpu_bo_unpin(adev->gart.bo); +		amdgpu_bo_unreserve(adev->gart.bo); +	} +	amdgpu_bo_unref(&adev->gart.bo); +	sg_free_table(sg); +	kfree(sg); +	p = virt_to_page(adev->gart.ptr); +	__free_pages(p, order); + +	adev->gart.ptr = NULL; +} + +/**   * amdgpu_gart_table_vram_alloc - allocate vram for gart page table   *   * @adev: amdgpu_device pointer @@ -182,7 +319,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,  	}  	mb();  	amdgpu_device_flush_hdp(adev, NULL); -	for (i = 0; i < adev->num_vmhubs; i++) +	for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  		amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);  	drm_dev_exit(idx); @@ -264,7 +401,7 @@ void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev)  	mb();  	amdgpu_device_flush_hdp(adev, NULL); -	for (i = 0; i < adev->num_vmhubs; i++) +	for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  		amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h index 8fea3e04e411..8283d682f543 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h @@ -51,6 +51,8 @@ struct amdgpu_gart {  	uint64_t			gart_pte_flags;  }; +int amdgpu_gart_table_ram_alloc(struct amdgpu_device *adev); +void amdgpu_gart_table_ram_free(struct amdgpu_device *adev);  int amdgpu_gart_table_vram_alloc(struct amdgpu_device *adev);  void amdgpu_gart_table_vram_free(struct amdgpu_device *adev);  int amdgpu_gart_table_vram_pin(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 863cb668e000..74055cba3dc9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -98,7 +98,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,  			     int alignment, u32 initial_domain,  			     u64 flags, enum ttm_bo_type type,  			     struct dma_resv *resv, -			     struct drm_gem_object **obj) +			     struct drm_gem_object **obj, int8_t xcp_id_plus1)  {  	struct amdgpu_bo *bo;  	struct amdgpu_bo_user *ubo; @@ -116,6 +116,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,  	bp.flags = flags;  	bp.domain = initial_domain;  	bp.bo_ptr_size = sizeof(struct amdgpu_bo); +	bp.xcp_id_plus1 = xcp_id_plus1;  	r = amdgpu_bo_create_user(adev, &bp, &ubo);  	if (r) @@ -336,7 +337,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  retry:  	r = amdgpu_gem_object_create(adev, size, args->in.alignment,  				     initial_domain, -				     flags, ttm_bo_type_device, resv, &gobj); +				     flags, ttm_bo_type_device, resv, &gobj, fpriv->xcp_id + 1);  	if (r && r != -ERESTARTSYS) {  		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {  			flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; @@ -379,6 +380,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  	struct ttm_operation_ctx ctx = { true, false };  	struct amdgpu_device *adev = drm_to_adev(dev);  	struct drm_amdgpu_gem_userptr *args = data; +	struct amdgpu_fpriv *fpriv = filp->driver_priv;  	struct drm_gem_object *gobj;  	struct hmm_range *range;  	struct amdgpu_bo *bo; @@ -405,7 +407,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  	/* create a gem object to contain this object in */  	r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU, -				     0, ttm_bo_type_device, NULL, &gobj); +				     0, ttm_bo_type_device, NULL, &gobj, fpriv->xcp_id + 1);  	if (r)  		return r; @@ -908,6 +910,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,  			    struct drm_mode_create_dumb *args)  {  	struct amdgpu_device *adev = drm_to_adev(dev); +	struct amdgpu_fpriv *fpriv = file_priv->driver_priv;  	struct drm_gem_object *gobj;  	uint32_t handle;  	u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | @@ -931,7 +934,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,  	domain = amdgpu_bo_get_preferred_domain(adev,  				amdgpu_display_supported_domains(adev, flags));  	r = amdgpu_gem_object_create(adev, args->size, 0, domain, flags, -				     ttm_bo_type_device, NULL, &gobj); +				     ttm_bo_type_device, NULL, &gobj, fpriv->xcp_id + 1);  	if (r)  		return -ENOMEM; @@ -948,7 +951,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,  #if defined(CONFIG_DEBUG_FS)  static int amdgpu_debugfs_gem_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	struct drm_device *dev = adev_to_drm(adev);  	struct drm_file *file;  	int r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h index 637bf51dbf06..f30264782ba2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h @@ -43,8 +43,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,  			     int alignment, u32 initial_domain,  			     u64 flags, enum ttm_bo_type type,  			     struct dma_resv *resv, -			     struct drm_gem_object **obj); - +			     struct drm_gem_object **obj, int8_t xcp_id_plus1);  int amdgpu_mode_dumb_create(struct drm_file *file_priv,  			    struct drm_device *dev,  			    struct drm_mode_create_dumb *args); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index f3f541ba0aca..a33d4bc34cee 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -28,6 +28,7 @@  #include "amdgpu_gfx.h"  #include "amdgpu_rlc.h"  #include "amdgpu_ras.h" +#include "amdgpu_xcp.h"  /* delay 0.1 second to enable gfx off feature */  #define GFX_OFF_DELAY_ENABLE         msecs_to_jiffies(100) @@ -63,10 +64,10 @@ void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,  }  bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, -				     int mec, int pipe, int queue) +				     int xcc_id, int mec, int pipe, int queue)  {  	return test_bit(amdgpu_gfx_mec_queue_to_bit(adev, mec, pipe, queue), -			adev->gfx.mec.queue_bitmap); +			adev->gfx.mec_bitmap[xcc_id].queue_bitmap);  }  int amdgpu_gfx_me_queue_to_bit(struct amdgpu_device *adev, @@ -204,29 +205,38 @@ bool amdgpu_gfx_is_high_priority_compute_queue(struct amdgpu_device *adev,  void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev)  { -	int i, queue, pipe; +	int i, j, queue, pipe;  	bool multipipe_policy = amdgpu_gfx_is_compute_multipipe_capable(adev);  	int max_queues_per_mec = min(adev->gfx.mec.num_pipe_per_mec *  				     adev->gfx.mec.num_queue_per_pipe,  				     adev->gfx.num_compute_rings); +	int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1;  	if (multipipe_policy) { -		/* policy: make queues evenly cross all pipes on MEC1 only */ -		for (i = 0; i < max_queues_per_mec; i++) { -			pipe = i % adev->gfx.mec.num_pipe_per_mec; -			queue = (i / adev->gfx.mec.num_pipe_per_mec) % -				adev->gfx.mec.num_queue_per_pipe; +		/* policy: make queues evenly cross all pipes on MEC1 only +		 * for multiple xcc, just use the original policy for simplicity */ +		for (j = 0; j < num_xcc; j++) { +			for (i = 0; i < max_queues_per_mec; i++) { +				pipe = i % adev->gfx.mec.num_pipe_per_mec; +				queue = (i / adev->gfx.mec.num_pipe_per_mec) % +					 adev->gfx.mec.num_queue_per_pipe; -			set_bit(pipe * adev->gfx.mec.num_queue_per_pipe + queue, -					adev->gfx.mec.queue_bitmap); +				set_bit(pipe * adev->gfx.mec.num_queue_per_pipe + queue, +					adev->gfx.mec_bitmap[j].queue_bitmap); +			}  		}  	} else {  		/* policy: amdgpu owns all queues in the given pipe */ -		for (i = 0; i < max_queues_per_mec; ++i) -			set_bit(i, adev->gfx.mec.queue_bitmap); +		for (j = 0; j < num_xcc; j++) { +			for (i = 0; i < max_queues_per_mec; ++i) +				set_bit(i, adev->gfx.mec_bitmap[j].queue_bitmap); +		}  	} -	dev_dbg(adev->dev, "mec queue bitmap weight=%d\n", bitmap_weight(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES)); +	for (j = 0; j < num_xcc; j++) { +		dev_dbg(adev->dev, "mec queue bitmap weight=%d\n", +			bitmap_weight(adev->gfx.mec_bitmap[j].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES)); +	}  }  void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev) @@ -258,7 +268,7 @@ void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev)  }  static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev, -				  struct amdgpu_ring *ring) +				  struct amdgpu_ring *ring, int xcc_id)  {  	int queue_bit;  	int mec, pipe, queue; @@ -268,7 +278,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,  		    * adev->gfx.mec.num_queue_per_pipe;  	while (--queue_bit >= 0) { -		if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap)) +		if (test_bit(queue_bit, adev->gfx.mec_bitmap[xcc_id].queue_bitmap))  			continue;  		amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue); @@ -294,9 +304,9 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,  int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  			     struct amdgpu_ring *ring, -			     struct amdgpu_irq_src *irq) +			     struct amdgpu_irq_src *irq, int xcc_id)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];  	int r = 0;  	spin_lock_init(&kiq->ring_lock); @@ -304,16 +314,20 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  	ring->adev = NULL;  	ring->ring_obj = NULL;  	ring->use_doorbell = true; -	ring->doorbell_index = adev->doorbell_index.kiq; -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->xcc_id = xcc_id; +	ring->vm_hub = AMDGPU_GFXHUB(xcc_id); +	ring->doorbell_index = +		(adev->doorbell_index.kiq + +		 xcc_id * adev->doorbell_index.xcc_doorbell_range) +		<< 1; -	r = amdgpu_gfx_kiq_acquire(adev, ring); +	r = amdgpu_gfx_kiq_acquire(adev, ring, xcc_id);  	if (r)  		return r;  	ring->eop_gpu_addr = kiq->eop_gpu_addr;  	ring->no_scheduler = true; -	sprintf(ring->name, "kiq_%d.%d.%d", ring->me, ring->pipe, ring->queue); +	sprintf(ring->name, "kiq_%d.%d.%d.%d", xcc_id, ring->me, ring->pipe, ring->queue);  	r = amdgpu_ring_init(adev, ring, 1024, irq, AMDGPU_CP_KIQ_IRQ_DRIVER0,  			     AMDGPU_RING_PRIO_DEFAULT, NULL);  	if (r) @@ -327,19 +341,19 @@ void amdgpu_gfx_kiq_free_ring(struct amdgpu_ring *ring)  	amdgpu_ring_fini(ring);  } -void amdgpu_gfx_kiq_fini(struct amdgpu_device *adev) +void amdgpu_gfx_kiq_fini(struct amdgpu_device *adev, int xcc_id)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];  	amdgpu_bo_free_kernel(&kiq->eop_obj, &kiq->eop_gpu_addr, NULL);  }  int amdgpu_gfx_kiq_init(struct amdgpu_device *adev, -			unsigned hpd_size) +			unsigned hpd_size, int xcc_id)  {  	int r;  	u32 *hpd; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];  	r = amdgpu_bo_create_kernel(adev, hpd_size, PAGE_SIZE,  				    AMDGPU_GEM_DOMAIN_GTT, &kiq->eop_obj, @@ -362,13 +376,18 @@ int amdgpu_gfx_kiq_init(struct amdgpu_device *adev,  /* create MQD for each compute/gfx queue */  int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev, -			   unsigned mqd_size) +			   unsigned mqd_size, int xcc_id)  { -	struct amdgpu_ring *ring = NULL; -	int r, i; +	int r, i, j; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id]; +	struct amdgpu_ring *ring = &kiq->ring; +	u32 domain = AMDGPU_GEM_DOMAIN_GTT; + +	/* Only enable on gfx10 and 11 for now to avoid changing behavior on older chips */ +	if (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(10, 0, 0)) +		domain |= AMDGPU_GEM_DOMAIN_VRAM;  	/* create MQD for KIQ */ -	ring = &adev->gfx.kiq.ring;  	if (!adev->enable_mes_kiq && !ring->mqd_obj) {  		/* originaly the KIQ MQD is put in GTT domain, but for SRIOV VRAM domain is a must  		 * otherwise hypervisor trigger SAVE_VF fail after driver unloaded which mean MQD @@ -387,8 +406,8 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,  		}  		/* prepare MQD backup */ -		adev->gfx.mec.mqd_backup[AMDGPU_MAX_COMPUTE_RINGS] = kmalloc(mqd_size, GFP_KERNEL); -		if (!adev->gfx.mec.mqd_backup[AMDGPU_MAX_COMPUTE_RINGS]) +		kiq->mqd_backup = kmalloc(mqd_size, GFP_KERNEL); +		if (!kiq->mqd_backup)  				dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name);  	} @@ -398,13 +417,14 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,  			ring = &adev->gfx.gfx_ring[i];  			if (!ring->mqd_obj) {  				r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE, -							    AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj, +							    domain, &ring->mqd_obj,  							    &ring->mqd_gpu_addr, &ring->mqd_ptr);  				if (r) {  					dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r);  					return r;  				} +				ring->mqd_size = mqd_size;  				/* prepare MQD backup */  				adev->gfx.me.mqd_backup[i] = kmalloc(mqd_size, GFP_KERNEL);  				if (!adev->gfx.me.mqd_backup[i]) @@ -415,19 +435,21 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,  	/* create MQD for each KCQ */  	for (i = 0; i < adev->gfx.num_compute_rings; i++) { -		ring = &adev->gfx.compute_ring[i]; +		j = i + xcc_id * adev->gfx.num_compute_rings; +		ring = &adev->gfx.compute_ring[j];  		if (!ring->mqd_obj) {  			r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE, -						    AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj, +						    domain, &ring->mqd_obj,  						    &ring->mqd_gpu_addr, &ring->mqd_ptr);  			if (r) {  				dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r);  				return r;  			} +			ring->mqd_size = mqd_size;  			/* prepare MQD backup */ -			adev->gfx.mec.mqd_backup[i] = kmalloc(mqd_size, GFP_KERNEL); -			if (!adev->gfx.mec.mqd_backup[i]) +			adev->gfx.mec.mqd_backup[j] = kmalloc(mqd_size, GFP_KERNEL); +			if (!adev->gfx.mec.mqd_backup[j])  				dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name);  		}  	} @@ -435,10 +457,11 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,  	return 0;  } -void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev) +void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev, int xcc_id)  {  	struct amdgpu_ring *ring = NULL; -	int i; +	int i, j; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];  	if (adev->asic_type >= CHIP_NAVI10 && amdgpu_async_gfx_ring) {  		for (i = 0; i < adev->gfx.num_gfx_rings; i++) { @@ -451,43 +474,81 @@ void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev)  	}  	for (i = 0; i < adev->gfx.num_compute_rings; i++) { -		ring = &adev->gfx.compute_ring[i]; -		kfree(adev->gfx.mec.mqd_backup[i]); +		j = i + xcc_id * adev->gfx.num_compute_rings; +		ring = &adev->gfx.compute_ring[j]; +		kfree(adev->gfx.mec.mqd_backup[j]);  		amdgpu_bo_free_kernel(&ring->mqd_obj,  				      &ring->mqd_gpu_addr,  				      &ring->mqd_ptr);  	} -	ring = &adev->gfx.kiq.ring; -	kfree(adev->gfx.mec.mqd_backup[AMDGPU_MAX_COMPUTE_RINGS]); +	ring = &kiq->ring; +	kfree(kiq->mqd_backup);  	amdgpu_bo_free_kernel(&ring->mqd_obj,  			      &ring->mqd_gpu_addr,  			      &ring->mqd_ptr);  } -int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev) +int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev, int xcc_id)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];  	struct amdgpu_ring *kiq_ring = &kiq->ring;  	int i, r = 0; +	int j;  	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)  		return -EINVAL; -	spin_lock(&adev->gfx.kiq.ring_lock); +	spin_lock(&kiq->ring_lock);  	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size *  					adev->gfx.num_compute_rings)) { -		spin_unlock(&adev->gfx.kiq.ring_lock); +		spin_unlock(&kiq->ring_lock);  		return -ENOMEM;  	} -	for (i = 0; i < adev->gfx.num_compute_rings; i++) -		kiq->pmf->kiq_unmap_queues(kiq_ring, &adev->gfx.compute_ring[i], +	for (i = 0; i < adev->gfx.num_compute_rings; i++) { +		j = i + xcc_id * adev->gfx.num_compute_rings; +		kiq->pmf->kiq_unmap_queues(kiq_ring, +					   &adev->gfx.compute_ring[j],  					   RESET_QUEUES, 0, 0); +	} + +	if (kiq_ring->sched.ready && !adev->job_hang) +		r = amdgpu_ring_test_helper(kiq_ring); +	spin_unlock(&kiq->ring_lock); + +	return r; +} + +int amdgpu_gfx_disable_kgq(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id]; +	struct amdgpu_ring *kiq_ring = &kiq->ring; +	int i, r = 0; +	int j; + +	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) +		return -EINVAL; + +	spin_lock(&kiq->ring_lock); +	if (amdgpu_gfx_is_master_xcc(adev, xcc_id)) { +		if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size * +						adev->gfx.num_gfx_rings)) { +			spin_unlock(&kiq->ring_lock); +			return -ENOMEM; +		} + +		for (i = 0; i < adev->gfx.num_gfx_rings; i++) { +			j = i + xcc_id * adev->gfx.num_gfx_rings; +			kiq->pmf->kiq_unmap_queues(kiq_ring, +						   &adev->gfx.gfx_ring[j], +						   PREEMPT_QUEUES, 0, 0); +		} +	} -	if (adev->gfx.kiq.ring.sched.ready && !adev->job_hang) +	if (adev->gfx.kiq[0].ring.sched.ready && !adev->job_hang)  		r = amdgpu_ring_test_helper(kiq_ring); -	spin_unlock(&adev->gfx.kiq.ring_lock); +	spin_unlock(&kiq->ring_lock);  	return r;  } @@ -505,18 +566,18 @@ int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev,  	return set_resource_bit;  } -int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev) +int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev, int xcc_id)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id]; +	struct amdgpu_ring *kiq_ring = &kiq->ring;  	uint64_t queue_mask = 0; -	int r, i; +	int r, i, j;  	if (!kiq->pmf || !kiq->pmf->kiq_map_queues || !kiq->pmf->kiq_set_resources)  		return -EINVAL;  	for (i = 0; i < AMDGPU_MAX_COMPUTE_QUEUES; ++i) { -		if (!test_bit(i, adev->gfx.mec.queue_bitmap)) +		if (!test_bit(i, adev->gfx.mec_bitmap[xcc_id].queue_bitmap))  			continue;  		/* This situation may be hit in the future if a new HW @@ -532,13 +593,15 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)  	DRM_INFO("kiq ring mec %d pipe %d q %d\n", kiq_ring->me, kiq_ring->pipe,  							kiq_ring->queue); -	spin_lock(&adev->gfx.kiq.ring_lock); +	amdgpu_device_flush_hdp(adev, NULL); + +	spin_lock(&kiq->ring_lock);  	r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size *  					adev->gfx.num_compute_rings +  					kiq->pmf->set_resources_size);  	if (r) {  		DRM_ERROR("Failed to lock KIQ (%d).\n", r); -		spin_unlock(&adev->gfx.kiq.ring_lock); +		spin_unlock(&kiq->ring_lock);  		return r;  	} @@ -546,11 +609,51 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)  		queue_mask = ~0ULL;  	kiq->pmf->kiq_set_resources(kiq_ring, queue_mask); -	for (i = 0; i < adev->gfx.num_compute_rings; i++) -		kiq->pmf->kiq_map_queues(kiq_ring, &adev->gfx.compute_ring[i]); +	for (i = 0; i < adev->gfx.num_compute_rings; i++) { +		j = i + xcc_id * adev->gfx.num_compute_rings; +			kiq->pmf->kiq_map_queues(kiq_ring, +						 &adev->gfx.compute_ring[j]); +	}  	r = amdgpu_ring_test_helper(kiq_ring); -	spin_unlock(&adev->gfx.kiq.ring_lock); +	spin_unlock(&kiq->ring_lock); +	if (r) +		DRM_ERROR("KCQ enable failed\n"); + +	return r; +} + +int amdgpu_gfx_enable_kgq(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id]; +	struct amdgpu_ring *kiq_ring = &kiq->ring; +	int r, i, j; + +	if (!kiq->pmf || !kiq->pmf->kiq_map_queues) +		return -EINVAL; + +	amdgpu_device_flush_hdp(adev, NULL); + +	spin_lock(&kiq->ring_lock); +	/* No need to map kcq on the slave */ +	if (amdgpu_gfx_is_master_xcc(adev, xcc_id)) { +		r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size * +						adev->gfx.num_gfx_rings); +		if (r) { +			DRM_ERROR("Failed to lock KIQ (%d).\n", r); +			spin_unlock(&kiq->ring_lock); +			return r; +		} + +		for (i = 0; i < adev->gfx.num_gfx_rings; i++) { +			j = i + xcc_id * adev->gfx.num_gfx_rings; +			kiq->pmf->kiq_map_queues(kiq_ring, +						 &adev->gfx.gfx_ring[j]); +		} +	} + +	r = amdgpu_ring_test_helper(kiq_ring); +	spin_unlock(&kiq->ring_lock);  	if (r)  		DRM_ERROR("KCQ enable failed\n"); @@ -785,12 +888,31 @@ int amdgpu_gfx_cp_ecc_error_irq(struct amdgpu_device *adev,  	return 0;  } +void amdgpu_gfx_ras_error_func(struct amdgpu_device *adev, +		void *ras_error_status, +		void (*func)(struct amdgpu_device *adev, void *ras_error_status, +				int xcc_id)) +{ +	int i; +	int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1; +	uint32_t xcc_mask = GENMASK(num_xcc - 1, 0); +	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status; + +	if (err_data) { +		err_data->ue_count = 0; +		err_data->ce_count = 0; +	} + +	for_each_inst(i, xcc_mask) +		func(adev, ras_error_status, i); +} +  uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)  {  	signed long r, cnt = 0;  	unsigned long flags;  	uint32_t seq, reg_val_offs = 0, value = 0; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *ring = &kiq->ring;  	if (amdgpu_device_skip_hw_access(adev)) @@ -858,7 +980,7 @@ void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)  	signed long r, cnt = 0;  	unsigned long flags;  	uint32_t seq; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *ring = &kiq->ring;  	BUG_ON(!ring->funcs->emit_wreg); @@ -1062,3 +1184,125 @@ void amdgpu_gfx_cp_init_microcode(struct amdgpu_device *adev,  		adev->firmware.fw_size += ALIGN(fw_size, PAGE_SIZE);  	}  } + +bool amdgpu_gfx_is_master_xcc(struct amdgpu_device *adev, int xcc_id) +{ +	return !(xcc_id % (adev->gfx.num_xcc_per_xcp ? +			adev->gfx.num_xcc_per_xcp : 1)); +} + +static ssize_t amdgpu_gfx_get_current_compute_partition(struct device *dev, +						struct device_attribute *addr, +						char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = drm_to_adev(ddev); +	int mode; + +	mode = amdgpu_xcp_query_partition_mode(adev->xcp_mgr, +					       AMDGPU_XCP_FL_NONE); + +	return sysfs_emit(buf, "%s\n", amdgpu_gfx_compute_mode_desc(mode)); +} + +static ssize_t amdgpu_gfx_set_compute_partition(struct device *dev, +						struct device_attribute *addr, +						const char *buf, size_t count) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = drm_to_adev(ddev); +	enum amdgpu_gfx_partition mode; +	int ret = 0, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	if (num_xcc % 2 != 0) +		return -EINVAL; + +	if (!strncasecmp("SPX", buf, strlen("SPX"))) { +		mode = AMDGPU_SPX_PARTITION_MODE; +	} else if (!strncasecmp("DPX", buf, strlen("DPX"))) { +		/* +		 * DPX mode needs AIDs to be in multiple of 2. +		 * Each AID connects 2 XCCs. +		 */ +		if (num_xcc%4) +			return -EINVAL; +		mode = AMDGPU_DPX_PARTITION_MODE; +	} else if (!strncasecmp("TPX", buf, strlen("TPX"))) { +		if (num_xcc != 6) +			return -EINVAL; +		mode = AMDGPU_TPX_PARTITION_MODE; +	} else if (!strncasecmp("QPX", buf, strlen("QPX"))) { +		if (num_xcc != 8) +			return -EINVAL; +		mode = AMDGPU_QPX_PARTITION_MODE; +	} else if (!strncasecmp("CPX", buf, strlen("CPX"))) { +		mode = AMDGPU_CPX_PARTITION_MODE; +	} else { +		return -EINVAL; +	} + +	ret = amdgpu_xcp_switch_partition_mode(adev->xcp_mgr, mode); + +	if (ret) +		return ret; + +	return count; +} + +static ssize_t amdgpu_gfx_get_available_compute_partition(struct device *dev, +						struct device_attribute *addr, +						char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = drm_to_adev(ddev); +	char *supported_partition; + +	/* TBD */ +	switch (NUM_XCC(adev->gfx.xcc_mask)) { +	case 8: +		supported_partition = "SPX, DPX, QPX, CPX"; +		break; +	case 6: +		supported_partition = "SPX, TPX, CPX"; +		break; +	case 4: +		supported_partition = "SPX, DPX, CPX"; +		break; +	/* this seems only existing in emulation phase */ +	case 2: +		supported_partition = "SPX, CPX"; +		break; +	default: +		supported_partition = "Not supported"; +		break; +	} + +	return sysfs_emit(buf, "%s\n", supported_partition); +} + +static DEVICE_ATTR(current_compute_partition, S_IRUGO | S_IWUSR, +		   amdgpu_gfx_get_current_compute_partition, +		   amdgpu_gfx_set_compute_partition); + +static DEVICE_ATTR(available_compute_partition, S_IRUGO, +		   amdgpu_gfx_get_available_compute_partition, NULL); + +int amdgpu_gfx_sysfs_init(struct amdgpu_device *adev) +{ +	int r; + +	r = device_create_file(adev->dev, &dev_attr_current_compute_partition); +	if (r) +		return r; + +	r = device_create_file(adev->dev, &dev_attr_available_compute_partition); + +	return r; +} + +void amdgpu_gfx_sysfs_fini(struct amdgpu_device *adev) +{ +	device_remove_file(adev->dev, &dev_attr_current_compute_partition); +	device_remove_file(adev->dev, &dev_attr_available_compute_partition); +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h index bfabea76d166..ce0f7a8ad4b8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h @@ -61,7 +61,42 @@ enum amdgpu_gfx_partition {  	AMDGPU_TPX_PARTITION_MODE = 2,  	AMDGPU_QPX_PARTITION_MODE = 3,  	AMDGPU_CPX_PARTITION_MODE = 4, -	AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE, +	AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE = -1, +	/* Automatically choose the right mode */ +	AMDGPU_AUTO_COMPUTE_PARTITION_MODE = -2, +}; + +#define NUM_XCC(x) hweight16(x) + +enum amdgpu_pkg_type { +	AMDGPU_PKG_TYPE_APU = 2, +	AMDGPU_PKG_TYPE_UNKNOWN, +}; + +enum amdgpu_gfx_ras_mem_id_type { +	AMDGPU_GFX_CP_MEM = 0, +	AMDGPU_GFX_GCEA_MEM, +	AMDGPU_GFX_GC_CANE_MEM, +	AMDGPU_GFX_GCUTCL2_MEM, +	AMDGPU_GFX_GDS_MEM, +	AMDGPU_GFX_LDS_MEM, +	AMDGPU_GFX_RLC_MEM, +	AMDGPU_GFX_SP_MEM, +	AMDGPU_GFX_SPI_MEM, +	AMDGPU_GFX_SQC_MEM, +	AMDGPU_GFX_SQ_MEM, +	AMDGPU_GFX_TA_MEM, +	AMDGPU_GFX_TCC_MEM, +	AMDGPU_GFX_TCA_MEM, +	AMDGPU_GFX_TCI_MEM, +	AMDGPU_GFX_TCP_MEM, +	AMDGPU_GFX_TD_MEM, +	AMDGPU_GFX_TCX_MEM, +	AMDGPU_GFX_ATC_L2_MEM, +	AMDGPU_GFX_UTCL2_MEM, +	AMDGPU_GFX_VML2_MEM, +	AMDGPU_GFX_VML2_WALKER_MEM, +	AMDGPU_GFX_MEM_TYPE_NUM  };  struct amdgpu_mec { @@ -75,8 +110,10 @@ struct amdgpu_mec {  	u32 num_mec;  	u32 num_pipe_per_mec;  	u32 num_queue_per_pipe; -	void			*mqd_backup[AMDGPU_MAX_COMPUTE_RINGS + 1]; +	void			*mqd_backup[AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES]; +}; +struct amdgpu_mec_bitmap {  	/* These are the resources for which amdgpu takes ownership */  	DECLARE_BITMAP(queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  }; @@ -120,6 +157,7 @@ struct amdgpu_kiq {  	struct amdgpu_ring	ring;  	struct amdgpu_irq_src	irq;  	const struct kiq_pm4_funcs *pmf; +	void			*mqd_backup;  };  /* @@ -230,23 +268,37 @@ struct amdgpu_gfx_ras {  						struct amdgpu_iv_entry *entry);  }; +struct amdgpu_gfx_shadow_info { +	u32 shadow_size; +	u32 shadow_alignment; +	u32 csa_size; +	u32 csa_alignment; +}; +  struct amdgpu_gfx_funcs {  	/* get the gpu clock counter */  	uint64_t (*get_gpu_clock_counter)(struct amdgpu_device *adev);  	void (*select_se_sh)(struct amdgpu_device *adev, u32 se_num, -			     u32 sh_num, u32 instance); -	void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, +			     u32 sh_num, u32 instance, int xcc_id); +	void (*read_wave_data)(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  			       uint32_t wave, uint32_t *dst, int *no_fields); -	void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t simd, +	void (*read_wave_vgprs)(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				uint32_t wave, uint32_t thread, uint32_t start,  				uint32_t size, uint32_t *dst); -	void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t simd, +	void (*read_wave_sgprs)(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				uint32_t wave, uint32_t start, uint32_t size,  				uint32_t *dst);  	void (*select_me_pipe_q)(struct amdgpu_device *adev, u32 me, u32 pipe, -				 u32 queue, u32 vmid); +				 u32 queue, u32 vmid, u32 xcc_id);  	void (*init_spm_golden)(struct amdgpu_device *adev);  	void (*update_perfmon_mgcg)(struct amdgpu_device *adev, bool enable); +	int (*get_gfx_shadow_info)(struct amdgpu_device *adev, +				   struct amdgpu_gfx_shadow_info *shadow_info); +	enum amdgpu_gfx_partition +			(*query_partition_mode)(struct amdgpu_device *adev); +	int (*switch_partition_mode)(struct amdgpu_device *adev, +				     int num_xccs_per_xcp); +	int (*ih_node_to_logical_xcc)(struct amdgpu_device *adev, int ih_node);  };  struct sq_work { @@ -296,7 +348,8 @@ struct amdgpu_gfx {  	struct amdgpu_ce		ce;  	struct amdgpu_me		me;  	struct amdgpu_mec		mec; -	struct amdgpu_kiq		kiq; +	struct amdgpu_mec_bitmap	mec_bitmap[AMDGPU_MAX_GC_INSTANCES]; +	struct amdgpu_kiq		kiq[AMDGPU_MAX_GC_INSTANCES];  	struct amdgpu_imu		imu;  	bool				rs64_enable; /* firmware format */  	const struct firmware		*me_fw;	/* ME firmware */ @@ -376,15 +429,31 @@ struct amdgpu_gfx {  	struct amdgpu_ring		sw_gfx_ring[AMDGPU_MAX_SW_GFX_RINGS];  	struct amdgpu_ring_mux          muxer; -	enum amdgpu_gfx_partition	partition_mode; -	uint32_t			num_xcd; +	bool				cp_gfx_shadow; /* for gfx11 */ + +	uint16_t 			xcc_mask;  	uint32_t			num_xcc_per_xcp; +	struct mutex			partition_mutex; +}; + +struct amdgpu_gfx_ras_reg_entry { +	struct amdgpu_ras_err_status_reg_entry reg_entry; +	enum amdgpu_gfx_ras_mem_id_type mem_id_type; +	uint32_t se_num; +}; + +struct amdgpu_gfx_ras_mem_id_entry { +	const struct amdgpu_ras_memory_id_entry *mem_id_ent; +	uint32_t size;  }; +#define AMDGPU_GFX_MEMID_ENT(x) {(x), ARRAY_SIZE(x)}, +  #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) -#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) -#define amdgpu_gfx_select_me_pipe_q(adev, me, pipe, q, vmid) (adev)->gfx.funcs->select_me_pipe_q((adev), (me), (pipe), (q), (vmid)) +#define amdgpu_gfx_select_se_sh(adev, se, sh, instance, xcc_id) ((adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance), (xcc_id))) +#define amdgpu_gfx_select_me_pipe_q(adev, me, pipe, q, vmid, xcc_id) ((adev)->gfx.funcs->select_me_pipe_q((adev), (me), (pipe), (q), (vmid), (xcc_id)))  #define amdgpu_gfx_init_spm_golden(adev) (adev)->gfx.funcs->init_spm_golden((adev)) +#define amdgpu_gfx_get_gfx_shadow_info(adev, si) ((adev)->gfx.funcs->get_gfx_shadow_info((adev), (si)))  /**   * amdgpu_gfx_create_bitmask - create a bitmask @@ -404,19 +473,21 @@ void amdgpu_gfx_parse_disable_cu(unsigned *mask, unsigned max_se,  int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  			     struct amdgpu_ring *ring, -			     struct amdgpu_irq_src *irq); +			     struct amdgpu_irq_src *irq, int xcc_id);  void amdgpu_gfx_kiq_free_ring(struct amdgpu_ring *ring); -void amdgpu_gfx_kiq_fini(struct amdgpu_device *adev); +void amdgpu_gfx_kiq_fini(struct amdgpu_device *adev, int xcc_id);  int amdgpu_gfx_kiq_init(struct amdgpu_device *adev, -			unsigned hpd_size); +			unsigned hpd_size, int xcc_id);  int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev, -			   unsigned mqd_size); -void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev); -int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev); -int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev); +			   unsigned mqd_size, int xcc_id); +void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev, int xcc_id); +int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev, int xcc_id); +int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev, int xcc_id); +int amdgpu_gfx_disable_kgq(struct amdgpu_device *adev, int xcc_id); +int amdgpu_gfx_enable_kgq(struct amdgpu_device *adev, int xcc_id);  void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev);  void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev); @@ -425,8 +496,8 @@ int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,  				int pipe, int queue);  void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,  				 int *mec, int *pipe, int *queue); -bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, int mec, -				     int pipe, int queue); +bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev, int xcc_id, +				     int mec, int pipe, int queue);  bool amdgpu_gfx_is_high_priority_compute_queue(struct amdgpu_device *adev,  					       struct amdgpu_ring *ring);  bool amdgpu_gfx_is_high_priority_graphics_queue(struct amdgpu_device *adev, @@ -458,4 +529,33 @@ void amdgpu_gfx_cp_init_microcode(struct amdgpu_device *adev, uint32_t ucode_id)  int amdgpu_gfx_ras_sw_init(struct amdgpu_device *adev);  int amdgpu_gfx_poison_consumption_handler(struct amdgpu_device *adev,  						struct amdgpu_iv_entry *entry); + +bool amdgpu_gfx_is_master_xcc(struct amdgpu_device *adev, int xcc_id); +int amdgpu_gfx_sysfs_init(struct amdgpu_device *adev); +void amdgpu_gfx_sysfs_fini(struct amdgpu_device *adev); +void amdgpu_gfx_ras_error_func(struct amdgpu_device *adev, +		void *ras_error_status, +		void (*func)(struct amdgpu_device *adev, void *ras_error_status, +				int xcc_id)); + +static inline const char *amdgpu_gfx_compute_mode_desc(int mode) +{ +	switch (mode) { +	case AMDGPU_SPX_PARTITION_MODE: +		return "SPX"; +	case AMDGPU_DPX_PARTITION_MODE: +		return "DPX"; +	case AMDGPU_TPX_PARTITION_MODE: +		return "TPX"; +	case AMDGPU_QPX_PARTITION_MODE: +		return "QPX"; +	case AMDGPU_CPX_PARTITION_MODE: +		return "CPX"; +	default: +		return "UNKNOWN"; +	} + +	return "UNKNOWN"; +} +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 4e2531758866..d78bd9732543 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c @@ -534,22 +534,21 @@ void amdgpu_gmc_ras_fini(struct amdgpu_device *adev)  	 *                    subject to change when ring number changes  	 * Engine 17: Gart flushes  	 */ -#define GFXHUB_FREE_VM_INV_ENGS_BITMAP		0x1FFF3 -#define MMHUB_FREE_VM_INV_ENGS_BITMAP		0x1FFF3 +#define AMDGPU_VMHUB_INV_ENG_BITMAP		0x1FFF3  int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev)  {  	struct amdgpu_ring *ring; -	unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] = -		{GFXHUB_FREE_VM_INV_ENGS_BITMAP, MMHUB_FREE_VM_INV_ENGS_BITMAP, -		GFXHUB_FREE_VM_INV_ENGS_BITMAP}; +	unsigned vm_inv_engs[AMDGPU_MAX_VMHUBS] = {0};  	unsigned i;  	unsigned vmhub, inv_eng; -	if (adev->enable_mes) { +	/* init the vm inv eng for all vmhubs */ +	for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) { +		vm_inv_engs[i] = AMDGPU_VMHUB_INV_ENG_BITMAP;  		/* reserve engine 5 for firmware */ -		for (vmhub = 0; vmhub < AMDGPU_MAX_VMHUBS; vmhub++) -			vm_inv_engs[vmhub] &= ~(1 << 5); +		if (adev->enable_mes) +			vm_inv_engs[i] &= ~(1 << 5);  	}  	for (i = 0; i < adev->num_rings; ++i) { @@ -593,6 +592,8 @@ void amdgpu_gmc_tmz_set(struct amdgpu_device *adev)  	case IP_VERSION(9, 3, 0):  	/* GC 10.3.7 */  	case IP_VERSION(10, 3, 7): +	/* GC 11.0.1 */ +	case IP_VERSION(11, 0, 1):  		if (amdgpu_tmz == 0) {  			adev->gmc.tmz_enabled = false;  			dev_info(adev->dev, @@ -616,7 +617,6 @@ void amdgpu_gmc_tmz_set(struct amdgpu_device *adev)  	case IP_VERSION(10, 3, 1):  	/* YELLOW_CARP*/  	case IP_VERSION(10, 3, 3): -	case IP_VERSION(11, 0, 1):  	case IP_VERSION(11, 0, 4):  		/* Don't enable it by default yet.  		 */ @@ -670,7 +670,7 @@ void amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,  	for (i = 0; i < 16; i++) {  		reg = hub->vm_context0_cntl + hub->ctx_distance * i; -		tmp = (hub_type == AMDGPU_GFXHUB_0) ? +		tmp = (hub_type == AMDGPU_GFXHUB(0)) ?  			RREG32_SOC15_IP(GC, reg) :  			RREG32_SOC15_IP(MMHUB, reg); @@ -679,7 +679,7 @@ void amdgpu_gmc_set_vm_fault_masks(struct amdgpu_device *adev, int hub_type,  		else  			tmp &= ~hub->vm_cntx_cntl_vm_fault; -		(hub_type == AMDGPU_GFXHUB_0) ? +		(hub_type == AMDGPU_GFXHUB(0)) ?  			WREG32_SOC15_IP(GC, reg, tmp) :  			WREG32_SOC15_IP(MMHUB, reg, tmp);  	} @@ -892,3 +892,47 @@ int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)  	return 0;  } + +static ssize_t current_memory_partition_show( +	struct device *dev, struct device_attribute *addr, char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = drm_to_adev(ddev); +	enum amdgpu_memory_partition mode; + +	mode = adev->gmc.gmc_funcs->query_mem_partition_mode(adev); +	switch (mode) { +	case AMDGPU_NPS1_PARTITION_MODE: +		return sysfs_emit(buf, "NPS1\n"); +	case AMDGPU_NPS2_PARTITION_MODE: +		return sysfs_emit(buf, "NPS2\n"); +	case AMDGPU_NPS3_PARTITION_MODE: +		return sysfs_emit(buf, "NPS3\n"); +	case AMDGPU_NPS4_PARTITION_MODE: +		return sysfs_emit(buf, "NPS4\n"); +	case AMDGPU_NPS6_PARTITION_MODE: +		return sysfs_emit(buf, "NPS6\n"); +	case AMDGPU_NPS8_PARTITION_MODE: +		return sysfs_emit(buf, "NPS8\n"); +	default: +		return sysfs_emit(buf, "UNKNOWN\n"); +	} + +	return sysfs_emit(buf, "UNKNOWN\n"); +} + +static DEVICE_ATTR_RO(current_memory_partition); + +int amdgpu_gmc_sysfs_init(struct amdgpu_device *adev) +{ +	if (!adev->gmc.gmc_funcs->query_mem_partition_mode) +		return 0; + +	return device_create_file(adev->dev, +				  &dev_attr_current_memory_partition); +} + +void amdgpu_gmc_sysfs_fini(struct amdgpu_device *adev) +{ +	device_remove_file(adev->dev, &dev_attr_current_memory_partition); +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h index 6d105d7fb98b..6794edd1d2d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h @@ -63,6 +63,16 @@  struct firmware; +enum amdgpu_memory_partition { +	UNKNOWN_MEMORY_PARTITION_MODE = 0, +	AMDGPU_NPS1_PARTITION_MODE = 1, +	AMDGPU_NPS2_PARTITION_MODE = 2, +	AMDGPU_NPS3_PARTITION_MODE = 3, +	AMDGPU_NPS4_PARTITION_MODE = 4, +	AMDGPU_NPS6_PARTITION_MODE = 6, +	AMDGPU_NPS8_PARTITION_MODE = 8, +}; +  /*   * GMC page fault information   */ @@ -119,7 +129,8 @@ struct amdgpu_gmc_funcs {  				uint32_t vmhub, uint32_t flush_type);  	/* flush the vm tlb via pasid */  	int (*flush_gpu_tlb_pasid)(struct amdgpu_device *adev, uint16_t pasid, -					uint32_t flush_type, bool all_hub); +					uint32_t flush_type, bool all_hub, +					uint32_t inst);  	/* flush the vm tlb via ring */  	uint64_t (*emit_flush_gpu_tlb)(struct amdgpu_ring *ring, unsigned vmid,  				       uint64_t pd_addr); @@ -137,8 +148,15 @@ struct amdgpu_gmc_funcs {  	void (*get_vm_pte)(struct amdgpu_device *adev,  			   struct amdgpu_bo_va_mapping *mapping,  			   uint64_t *flags); +	/* override per-page pte flags */ +	void (*override_vm_pte_flags)(struct amdgpu_device *dev, +				      struct amdgpu_vm *vm, +				      uint64_t addr, uint64_t *flags);  	/* get the amount of memory used by the vbios for pre-OS console */  	unsigned int (*get_vbios_fb_size)(struct amdgpu_device *adev); + +	enum amdgpu_memory_partition (*query_mem_partition_mode)( +		struct amdgpu_device *adev);  };  struct amdgpu_xgmi_ras { @@ -164,6 +182,21 @@ struct amdgpu_xgmi {  	struct amdgpu_xgmi_ras *ras;  }; +struct amdgpu_mem_partition_info { +	union { +		struct { +			uint32_t fpfn; +			uint32_t lpfn; +		} range; +		struct { +			int node; +		} numa; +	}; +	uint64_t size; +}; + +#define INVALID_PFN    -1 +  struct amdgpu_gmc {  	/* FB's physical address in MMIO space (for CPU to  	 * map FB). This is different compared to the agp/ @@ -250,7 +283,10 @@ struct amdgpu_gmc {  	uint64_t		last_fault:AMDGPU_GMC_FAULT_RING_ORDER;  	bool tmz_enabled; +	bool is_app_apu; +	struct amdgpu_mem_partition_info *mem_partitions; +	uint8_t num_mem_partitions;  	const struct amdgpu_gmc_funcs	*gmc_funcs;  	struct amdgpu_xgmi xgmi; @@ -296,14 +332,17 @@ struct amdgpu_gmc {  };  #define amdgpu_gmc_flush_gpu_tlb(adev, vmid, vmhub, type) ((adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid), (vmhub), (type))) -#define amdgpu_gmc_flush_gpu_tlb_pasid(adev, pasid, type, allhub) \ +#define amdgpu_gmc_flush_gpu_tlb_pasid(adev, pasid, type, allhub, inst) \  	((adev)->gmc.gmc_funcs->flush_gpu_tlb_pasid \ -	((adev), (pasid), (type), (allhub))) +	((adev), (pasid), (type), (allhub), (inst)))  #define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr))  #define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid))  #define amdgpu_gmc_map_mtype(adev, flags) (adev)->gmc.gmc_funcs->map_mtype((adev),(flags))  #define amdgpu_gmc_get_vm_pde(adev, level, dst, flags) (adev)->gmc.gmc_funcs->get_vm_pde((adev), (level), (dst), (flags))  #define amdgpu_gmc_get_vm_pte(adev, mapping, flags) (adev)->gmc.gmc_funcs->get_vm_pte((adev), (mapping), (flags)) +#define amdgpu_gmc_override_vm_pte_flags(adev, vm, addr, pte_flags)	\ +	(adev)->gmc.gmc_funcs->override_vm_pte_flags			\ +		((adev), (vm), (addr), (pte_flags))  #define amdgpu_gmc_get_vbios_fb_size(adev) (adev)->gmc.gmc_funcs->get_vbios_fb_size((adev))  /** @@ -373,4 +412,7 @@ uint64_t amdgpu_gmc_vram_mc2pa(struct amdgpu_device *adev, uint64_t mc_addr);  uint64_t amdgpu_gmc_vram_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo);  uint64_t amdgpu_gmc_vram_cpu_pa(struct amdgpu_device *adev, struct amdgpu_bo *bo);  int amdgpu_gmc_vram_checking(struct amdgpu_device *adev); +int amdgpu_gmc_sysfs_init(struct amdgpu_device *adev); +void amdgpu_gmc_sysfs_fini(struct amdgpu_device *adev); +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 4ff348e10e4d..ebeddc9a37e9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -136,7 +136,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	uint64_t fence_ctx;  	uint32_t status = 0, alloc_size;  	unsigned fence_flags = 0; -	bool secure; +	bool secure, init_shadow; +	u64 shadow_va, csa_va, gds_va; +	int vmid = AMDGPU_JOB_GET_VMID(job);  	unsigned i;  	int r = 0; @@ -150,9 +152,17 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		vm = job->vm;  		fence_ctx = job->base.s_fence ?  			job->base.s_fence->scheduled.context : 0; +		shadow_va = job->shadow_va; +		csa_va = job->csa_va; +		gds_va = job->gds_va; +		init_shadow = job->init_shadow;  	} else {  		vm = NULL;  		fence_ctx = 0; +		shadow_va = 0; +		csa_va = 0; +		gds_va = 0; +		init_shadow = false;  	}  	if (!ring->sched.ready && !ring->is_mes_queue) { @@ -212,7 +222,12 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	}  	amdgpu_ring_ib_begin(ring); -	if (job && ring->funcs->init_cond_exec) + +	if (ring->funcs->emit_gfx_shadow) +		amdgpu_ring_emit_gfx_shadow(ring, shadow_va, csa_va, gds_va, +					    init_shadow, vmid); + +	if (ring->funcs->init_cond_exec)  		patch_offset = amdgpu_ring_init_cond_exec(ring);  	amdgpu_device_flush_hdp(adev, ring); @@ -263,6 +278,18 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  				       fence_flags | AMDGPU_FENCE_FLAG_64BIT);  	} +	if (ring->funcs->emit_gfx_shadow) { +		amdgpu_ring_emit_gfx_shadow(ring, 0, 0, 0, false, 0); + +		if (ring->funcs->init_cond_exec) { +			unsigned ce_offset = ~0; + +			ce_offset = amdgpu_ring_init_cond_exec(ring); +			if (ce_offset != ~0 && ring->funcs->patch_cond_exec) +				amdgpu_ring_patch_cond_exec(ring, ce_offset); +		} +	} +  	r = amdgpu_fence_emit(ring, f, job, fence_flags);  	if (r) {  		dev_err(adev->dev, "failed to emit fence (%d)\n", r); @@ -436,7 +463,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)  static int amdgpu_debugfs_sa_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	seq_printf(m, "--------------------- DELAYED --------------------- \n");  	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DELAYED], diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c index c991ca0b7a1c..ff1ea99292fb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c @@ -409,7 +409,7 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,  	if (r || !idle)  		goto error; -	if (vm->reserved_vmid[vmhub]) { +	if (vm->reserved_vmid[vmhub] || (enforce_isolation && (vmhub == AMDGPU_GFXHUB(0)))) {  		r = amdgpu_vmid_grab_reserved(vm, ring, job, &id, fence);  		if (r || !id)  			goto error; @@ -460,14 +460,11 @@ error:  }  int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev, -			       struct amdgpu_vm *vm,  			       unsigned vmhub)  {  	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];  	mutex_lock(&id_mgr->lock); -	if (vm->reserved_vmid[vmhub]) -		goto unlock;  	++id_mgr->reserved_use_count;  	if (!id_mgr->reserved) { @@ -479,27 +476,23 @@ int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev,  		list_del_init(&id->list);  		id_mgr->reserved = id;  	} -	vm->reserved_vmid[vmhub] = true; -unlock:  	mutex_unlock(&id_mgr->lock);  	return 0;  }  void amdgpu_vmid_free_reserved(struct amdgpu_device *adev, -			       struct amdgpu_vm *vm,  			       unsigned vmhub)  {  	struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];  	mutex_lock(&id_mgr->lock); -	if (vm->reserved_vmid[vmhub] && -	    !--id_mgr->reserved_use_count) { +	if (!--id_mgr->reserved_use_count) {  		/* give the reserved ID back to normal round robin */  		list_add(&id_mgr->reserved->list, &id_mgr->ids_lru);  		id_mgr->reserved = NULL;  	} -	vm->reserved_vmid[vmhub] = false; +  	mutex_unlock(&id_mgr->lock);  } @@ -578,6 +571,10 @@ void amdgpu_vmid_mgr_init(struct amdgpu_device *adev)  			list_add_tail(&id_mgr->ids[j].list, &id_mgr->ids_lru);  		}  	} +	/* alloc a default reserved vmid to enforce isolation */ +	if (enforce_isolation) +		amdgpu_vmid_alloc_reserved(adev, AMDGPU_GFXHUB(0)); +  }  /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h index d1cc09b45da4..fa8c42c83d5d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h @@ -79,11 +79,9 @@ void amdgpu_pasid_free_delayed(struct dma_resv *resv,  bool amdgpu_vmid_had_gpu_reset(struct amdgpu_device *adev,  			       struct amdgpu_vmid *id);  int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev, -			       struct amdgpu_vm *vm, -			       unsigned vmhub); +				unsigned vmhub);  void amdgpu_vmid_free_reserved(struct amdgpu_device *adev, -			       struct amdgpu_vm *vm, -			       unsigned vmhub); +				unsigned vmhub);  int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,  		     struct amdgpu_job *job, struct dma_fence **fence);  void amdgpu_vmid_reset(struct amdgpu_device *adev, unsigned vmhub, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c index 1d5af50331e4..fceb3b384955 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c @@ -270,7 +270,7 @@ void amdgpu_ih_decode_iv_helper(struct amdgpu_device *adev,  	entry->timestamp = dw[1] | ((u64)(dw[2] & 0xffff) << 32);  	entry->timestamp_src = dw[2] >> 31;  	entry->pasid = dw[3] & 0xffff; -	entry->pasid_src = dw[3] >> 31; +	entry->node_id = (dw[3] >> 16) & 0xff;  	entry->src_data[0] = dw[4];  	entry->src_data[1] = dw[5];  	entry->src_data[2] = dw[6]; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index fafebec5b7b6..3481d2808ce5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -99,6 +99,21 @@ const char *soc15_ih_clientid_name[] = {  	"MP1"  }; +const int node_id_to_phys_map[NODEID_MAX] = { +	[AID0_NODEID] = 0, +	[XCD0_NODEID] = 0, +	[XCD1_NODEID] = 1, +	[AID1_NODEID] = 1, +	[XCD2_NODEID] = 2, +	[XCD3_NODEID] = 3, +	[AID2_NODEID] = 2, +	[XCD4_NODEID] = 4, +	[XCD5_NODEID] = 5, +	[AID3_NODEID] = 3, +	[XCD6_NODEID] = 6, +	[XCD7_NODEID] = 7, +}; +  /**   * amdgpu_irq_disable_all - disable *all* interrupts   * @@ -109,7 +124,7 @@ const char *soc15_ih_clientid_name[] = {  void amdgpu_irq_disable_all(struct amdgpu_device *adev)  {  	unsigned long irqflags; -	unsigned i, j, k; +	unsigned int i, j, k;  	int r;  	spin_lock_irqsave(&adev->irq.lock, irqflags); @@ -124,7 +139,6 @@ void amdgpu_irq_disable_all(struct amdgpu_device *adev)  				continue;  			for (k = 0; k < src->num_types; ++k) { -				atomic_set(&src->enabled_types[k], 0);  				r = src->funcs->set(adev, src, k,  						    AMDGPU_IRQ_STATE_DISABLE);  				if (r) @@ -268,11 +282,11 @@ int amdgpu_irq_init(struct amdgpu_device *adev)  		int nvec = pci_msix_vec_count(adev->pdev);  		unsigned int flags; -		if (nvec <= 0) { +		if (nvec <= 0)  			flags = PCI_IRQ_MSI; -		} else { +		else  			flags = PCI_IRQ_MSI | PCI_IRQ_MSIX; -		} +  		/* we only need one vector */  		nvec = pci_alloc_irq_vectors(adev->pdev, 1, 1, flags);  		if (nvec > 0) { @@ -331,7 +345,7 @@ void amdgpu_irq_fini_hw(struct amdgpu_device *adev)   */  void amdgpu_irq_fini_sw(struct amdgpu_device *adev)  { -	unsigned i, j; +	unsigned int i, j;  	for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) {  		if (!adev->irq.client[i].sources) @@ -365,7 +379,7 @@ void amdgpu_irq_fini_sw(struct amdgpu_device *adev)   * 0 on success or error code otherwise   */  int amdgpu_irq_add_id(struct amdgpu_device *adev, -		      unsigned client_id, unsigned src_id, +		      unsigned int client_id, unsigned int src_id,  		      struct amdgpu_irq_src *source)  {  	if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) @@ -417,7 +431,7 @@ void amdgpu_irq_dispatch(struct amdgpu_device *adev,  {  	u32 ring_index = ih->rptr >> 2;  	struct amdgpu_iv_entry entry; -	unsigned client_id, src_id; +	unsigned int client_id, src_id;  	struct amdgpu_irq_src *src;  	bool handled = false;  	int r; @@ -492,7 +506,7 @@ void amdgpu_irq_delegate(struct amdgpu_device *adev,   * Updates interrupt state for the specific source (all ASICs).   */  int amdgpu_irq_update(struct amdgpu_device *adev, -			     struct amdgpu_irq_src *src, unsigned type) +			     struct amdgpu_irq_src *src, unsigned int type)  {  	unsigned long irqflags;  	enum amdgpu_interrupt_state state; @@ -501,7 +515,8 @@ int amdgpu_irq_update(struct amdgpu_device *adev,  	spin_lock_irqsave(&adev->irq.lock, irqflags);  	/* We need to determine after taking the lock, otherwise -	   we might disable just enabled interrupts again */ +	 * we might disable just enabled interrupts again +	 */  	if (amdgpu_irq_enabled(adev, src, type))  		state = AMDGPU_IRQ_STATE_ENABLE;  	else @@ -555,7 +570,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)   * 0 on success or error code otherwise   */  int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src, -		   unsigned type) +		   unsigned int type)  {  	if (!adev->irq.installed)  		return -ENOENT; @@ -585,7 +600,7 @@ int amdgpu_irq_get(struct amdgpu_device *adev, struct amdgpu_irq_src *src,   * 0 on success or error code otherwise   */  int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src, -		   unsigned type) +		   unsigned int type)  {  	if (!adev->irq.installed)  		return -ENOENT; @@ -619,7 +634,7 @@ int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src,   * invalid parameters   */  bool amdgpu_irq_enabled(struct amdgpu_device *adev, struct amdgpu_irq_src *src, -			unsigned type) +			unsigned int type)  {  	if (!adev->irq.installed)  		return false; @@ -732,7 +747,7 @@ void amdgpu_irq_remove_domain(struct amdgpu_device *adev)   * Returns:   * Linux IRQ   */ -unsigned amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned src_id) +unsigned int amdgpu_irq_create_mapping(struct amdgpu_device *adev, unsigned int src_id)  {  	adev->irq.virq[src_id] = irq_create_mapping(adev->irq.domain, src_id); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h index be243adf3e65..04c0b4fa17a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h @@ -53,7 +53,7 @@ struct amdgpu_iv_entry {  	uint64_t timestamp;  	unsigned timestamp_src;  	unsigned pasid; -	unsigned pasid_src; +	unsigned node_id;  	unsigned src_data[AMDGPU_IRQ_SRC_DATA_MAX_SIZE_DW];  	const uint32_t *iv_entry;  }; @@ -102,6 +102,24 @@ struct amdgpu_irq {  	bool                            retry_cam_enabled;  }; +enum interrupt_node_id_per_aid { +	AID0_NODEID = 0, +	XCD0_NODEID = 1, +	XCD1_NODEID = 2, +	AID1_NODEID = 4, +	XCD2_NODEID = 5, +	XCD3_NODEID = 6, +	AID2_NODEID = 8, +	XCD4_NODEID = 9, +	XCD5_NODEID = 10, +	AID3_NODEID = 12, +	XCD6_NODEID = 13, +	XCD7_NODEID = 14, +	NODEID_MAX, +}; + +extern const int node_id_to_phys_map[NODEID_MAX]; +  void amdgpu_irq_disable_all(struct amdgpu_device *adev);  int amdgpu_irq_init(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index c3d9d75143f4..aca3a2bfe8d2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -65,6 +65,8 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)  	DRM_ERROR("Process information: process %s pid %d thread %s pid %d\n",  		  ti.process_name, ti.tgid, ti.task_name, ti.pid); +	dma_fence_set_error(&s_job->s_fence->finished, -ETIME); +  	if (amdgpu_device_should_recover_gpu(ring->adev)) {  		struct amdgpu_reset_context reset_context;  		memset(&reset_context, 0, sizeof(reset_context)); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h index 52f2e313ea17..3f9804f956c9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h @@ -67,6 +67,12 @@ struct amdgpu_job {  	uint64_t		uf_addr;  	uint64_t		uf_sequence; +	/* virtual addresses for shadow/GDS/CSA */ +	uint64_t		shadow_va; +	uint64_t		csa_va; +	uint64_t		gds_va; +	bool			init_shadow; +  	/* job_run_counter >= 1 means a resubmit job */  	uint32_t		job_run_counter; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c index b07c000fc8ba..3add4b4f0667 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c @@ -45,13 +45,14 @@ int amdgpu_jpeg_sw_init(struct amdgpu_device *adev)  int amdgpu_jpeg_sw_fini(struct amdgpu_device *adev)  { -	int i; +	int i, j;  	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		amdgpu_ring_fini(&adev->jpeg.inst[i].ring_dec); +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) +			amdgpu_ring_fini(&adev->jpeg.inst[i].ring_dec[j]);  	}  	mutex_destroy(&adev->jpeg.jpeg_pg_lock); @@ -76,13 +77,14 @@ static void amdgpu_jpeg_idle_work_handler(struct work_struct *work)  	struct amdgpu_device *adev =  		container_of(work, struct amdgpu_device, jpeg.idle_work.work);  	unsigned int fences = 0; -	unsigned int i; +	unsigned int i, j;  	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		fences += amdgpu_fence_count_emitted(&adev->jpeg.inst[i].ring_dec); +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) +			fences += amdgpu_fence_count_emitted(&adev->jpeg.inst[i].ring_dec[j]);  	}  	if (!fences && !atomic_read(&adev->jpeg.total_submission_cnt)) @@ -122,18 +124,21 @@ int amdgpu_jpeg_dec_ring_test_ring(struct amdgpu_ring *ring)  	if (amdgpu_sriov_vf(adev))  		return 0; -	WREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch, 0xCAFEDEAD);  	r = amdgpu_ring_alloc(ring, 3);  	if (r)  		return r; -	amdgpu_ring_write(ring, PACKET0(adev->jpeg.internal.jpeg_pitch, 0)); -	amdgpu_ring_write(ring, 0xDEADBEEF); +	WREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch[ring->pipe], 0xCAFEDEAD); +	/* Add a read register to make sure the write register is executed. */ +	RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch[ring->pipe]); + +	amdgpu_ring_write(ring, PACKET0(adev->jpeg.internal.jpeg_pitch[ring->pipe], 0)); +	amdgpu_ring_write(ring, 0xABADCAFE);  	amdgpu_ring_commit(ring);  	for (i = 0; i < adev->usec_timeout; i++) { -		tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch); -		if (tmp == 0xDEADBEEF) +		tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch[ring->pipe]); +		if (tmp == 0xABADCAFE)  			break;  		udelay(1);  	} @@ -161,8 +166,7 @@ static int amdgpu_jpeg_dec_set_reg(struct amdgpu_ring *ring, uint32_t handle,  	ib = &job->ibs[0]; -	ib->ptr[0] = PACKETJ(adev->jpeg.internal.jpeg_pitch, 0, 0, -			     PACKETJ_TYPE0); +	ib->ptr[0] = PACKETJ(adev->jpeg.internal.jpeg_pitch[ring->pipe], 0, 0, PACKETJ_TYPE0);  	ib->ptr[1] = 0xDEADBEEF;  	for (i = 2; i < 16; i += 2) {  		ib->ptr[i] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); @@ -208,7 +212,7 @@ int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	}  	if (!amdgpu_sriov_vf(adev)) {  		for (i = 0; i < adev->usec_timeout; i++) { -			tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch); +			tmp = RREG32(adev->jpeg.inst[ring->me].external.jpeg_pitch[ring->pipe]);  			if (tmp == 0xDEADBEEF)  				break;  			udelay(1); @@ -241,6 +245,31 @@ int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,  	return 0;  } +int amdgpu_jpeg_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block) +{ +	int r, i; + +	r = amdgpu_ras_block_late_init(adev, ras_block); +	if (r) +		return r; + +	if (amdgpu_ras_is_supported(adev, ras_block->block)) { +		for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +			if (adev->jpeg.harvest_config & (1 << i)) +				continue; + +			r = amdgpu_irq_get(adev, &adev->jpeg.inst[i].ras_poison_irq, 0); +			if (r) +				goto late_fini; +		} +	} +	return 0; + +late_fini: +	amdgpu_ras_block_late_fini(adev, ras_block); +	return r; +} +  int amdgpu_jpeg_ras_sw_init(struct amdgpu_device *adev)  {  	int err; @@ -262,7 +291,7 @@ int amdgpu_jpeg_ras_sw_init(struct amdgpu_device *adev)  	adev->jpeg.ras_if = &ras->ras_block.ras_comm;  	if (!ras->ras_block.ras_late_init) -		ras->ras_block.ras_late_init = amdgpu_ras_block_late_init; +		ras->ras_block.ras_late_init = amdgpu_jpeg_ras_late_init;  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h index 0ca76f0f23e9..ffe47e9f5bf2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h @@ -26,19 +26,22 @@  #include "amdgpu_ras.h" -#define AMDGPU_MAX_JPEG_INSTANCES	2 +#define AMDGPU_MAX_JPEG_INSTANCES	4 +#define AMDGPU_MAX_JPEG_RINGS		8  #define AMDGPU_JPEG_HARVEST_JPEG0 (1 << 0)  #define AMDGPU_JPEG_HARVEST_JPEG1 (1 << 1)  struct amdgpu_jpeg_reg{ -	unsigned jpeg_pitch; +	unsigned jpeg_pitch[AMDGPU_MAX_JPEG_RINGS];  };  struct amdgpu_jpeg_inst { -	struct amdgpu_ring ring_dec; +	struct amdgpu_ring ring_dec[AMDGPU_MAX_JPEG_RINGS];  	struct amdgpu_irq_src irq; +	struct amdgpu_irq_src ras_poison_irq;  	struct amdgpu_jpeg_reg external; +	uint8_t aid_id;  };  struct amdgpu_jpeg_ras { @@ -48,6 +51,7 @@ struct amdgpu_jpeg_ras {  struct amdgpu_jpeg {  	uint8_t	num_jpeg_inst;  	struct amdgpu_jpeg_inst inst[AMDGPU_MAX_JPEG_INSTANCES]; +	unsigned num_jpeg_rings;  	struct amdgpu_jpeg_reg internal;  	unsigned harvest_config;  	struct delayed_work idle_work; @@ -56,6 +60,9 @@ struct amdgpu_jpeg {  	atomic_t total_submission_cnt;  	struct ras_common_if	*ras_if;  	struct amdgpu_jpeg_ras	*ras; + +	uint16_t inst_mask; +	uint8_t num_inst_per_aid;  };  int amdgpu_jpeg_sw_init(struct amdgpu_device *adev); @@ -72,6 +79,8 @@ int amdgpu_jpeg_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout);  int amdgpu_jpeg_process_poison_irq(struct amdgpu_device *adev,  				struct amdgpu_irq_src *source,  				struct amdgpu_iv_entry *entry); +int amdgpu_jpeg_ras_late_init(struct amdgpu_device *adev, +				struct ras_common_if *ras_block);  int amdgpu_jpeg_ras_sw_init(struct amdgpu_device *adev);  #endif /*__AMDGPU_JPEG_H__*/ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 0efb38539d70..e3531aa3c8bd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -462,8 +462,9 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,  			if (adev->jpeg.harvest_config & (1 << i))  				continue; -			if (adev->jpeg.inst[i].ring_dec.sched.ready) -				++num_rings; +			for (j = 0; j < adev->jpeg.num_jpeg_rings; j++) +				if (adev->jpeg.inst[i].ring_dec[j].sched.ready) +					++num_rings;  		}  		ib_start_alignment = 16;  		ib_size_alignment = 16; @@ -876,6 +877,19 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  		dev_info->gl2c_cache_size = adev->gfx.config.gc_gl2c_per_gpu;  		dev_info->mall_size = adev->gmc.mall_size; + +		if (adev->gfx.funcs->get_gfx_shadow_info) { +			struct amdgpu_gfx_shadow_info shadow_info; + +			ret = amdgpu_gfx_get_gfx_shadow_info(adev, &shadow_info); +			if (!ret) { +				dev_info->shadow_size = shadow_info.shadow_size; +				dev_info->shadow_alignment = shadow_info.shadow_alignment; +				dev_info->csa_size = shadow_info.csa_size; +				dev_info->csa_alignment = shadow_info.csa_alignment; +			} +		} +  		ret = copy_to_user(out, dev_info,  				   min((size_t)size, sizeof(*dev_info))) ? -EFAULT : 0;  		kfree(dev_info); @@ -1140,6 +1154,15 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  		kfree(caps);  		return r;  	} +	case AMDGPU_INFO_MAX_IBS: { +		uint32_t max_ibs[AMDGPU_HW_IP_NUM]; + +		for (i = 0; i < AMDGPU_HW_IP_NUM; ++i) +			max_ibs[i] = amdgpu_ring_max_ibs(i); + +		return copy_to_user(out, max_ibs, +				    min((size_t)size, sizeof(max_ibs))) ? -EFAULT : 0; +	}  	default:  		DRM_DEBUG_KMS("Invalid request %d\n", info->query);  		return -EINVAL; @@ -1210,6 +1233,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)  	if (r)  		goto error_pasid; +	r = amdgpu_xcp_open_device(adev, fpriv, file_priv); +	if (r) +		goto error_vm; +  	r = amdgpu_vm_set_pasid(adev, &fpriv->vm, pasid);  	if (r)  		goto error_vm; @@ -1284,12 +1311,12 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,  	if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_VCE) != NULL)  		amdgpu_vce_free_handles(adev, file_priv); -	if (amdgpu_mcbp) { -		/* TODO: how to handle reserve failure */ -		BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, true)); -		amdgpu_vm_bo_del(adev, fpriv->csa_va); +	if (fpriv->csa_va) { +		uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK; + +		WARN_ON(amdgpu_unmap_static_csa(adev, &fpriv->vm, adev->virt.csa_obj, +						fpriv->csa_va, csa_addr));  		fpriv->csa_va = NULL; -		amdgpu_bo_unreserve(adev->virt.csa_obj);  	}  	pasid = fpriv->vm.pasid; @@ -1441,7 +1468,7 @@ void amdgpu_disable_vblank_kms(struct drm_crtc *crtc)  static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	struct drm_amdgpu_info_firmware fw_info;  	struct drm_amdgpu_query_fw query_fw;  	struct atom_context *ctx = adev->mode_info.atom_context; @@ -1449,7 +1476,7 @@ static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)  	int ret, i;  	static const char *ta_fw_name[TA_FW_TYPE_MAX_INDEX] = { -#define TA_FW_NAME(type) [TA_FW_TYPE_PSP_##type] = #type +#define TA_FW_NAME(type)[TA_FW_TYPE_PSP_##type] = #type  		TA_FW_NAME(XGMI),  		TA_FW_NAME(RAS),  		TA_FW_NAME(HDCP), @@ -1548,7 +1575,7 @@ static int amdgpu_debugfs_firmware_info_show(struct seq_file *m, void *unused)  		   fw_info.feature, fw_info.ver);  	/* RLCV */ -        query_fw.fw_type = AMDGPU_INFO_FW_GFX_RLCV; +	query_fw.fw_type = AMDGPU_INFO_FW_GFX_RLCV;  	ret = amdgpu_firmware_info(&fw_info, &query_fw, adev);  	if (ret)  		return ret; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c index f0f00466b59f..e9091ebfe230 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c @@ -924,6 +924,43 @@ error:  	return r;  } +int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev, +				uint64_t process_context_addr, +				uint32_t spi_gdbg_per_vmid_cntl, +				const uint32_t *tcp_watch_cntl, +				uint32_t flags, +				bool trap_en) +{ +	struct mes_misc_op_input op_input = {0}; +	int r; + +	if (!adev->mes.funcs->misc_op) { +		DRM_ERROR("mes set shader debugger is not supported!\n"); +		return -EINVAL; +	} + +	op_input.op = MES_MISC_OP_SET_SHADER_DEBUGGER; +	op_input.set_shader_debugger.process_context_addr = process_context_addr; +	op_input.set_shader_debugger.flags.u32all = flags; +	op_input.set_shader_debugger.spi_gdbg_per_vmid_cntl = spi_gdbg_per_vmid_cntl; +	memcpy(op_input.set_shader_debugger.tcp_watch_cntl, tcp_watch_cntl, +			sizeof(op_input.set_shader_debugger.tcp_watch_cntl)); + +	if (((adev->mes.sched_version & AMDGPU_MES_API_VERSION_MASK) >> +			AMDGPU_MES_API_VERSION_SHIFT) >= 14) +		op_input.set_shader_debugger.trap_en = trap_en; + +	amdgpu_mes_lock(&adev->mes); + +	r = adev->mes.funcs->misc_op(&adev->mes, &op_input); +	if (r) +		DRM_ERROR("failed to set_shader_debugger\n"); + +	amdgpu_mes_unlock(&adev->mes); + +	return r; +} +  static void  amdgpu_mes_ring_to_queue_props(struct amdgpu_device *adev,  			       struct amdgpu_ring *ring, @@ -1305,14 +1342,9 @@ static int amdgpu_mes_test_queues(struct amdgpu_ring **added_rings)  		if (!ring)  			continue; -		r = amdgpu_ring_test_ring(ring); -		if (r) { -			DRM_DEV_ERROR(ring->adev->dev, -				      "ring %s test failed (%d)\n", -				      ring->name, r); +		r = amdgpu_ring_test_helper(ring); +		if (r)  			return r; -		} else -			DRM_INFO("ring %s test pass\n", ring->name);  		r = amdgpu_ring_test_ib(ring, 1000 * 10);  		if (r) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h index 547ec35691fa..2d6ac30b7135 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h @@ -219,6 +219,8 @@ struct mes_add_queue_input {  	uint32_t        gws_size;  	uint64_t	tba_addr;  	uint64_t	tma_addr; +	uint32_t	trap_en; +	uint32_t	skip_process_ctx_clear;  	uint32_t	is_kfd_process;  	uint32_t	is_aql_queue;  	uint32_t	queue_size; @@ -256,6 +258,7 @@ enum mes_misc_opcode {  	MES_MISC_OP_READ_REG,  	MES_MISC_OP_WRM_REG_WAIT,  	MES_MISC_OP_WRM_REG_WR_WAIT, +	MES_MISC_OP_SET_SHADER_DEBUGGER,  };  struct mes_misc_op_input { @@ -278,6 +281,21 @@ struct mes_misc_op_input {  			uint32_t                   reg0;  			uint32_t                   reg1;  		} wrm_reg; + +		struct { +			uint64_t process_context_addr; +			union { +				struct { +					uint64_t single_memop : 1; +					uint64_t single_alu_op : 1; +					uint64_t reserved: 30; +				}; +				uint32_t u32all; +			} flags; +			uint32_t spi_gdbg_per_vmid_cntl; +			uint32_t tcp_watch_cntl[4]; +			uint32_t trap_en; +		} set_shader_debugger;  	};  }; @@ -340,6 +358,12 @@ int amdgpu_mes_reg_wait(struct amdgpu_device *adev, uint32_t reg,  int amdgpu_mes_reg_write_reg_wait(struct amdgpu_device *adev,  				  uint32_t reg0, uint32_t reg1,  				  uint32_t ref, uint32_t mask); +int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev, +				uint64_t process_context_addr, +				uint32_t spi_gdbg_per_vmid_cntl, +				const uint32_t *tcp_watch_cntl, +				uint32_t flags, +				bool trap_en);  int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id,  			int queue_type, int idx, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h index d21bb6dae56e..1ca9d4ed8063 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h @@ -21,6 +21,29 @@  #ifndef __AMDGPU_MMHUB_H__  #define __AMDGPU_MMHUB_H__ +enum amdgpu_mmhub_ras_memory_id { +	AMDGPU_MMHUB_WGMI_PAGEMEM = 0, +	AMDGPU_MMHUB_RGMI_PAGEMEM = 1, +	AMDGPU_MMHUB_WDRAM_PAGEMEM = 2, +	AMDGPU_MMHUB_RDRAM_PAGEMEM = 3, +	AMDGPU_MMHUB_WIO_CMDMEM = 4, +	AMDGPU_MMHUB_RIO_CMDMEM = 5, +	AMDGPU_MMHUB_WGMI_CMDMEM = 6, +	AMDGPU_MMHUB_RGMI_CMDMEM = 7, +	AMDGPU_MMHUB_WDRAM_CMDMEM = 8, +	AMDGPU_MMHUB_RDRAM_CMDMEM = 9, +	AMDGPU_MMHUB_MAM_DMEM0 = 10, +	AMDGPU_MMHUB_MAM_DMEM1 = 11, +	AMDGPU_MMHUB_MAM_DMEM2 = 12, +	AMDGPU_MMHUB_MAM_DMEM3 = 13, +	AMDGPU_MMHUB_WRET_TAGMEM = 19, +	AMDGPU_MMHUB_RRET_TAGMEM = 20, +	AMDGPU_MMHUB_WIO_DATAMEM = 21, +	AMDGPU_MMHUB_WGMI_DATAMEM = 22, +	AMDGPU_MMHUB_WDRAM_DATAMEM = 23, +	AMDGPU_MMHUB_MEMORY_BLOCK_LAST, +}; +  struct amdgpu_mmhub_ras {  	struct amdgpu_ras_block_object ras_block;  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h index c686ff4bcc39..095aecfb201e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h @@ -61,6 +61,7 @@ struct amdgpu_nbio_funcs {  	u32 (*get_hdp_flush_done_offset)(struct amdgpu_device *adev);  	u32 (*get_pcie_index_offset)(struct amdgpu_device *adev);  	u32 (*get_pcie_data_offset)(struct amdgpu_device *adev); +	u32 (*get_pcie_index_hi_offset)(struct amdgpu_device *adev);  	u32 (*get_pcie_port_index_offset)(struct amdgpu_device *adev);  	u32 (*get_pcie_port_data_offset)(struct amdgpu_device *adev);  	u32 (*get_rev_id)(struct amdgpu_device *adev); @@ -95,6 +96,11 @@ struct amdgpu_nbio_funcs {  	void (*apply_l1_link_width_reconfig_wa)(struct amdgpu_device *adev);  	void (*clear_doorbell_interrupt)(struct amdgpu_device *adev);  	u32 (*get_rom_offset)(struct amdgpu_device *adev); +	int (*get_compute_partition_mode)(struct amdgpu_device *adev); +	u32 (*get_memory_partition_mode)(struct amdgpu_device *adev, +					 u32 *supp_modes); +	void (*set_compute_partition_mode)(struct amdgpu_device *adev, +					   enum amdgpu_gfx_partition mode);  };  struct amdgpu_nbio { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 2bd1a54ee866..f76649e523a0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -79,9 +79,10 @@ static void amdgpu_bo_user_destroy(struct ttm_buffer_object *tbo)  static void amdgpu_bo_vm_destroy(struct ttm_buffer_object *tbo)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); -	struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); +	struct amdgpu_bo *shadow_bo = ttm_to_amdgpu_bo(tbo), *bo;  	struct amdgpu_bo_vm *vmbo; +	bo = shadow_bo->parent;  	vmbo = to_amdgpu_bo_vm(bo);  	/* in case amdgpu_device_recover_vram got NULL of bo->parent */  	if (!list_empty(&vmbo->shadow_list)) { @@ -130,15 +131,25 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)  	u32 c = 0;  	if (domain & AMDGPU_GEM_DOMAIN_VRAM) { -		unsigned visible_pfn = adev->gmc.visible_vram_size >> PAGE_SHIFT; +		unsigned int visible_pfn = adev->gmc.visible_vram_size >> PAGE_SHIFT; +		int8_t mem_id = KFD_XCP_MEM_ID(adev, abo->xcp_id); -		places[c].fpfn = 0; -		places[c].lpfn = 0; +		if (adev->gmc.mem_partitions && mem_id >= 0) { +			places[c].fpfn = adev->gmc.mem_partitions[mem_id].range.fpfn; +			/* +			 * memory partition range lpfn is inclusive start + size - 1 +			 * TTM place lpfn is exclusive start + size +			 */ +			places[c].lpfn = adev->gmc.mem_partitions[mem_id].range.lpfn + 1; +		} else { +			places[c].fpfn = 0; +			places[c].lpfn = 0; +		}  		places[c].mem_type = TTM_PL_VRAM;  		places[c].flags = 0;  		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) -			places[c].lpfn = visible_pfn; +			places[c].lpfn = min_not_zero(places[c].lpfn, visible_pfn);  		else if (adev->gmc.real_vram_size != adev->gmc.visible_vram_size)  			places[c].flags |= TTM_PL_FLAG_TOPDOWN; @@ -574,6 +585,13 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	bo->flags = bp->flags; +	if (adev->gmc.mem_partitions) +		/* For GPUs with spatial partitioning, bo->xcp_id=-1 means any partition */ +		bo->xcp_id = bp->xcp_id_plus1 - 1; +	else +		/* For GPUs without spatial partitioning */ +		bo->xcp_id = 0; +  	if (!amdgpu_bo_support_uswc(bo->flags))  		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC; @@ -610,7 +628,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	    bo->tbo.resource->mem_type == TTM_PL_VRAM) {  		struct dma_fence *fence; -		r = amdgpu_fill_buffer(bo, 0, bo->tbo.base.resv, &fence); +		r = amdgpu_fill_buffer(bo, 0, bo->tbo.base.resv, &fence, true);  		if (unlikely(r))  			goto fail_unreserve; @@ -694,11 +712,6 @@ int amdgpu_bo_create_vm(struct amdgpu_device *adev,  		return r;  	*vmbo_ptr = to_amdgpu_bo_vm(bo_ptr); -	INIT_LIST_HEAD(&(*vmbo_ptr)->shadow_list); -	/* Set destroy callback to amdgpu_bo_vm_destroy after vmbo->shadow_list -	 * is initialized. -	 */ -	bo_ptr->tbo.destroy = &amdgpu_bo_vm_destroy;  	return r;  } @@ -715,6 +728,8 @@ void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo)  	mutex_lock(&adev->shadow_list_lock);  	list_add_tail(&vmbo->shadow_list, &adev->shadow_list); +	vmbo->shadow->parent = amdgpu_bo_ref(&vmbo->bo); +	vmbo->shadow->tbo.destroy = &amdgpu_bo_vm_destroy;  	mutex_unlock(&adev->shadow_list_lock);  } @@ -935,7 +950,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,  		bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;  	amdgpu_bo_placement_from_domain(bo, domain);  	for (i = 0; i < bo->placement.num_placement; i++) { -		unsigned fpfn, lpfn; +		unsigned int fpfn, lpfn;  		fpfn = min_offset >> PAGE_SHIFT;  		lpfn = max_offset >> PAGE_SHIFT; @@ -1016,7 +1031,7 @@ void amdgpu_bo_unpin(struct amdgpu_bo *bo)  	}  } -static const char *amdgpu_vram_names[] = { +static const char * const amdgpu_vram_names[] = {  	"UNKNOWN",  	"GDDR1",  	"DDR2", @@ -1044,7 +1059,7 @@ static const char *amdgpu_vram_names[] = {  int amdgpu_bo_init(struct amdgpu_device *adev)  {  	/* On A+A platform, VRAM can be mapped as WB */ -	if (!adev->gmc.xgmi.connected_to_cpu) { +	if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {  		/* reserve PAT memory space to WC for VRAM */  		int r = arch_io_reserve_memtype_wc(adev->gmc.aper_base,  				adev->gmc.aper_size); @@ -1080,8 +1095,7 @@ void amdgpu_bo_fini(struct amdgpu_device *adev)  	amdgpu_ttm_fini(adev);  	if (drm_dev_enter(adev_to_drm(adev), &idx)) { - -		if (!adev->gmc.xgmi.connected_to_cpu) { +		if (!adev->gmc.xgmi.connected_to_cpu && !adev->gmc.is_app_apu) {  			arch_phys_wc_del(adev->gmc.vram_mtrr);  			arch_io_free_memtype_wc(adev->gmc.aper_base, adev->gmc.aper_size);  		} @@ -1148,8 +1162,8 @@ void amdgpu_bo_get_tiling_flags(struct amdgpu_bo *bo, u64 *tiling_flags)   * Returns:   * 0 for success or a negative error code on failure.   */ -int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata, -			    uint32_t metadata_size, uint64_t flags) +int amdgpu_bo_set_metadata(struct amdgpu_bo *bo, void *metadata, +			   u32 metadata_size, uint64_t flags)  {  	struct amdgpu_bo_user *ubo;  	void *buffer; @@ -1338,7 +1352,7 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)  	if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv)))  		return; -	r = amdgpu_fill_buffer(abo, AMDGPU_POISON, bo->base.resv, &fence); +	r = amdgpu_fill_buffer(abo, AMDGPU_POISON, bo->base.resv, &fence, true);  	if (!WARN_ON(r)) {  		amdgpu_bo_fence(abo, fence, false);  		dma_fence_put(fence); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h index 35b8106816a1..05496b97ef93 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h @@ -56,6 +56,8 @@ struct amdgpu_bo_param {  	bool				no_wait_gpu;  	struct dma_resv			*resv;  	void				(*destroy)(struct ttm_buffer_object *bo); +	/* xcp partition number plus 1, 0 means any partition */ +	int8_t				xcp_id_plus1;  };  /* bo virtual addresses in a vm */ @@ -108,6 +110,13 @@ struct amdgpu_bo {  	struct mmu_interval_notifier	notifier;  #endif  	struct kgd_mem                  *kfd_bo; + +	/* +	 * For GPUs with spatial partitioning, xcp partition number, -1 means +	 * any partition. For other ASICs without spatial partition, always 0 +	 * for memory accounting. +	 */ +	int8_t				xcp_id;  };  struct amdgpu_bo_user { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 9d7e6e0e73ed..dd865beb39a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -146,6 +146,9 @@ static int psp_init_sriov_microcode(struct psp_context *psp)  	case IP_VERSION(13, 0, 0):  		adev->virt.autoload_ucode_id = 0;  		break; +	case IP_VERSION(13, 0, 6): +		ret = psp_init_cap_microcode(psp, ucode_prefix); +		break;  	case IP_VERSION(13, 0, 10):  		adev->virt.autoload_ucode_id = AMDGPU_UCODE_ID_CP_MES1_DATA;  		ret = psp_init_cap_microcode(psp, ucode_prefix); @@ -329,6 +332,9 @@ static bool psp_get_runtime_db_entry(struct amdgpu_device *adev,  	bool ret = false;  	int i; +	if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 6)) +		return false; +  	db_header_pos = adev->gmc.mc_vram_size - PSP_RUNTIME_DB_OFFSET;  	db_dir_pos = db_header_pos + sizeof(struct psp_runtime_data_header); @@ -411,7 +417,7 @@ static int psp_sw_init(void *handle)  	if ((psp_get_runtime_db_entry(adev,  				PSP_RUNTIME_ENTRY_TYPE_PPTABLE_ERR_STATUS,  				&scpm_entry)) && -	    (SCPM_DISABLE != scpm_entry.scpm_status)) { +	    (scpm_entry.scpm_status != SCPM_DISABLE)) {  		adev->scpm_enabled = true;  		adev->scpm_status = scpm_entry.scpm_status;  	} else { @@ -458,10 +464,9 @@ static int psp_sw_init(void *handle)  	if (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 0) ||  	    adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 7)) { -		ret= psp_sysfs_init(adev); -		if (ret) { +		ret = psp_sysfs_init(adev); +		if (ret)  			return ret; -		}  	}  	ret = amdgpu_bo_create_kernel(adev, PSP_1_MEG, PSP_1_MEG, @@ -474,7 +479,8 @@ static int psp_sw_init(void *handle)  		return ret;  	ret = amdgpu_bo_create_kernel(adev, PSP_FENCE_BUFFER_SIZE, PAGE_SIZE, -				      AMDGPU_GEM_DOMAIN_VRAM, +				      AMDGPU_GEM_DOMAIN_VRAM | +				      AMDGPU_GEM_DOMAIN_GTT,  				      &psp->fence_buf_bo,  				      &psp->fence_buf_mc_addr,  				      &psp->fence_buf); @@ -482,7 +488,8 @@ static int psp_sw_init(void *handle)  		goto failed1;  	ret = amdgpu_bo_create_kernel(adev, PSP_CMD_BUFFER_SIZE, PAGE_SIZE, -				      AMDGPU_GEM_DOMAIN_VRAM, +				      AMDGPU_GEM_DOMAIN_VRAM | +				      AMDGPU_GEM_DOMAIN_GTT,  				      &psp->cmd_buf_bo, &psp->cmd_buf_mc_addr,  				      (void **)&psp->cmd_buf_mem);  	if (ret) @@ -520,6 +527,8 @@ static int psp_sw_fini(void *handle)  	kfree(cmd);  	cmd = NULL; +	psp_free_shared_bufs(psp); +  	if (psp->km_ring.ring_mem)  		amdgpu_bo_free_kernel(&adev->firmware.rbuf,  				      &psp->km_ring.ring_mem_mc_addr, @@ -643,7 +652,7 @@ psp_cmd_submit_buf(struct psp_context *psp,  	skip_unsupport = (psp->cmd_buf_mem->resp.status == TEE_ERROR_NOT_SUPPORTED ||  		psp->cmd_buf_mem->resp.status == PSP_ERR_UNKNOWN_COMMAND) && amdgpu_sriov_vf(psp->adev); -	memcpy((void*)&cmd->resp, (void*)&psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp)); +	memcpy(&cmd->resp, &psp->cmd_buf_mem->resp, sizeof(struct psp_gfx_resp));  	/* In some cases, psp response status is not 0 even there is no  	 * problem while the command is submitted. Some version of PSP FW @@ -699,8 +708,13 @@ static void psp_prep_tmr_cmd_buf(struct psp_context *psp,  				 uint64_t tmr_mc, struct amdgpu_bo *tmr_bo)  {  	struct amdgpu_device *adev = psp->adev; -	uint32_t size = amdgpu_bo_size(tmr_bo); -	uint64_t tmr_pa = amdgpu_gmc_vram_pa(adev, tmr_bo); +	uint32_t size = 0; +	uint64_t tmr_pa = 0; + +	if (tmr_bo) { +		size = amdgpu_bo_size(tmr_bo); +		tmr_pa = amdgpu_gmc_vram_pa(adev, tmr_bo); +	}  	if (amdgpu_sriov_vf(psp->adev))  		cmd->cmd_id = GFX_CMD_ID_SETUP_VMR; @@ -745,6 +759,16 @@ static int psp_load_toc(struct psp_context *psp,  	return ret;  } +static bool psp_boottime_tmr(struct psp_context *psp) +{ +	switch (psp->adev->ip_versions[MP0_HWIP][0]) { +	case IP_VERSION(13, 0, 6): +		return true; +	default: +		return false; +	} +} +  /* Set up Trusted Memory Region */  static int psp_tmr_init(struct psp_context *psp)  { @@ -816,8 +840,9 @@ static int psp_tmr_load(struct psp_context *psp)  	cmd = acquire_psp_cmd_buf(psp);  	psp_prep_tmr_cmd_buf(psp, cmd, psp->tmr_mc_addr, psp->tmr_bo); -	DRM_INFO("reserve 0x%lx from 0x%llx for PSP TMR\n", -		 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr); +	if (psp->tmr_bo) +		DRM_INFO("reserve 0x%lx from 0x%llx for PSP TMR\n", +			 amdgpu_bo_size(psp->tmr_bo), psp->tmr_mc_addr);  	ret = psp_cmd_submit_buf(psp, NULL, cmd,  				 psp->fence_buf_mc_addr); @@ -828,7 +853,7 @@ static int psp_tmr_load(struct psp_context *psp)  }  static void psp_prep_tmr_unload_cmd_buf(struct psp_context *psp, -				        struct psp_gfx_cmd_resp *cmd) +					struct psp_gfx_cmd_resp *cmd)  {  	if (amdgpu_sriov_vf(psp->adev))  		cmd->cmd_id = GFX_CMD_ID_DESTROY_VMR; @@ -969,6 +994,27 @@ static int psp_rl_load(struct amdgpu_device *adev)  	return ret;  } +int psp_spatial_partition(struct psp_context *psp, int mode) +{ +	struct psp_gfx_cmd_resp *cmd; +	int ret; + +	if (amdgpu_sriov_vf(psp->adev)) +		return 0; + +	cmd = acquire_psp_cmd_buf(psp); + +	cmd->cmd_id = GFX_CMD_ID_SRIOV_SPATIAL_PART; +	cmd->cmd.cmd_spatial_part.mode = mode; + +	dev_info(psp->adev->dev, "Requesting %d partitions through PSP", mode); +	ret = psp_cmd_submit_buf(psp, NULL, cmd, psp->fence_buf_mc_addr); + +	release_psp_cmd_buf(psp); + +	return ret; +} +  static int psp_asd_initialize(struct psp_context *psp)  {  	int ret; @@ -1065,7 +1111,7 @@ static void psp_prep_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,  				     struct ta_context *context)  {  	cmd->cmd_id				= context->ta_load_type; -	cmd->cmd.cmd_load_ta.app_phy_addr_lo 	= lower_32_bits(ta_bin_mc); +	cmd->cmd.cmd_load_ta.app_phy_addr_lo	= lower_32_bits(ta_bin_mc);  	cmd->cmd.cmd_load_ta.app_phy_addr_hi	= upper_32_bits(ta_bin_mc);  	cmd->cmd.cmd_load_ta.app_len		= context->bin_desc.size_bytes; @@ -1136,9 +1182,8 @@ int psp_ta_load(struct psp_context *psp, struct ta_context *context)  	context->resp_status = cmd->resp.status; -	if (!ret) { +	if (!ret)  		context->session_id = cmd->resp.session_id; -	}  	release_psp_cmd_buf(psp); @@ -1254,8 +1299,9 @@ int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id)  static bool psp_xgmi_peer_link_info_supported(struct psp_context *psp)  { -	return psp->adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2) && -		psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b; +	return (psp->adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 2) && +		psp->xgmi_context.context.bin_desc.fw_version >= 0x2000000b) || +		psp->adev->ip_versions[MP0_HWIP][0] >= IP_VERSION(13, 0, 6);  }  /* @@ -1363,6 +1409,9 @@ int psp_xgmi_get_topology_info(struct psp_context *psp,  	/* Invoke xgmi ta again to get the link information */  	if (psp_xgmi_peer_link_info_supported(psp)) {  		struct ta_xgmi_cmd_get_peer_link_info_output *link_info_output; +		bool requires_reflection = +			(psp->xgmi_context.supports_extended_data && get_extended_data) || +				psp->adev->ip_versions[MP0_HWIP][0] == IP_VERSION(13, 0, 6);  		xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_PEER_LINKS; @@ -1377,11 +1426,11 @@ int psp_xgmi_get_topology_info(struct psp_context *psp,  			topology->nodes[i].num_links = get_extended_data ?  					topology->nodes[i].num_links +  							link_info_output->nodes[i].num_links : -					link_info_output->nodes[i].num_links; +					((requires_reflection && topology->nodes[i].num_links) ? topology->nodes[i].num_links : +					 link_info_output->nodes[i].num_links);  			/* reflect the topology information for bi-directionality */ -			if (psp->xgmi_context.supports_extended_data && -					get_extended_data && topology->nodes[i].num_hops) +			if (requires_reflection && topology->nodes[i].num_hops)  				psp_xgmi_reflect_topology_info(psp, topology->nodes[i]);  		}  	} @@ -1465,8 +1514,7 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)  	if (amdgpu_ras_intr_triggered())  		return ret; -	if (ras_cmd->if_version > RAS_TA_HOST_IF_VER) -	{ +	if (ras_cmd->if_version > RAS_TA_HOST_IF_VER) {  		DRM_WARN("RAS: Unsupported Interface");  		return -EINVAL;  	} @@ -1476,8 +1524,7 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)  			dev_warn(psp->adev->dev, "ECC switch disabled\n");  			ras_cmd->ras_status = TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE; -		} -		else if (ras_cmd->ras_out_message.flags.reg_access_failure_flag) +		} else if (ras_cmd->ras_out_message.flags.reg_access_failure_flag)  			dev_warn(psp->adev->dev,  				 "RAS internal register access blocked\n"); @@ -1573,11 +1620,10 @@ int psp_ras_initialize(struct psp_context *psp)  				if (ret)  					dev_warn(adev->dev, "PSP set boot config failed\n");  				else -					dev_warn(adev->dev, "GECC will be disabled in next boot cycle " -						 "if set amdgpu_ras_enable and/or amdgpu_ras_mask to 0x0\n"); +					dev_warn(adev->dev, "GECC will be disabled in next boot cycle if set amdgpu_ras_enable and/or amdgpu_ras_mask to 0x0\n");  			}  		} else { -			if (1 == boot_cfg) { +			if (boot_cfg == 1) {  				dev_info(adev->dev, "GECC is enabled\n");  			} else {  				/* enable GECC in next boot cycle if it is disabled @@ -1609,6 +1655,8 @@ int psp_ras_initialize(struct psp_context *psp)  		ras_cmd->ras_in_message.init_flags.poison_mode_en = 1;  	if (!adev->gmc.xgmi.connected_to_cpu)  		ras_cmd->ras_in_message.init_flags.dgpu_mode = 1; +	ras_cmd->ras_in_message.init_flags.xcc_mask = +		adev->gfx.xcc_mask;  	ret = psp_ta_load(psp, &psp->ras_context.context); @@ -1626,14 +1674,37 @@ int psp_ras_initialize(struct psp_context *psp)  }  int psp_ras_trigger_error(struct psp_context *psp, -			  struct ta_ras_trigger_error_input *info) +			  struct ta_ras_trigger_error_input *info, uint32_t instance_mask)  {  	struct ta_ras_shared_memory *ras_cmd; +	struct amdgpu_device *adev = psp->adev;  	int ret; +	uint32_t dev_mask;  	if (!psp->ras_context.context.initialized)  		return -EINVAL; +	switch (info->block_id) { +	case TA_RAS_BLOCK__GFX: +		dev_mask = GET_MASK(GC, instance_mask); +		break; +	case TA_RAS_BLOCK__SDMA: +		dev_mask = GET_MASK(SDMA0, instance_mask); +		break; +	case TA_RAS_BLOCK__VCN: +	case TA_RAS_BLOCK__JPEG: +		dev_mask = GET_MASK(VCN, instance_mask); +		break; +	default: +		dev_mask = instance_mask; +		break; +	} + +	/* reuse sub_block_index for backward compatibility */ +	dev_mask <<= AMDGPU_RAS_INST_SHIFT; +	dev_mask &= AMDGPU_RAS_INST_MASK; +	info->sub_block_index |= dev_mask; +  	ras_cmd = (struct ta_ras_shared_memory *)psp->ras_context.context.mem_context.shared_buf;  	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory)); @@ -2077,10 +2148,12 @@ static int psp_hw_start(struct psp_context *psp)  	if (amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev))  		goto skip_pin_bo; -	ret = psp_tmr_init(psp); -	if (ret) { -		DRM_ERROR("PSP tmr init failed!\n"); -		return ret; +	if (!psp_boottime_tmr(psp)) { +		ret = psp_tmr_init(psp); +		if (ret) { +			DRM_ERROR("PSP tmr init failed!\n"); +			return ret; +		}  	}  skip_pin_bo: @@ -2363,7 +2436,7 @@ static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,  }  static int psp_execute_non_psp_fw_load(struct psp_context *psp, -			          struct amdgpu_firmware_info *ucode) +				  struct amdgpu_firmware_info *ucode)  {  	int ret = 0;  	struct psp_gfx_cmd_resp *cmd = acquire_psp_cmd_buf(psp); @@ -2402,9 +2475,8 @@ static int psp_load_smu_fw(struct psp_context *psp)  	     (adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 4) ||  	      adev->ip_versions[MP0_HWIP][0] == IP_VERSION(11, 0, 2)))) {  		ret = amdgpu_dpm_set_mp1_state(adev, PP_MP1_STATE_UNLOAD); -		if (ret) { +		if (ret)  			DRM_WARN("Failed to set MP1 state prepare for reload\n"); -		}  	}  	ret = psp_execute_non_psp_fw_load(psp, ucode); @@ -2655,8 +2727,6 @@ static int psp_hw_fini(void *handle)  	psp_ring_destroy(psp, PSP_RING_TYPE__KM); -	psp_free_shared_bufs(psp); -  	return 0;  } @@ -2716,9 +2786,8 @@ static int psp_suspend(void *handle)  	}  	ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); -	if (ret) { +	if (ret)  		DRM_ERROR("PSP ring stop failed\n"); -	}  out:  	return ret; @@ -2967,7 +3036,7 @@ static int parse_sos_bin_descriptor(struct psp_context *psp,  		psp->sos.fw_version        = le32_to_cpu(desc->fw_version);  		psp->sos.feature_version   = le32_to_cpu(desc->fw_version);  		psp->sos.size_bytes        = le32_to_cpu(desc->size_bytes); -		psp->sos.start_addr 	   = ucode_start_addr; +		psp->sos.start_addr	   = ucode_start_addr;  		break;  	case PSP_FW_TYPE_PSP_SYS_DRV:  		psp->sys.fw_version        = le32_to_cpu(desc->fw_version); @@ -3491,7 +3560,7 @@ void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size  	drm_dev_exit(idx);  } -static DEVICE_ATTR(usbc_pd_fw, S_IRUGO | S_IWUSR, +static DEVICE_ATTR(usbc_pd_fw, 0644,  		   psp_usbc_pd_fw_sysfs_read,  		   psp_usbc_pd_fw_sysfs_write); @@ -3548,6 +3617,9 @@ static ssize_t amdgpu_psp_vbflash_read(struct file *filp, struct kobject *kobj,  	void *fw_pri_cpu_addr;  	int ret; +	if (adev->psp.vbflash_image_size == 0) +		return -EINVAL; +  	dev_info(adev->dev, "VBIOS flash to PSP started");  	ret = amdgpu_bo_create_kernel(adev, adev->psp.vbflash_image_size, @@ -3599,13 +3671,13 @@ static ssize_t amdgpu_psp_vbflash_status(struct device *dev,  }  static const struct bin_attribute psp_vbflash_bin_attr = { -	.attr = {.name = "psp_vbflash", .mode = 0664}, +	.attr = {.name = "psp_vbflash", .mode = 0660},  	.size = 0,  	.write = amdgpu_psp_vbflash_write,  	.read = amdgpu_psp_vbflash_read,  }; -static DEVICE_ATTR(psp_vbflash_status, 0444, amdgpu_psp_vbflash_status, NULL); +static DEVICE_ATTR(psp_vbflash_status, 0440, amdgpu_psp_vbflash_status, NULL);  int amdgpu_psp_sysfs_init(struct amdgpu_device *adev)  { @@ -3618,6 +3690,7 @@ int amdgpu_psp_sysfs_init(struct amdgpu_device *adev)  	switch (adev->ip_versions[MP0_HWIP][0]) {  	case IP_VERSION(13, 0, 0):  	case IP_VERSION(13, 0, 7): +	case IP_VERSION(13, 0, 10):  		if (!psp->adev) {  			psp->adev = adev;  			psp_v13_0_set_psp_funcs(psp); @@ -3673,8 +3746,7 @@ static void psp_sysfs_fini(struct amdgpu_device *adev)  	device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);  } -const struct amdgpu_ip_block_version psp_v3_1_ip_block = -{ +const struct amdgpu_ip_block_version psp_v3_1_ip_block = {  	.type = AMD_IP_BLOCK_TYPE_PSP,  	.major = 3,  	.minor = 1, @@ -3682,8 +3754,7 @@ const struct amdgpu_ip_block_version psp_v3_1_ip_block =  	.funcs = &psp_ip_funcs,  }; -const struct amdgpu_ip_block_version psp_v10_0_ip_block = -{ +const struct amdgpu_ip_block_version psp_v10_0_ip_block = {  	.type = AMD_IP_BLOCK_TYPE_PSP,  	.major = 10,  	.minor = 0, @@ -3691,8 +3762,7 @@ const struct amdgpu_ip_block_version psp_v10_0_ip_block =  	.funcs = &psp_ip_funcs,  }; -const struct amdgpu_ip_block_version psp_v11_0_ip_block = -{ +const struct amdgpu_ip_block_version psp_v11_0_ip_block = {  	.type = AMD_IP_BLOCK_TYPE_PSP,  	.major = 11,  	.minor = 0, @@ -3708,8 +3778,7 @@ const struct amdgpu_ip_block_version psp_v11_0_8_ip_block = {  	.funcs = &psp_ip_funcs,  }; -const struct amdgpu_ip_block_version psp_v12_0_ip_block = -{ +const struct amdgpu_ip_block_version psp_v12_0_ip_block = {  	.type = AMD_IP_BLOCK_TYPE_PSP,  	.major = 12,  	.minor = 0, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h index cf4f60c66122..d84323923a3f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h @@ -486,7 +486,7 @@ int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id);  int psp_ras_enable_features(struct psp_context *psp,  		union ta_ras_cmd_input *info, bool enable);  int psp_ras_trigger_error(struct psp_context *psp, -			  struct ta_ras_trigger_error_input *info); +			  struct ta_ras_trigger_error_input *info, uint32_t instance_mask);  int psp_ras_terminate(struct psp_context *psp);  int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id); @@ -519,6 +519,8 @@ int psp_load_fw_list(struct psp_context *psp,  		     struct amdgpu_firmware_info **ucode_list, int ucode_count);  void psp_copy_fw(struct psp_context *psp, uint8_t *start_addr, uint32_t bin_size); +int psp_spatial_partition(struct psp_context *psp, int mode); +  int is_psp_fw_valid(struct psp_bin_desc bin);  int amdgpu_psp_sysfs_init(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index 3ab8a88789c8..a6c3265cdbc4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -256,6 +256,8 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,  	int block_id;  	uint32_t sub_block;  	u64 address, value; +	/* default value is 0 if the mask is not set by user */ +	u32 instance_mask = 0;  	if (*pos)  		return -EINVAL; @@ -306,7 +308,11 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,  		data->op = op;  		if (op == 2) { -			if (sscanf(str, "%*s %*s %*s 0x%x 0x%llx 0x%llx", +			if (sscanf(str, "%*s %*s %*s 0x%x 0x%llx 0x%llx 0x%x", +				   &sub_block, &address, &value, &instance_mask) != 4 && +			    sscanf(str, "%*s %*s %*s %u %llu %llu %u", +				   &sub_block, &address, &value, &instance_mask) != 4 && +				sscanf(str, "%*s %*s %*s 0x%x 0x%llx 0x%llx",  				   &sub_block, &address, &value) != 3 &&  			    sscanf(str, "%*s %*s %*s %u %llu %llu",  				   &sub_block, &address, &value) != 3) @@ -314,6 +320,7 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,  			data->head.sub_block_index = sub_block;  			data->inject.address = address;  			data->inject.value = value; +			data->inject.instance_mask = instance_mask;  		}  	} else {  		if (size < sizeof(*data)) @@ -326,6 +333,46 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,  	return 0;  } +static void amdgpu_ras_instance_mask_check(struct amdgpu_device *adev, +				struct ras_debug_if *data) +{ +	int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1; +	uint32_t mask, inst_mask = data->inject.instance_mask; + +	/* no need to set instance mask if there is only one instance */ +	if (num_xcc <= 1 && inst_mask) { +		data->inject.instance_mask = 0; +		dev_dbg(adev->dev, +			"RAS inject mask(0x%x) isn't supported and force it to 0.\n", +			inst_mask); + +		return; +	} + +	switch (data->head.block) { +	case AMDGPU_RAS_BLOCK__GFX: +		mask = GENMASK(num_xcc - 1, 0); +		break; +	case AMDGPU_RAS_BLOCK__SDMA: +		mask = GENMASK(adev->sdma.num_instances - 1, 0); +		break; +	case AMDGPU_RAS_BLOCK__VCN: +	case AMDGPU_RAS_BLOCK__JPEG: +		mask = GENMASK(adev->vcn.num_vcn_inst - 1, 0); +		break; +	default: +		mask = inst_mask; +		break; +	} + +	/* remove invalid bits in instance mask */ +	data->inject.instance_mask &= mask; +	if (inst_mask != data->inject.instance_mask) +		dev_dbg(adev->dev, +			"Adjust RAS inject mask 0x%x to 0x%x\n", +			inst_mask, data->inject.instance_mask); +} +  /**   * DOC: AMDGPU RAS debugfs control interface   * @@ -341,7 +388,7 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,   * sub_block_index: some IPs have subcomponets. say, GFX, sDMA.   * name: the name of IP.   * - * inject has two more members than head, they are address, value. + * inject has three more members than head, they are address, value and mask.   * As their names indicate, inject operation will write the   * value to the address.   * @@ -365,7 +412,7 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,   *   *	echo "disable <block>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl   *	echo "enable  <block> <error>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl - *	echo "inject  <block> <error> <sub-block> <address> <value> > /sys/kernel/debug/dri/<N>/ras/ras_ctrl + *	echo "inject  <block> <error> <sub-block> <address> <value> <mask>" > /sys/kernel/debug/dri/<N>/ras/ras_ctrl   *   * Where N, is the card which you want to affect.   * @@ -382,13 +429,14 @@ static int amdgpu_ras_debugfs_ctrl_parse_data(struct file *f,   *   * The sub-block is a the sub-block index, pass 0 if there is no sub-block.   * The address and value are hexadecimal numbers, leading 0x is optional. + * The mask means instance mask, is optional, default value is 0x1.   *   * For instance,   *   * .. code-block:: bash   *   *	echo inject umc ue 0x0 0x0 0x0 > /sys/kernel/debug/dri/0/ras/ras_ctrl - *	echo inject umc ce 0 0 0 > /sys/kernel/debug/dri/0/ras/ras_ctrl + *	echo inject umc ce 0 0 0 3 > /sys/kernel/debug/dri/0/ras/ras_ctrl   *	echo disable umc > /sys/kernel/debug/dri/0/ras/ras_ctrl   *   * How to check the result of the operation? @@ -460,6 +508,8 @@ static ssize_t amdgpu_ras_debugfs_ctrl_write(struct file *f,  			break;  		} +		amdgpu_ras_instance_mask_check(adev, &data); +  		/* data.inject.address is offset instead of absolute gpu address */  		ret = amdgpu_ras_error_inject(adev, &data.inject);  		break; @@ -1115,15 +1165,15 @@ int amdgpu_ras_error_inject(struct amdgpu_device *adev,  							  block_info.address);  	} -	if (info->head.block == AMDGPU_RAS_BLOCK__GFX) { -		if (block_obj->hw_ops->ras_error_inject) -			ret = block_obj->hw_ops->ras_error_inject(adev, info); +	if (block_obj->hw_ops->ras_error_inject) { +		if (info->head.block == AMDGPU_RAS_BLOCK__GFX) +			ret = block_obj->hw_ops->ras_error_inject(adev, info, info->instance_mask); +		else /* Special ras_error_inject is defined (e.g: xgmi) */ +			ret = block_obj->hw_ops->ras_error_inject(adev, &block_info, +						info->instance_mask);  	} else { -		/* If defined special ras_error_inject(e.g: xgmi), implement special ras_error_inject */ -		if (block_obj->hw_ops->ras_error_inject) -			ret = block_obj->hw_ops->ras_error_inject(adev, &block_info); -		else  /*If not defined .ras_error_inject, use default ras_error_inject*/ -			ret = psp_ras_trigger_error(&adev->psp, &block_info); +		/* default path */ +		ret = psp_ras_trigger_error(&adev->psp, &block_info, info->instance_mask);  	}  	if (ret) @@ -1597,8 +1647,7 @@ static int amdgpu_ras_fs_fini(struct amdgpu_device *adev)  void amdgpu_ras_interrupt_fatal_error_handler(struct amdgpu_device *adev)  {  	/* Fatal error events are handled on host side */ -	if (amdgpu_sriov_vf(adev) || -		!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__PCIE_BIF)) +	if (amdgpu_sriov_vf(adev))  		return;  	if (adev->nbio.ras && @@ -2008,9 +2057,15 @@ static void amdgpu_ras_do_recovery(struct work_struct *work)  		/* Perform full reset in fatal error mode */  		if (!amdgpu_ras_is_poison_mode_supported(ras->adev))  			set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags); -		else +		else {  			clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags); +			if (ras->gpu_reset_flags & AMDGPU_RAS_GPU_RESET_MODE2_RESET) { +				ras->gpu_reset_flags &= ~AMDGPU_RAS_GPU_RESET_MODE2_RESET; +				reset_context.method = AMD_RESET_METHOD_MODE2; +			} +		} +  		amdgpu_device_gpu_recover(ras->adev, NULL, &reset_context);  	}  	atomic_set(&ras->in_recovery, 0); @@ -2259,7 +2314,7 @@ int amdgpu_ras_recovery_init(struct amdgpu_device *adev)  	atomic_set(&con->in_recovery, 0);  	con->eeprom_control.bad_channel_bitmap = 0; -	max_eeprom_records_count = amdgpu_ras_eeprom_max_record_count(); +	max_eeprom_records_count = amdgpu_ras_eeprom_max_record_count(&con->eeprom_control);  	amdgpu_ras_validate_threshold(adev, max_eeprom_records_count);  	/* Todo: During test the SMU might fail to read the eeprom through I2C @@ -2625,7 +2680,8 @@ release_con:  int amdgpu_persistent_edc_harvesting_supported(struct amdgpu_device *adev)  { -	if (adev->gmc.xgmi.connected_to_cpu) +	if (adev->gmc.xgmi.connected_to_cpu || +	    adev->gmc.is_app_apu)  		return 1;  	return 0;  } @@ -3104,3 +3160,143 @@ int amdgpu_ras_register_ras_block(struct amdgpu_device *adev,  	return 0;  } + +void amdgpu_ras_get_error_type_name(uint32_t err_type, char *err_type_name) +{ +	if (!err_type_name) +		return; + +	switch (err_type) { +	case AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE: +		sprintf(err_type_name, "correctable"); +		break; +	case AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE: +		sprintf(err_type_name, "uncorrectable"); +		break; +	default: +		sprintf(err_type_name, "unknown"); +		break; +	} +} + +bool amdgpu_ras_inst_get_memory_id_field(struct amdgpu_device *adev, +					 const struct amdgpu_ras_err_status_reg_entry *reg_entry, +					 uint32_t instance, +					 uint32_t *memory_id) +{ +	uint32_t err_status_lo_data, err_status_lo_offset; + +	if (!reg_entry) +		return false; + +	err_status_lo_offset = +		AMDGPU_RAS_REG_ENTRY_OFFSET(reg_entry->hwip, instance, +					    reg_entry->seg_lo, reg_entry->reg_lo); +	err_status_lo_data = RREG32(err_status_lo_offset); + +	if ((reg_entry->flags & AMDGPU_RAS_ERR_STATUS_VALID) && +	    !REG_GET_FIELD(err_status_lo_data, ERR_STATUS_LO, ERR_STATUS_VALID_FLAG)) +		return false; + +	*memory_id = REG_GET_FIELD(err_status_lo_data, ERR_STATUS_LO, MEMORY_ID); + +	return true; +} + +bool amdgpu_ras_inst_get_err_cnt_field(struct amdgpu_device *adev, +				       const struct amdgpu_ras_err_status_reg_entry *reg_entry, +				       uint32_t instance, +				       unsigned long *err_cnt) +{ +	uint32_t err_status_hi_data, err_status_hi_offset; + +	if (!reg_entry) +		return false; + +	err_status_hi_offset = +		AMDGPU_RAS_REG_ENTRY_OFFSET(reg_entry->hwip, instance, +					    reg_entry->seg_hi, reg_entry->reg_hi); +	err_status_hi_data = RREG32(err_status_hi_offset); + +	if ((reg_entry->flags & AMDGPU_RAS_ERR_INFO_VALID) && +	    !REG_GET_FIELD(err_status_hi_data, ERR_STATUS_HI, ERR_INFO_VALID_FLAG)) +		/* keep the check here in case we need to refer to the result later */ +		dev_dbg(adev->dev, "Invalid err_info field\n"); + +	/* read err count */ +	*err_cnt = REG_GET_FIELD(err_status_hi_data, ERR_STATUS, ERR_CNT); + +	return true; +} + +void amdgpu_ras_inst_query_ras_error_count(struct amdgpu_device *adev, +					   const struct amdgpu_ras_err_status_reg_entry *reg_list, +					   uint32_t reg_list_size, +					   const struct amdgpu_ras_memory_id_entry *mem_list, +					   uint32_t mem_list_size, +					   uint32_t instance, +					   uint32_t err_type, +					   unsigned long *err_count) +{ +	uint32_t memory_id; +	unsigned long err_cnt; +	char err_type_name[16]; +	uint32_t i, j; + +	for (i = 0; i < reg_list_size; i++) { +		/* query memory_id from err_status_lo */ +		if (!amdgpu_ras_inst_get_memory_id_field(adev, ®_list[i], +							 instance, &memory_id)) +			continue; + +		/* query err_cnt from err_status_hi */ +		if (!amdgpu_ras_inst_get_err_cnt_field(adev, ®_list[i], +						       instance, &err_cnt) || +		    !err_cnt) +			continue; + +		*err_count += err_cnt; + +		/* log the errors */ +		amdgpu_ras_get_error_type_name(err_type, err_type_name); +		if (!mem_list) { +			/* memory_list is not supported */ +			dev_info(adev->dev, +				 "%ld %s hardware errors detected in %s, instance: %d, memory_id: %d\n", +				 err_cnt, err_type_name, +				 reg_list[i].block_name, +				 instance, memory_id); +		} else { +			for (j = 0; j < mem_list_size; j++) { +				if (memory_id == mem_list[j].memory_id) { +					dev_info(adev->dev, +						 "%ld %s hardware errors detected in %s, instance: %d, memory block: %s\n", +						 err_cnt, err_type_name, +						 reg_list[i].block_name, +						 instance, mem_list[j].name); +					break; +				} +			} +		} +	} +} + +void amdgpu_ras_inst_reset_ras_error_count(struct amdgpu_device *adev, +					   const struct amdgpu_ras_err_status_reg_entry *reg_list, +					   uint32_t reg_list_size, +					   uint32_t instance) +{ +	uint32_t err_status_lo_offset, err_status_hi_offset; +	uint32_t i; + +	for (i = 0; i < reg_list_size; i++) { +		err_status_lo_offset = +			AMDGPU_RAS_REG_ENTRY_OFFSET(reg_list[i].hwip, instance, +						    reg_list[i].seg_lo, reg_list[i].reg_lo); +		err_status_hi_offset = +			AMDGPU_RAS_REG_ENTRY_OFFSET(reg_list[i].hwip, instance, +						    reg_list[i].seg_hi, reg_list[i].reg_hi); +		WREG32(err_status_lo_offset, 0); +		WREG32(err_status_hi_offset, 0); +	} +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h index 17b3d1992e80..46bf1889a9d7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h @@ -32,6 +32,11 @@  struct amdgpu_iv_entry;  #define AMDGPU_RAS_FLAG_INIT_BY_VBIOS		(0x1 << 0) +/* position of instance value in sub_block_index of + * ta_ras_trigger_error_input, the sub block uses lower 12 bits + */ +#define AMDGPU_RAS_INST_MASK 0xfffff000 +#define AMDGPU_RAS_INST_SHIFT 0xc  enum amdgpu_ras_block {  	AMDGPU_RAS_BLOCK__UMC = 0, @@ -314,6 +319,45 @@ enum amdgpu_ras_ret {  	AMDGPU_RAS_PT,  }; +/* ras error status reisger fields */ +#define ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT	0x0 +#define ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK	0x00000001L +#define ERR_STATUS_LO__MEMORY_ID__SHIFT			0x18 +#define ERR_STATUS_LO__MEMORY_ID_MASK			0xFF000000L +#define ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT	0x2 +#define ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK		0x00000004L +#define ERR_STATUS__ERR_CNT__SHIFT			0x17 +#define ERR_STATUS__ERR_CNT_MASK			0x03800000L + +#define AMDGPU_RAS_REG_ENTRY(ip, inst, reg_lo, reg_hi) \ +	ip##_HWIP, inst, reg_lo##_BASE_IDX, reg_lo, reg_hi##_BASE_IDX, reg_hi + +#define AMDGPU_RAS_REG_ENTRY_OFFSET(hwip, ip_inst, segment, reg) \ +	(adev->reg_offset[hwip][ip_inst][segment] + (reg)) + +#define AMDGPU_RAS_ERR_INFO_VALID	(1 << 0) +#define AMDGPU_RAS_ERR_STATUS_VALID	(1 << 1) +#define AMDGPU_RAS_ERR_ADDRESS_VALID	(1 << 2) + +#define AMDGPU_RAS_GPU_RESET_MODE2_RESET  (0x1 << 0) + +struct amdgpu_ras_err_status_reg_entry { +	uint32_t hwip; +	uint32_t ip_inst; +	uint32_t seg_lo; +	uint32_t reg_lo; +	uint32_t seg_hi; +	uint32_t reg_hi; +	uint32_t reg_inst; +	uint32_t flags; +	const char *block_name; +}; + +struct amdgpu_ras_memory_id_entry { +	uint32_t memory_id; +	const char *name; +}; +  struct ras_common_if {  	enum amdgpu_ras_block block;  	enum amdgpu_ras_error_type type; @@ -385,6 +429,9 @@ struct amdgpu_ras {  	/* Indicates smu whether need update bad channel info */  	bool update_channel_flag; + +	/* Record special requirements of gpu reset caller */ +	uint32_t  gpu_reset_flags;  };  struct ras_fs_data { @@ -471,6 +518,7 @@ struct ras_inject_if {  	struct ras_common_if head;  	uint64_t address;  	uint64_t value; +	uint32_t instance_mask;  };  struct ras_cure_if { @@ -508,7 +556,8 @@ struct amdgpu_ras_block_object {  };  struct amdgpu_ras_block_hw_ops { -	int  (*ras_error_inject)(struct amdgpu_device *adev, void *inject_if); +	int  (*ras_error_inject)(struct amdgpu_device *adev, +			void *inject_if, uint32_t instance_mask);  	void (*query_ras_error_count)(struct amdgpu_device *adev, void *ras_error_status);  	void (*query_ras_error_status)(struct amdgpu_device *adev);  	void (*query_ras_error_address)(struct amdgpu_device *adev, void *ras_error_status); @@ -696,4 +745,25 @@ int amdgpu_ras_set_context(struct amdgpu_device *adev, struct amdgpu_ras *ras_co  int amdgpu_ras_register_ras_block(struct amdgpu_device *adev,  				struct amdgpu_ras_block_object *ras_block_obj);  void amdgpu_ras_interrupt_fatal_error_handler(struct amdgpu_device *adev); +void amdgpu_ras_get_error_type_name(uint32_t err_type, char *err_type_name); +bool amdgpu_ras_inst_get_memory_id_field(struct amdgpu_device *adev, +					 const struct amdgpu_ras_err_status_reg_entry *reg_entry, +					 uint32_t instance, +					 uint32_t *memory_id); +bool amdgpu_ras_inst_get_err_cnt_field(struct amdgpu_device *adev, +				       const struct amdgpu_ras_err_status_reg_entry *reg_entry, +				       uint32_t instance, +				       unsigned long *err_cnt); +void amdgpu_ras_inst_query_ras_error_count(struct amdgpu_device *adev, +					   const struct amdgpu_ras_err_status_reg_entry *reg_list, +					   uint32_t reg_list_size, +					   const struct amdgpu_ras_memory_id_entry *mem_list, +					   uint32_t mem_list_size, +					   uint32_t instance, +					   uint32_t err_type, +					   unsigned long *err_count); +void amdgpu_ras_inst_reset_ras_error_count(struct amdgpu_device *adev, +					   const struct amdgpu_ras_err_status_reg_entry *reg_list, +					   uint32_t reg_list_size, +					   uint32_t instance);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c index c2c2a7718613..c2e8f6491ac6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.c @@ -68,11 +68,24 @@  /* Table hdr is 'AMDR' */  #define RAS_TABLE_HDR_VAL       0x414d4452 -#define RAS_TABLE_VER           0x00010000  /* Bad GPU tag ‘BADG’ */  #define RAS_TABLE_HDR_BAD       0x42414447 +/** + * EEPROM Table structure v1 + * --------------------------------- + * |                               | + * |     EEPROM TABLE HEADER       | + * |      ( size 20 Bytes )        | + * |                               | + * --------------------------------- + * |                               | + * |    BAD PAGE RECORD AREA       | + * |                               | + * --------------------------------- + */ +  /* Assume 2-Mbit size EEPROM and take up the whole space. */  #define RAS_TBL_SIZE_BYTES      (256 * 1024)  #define RAS_TABLE_START         0 @@ -81,6 +94,35 @@  #define RAS_MAX_RECORD_COUNT    ((RAS_TBL_SIZE_BYTES - RAS_TABLE_HEADER_SIZE) \  				 / RAS_TABLE_RECORD_SIZE) +/** + * EEPROM Table structrue v2.1 + * --------------------------------- + * |                               | + * |     EEPROM TABLE HEADER       | + * |      ( size 20 Bytes )        | + * |                               | + * --------------------------------- + * |                               | + * |     EEPROM TABLE RAS INFO     | + * | (available info size 4 Bytes) | + * |  ( reserved size 252 Bytes )  | + * |                               | + * --------------------------------- + * |                               | + * |     BAD PAGE RECORD AREA      | + * |                               | + * --------------------------------- + */ + +/* EEPROM Table V2_1 */ +#define RAS_TABLE_V2_1_INFO_SIZE       256 +#define RAS_TABLE_V2_1_INFO_START      RAS_TABLE_HEADER_SIZE +#define RAS_RECORD_START_V2_1          (RAS_HDR_START + RAS_TABLE_HEADER_SIZE + \ +					RAS_TABLE_V2_1_INFO_SIZE) +#define RAS_MAX_RECORD_COUNT_V2_1      ((RAS_TBL_SIZE_BYTES - RAS_TABLE_HEADER_SIZE - \ +					RAS_TABLE_V2_1_INFO_SIZE) \ +					/ RAS_TABLE_RECORD_SIZE) +  /* Given a zero-based index of an EEPROM RAS record, yields the EEPROM   * offset off of RAS_TABLE_START.  That is, this is something you can   * add to control->i2c_address, and then tell I2C layer to read @@ -103,6 +145,10 @@  #define RAS_NUM_RECS(_tbl_hdr)  (((_tbl_hdr)->tbl_size - \  				  RAS_TABLE_HEADER_SIZE) / RAS_TABLE_RECORD_SIZE) +#define RAS_NUM_RECS_V2_1(_tbl_hdr)  (((_tbl_hdr)->tbl_size - \ +				       RAS_TABLE_HEADER_SIZE - \ +				       RAS_TABLE_V2_1_INFO_SIZE) / RAS_TABLE_RECORD_SIZE) +  #define to_amdgpu_device(x) (container_of(x, struct amdgpu_ras, eeprom_control))->adev  static bool __is_ras_eeprom_supported(struct amdgpu_device *adev) @@ -230,6 +276,69 @@ static int __write_table_header(struct amdgpu_ras_eeprom_control *control)  	return res;  } +static void +__encode_table_ras_info_to_buf(struct amdgpu_ras_eeprom_table_ras_info *rai, +			       unsigned char *buf) +{ +	u32 *pp = (uint32_t *)buf; +	u32 tmp; + +	tmp = ((uint32_t)(rai->rma_status) & 0xFF) | +	      (((uint32_t)(rai->health_percent) << 8) & 0xFF00) | +	      (((uint32_t)(rai->ecc_page_threshold) << 16) & 0xFFFF0000); +	pp[0] = cpu_to_le32(tmp); +} + +static void +__decode_table_ras_info_from_buf(struct amdgpu_ras_eeprom_table_ras_info *rai, +				 unsigned char *buf) +{ +	u32 *pp = (uint32_t *)buf; +	u32 tmp; + +	tmp = le32_to_cpu(pp[0]); +	rai->rma_status = tmp & 0xFF; +	rai->health_percent = (tmp >> 8) & 0xFF; +	rai->ecc_page_threshold = (tmp >> 16) & 0xFFFF; +} + +static int __write_table_ras_info(struct amdgpu_ras_eeprom_control *control) +{ +	struct amdgpu_device *adev = to_amdgpu_device(control); +	u8 *buf; +	int res; + +	buf = kzalloc(RAS_TABLE_V2_1_INFO_SIZE, GFP_KERNEL); +	if (!buf) { +		DRM_ERROR("Failed to alloc buf to write table ras info\n"); +		return -ENOMEM; +	} + +	__encode_table_ras_info_to_buf(&control->tbl_rai, buf); + +	/* i2c may be unstable in gpu reset */ +	down_read(&adev->reset_domain->sem); +	res = amdgpu_eeprom_write(adev->pm.ras_eeprom_i2c_bus, +				  control->i2c_address + +				  control->ras_info_offset, +				  buf, RAS_TABLE_V2_1_INFO_SIZE); +	up_read(&adev->reset_domain->sem); + +	if (res < 0) { +		DRM_ERROR("Failed to write EEPROM table ras info:%d", res); +	} else if (res < RAS_TABLE_V2_1_INFO_SIZE) { +		DRM_ERROR("Short write:%d out of %d\n", +			  res, RAS_TABLE_V2_1_INFO_SIZE); +		res = -EIO; +	} else { +		res = 0; +	} + +	kfree(buf); + +	return res; +} +  static u8 __calc_hdr_byte_sum(const struct amdgpu_ras_eeprom_control *control)  {  	int ii; @@ -246,6 +355,21 @@ static u8 __calc_hdr_byte_sum(const struct amdgpu_ras_eeprom_control *control)  	return csum;  } +static u8 __calc_ras_info_byte_sum(const struct amdgpu_ras_eeprom_control *control) +{ +	int ii; +	u8  *pp, csum; +	size_t sz; + +	sz = sizeof(control->tbl_rai); +	pp = (u8 *) &control->tbl_rai; +	csum = 0; +	for (ii = 0; ii < sz; ii++, pp++) +		csum += *pp; + +	return csum; +} +  static int amdgpu_ras_eeprom_correct_header_tag(  	struct amdgpu_ras_eeprom_control *control,  	uint32_t header) @@ -282,6 +406,7 @@ int amdgpu_ras_eeprom_reset_table(struct amdgpu_ras_eeprom_control *control)  {  	struct amdgpu_device *adev = to_amdgpu_device(control);  	struct amdgpu_ras_eeprom_table_header *hdr = &control->tbl_hdr; +	struct amdgpu_ras_eeprom_table_ras_info *rai = &control->tbl_rai;  	struct amdgpu_ras *con = amdgpu_ras_get_context(adev);  	u8 csum;  	int res; @@ -289,14 +414,37 @@ int amdgpu_ras_eeprom_reset_table(struct amdgpu_ras_eeprom_control *control)  	mutex_lock(&control->ras_tbl_mutex);  	hdr->header = RAS_TABLE_HDR_VAL; -	hdr->version = RAS_TABLE_VER; -	hdr->first_rec_offset = RAS_RECORD_START; -	hdr->tbl_size = RAS_TABLE_HEADER_SIZE; +	if (adev->umc.ras && +	    adev->umc.ras->set_eeprom_table_version) +		adev->umc.ras->set_eeprom_table_version(hdr); +	else +		hdr->version = RAS_TABLE_VER_V1; + +	if (hdr->version == RAS_TABLE_VER_V2_1) { +		hdr->first_rec_offset = RAS_RECORD_START_V2_1; +		hdr->tbl_size = RAS_TABLE_HEADER_SIZE + +				RAS_TABLE_V2_1_INFO_SIZE; +		rai->rma_status = GPU_HEALTH_USABLE; +		/** +		 * GPU health represented as a percentage. +		 * 0 means worst health, 100 means fully health. +		 */ +		rai->health_percent = 100; +		/* ecc_page_threshold = 0 means disable bad page retirement */ +		rai->ecc_page_threshold = con->bad_page_cnt_threshold; +	} else { +		hdr->first_rec_offset = RAS_RECORD_START; +		hdr->tbl_size = RAS_TABLE_HEADER_SIZE; +	}  	csum = __calc_hdr_byte_sum(control); +	if (hdr->version == RAS_TABLE_VER_V2_1) +		csum += __calc_ras_info_byte_sum(control);  	csum = -csum;  	hdr->checksum = csum;  	res = __write_table_header(control); +	if (!res && hdr->version > RAS_TABLE_VER_V1) +		res = __write_table_ras_info(control);  	control->ras_num_recs = 0;  	control->ras_fri = 0; @@ -573,11 +721,19 @@ amdgpu_ras_eeprom_update_header(struct amdgpu_ras_eeprom_control *control)  			"Saved bad pages %d reaches threshold value %d\n",  			control->ras_num_recs, ras->bad_page_cnt_threshold);  		control->tbl_hdr.header = RAS_TABLE_HDR_BAD; +		if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1) { +			control->tbl_rai.rma_status = GPU_RETIRED__ECC_REACH_THRESHOLD; +			control->tbl_rai.health_percent = 0; +		}  	} -	control->tbl_hdr.version = RAS_TABLE_VER; -	control->tbl_hdr.first_rec_offset = RAS_INDEX_TO_OFFSET(control, control->ras_fri); -	control->tbl_hdr.tbl_size = RAS_TABLE_HEADER_SIZE + control->ras_num_recs * RAS_TABLE_RECORD_SIZE; +	if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1) +		control->tbl_hdr.tbl_size = RAS_TABLE_HEADER_SIZE + +					    RAS_TABLE_V2_1_INFO_SIZE + +					    control->ras_num_recs * RAS_TABLE_RECORD_SIZE; +	else +		control->tbl_hdr.tbl_size = RAS_TABLE_HEADER_SIZE + +					    control->ras_num_recs * RAS_TABLE_RECORD_SIZE;  	control->tbl_hdr.checksum = 0;  	buf_size = control->ras_num_recs * RAS_TABLE_RECORD_SIZE; @@ -606,6 +762,17 @@ amdgpu_ras_eeprom_update_header(struct amdgpu_ras_eeprom_control *control)  		goto Out;  	} +	/** +	 * bad page records have been stored in eeprom, +	 * now calculate gpu health percent +	 */ +	if (amdgpu_bad_page_threshold != 0 && +	    control->tbl_hdr.version == RAS_TABLE_VER_V2_1 && +	    control->ras_num_recs < ras->bad_page_cnt_threshold) +		control->tbl_rai.health_percent = ((ras->bad_page_cnt_threshold - +						   control->ras_num_recs) * 100) / +						   ras->bad_page_cnt_threshold; +  	/* Recalc the checksum.  	 */  	csum = 0; @@ -613,10 +780,14 @@ amdgpu_ras_eeprom_update_header(struct amdgpu_ras_eeprom_control *control)  		csum += *pp;  	csum += __calc_hdr_byte_sum(control); +	if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1) +		csum += __calc_ras_info_byte_sum(control);  	/* avoid sign extension when assigning to "checksum" */  	csum = -csum;  	control->tbl_hdr.checksum = csum;  	res = __write_table_header(control); +	if (!res && control->tbl_hdr.version > RAS_TABLE_VER_V1) +		res = __write_table_ras_info(control);  Out:  	kfree(buf);  	return res; @@ -807,9 +978,12 @@ Out:  	return res;  } -uint32_t amdgpu_ras_eeprom_max_record_count(void) +uint32_t amdgpu_ras_eeprom_max_record_count(struct amdgpu_ras_eeprom_control *control)  { -	return RAS_MAX_RECORD_COUNT; +	if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1) +		return RAS_MAX_RECORD_COUNT_V2_1; +	else +		return RAS_MAX_RECORD_COUNT;  }  static ssize_t @@ -1051,8 +1225,14 @@ static int __verify_ras_table_checksum(struct amdgpu_ras_eeprom_control *control  	int buf_size, res;  	u8  csum, *buf, *pp; -	buf_size = RAS_TABLE_HEADER_SIZE + -		control->ras_num_recs * RAS_TABLE_RECORD_SIZE; +	if (control->tbl_hdr.version == RAS_TABLE_VER_V2_1) +		buf_size = RAS_TABLE_HEADER_SIZE + +			   RAS_TABLE_V2_1_INFO_SIZE + +			   control->ras_num_recs * RAS_TABLE_RECORD_SIZE; +	else +		buf_size = RAS_TABLE_HEADER_SIZE + +			   control->ras_num_recs * RAS_TABLE_RECORD_SIZE; +  	buf = kzalloc(buf_size, GFP_KERNEL);  	if (!buf) {  		DRM_ERROR("Out of memory checking RAS table checksum.\n"); @@ -1080,6 +1260,39 @@ Out:  	return res < 0 ? res : csum;  } +static int __read_table_ras_info(struct amdgpu_ras_eeprom_control *control) +{ +	struct amdgpu_ras_eeprom_table_ras_info *rai = &control->tbl_rai; +	struct amdgpu_device *adev = to_amdgpu_device(control); +	unsigned char *buf; +	int res; + +	buf = kzalloc(RAS_TABLE_V2_1_INFO_SIZE, GFP_KERNEL); +	if (!buf) { +		DRM_ERROR("Failed to alloc buf to read EEPROM table ras info\n"); +		return -ENOMEM; +	} + +	/** +	 * EEPROM table V2_1 supports ras info, +	 * read EEPROM table ras info +	 */ +	res = amdgpu_eeprom_read(adev->pm.ras_eeprom_i2c_bus, +				 control->i2c_address + control->ras_info_offset, +				 buf, RAS_TABLE_V2_1_INFO_SIZE); +	if (res < RAS_TABLE_V2_1_INFO_SIZE) { +		DRM_ERROR("Failed to read EEPROM table ras info, res:%d", res); +		res = res >= 0 ? -EIO : res; +		goto Out; +	} + +	__decode_table_ras_info_from_buf(rai, buf); + +Out: +	kfree(buf); +	return res == RAS_TABLE_V2_1_INFO_SIZE ? 0 : res; +} +  int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control,  			   bool *exceed_err_limit)  { @@ -1102,8 +1315,7 @@ int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control,  		return -EINVAL;  	control->ras_header_offset = RAS_HDR_START; -	control->ras_record_offset = RAS_RECORD_START; -	control->ras_max_record_count  = RAS_MAX_RECORD_COUNT; +	control->ras_info_offset = RAS_TABLE_V2_1_INFO_START;  	mutex_init(&control->ras_tbl_mutex);  	/* Read the table header from EEPROM address */ @@ -1117,12 +1329,27 @@ int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control,  	__decode_table_header_from_buf(hdr, buf); -	control->ras_num_recs = RAS_NUM_RECS(hdr); +	if (hdr->version == RAS_TABLE_VER_V2_1) { +		control->ras_num_recs = RAS_NUM_RECS_V2_1(hdr); +		control->ras_record_offset = RAS_RECORD_START_V2_1; +		control->ras_max_record_count = RAS_MAX_RECORD_COUNT_V2_1; +	} else { +		control->ras_num_recs = RAS_NUM_RECS(hdr); +		control->ras_record_offset = RAS_RECORD_START; +		control->ras_max_record_count = RAS_MAX_RECORD_COUNT; +	}  	control->ras_fri = RAS_OFFSET_TO_INDEX(control, hdr->first_rec_offset);  	if (hdr->header == RAS_TABLE_HDR_VAL) {  		DRM_DEBUG_DRIVER("Found existing EEPROM table with %d records",  				 control->ras_num_recs); + +		if (hdr->version == RAS_TABLE_VER_V2_1) { +			res = __read_table_ras_info(control); +			if (res) +				return res; +		} +  		res = __verify_ras_table_checksum(control);  		if (res)  			DRM_ERROR("RAS table incorrect checksum or error:%d\n", @@ -1136,6 +1363,12 @@ int amdgpu_ras_eeprom_init(struct amdgpu_ras_eeprom_control *control,  					ras->bad_page_cnt_threshold);  	} else if (hdr->header == RAS_TABLE_HDR_BAD &&  		   amdgpu_bad_page_threshold != 0) { +		if (hdr->version == RAS_TABLE_VER_V2_1) { +			res = __read_table_ras_info(control); +			if (res) +				return res; +		} +  		res = __verify_ras_table_checksum(control);  		if (res)  			DRM_ERROR("RAS Table incorrect checksum or error:%d\n", diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h index 54d9bfe0881d..6dfd667f3013 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.h @@ -26,8 +26,16 @@  #include <linux/i2c.h> +#define RAS_TABLE_VER_V1           0x00010000 +#define RAS_TABLE_VER_V2_1         0x00021000 +  struct amdgpu_device; +enum amdgpu_ras_gpu_health_status { +	GPU_HEALTH_USABLE = 0, +	GPU_RETIRED__ECC_REACH_THRESHOLD = 2, +}; +  enum amdgpu_ras_eeprom_err_type {  	AMDGPU_RAS_EEPROM_ERR_NA,  	AMDGPU_RAS_EEPROM_ERR_RECOVERABLE, @@ -43,9 +51,18 @@ struct amdgpu_ras_eeprom_table_header {  	uint32_t checksum;  } __packed; +struct amdgpu_ras_eeprom_table_ras_info { +	u8  rma_status; +	u8  health_percent; +	u16 ecc_page_threshold; +	u32 padding[64 - 1]; +} __packed; +  struct amdgpu_ras_eeprom_control {  	struct amdgpu_ras_eeprom_table_header tbl_hdr; +	struct amdgpu_ras_eeprom_table_ras_info tbl_rai; +  	/* Base I2C EEPPROM 19-bit memory address,  	 * where the table is located. For more information,  	 * see top of amdgpu_eeprom.c. @@ -58,6 +75,7 @@ struct amdgpu_ras_eeprom_control {  	 * right after the header.  	 */  	u32 ras_header_offset; +	u32 ras_info_offset;  	u32 ras_record_offset;  	/* Number of records in the table. @@ -124,7 +142,7 @@ int amdgpu_ras_eeprom_read(struct amdgpu_ras_eeprom_control *control,  int amdgpu_ras_eeprom_append(struct amdgpu_ras_eeprom_control *control,  			     struct eeprom_table_record *records, const u32 num); -uint32_t amdgpu_ras_eeprom_max_record_count(void); +uint32_t amdgpu_ras_eeprom_max_record_count(struct amdgpu_ras_eeprom_control *control);  void amdgpu_ras_debugfs_set_ret_size(struct amdgpu_ras_eeprom_control *control); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c index 6437ead87e5f..eec41ad30406 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c @@ -40,6 +40,7 @@ int amdgpu_reset_init(struct amdgpu_device *adev)  	switch (adev->ip_versions[MP1_HWIP][0]) {  	case IP_VERSION(13, 0, 2): +	case IP_VERSION(13, 0, 6):  		ret = aldebaran_reset_init(adev);  		break;  	case IP_VERSION(11, 0, 7): @@ -61,6 +62,7 @@ int amdgpu_reset_fini(struct amdgpu_device *adev)  	switch (adev->ip_versions[MP1_HWIP][0]) {  	case IP_VERSION(13, 0, 2): +	case IP_VERSION(13, 0, 6):  		ret = aldebaran_reset_fini(adev);  		break;  	case IP_VERSION(11, 0, 7): diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index dc474b809604..da26c555af24 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c @@ -50,6 +50,26 @@   */  /** + * amdgpu_ring_max_ibs - Return max IBs that fit in a single submission. + * + * @type: ring type for which to return the limit. + */ +unsigned int amdgpu_ring_max_ibs(enum amdgpu_ring_type type) +{ +	switch (type) { +	case AMDGPU_RING_TYPE_GFX: +		/* Need to keep at least 192 on GFX7+ for old radv. */ +		return 192; +	case AMDGPU_RING_TYPE_COMPUTE: +		return 125; +	case AMDGPU_RING_TYPE_VCN_JPEG: +		return 16; +	default: +		return 49; +	} +} + +/**   * amdgpu_ring_alloc - allocate space on the ring buffer   *   * @ring: amdgpu_ring structure holding ring information @@ -58,7 +78,7 @@   * Allocate @ndw dwords in the ring buffer (all asics).   * Returns 0 on success, error on failure.   */ -int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw) +int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned int ndw)  {  	/* Align requested size with padding so unlock_commit can  	 * pad safely */ @@ -182,6 +202,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,  	int sched_hw_submission = amdgpu_sched_hw_submission;  	u32 *num_sched;  	u32 hw_ip; +	unsigned int max_ibs_dw;  	/* Set the hw submission limit higher for KIQ because  	 * it's used for a number of gfx/compute tasks by both @@ -290,6 +311,13 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,  		return r;  	} +	max_ibs_dw = ring->funcs->emit_frame_size + +		     amdgpu_ring_max_ibs(ring->funcs->type) * ring->funcs->emit_ib_size; +	max_ibs_dw = (max_ibs_dw + ring->funcs->align_mask) & ~ring->funcs->align_mask; + +	if (WARN_ON(max_ibs_dw > max_dw)) +		max_dw = max_ibs_dw; +  	ring->ring_size = roundup_pow_of_two(max_dw * 4 * sched_hw_submission);  	ring->buf_mask = (ring->ring_size / 4) - 1; @@ -361,6 +389,8 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)  		amdgpu_bo_free_kernel(&ring->ring_obj,  				      &ring->gpu_addr,  				      (void **)&ring->ring); +	} else { +		kfree(ring->fence_drv.fences);  	}  	dma_fence_put(ring->vmid_wait); @@ -478,6 +508,59 @@ static const struct file_operations amdgpu_debugfs_ring_fops = {  	.llseek = default_llseek  }; +static ssize_t amdgpu_debugfs_mqd_read(struct file *f, char __user *buf, +				       size_t size, loff_t *pos) +{ +	struct amdgpu_ring *ring = file_inode(f)->i_private; +	volatile u32 *mqd; +	int r; +	uint32_t value, result; + +	if (*pos & 3 || size & 3) +		return -EINVAL; + +	result = 0; + +	r = amdgpu_bo_reserve(ring->mqd_obj, false); +	if (unlikely(r != 0)) +		return r; + +	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&mqd); +	if (r) { +		amdgpu_bo_unreserve(ring->mqd_obj); +		return r; +	} + +	while (size) { +		if (*pos >= ring->mqd_size) +			goto done; + +		value = mqd[*pos/4]; +		r = put_user(value, (uint32_t *)buf); +		if (r) +			goto done; +		buf += 4; +		result += 4; +		size -= 4; +		*pos += 4; +	} + +done: +	amdgpu_bo_kunmap(ring->mqd_obj); +	mqd = NULL; +	amdgpu_bo_unreserve(ring->mqd_obj); +	if (r) +		return r; + +	return result; +} + +static const struct file_operations amdgpu_debugfs_mqd_fops = { +	.owner = THIS_MODULE, +	.read = amdgpu_debugfs_mqd_read, +	.llseek = default_llseek +}; +  #endif  void amdgpu_debugfs_ring_init(struct amdgpu_device *adev, @@ -489,10 +572,16 @@ void amdgpu_debugfs_ring_init(struct amdgpu_device *adev,  	char name[32];  	sprintf(name, "amdgpu_ring_%s", ring->name); -	debugfs_create_file_size(name, S_IFREG | S_IRUGO, root, ring, +	debugfs_create_file_size(name, S_IFREG | 0444, root, ring,  				 &amdgpu_debugfs_ring_fops,  				 ring->ring_size + 12); +	if (ring->mqd_obj) { +		sprintf(name, "amdgpu_mqd_%s", ring->name); +		debugfs_create_file_size(name, S_IFREG | 0444, root, ring, +					 &amdgpu_debugfs_mqd_fops, +					 ring->mqd_size); +	}  #endif  } @@ -581,3 +670,21 @@ void amdgpu_ring_ib_end(struct amdgpu_ring *ring)  	if (ring->is_sw_ring)  		amdgpu_sw_ring_ib_end(ring);  } + +void amdgpu_ring_ib_on_emit_cntl(struct amdgpu_ring *ring) +{ +	if (ring->is_sw_ring) +		amdgpu_sw_ring_ib_mark_offset(ring, AMDGPU_MUX_OFFSET_TYPE_CONTROL); +} + +void amdgpu_ring_ib_on_emit_ce(struct amdgpu_ring *ring) +{ +	if (ring->is_sw_ring) +		amdgpu_sw_ring_ib_mark_offset(ring, AMDGPU_MUX_OFFSET_TYPE_CE); +} + +void amdgpu_ring_ib_on_emit_de(struct amdgpu_ring *ring) +{ +	if (ring->is_sw_ring) +		amdgpu_sw_ring_ib_mark_offset(ring, AMDGPU_MUX_OFFSET_TYPE_DE); +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index d8749444b689..21ffb9ce32ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -37,8 +37,8 @@ struct amdgpu_job;  struct amdgpu_vm;  /* max number of rings */ -#define AMDGPU_MAX_RINGS		28 -#define AMDGPU_MAX_HWIP_RINGS		8 +#define AMDGPU_MAX_RINGS		124 +#define AMDGPU_MAX_HWIP_RINGS		64  #define AMDGPU_MAX_GFX_RINGS		2  #define AMDGPU_MAX_SW_GFX_RINGS         2  #define AMDGPU_MAX_COMPUTE_RINGS	8 @@ -212,6 +212,8 @@ struct amdgpu_ring_funcs {  	void (*end_use)(struct amdgpu_ring *ring);  	void (*emit_switch_buffer) (struct amdgpu_ring *ring);  	void (*emit_cntxcntl) (struct amdgpu_ring *ring, uint32_t flags); +	void (*emit_gfx_shadow)(struct amdgpu_ring *ring, u64 shadow_va, u64 csa_va, +				u64 gds_va, bool init_shadow, int vmid);  	void (*emit_rreg)(struct amdgpu_ring *ring, uint32_t reg,  			  uint32_t reg_val_offs);  	void (*emit_wreg)(struct amdgpu_ring *ring, uint32_t reg, uint32_t val); @@ -227,6 +229,9 @@ struct amdgpu_ring_funcs {  	int (*preempt_ib)(struct amdgpu_ring *ring);  	void (*emit_mem_sync)(struct amdgpu_ring *ring);  	void (*emit_wave_limit)(struct amdgpu_ring *ring, bool enable); +	void (*patch_cntl)(struct amdgpu_ring *ring, unsigned offset); +	void (*patch_ce)(struct amdgpu_ring *ring, unsigned offset); +	void (*patch_de)(struct amdgpu_ring *ring, unsigned offset);  };  struct amdgpu_ring { @@ -250,12 +255,14 @@ struct amdgpu_ring {  	uint32_t		buf_mask;  	u32			idx;  	u32			xcc_id; +	u32			xcp_id;  	u32			me;  	u32			pipe;  	u32			queue;  	struct amdgpu_bo	*mqd_obj;  	uint64_t                mqd_gpu_addr;  	void                    *mqd_ptr; +	unsigned                mqd_size;  	uint64_t                eop_gpu_addr;  	u32			doorbell_index;  	bool			use_doorbell; @@ -309,6 +316,7 @@ struct amdgpu_ring {  #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r))  #define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r))  #define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d)) +#define amdgpu_ring_emit_gfx_shadow(r, s, c, g, i, v) ((r)->funcs->emit_gfx_shadow((r), (s), (c), (g), (i), (v)))  #define amdgpu_ring_emit_rreg(r, d, o) (r)->funcs->emit_rreg((r), (d), (o))  #define amdgpu_ring_emit_wreg(r, d, v) (r)->funcs->emit_wreg((r), (d), (v))  #define amdgpu_ring_emit_reg_wait(r, d, v, m) (r)->funcs->emit_reg_wait((r), (d), (v), (m)) @@ -318,10 +326,17 @@ struct amdgpu_ring {  #define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))  #define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))  #define amdgpu_ring_preempt_ib(r) (r)->funcs->preempt_ib(r) +#define amdgpu_ring_patch_cntl(r, o) ((r)->funcs->patch_cntl((r), (o))) +#define amdgpu_ring_patch_ce(r, o) ((r)->funcs->patch_ce((r), (o))) +#define amdgpu_ring_patch_de(r, o) ((r)->funcs->patch_de((r), (o))) +unsigned int amdgpu_ring_max_ibs(enum amdgpu_ring_type type);  int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw);  void amdgpu_ring_ib_begin(struct amdgpu_ring *ring);  void amdgpu_ring_ib_end(struct amdgpu_ring *ring); +void amdgpu_ring_ib_on_emit_cntl(struct amdgpu_ring *ring); +void amdgpu_ring_ib_on_emit_ce(struct amdgpu_ring *ring); +void amdgpu_ring_ib_on_emit_de(struct amdgpu_ring *ring);  void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count);  void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.c index 62079f0e3ee8..73516abef662 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.c @@ -105,6 +105,16 @@ static void amdgpu_mux_resubmit_chunks(struct amdgpu_ring_mux *mux)  				amdgpu_fence_update_start_timestamp(e->ring,  								    chunk->sync_seq,  								    ktime_get()); +				if (chunk->sync_seq == +					le32_to_cpu(*(e->ring->fence_drv.cpu_addr + 2))) { +					if (chunk->cntl_offset <= e->ring->buf_mask) +						amdgpu_ring_patch_cntl(e->ring, +								       chunk->cntl_offset); +					if (chunk->ce_offset <= e->ring->buf_mask) +						amdgpu_ring_patch_ce(e->ring, chunk->ce_offset); +					if (chunk->de_offset <= e->ring->buf_mask) +						amdgpu_ring_patch_de(e->ring, chunk->de_offset); +				}  				amdgpu_ring_mux_copy_pkt_from_sw_ring(mux, e->ring,  								      chunk->start,  								      chunk->end); @@ -407,6 +417,17 @@ void amdgpu_sw_ring_ib_end(struct amdgpu_ring *ring)  	amdgpu_ring_mux_end_ib(mux, ring);  } +void amdgpu_sw_ring_ib_mark_offset(struct amdgpu_ring *ring, enum amdgpu_ring_mux_offset_type type) +{ +	struct amdgpu_device *adev = ring->adev; +	struct amdgpu_ring_mux *mux = &adev->gfx.muxer; +	unsigned offset; + +	offset = ring->wptr & ring->buf_mask; + +	amdgpu_ring_mux_ib_mark_offset(mux, ring, offset, type); +} +  void amdgpu_ring_mux_start_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring)  {  	struct amdgpu_mux_entry *e; @@ -429,6 +450,10 @@ void amdgpu_ring_mux_start_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *r  	}  	chunk->start = ring->wptr; +	/* the initialized value used to check if they are set by the ib submission*/ +	chunk->cntl_offset = ring->buf_mask + 1; +	chunk->de_offset = ring->buf_mask + 1; +	chunk->ce_offset = ring->buf_mask + 1;  	list_add_tail(&chunk->entry, &e->list);  } @@ -454,6 +479,41 @@ static void scan_and_remove_signaled_chunk(struct amdgpu_ring_mux *mux, struct a  	}  } +void amdgpu_ring_mux_ib_mark_offset(struct amdgpu_ring_mux *mux, +				    struct amdgpu_ring *ring, u64 offset, +				    enum amdgpu_ring_mux_offset_type type) +{ +	struct amdgpu_mux_entry *e; +	struct amdgpu_mux_chunk *chunk; + +	e = amdgpu_ring_mux_sw_entry(mux, ring); +	if (!e) { +		DRM_ERROR("cannot find entry!\n"); +		return; +	} + +	chunk = list_last_entry(&e->list, struct amdgpu_mux_chunk, entry); +	if (!chunk) { +		DRM_ERROR("cannot find chunk!\n"); +		return; +	} + +	switch (type) { +	case AMDGPU_MUX_OFFSET_TYPE_CONTROL: +		chunk->cntl_offset = offset; +		break; +	case AMDGPU_MUX_OFFSET_TYPE_DE: +		chunk->de_offset = offset; +		break; +	case AMDGPU_MUX_OFFSET_TYPE_CE: +		chunk->ce_offset = offset; +		break; +	default: +		DRM_ERROR("invalid type (%d)\n", type); +		break; +	} +} +  void amdgpu_ring_mux_end_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring)  {  	struct amdgpu_mux_entry *e; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h index 4be45fc14954..b22d4fb2a847 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.h @@ -50,6 +50,12 @@ struct amdgpu_mux_entry {  	struct list_head        list;  }; +enum amdgpu_ring_mux_offset_type { +	AMDGPU_MUX_OFFSET_TYPE_CONTROL, +	AMDGPU_MUX_OFFSET_TYPE_DE, +	AMDGPU_MUX_OFFSET_TYPE_CE, +}; +  struct amdgpu_ring_mux {  	struct amdgpu_ring      *real_ring; @@ -72,12 +78,18 @@ struct amdgpu_ring_mux {   * @sync_seq: the fence seqno related with the saved IB.   * @start:- start location on the software ring.   * @end:- end location on the software ring. + * @control_offset:- the PRE_RESUME bit position used for resubmission. + * @de_offset:- the anchor in write_data for de meta of resubmission. + * @ce_offset:- the anchor in write_data for ce meta of resubmission.   */  struct amdgpu_mux_chunk {  	struct list_head        entry;  	uint32_t                sync_seq;  	u64                     start;  	u64                     end; +	u64                     cntl_offset; +	u64                     de_offset; +	u64                     ce_offset;  };  int amdgpu_ring_mux_init(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring, @@ -89,6 +101,8 @@ u64 amdgpu_ring_mux_get_wptr(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ri  u64 amdgpu_ring_mux_get_rptr(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring);  void amdgpu_ring_mux_start_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring);  void amdgpu_ring_mux_end_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring); +void amdgpu_ring_mux_ib_mark_offset(struct amdgpu_ring_mux *mux, struct amdgpu_ring *ring, +				    u64 offset, enum amdgpu_ring_mux_offset_type type);  bool amdgpu_mcbp_handle_trailing_fence_irq(struct amdgpu_ring_mux *mux);  u64 amdgpu_sw_ring_get_rptr_gfx(struct amdgpu_ring *ring); @@ -97,6 +111,7 @@ void amdgpu_sw_ring_set_wptr_gfx(struct amdgpu_ring *ring);  void amdgpu_sw_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count);  void amdgpu_sw_ring_ib_begin(struct amdgpu_ring *ring);  void amdgpu_sw_ring_ib_end(struct amdgpu_ring *ring); +void amdgpu_sw_ring_ib_mark_offset(struct amdgpu_ring *ring, enum amdgpu_ring_mux_offset_type type);  const char *amdgpu_sw_ring_name(int idx);  unsigned int amdgpu_sw_ring_priority(int idx); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c index 85fb730d9fc8..35e0ae9acadc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c @@ -31,12 +31,13 @@   * amdgpu_gfx_rlc_enter_safe_mode - Set RLC into safe mode   *   * @adev: amdgpu_device pointer + * @xcc_id: xcc accelerated compute core id   *   * Set RLC enter into safe mode if RLC is enabled and haven't in safe mode.   */ -void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev) +void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev, int xcc_id)  { -	if (adev->gfx.rlc.in_safe_mode) +	if (adev->gfx.rlc.in_safe_mode[xcc_id])  		return;  	/* if RLC is not enabled, do nothing */ @@ -46,8 +47,8 @@ void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev)  	if (adev->cg_flags &  	    (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG |  	     AMD_CG_SUPPORT_GFX_3D_CGCG)) { -		adev->gfx.rlc.funcs->set_safe_mode(adev); -		adev->gfx.rlc.in_safe_mode = true; +		adev->gfx.rlc.funcs->set_safe_mode(adev, xcc_id); +		adev->gfx.rlc.in_safe_mode[xcc_id] = true;  	}  } @@ -55,12 +56,13 @@ void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev)   * amdgpu_gfx_rlc_exit_safe_mode - Set RLC out of safe mode   *   * @adev: amdgpu_device pointer + * @xcc_id: xcc accelerated compute core id   *   * Set RLC exit safe mode if RLC is enabled and have entered into safe mode.   */ -void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev) +void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev, int xcc_id)  { -	if (!(adev->gfx.rlc.in_safe_mode)) +	if (!(adev->gfx.rlc.in_safe_mode[xcc_id]))  		return;  	/* if RLC is not enabled, do nothing */ @@ -70,8 +72,8 @@ void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev)  	if (adev->cg_flags &  	    (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG |  	     AMD_CG_SUPPORT_GFX_3D_CGCG)) { -		adev->gfx.rlc.funcs->unset_safe_mode(adev); -		adev->gfx.rlc.in_safe_mode = false; +		adev->gfx.rlc.funcs->unset_safe_mode(adev, xcc_id); +		adev->gfx.rlc.in_safe_mode[xcc_id] = false;  	}  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h index 23f060db9255..80b263646966 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h @@ -157,8 +157,8 @@ typedef struct _RLC_TABLE_OF_CONTENT {  struct amdgpu_rlc_funcs {  	bool (*is_rlc_enabled)(struct amdgpu_device *adev); -	void (*set_safe_mode)(struct amdgpu_device *adev); -	void (*unset_safe_mode)(struct amdgpu_device *adev); +	void (*set_safe_mode)(struct amdgpu_device *adev, int xcc_id); +	void (*unset_safe_mode)(struct amdgpu_device *adev, int xcc_id);  	int  (*init)(struct amdgpu_device *adev);  	u32  (*get_csb_size)(struct amdgpu_device *adev);  	void (*get_csb_buffer)(struct amdgpu_device *adev, volatile u32 *buffer); @@ -201,7 +201,7 @@ struct amdgpu_rlc {  	u32                     cp_table_size;  	/* safe mode for updating CG/PG state */ -	bool in_safe_mode; +	bool in_safe_mode[8];  	const struct amdgpu_rlc_funcs *funcs;  	/* for firmware data */ @@ -260,8 +260,8 @@ struct amdgpu_rlc {  	struct amdgpu_rlcg_reg_access_ctrl reg_access_ctrl;  }; -void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev); -void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev); +void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev, int xcc_id); +void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev, int xcc_id);  int amdgpu_gfx_rlc_init_sr(struct amdgpu_device *adev, u32 dws);  int amdgpu_gfx_rlc_init_csb(struct amdgpu_device *adev);  int amdgpu_gfx_rlc_init_cpt(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index 231ca06bc9c7..78ec3420ef85 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -64,7 +64,7 @@ int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index)  }  uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, -				     unsigned vmid) +				     unsigned int vmid)  {  	struct amdgpu_device *adev = ring->adev;  	uint64_t csa_mc_addr; @@ -252,6 +252,13 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,  				if (!duplicate && (instance != i))  					continue;  				else { +					/* Use a single copy per SDMA firmware type. PSP uses the same instance for all +					 * groups of SDMAs */ +					if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 4, 2) && +					    adev->firmware.load_type == AMDGPU_FW_LOAD_PSP && +					    adev->sdma.num_inst_per_aid == i) { +						break; +					}  					info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];  					info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;  					info->fw = adev->sdma.instance[i].fw; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index fc8528812598..513ac22120c1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h @@ -26,7 +26,7 @@  #include "amdgpu_ras.h"  /* max number of IP instances */ -#define AMDGPU_MAX_SDMA_INSTANCES		8 +#define AMDGPU_MAX_SDMA_INSTANCES		16  enum amdgpu_sdma_irq {  	AMDGPU_SDMA_IRQ_INSTANCE0  = 0, @@ -37,9 +37,19 @@ enum amdgpu_sdma_irq {  	AMDGPU_SDMA_IRQ_INSTANCE5,  	AMDGPU_SDMA_IRQ_INSTANCE6,  	AMDGPU_SDMA_IRQ_INSTANCE7, +	AMDGPU_SDMA_IRQ_INSTANCE8, +	AMDGPU_SDMA_IRQ_INSTANCE9, +	AMDGPU_SDMA_IRQ_INSTANCE10, +	AMDGPU_SDMA_IRQ_INSTANCE11, +	AMDGPU_SDMA_IRQ_INSTANCE12, +	AMDGPU_SDMA_IRQ_INSTANCE13, +	AMDGPU_SDMA_IRQ_INSTANCE14, +	AMDGPU_SDMA_IRQ_INSTANCE15,  	AMDGPU_SDMA_IRQ_LAST  }; +#define NUM_SDMA(x) hweight32(x) +  struct amdgpu_sdma_instance {  	/* SDMA firmware */  	const struct firmware	*fw; @@ -49,6 +59,35 @@ struct amdgpu_sdma_instance {  	struct amdgpu_ring	ring;  	struct amdgpu_ring	page;  	bool			burst_nop; +	uint32_t		aid_id; +}; + +enum amdgpu_sdma_ras_memory_id { +	AMDGPU_SDMA_MBANK_DATA_BUF0 = 1, +	AMDGPU_SDMA_MBANK_DATA_BUF1 = 2, +	AMDGPU_SDMA_MBANK_DATA_BUF2 = 3, +	AMDGPU_SDMA_MBANK_DATA_BUF3 = 4, +	AMDGPU_SDMA_MBANK_DATA_BUF4 = 5, +	AMDGPU_SDMA_MBANK_DATA_BUF5 = 6, +	AMDGPU_SDMA_MBANK_DATA_BUF6 = 7, +	AMDGPU_SDMA_MBANK_DATA_BUF7 = 8, +	AMDGPU_SDMA_MBANK_DATA_BUF8 = 9, +	AMDGPU_SDMA_MBANK_DATA_BUF9 = 10, +	AMDGPU_SDMA_MBANK_DATA_BUF10 = 11, +	AMDGPU_SDMA_MBANK_DATA_BUF11 = 12, +	AMDGPU_SDMA_MBANK_DATA_BUF12 = 13, +	AMDGPU_SDMA_MBANK_DATA_BUF13 = 14, +	AMDGPU_SDMA_MBANK_DATA_BUF14 = 15, +	AMDGPU_SDMA_MBANK_DATA_BUF15 = 16, +	AMDGPU_SDMA_UCODE_BUF = 17, +	AMDGPU_SDMA_RB_CMD_BUF = 18, +	AMDGPU_SDMA_IB_CMD_BUF = 19, +	AMDGPU_SDMA_UTCL1_RD_FIFO = 20, +	AMDGPU_SDMA_UTCL1_RDBST_FIFO = 21, +	AMDGPU_SDMA_UTCL1_WR_FIFO = 22, +	AMDGPU_SDMA_DATA_LUT_FIFO = 23, +	AMDGPU_SDMA_SPLIT_DAT_BUF = 24, +	AMDGPU_SDMA_MEMORY_BLOCK_LAST,  };  struct amdgpu_sdma_ras { @@ -66,6 +105,8 @@ struct amdgpu_sdma {  	struct amdgpu_irq_src	srbm_write_irq;  	int			num_instances; +	uint32_t 		sdma_mask; +	int			num_inst_per_aid;  	uint32_t                    srbm_soft_reset;  	bool			has_page_queue;  	struct ras_common_if	*ras_if; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h index c7a823f3f2c5..89c38d864471 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_smuio.h @@ -30,6 +30,7 @@ struct amdgpu_smuio_funcs {  	void (*get_clock_gating_state)(struct amdgpu_device *adev, u64 *flags);  	u32 (*get_die_id)(struct amdgpu_device *adev);  	u32 (*get_socket_id)(struct amdgpu_device *adev); +	enum amdgpu_pkg_type (*get_pkg_type)(struct amdgpu_device *adev);  	bool (*is_host_gpu_xgmi_supported)(struct amdgpu_device *adev);  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 2cd081cbf706..d2d0d27f9053 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -38,7 +38,6 @@  #include <linux/seq_file.h>  #include <linux/slab.h>  #include <linux/swap.h> -#include <linux/swiotlb.h>  #include <linux/dma-buf.h>  #include <linux/sizes.h>  #include <linux/module.h> @@ -65,7 +64,7 @@  MODULE_IMPORT_NS(DMA_BUF); -#define AMDGPU_TTM_VRAM_MAX_DW_READ	(size_t)128 +#define AMDGPU_TTM_VRAM_MAX_DW_READ	((size_t)128)  static int amdgpu_ttm_backend_bind(struct ttm_device *bdev,  				   struct ttm_tt *ttm, @@ -184,11 +183,11 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,  static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo,  				 struct ttm_resource *mem,  				 struct amdgpu_res_cursor *mm_cur, -				 unsigned window, struct amdgpu_ring *ring, +				 unsigned int window, struct amdgpu_ring *ring,  				 bool tmz, uint64_t *size, uint64_t *addr)  {  	struct amdgpu_device *adev = ring->adev; -	unsigned offset, num_pages, num_dw, num_bytes; +	unsigned int offset, num_pages, num_dw, num_bytes;  	uint64_t src_addr, dst_addr;  	struct amdgpu_job *job;  	void *cpu_addr; @@ -384,7 +383,8 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,  	    (abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE)) {  		struct dma_fence *wipe_fence = NULL; -		r = amdgpu_fill_buffer(abo, AMDGPU_POISON, NULL, &wipe_fence); +		r = amdgpu_fill_buffer(abo, AMDGPU_POISON, NULL, &wipe_fence, +					false);  		if (r) {  			goto error;  		} else if (wipe_fence) { @@ -631,6 +631,7 @@ struct amdgpu_ttm_tt {  	struct task_struct	*usertask;  	uint32_t		userflags;  	bool			bound; +	int32_t			pool_id;  };  #define ttm_to_amdgpu_ttm_tt(ptr)	container_of(ptr, struct amdgpu_ttm_tt, ttm) @@ -800,6 +801,44 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_device *bdev,  	sg_free_table(ttm->sg);  } +/* + * total_pages is constructed as MQD0+CtrlStack0 + MQD1+CtrlStack1 + ... + * MQDn+CtrlStackn where n is the number of XCCs per partition. + * pages_per_xcc is the size of one MQD+CtrlStack. The first page is MQD + * and uses memory type default, UC. The rest of pages_per_xcc are + * Ctrl stack and modify their memory type to NC. + */ +static void amdgpu_ttm_gart_bind_gfx9_mqd(struct amdgpu_device *adev, +				struct ttm_tt *ttm, uint64_t flags) +{ +	struct amdgpu_ttm_tt *gtt = (void *)ttm; +	uint64_t total_pages = ttm->num_pages; +	int num_xcc = max(1U, adev->gfx.num_xcc_per_xcp); +	uint64_t page_idx, pages_per_xcc; +	int i; +	uint64_t ctrl_flags = (flags & ~AMDGPU_PTE_MTYPE_VG10_MASK) | +			AMDGPU_PTE_MTYPE_VG10(AMDGPU_MTYPE_NC); + +	pages_per_xcc = total_pages; +	do_div(pages_per_xcc, num_xcc); + +	for (i = 0, page_idx = 0; i < num_xcc; i++, page_idx += pages_per_xcc) { +		/* MQD page: use default flags */ +		amdgpu_gart_bind(adev, +				gtt->offset + (page_idx << PAGE_SHIFT), +				1, >t->ttm.dma_address[page_idx], flags); +		/* +		 * Ctrl pages - modify the memory type to NC (ctrl_flags) from +		 * the second page of the BO onward. +		 */ +		amdgpu_gart_bind(adev, +				gtt->offset + ((page_idx + 1) << PAGE_SHIFT), +				pages_per_xcc - 1, +				>t->ttm.dma_address[page_idx + 1], +				ctrl_flags); +	} +} +  static void amdgpu_ttm_gart_bind(struct amdgpu_device *adev,  				 struct ttm_buffer_object *tbo,  				 uint64_t flags) @@ -812,21 +851,7 @@ static void amdgpu_ttm_gart_bind(struct amdgpu_device *adev,  		flags |= AMDGPU_PTE_TMZ;  	if (abo->flags & AMDGPU_GEM_CREATE_CP_MQD_GFX9) { -		uint64_t page_idx = 1; - -		amdgpu_gart_bind(adev, gtt->offset, page_idx, -				 gtt->ttm.dma_address, flags); - -		/* The memory type of the first page defaults to UC. Now -		 * modify the memory type to NC from the second page of -		 * the BO onward. -		 */ -		flags &= ~AMDGPU_PTE_MTYPE_VG10_MASK; -		flags |= AMDGPU_PTE_MTYPE_VG10(AMDGPU_MTYPE_NC); - -		amdgpu_gart_bind(adev, gtt->offset + (page_idx << PAGE_SHIFT), -				 ttm->num_pages - page_idx, -				 &(gtt->ttm.dma_address[page_idx]), flags); +		amdgpu_ttm_gart_bind_gfx9_mqd(adev, ttm, flags);  	} else {  		amdgpu_gart_bind(adev, gtt->offset, ttm->num_pages,  				 gtt->ttm.dma_address, flags); @@ -1029,15 +1054,20 @@ static void amdgpu_ttm_backend_destroy(struct ttm_device *bdev,  static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,  					   uint32_t page_flags)  { +	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);  	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);  	struct amdgpu_ttm_tt *gtt;  	enum ttm_caching caching;  	gtt = kzalloc(sizeof(struct amdgpu_ttm_tt), GFP_KERNEL); -	if (gtt == NULL) { +	if (!gtt)  		return NULL; -	} +  	gtt->gobj = &bo->base; +	if (adev->gmc.mem_partitions && abo->xcp_id >= 0) +		gtt->pool_id = KFD_XCP_MEM_ID(adev, abo->xcp_id); +	else +		gtt->pool_id = abo->xcp_id;  	if (abo->flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)  		caching = ttm_write_combined; @@ -1064,6 +1094,7 @@ static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);  	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm); +	struct ttm_pool *pool;  	pgoff_t i;  	int ret; @@ -1078,7 +1109,11 @@ static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,  	if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL)  		return 0; -	ret = ttm_pool_alloc(&adev->mman.bdev.pool, ttm, ctx); +	if (adev->mman.ttm_pools && gtt->pool_id >= 0) +		pool = &adev->mman.ttm_pools[gtt->pool_id]; +	else +		pool = &adev->mman.bdev.pool; +	ret = ttm_pool_alloc(pool, ttm, ctx);  	if (ret)  		return ret; @@ -1099,6 +1134,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,  {  	struct amdgpu_ttm_tt *gtt = ttm_to_amdgpu_ttm_tt(ttm);  	struct amdgpu_device *adev; +	struct ttm_pool *pool;  	pgoff_t i;  	amdgpu_ttm_backend_unbind(bdev, ttm); @@ -1117,7 +1153,13 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_device *bdev,  		ttm->pages[i]->mapping = NULL;  	adev = amdgpu_ttm_adev(bdev); -	return ttm_pool_free(&adev->mman.bdev.pool, ttm); + +	if (adev->mman.ttm_pools && gtt->pool_id >= 0) +		pool = &adev->mman.ttm_pools[gtt->pool_id]; +	else +		pool = &adev->mman.bdev.pool; + +	return ttm_pool_free(pool, ttm);  }  /** @@ -1623,14 +1665,15 @@ static int amdgpu_ttm_training_reserve_vram_fini(struct amdgpu_device *adev)  	return 0;  } -static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev) +static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev, +						uint32_t reserve_size)  {  	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;  	memset(ctx, 0, sizeof(*ctx));  	ctx->c2p_train_data_offset = -		ALIGN((adev->gmc.mc_vram_size - adev->mman.discovery_tmr_size - SZ_1M), SZ_1M); +		ALIGN((adev->gmc.mc_vram_size - reserve_size - SZ_1M), SZ_1M);  	ctx->p2c_train_data_offset =  		(adev->gmc.mc_vram_size - GDDR6_MEM_TRAINING_OFFSET);  	ctx->train_data_size = @@ -1648,11 +1691,12 @@ static void amdgpu_ttm_training_data_block_init(struct amdgpu_device *adev)   */  static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)  { -	int ret;  	struct psp_memory_training_context *ctx = &adev->psp.mem_train_ctx;  	bool mem_train_support = false; +	uint32_t reserve_size = 0; +	int ret; -	if (!amdgpu_sriov_vf(adev)) { +	if (adev->bios && !amdgpu_sriov_vf(adev)) {  		if (amdgpu_atomfirmware_mem_training_supported(adev))  			mem_train_support = true;  		else @@ -1666,14 +1710,18 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)  	 * Otherwise, fallback to legacy approach to check and reserve tmr block for ip  	 * discovery data and G6 memory training data respectively  	 */ -	adev->mman.discovery_tmr_size = -		amdgpu_atomfirmware_get_fw_reserved_fb_size(adev); -	if (!adev->mman.discovery_tmr_size) -		adev->mman.discovery_tmr_size = DISCOVERY_TMR_OFFSET; +	if (adev->bios) +		reserve_size = +			amdgpu_atomfirmware_get_fw_reserved_fb_size(adev); + +	if (!adev->bios && adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) +		reserve_size = max(reserve_size, (uint32_t)280 << 20); +	else if (!reserve_size) +		reserve_size = DISCOVERY_TMR_OFFSET;  	if (mem_train_support) {  		/* reserve vram for mem train according to TMR location */ -		amdgpu_ttm_training_data_block_init(adev); +		amdgpu_ttm_training_data_block_init(adev, reserve_size);  		ret = amdgpu_bo_create_kernel_at(adev,  						 ctx->c2p_train_data_offset,  						 ctx->train_data_size, @@ -1687,20 +1735,58 @@ static int amdgpu_ttm_reserve_tmr(struct amdgpu_device *adev)  		ctx->init = PSP_MEM_TRAIN_RESERVE_SUCCESS;  	} -	ret = amdgpu_bo_create_kernel_at(adev, -					 adev->gmc.real_vram_size - adev->mman.discovery_tmr_size, -					 adev->mman.discovery_tmr_size, -					 &adev->mman.discovery_memory, -					 NULL); -	if (ret) { -		DRM_ERROR("alloc tmr failed(%d)!\n", ret); -		amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL); -		return ret; +	if (!adev->gmc.is_app_apu) { +		ret = amdgpu_bo_create_kernel_at( +			adev, adev->gmc.real_vram_size - reserve_size, +			reserve_size, &adev->mman.fw_reserved_memory, NULL); +		if (ret) { +			DRM_ERROR("alloc tmr failed(%d)!\n", ret); +			amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, +					      NULL, NULL); +			return ret; +		} +	} else { +		DRM_DEBUG_DRIVER("backdoor fw loading path for PSP TMR, no reservation needed\n");  	}  	return 0;  } +static int amdgpu_ttm_pools_init(struct amdgpu_device *adev) +{ +	int i; + +	if (!adev->gmc.is_app_apu || !adev->gmc.num_mem_partitions) +		return 0; + +	adev->mman.ttm_pools = kcalloc(adev->gmc.num_mem_partitions, +				       sizeof(*adev->mman.ttm_pools), +				       GFP_KERNEL); +	if (!adev->mman.ttm_pools) +		return -ENOMEM; + +	for (i = 0; i < adev->gmc.num_mem_partitions; i++) { +		ttm_pool_init(&adev->mman.ttm_pools[i], adev->dev, +			      adev->gmc.mem_partitions[i].numa.node, +			      false, false); +	} +	return 0; +} + +static void amdgpu_ttm_pools_fini(struct amdgpu_device *adev) +{ +	int i; + +	if (!adev->gmc.is_app_apu || !adev->mman.ttm_pools) +		return; + +	for (i = 0; i < adev->gmc.num_mem_partitions; i++) +		ttm_pool_fini(&adev->mman.ttm_pools[i]); + +	kfree(adev->mman.ttm_pools); +	adev->mman.ttm_pools = NULL; +} +  /*   * amdgpu_ttm_init - Init the memory management (ttm) as well as various   * gtt/vram related fields. @@ -1727,6 +1813,12 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  		DRM_ERROR("failed initializing buffer object driver(%d).\n", r);  		return r;  	} + +	r = amdgpu_ttm_pools_init(adev); +	if (r) { +		DRM_ERROR("failed to init ttm pools(%d).\n", r); +		return r; +	}  	adev->mman.initialized = true;  	/* Initialize VRAM pool with all of VRAM divided into pages */ @@ -1744,6 +1836,9 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  		adev->mman.aper_base_kaddr = ioremap_cache(adev->gmc.aper_base,  				adev->gmc.visible_vram_size); +	else if (adev->gmc.is_app_apu) +		DRM_DEBUG_DRIVER( +			"No need to ioremap when real vram size is 0\n");  	else  #endif  		adev->mman.aper_base_kaddr = ioremap_wc(adev->gmc.aper_base, @@ -1755,9 +1850,8 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  	 *place on the VRAM, so reserve it early.  	 */  	r = amdgpu_ttm_fw_reserve_vram_init(adev); -	if (r) { +	if (r)  		return r; -	}  	/*  	 *The reserved vram for driver must be pinned to the specified @@ -1781,49 +1875,46 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  	/* allocate memory as required for VGA  	 * This is used for VGA emulation and pre-OS scanout buffers to  	 * avoid display artifacts while transitioning between pre-OS -	 * and driver.  */ -	r = amdgpu_bo_create_kernel_at(adev, 0, adev->mman.stolen_vga_size, -				       &adev->mman.stolen_vga_memory, -				       NULL); -	if (r) -		return r; -	r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size, -				       adev->mman.stolen_extended_size, -				       &adev->mman.stolen_extended_memory, -				       NULL); -	if (r) -		return r; -	r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_reserved_offset, -				       adev->mman.stolen_reserved_size, -				       &adev->mman.stolen_reserved_memory, -				       NULL); -	if (r) -		return r; +	 * and driver. +	 */ +	if (!adev->gmc.is_app_apu) { +		r = amdgpu_bo_create_kernel_at(adev, 0, +					       adev->mman.stolen_vga_size, +					       &adev->mman.stolen_vga_memory, +					       NULL); +		if (r) +			return r; -	DRM_INFO("amdgpu: %uM of VRAM memory ready\n", -		 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024))); +		r = amdgpu_bo_create_kernel_at(adev, adev->mman.stolen_vga_size, +					       adev->mman.stolen_extended_size, +					       &adev->mman.stolen_extended_memory, +					       NULL); -	/* Compute GTT size, either based on 1/2 the size of RAM size -	 * or whatever the user passed on module init */ -	if (amdgpu_gtt_size == -1) { -		struct sysinfo si; +		if (r) +			return r; -		si_meminfo(&si); -		/* Certain GL unit tests for large textures can cause problems -		 * with the OOM killer since there is no way to link this memory -		 * to a process.  This was originally mitigated (but not necessarily -		 * eliminated) by limiting the GTT size.  The problem is this limit -		 * is often too low for many modern games so just make the limit 1/2 -		 * of system memory which aligns with TTM. The OOM accounting needs -		 * to be addressed, but we shouldn't prevent common 3D applications -		 * from being usable just to potentially mitigate that corner case. -		 */ -		gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20), -			       (u64)si.totalram * si.mem_unit / 2); +		r = amdgpu_bo_create_kernel_at(adev, +					       adev->mman.stolen_reserved_offset, +					       adev->mman.stolen_reserved_size, +					       &adev->mman.stolen_reserved_memory, +					       NULL); +		if (r) +			return r;  	} else { -		gtt_size = (uint64_t)amdgpu_gtt_size << 20; +		DRM_DEBUG_DRIVER("Skipped stolen memory reservation\n");  	} +	DRM_INFO("amdgpu: %uM of VRAM memory ready\n", +		 (unsigned int)(adev->gmc.real_vram_size / (1024 * 1024))); + +	/* Compute GTT size, either based on TTM limit +	 * or whatever the user passed on module init. +	 */ +	if (amdgpu_gtt_size == -1) +		gtt_size = ttm_tt_pages_limit() << PAGE_SHIFT; +	else +		gtt_size = (uint64_t)amdgpu_gtt_size << 20; +  	/* Initialize GTT memory pool */  	r = amdgpu_gtt_mgr_init(adev, gtt_size);  	if (r) { @@ -1831,7 +1922,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  		return r;  	}  	DRM_INFO("amdgpu: %uM of GTT memory ready.\n", -		 (unsigned)(gtt_size / (1024 * 1024))); +		 (unsigned int)(gtt_size / (1024 * 1024)));  	/* Initialize preemptible memory pool */  	r = amdgpu_preempt_mgr_init(adev); @@ -1858,7 +1949,6 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  		DRM_ERROR("Failed initializing oa heap.\n");  		return r;  	} -  	if (amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE,  				AMDGPU_GEM_DOMAIN_GTT,  				&adev->mman.sdma_access_bo, NULL, @@ -1874,18 +1964,24 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  void amdgpu_ttm_fini(struct amdgpu_device *adev)  {  	int idx; +  	if (!adev->mman.initialized)  		return; +	amdgpu_ttm_pools_fini(adev); +  	amdgpu_ttm_training_reserve_vram_fini(adev);  	/* return the stolen vga memory back to VRAM */ -	amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL); -	amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL); -	/* return the IP Discovery TMR memory back to VRAM */ -	amdgpu_bo_free_kernel(&adev->mman.discovery_memory, NULL, NULL); -	if (adev->mman.stolen_reserved_size) -		amdgpu_bo_free_kernel(&adev->mman.stolen_reserved_memory, -				      NULL, NULL); +	if (!adev->gmc.is_app_apu) { +		amdgpu_bo_free_kernel(&adev->mman.stolen_vga_memory, NULL, NULL); +		amdgpu_bo_free_kernel(&adev->mman.stolen_extended_memory, NULL, NULL); +		/* return the FW reserved memory back to VRAM */ +		amdgpu_bo_free_kernel(&adev->mman.fw_reserved_memory, NULL, +				      NULL); +		if (adev->mman.stolen_reserved_size) +			amdgpu_bo_free_kernel(&adev->mman.stolen_reserved_memory, +					      NULL, NULL); +	}  	amdgpu_bo_free_kernel(&adev->mman.sdma_access_bo, NULL,  					&adev->mman.sdma_access_ptr);  	amdgpu_ttm_fw_reserve_vram_fini(adev); @@ -1927,7 +2023,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)  	int r;  	if (!adev->mman.initialized || amdgpu_in_reset(adev) || -	    adev->mman.buffer_funcs_enabled == enable) +	    adev->mman.buffer_funcs_enabled == enable || adev->gmc.is_app_apu)  		return;  	if (enable) { @@ -1944,8 +2040,18 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)  				  r);  			return;  		} + +		r = drm_sched_entity_init(&adev->mman.delayed, +					  DRM_SCHED_PRIORITY_NORMAL, &sched, +					  1, NULL); +		if (r) { +			DRM_ERROR("Failed setting up TTM BO move entity (%d)\n", +				  r); +			goto error_free_entity; +		}  	} else {  		drm_sched_entity_destroy(&adev->mman.entity); +		drm_sched_entity_destroy(&adev->mman.delayed);  		dma_fence_put(man->move);  		man->move = NULL;  	} @@ -1957,6 +2063,11 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)  		size = adev->gmc.visible_vram_size;  	man->size = size;  	adev->mman.buffer_funcs_enabled = enable; + +	return; + +error_free_entity: +	drm_sched_entity_destroy(&adev->mman.entity);  }  static int amdgpu_ttm_prepare_job(struct amdgpu_device *adev, @@ -1964,14 +2075,16 @@ static int amdgpu_ttm_prepare_job(struct amdgpu_device *adev,  				  unsigned int num_dw,  				  struct dma_resv *resv,  				  bool vm_needs_flush, -				  struct amdgpu_job **job) +				  struct amdgpu_job **job, +				  bool delayed)  {  	enum amdgpu_ib_pool_type pool = direct_submit ?  		AMDGPU_IB_POOL_DIRECT :  		AMDGPU_IB_POOL_DELAYED;  	int r; - -	r = amdgpu_job_alloc_with_ib(adev, &adev->mman.entity, +	struct drm_sched_entity *entity = delayed ? &adev->mman.delayed : +						    &adev->mman.entity; +	r = amdgpu_job_alloc_with_ib(adev, entity,  				     AMDGPU_FENCE_OWNER_UNDEFINED,  				     num_dw * 4, pool, job);  	if (r) @@ -1997,10 +2110,10 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,  		       bool vm_needs_flush, bool tmz)  {  	struct amdgpu_device *adev = ring->adev; -	unsigned num_loops, num_dw; +	unsigned int num_loops, num_dw;  	struct amdgpu_job *job;  	uint32_t max_bytes; -	unsigned i; +	unsigned int i;  	int r;  	if (!direct_submit && !ring->sched.ready) { @@ -2012,7 +2125,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,  	num_loops = DIV_ROUND_UP(byte_count, max_bytes);  	num_dw = ALIGN(num_loops * adev->mman.buffer_funcs->copy_num_dw, 8);  	r = amdgpu_ttm_prepare_job(adev, direct_submit, num_dw, -				   resv, vm_needs_flush, &job); +				   resv, vm_needs_flush, &job, false);  	if (r)  		return r; @@ -2048,7 +2161,7 @@ static int amdgpu_ttm_fill_mem(struct amdgpu_ring *ring, uint32_t src_data,  			       uint64_t dst_addr, uint32_t byte_count,  			       struct dma_resv *resv,  			       struct dma_fence **fence, -			       bool vm_needs_flush) +			       bool vm_needs_flush, bool delayed)  {  	struct amdgpu_device *adev = ring->adev;  	unsigned int num_loops, num_dw; @@ -2061,7 +2174,7 @@ static int amdgpu_ttm_fill_mem(struct amdgpu_ring *ring, uint32_t src_data,  	num_loops = DIV_ROUND_UP_ULL(byte_count, max_bytes);  	num_dw = ALIGN(num_loops * adev->mman.buffer_funcs->fill_num_dw, 8);  	r = amdgpu_ttm_prepare_job(adev, false, num_dw, resv, vm_needs_flush, -				   &job); +				   &job, delayed);  	if (r)  		return r; @@ -2084,7 +2197,8 @@ static int amdgpu_ttm_fill_mem(struct amdgpu_ring *ring, uint32_t src_data,  int amdgpu_fill_buffer(struct amdgpu_bo *bo,  			uint32_t src_data,  			struct dma_resv *resv, -			struct dma_fence **f) +			struct dma_fence **f, +			bool delayed)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);  	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; @@ -2113,7 +2227,7 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,  			goto error;  		r = amdgpu_ttm_fill_mem(ring, src_data, to, cur_size, resv, -					&next, true); +					&next, true, delayed);  		if (r)  			goto error; @@ -2164,7 +2278,7 @@ int amdgpu_ttm_evict_resources(struct amdgpu_device *adev, int mem_type)  static int amdgpu_ttm_page_pool_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	return ttm_pool_debugfs(&adev->mman.bdev.pool, m);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index e2cd5894afc9..e82b1edee7a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -49,6 +49,7 @@ struct amdgpu_gtt_mgr {  struct amdgpu_mman {  	struct ttm_device		bdev; +	struct ttm_pool			*ttm_pools;  	bool				initialized;  	void __iomem			*aper_base_kaddr; @@ -60,6 +61,8 @@ struct amdgpu_mman {  	struct mutex				gtt_window_lock;  	/* Scheduler entity for buffer moves */  	struct drm_sched_entity			entity; +	/* Scheduler entity for VRAM clearing */ +	struct drm_sched_entity			delayed;  	struct amdgpu_vram_mgr vram_mgr;  	struct amdgpu_gtt_mgr gtt_mgr; @@ -78,7 +81,8 @@ struct amdgpu_mman {  	/* discovery */  	uint8_t				*discovery_bin;  	uint32_t			discovery_tmr_size; -	struct amdgpu_bo		*discovery_memory; +	/* fw reserved memory */ +	struct amdgpu_bo		*fw_reserved_memory;  	/* firmware VRAM reservation */  	u64		fw_vram_usage_start_offset; @@ -150,7 +154,8 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,  int amdgpu_fill_buffer(struct amdgpu_bo *bo,  			uint32_t src_data,  			struct dma_resv *resv, -			struct dma_fence **fence); +			struct dma_fence **fence, +			bool delayed);  int amdgpu_ttm_alloc_gart(struct ttm_buffer_object *bo);  void amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index f76b1cb8baf8..16807ff96dc9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -748,7 +748,7 @@ static int amdgpu_ucode_init_single_fw(struct amdgpu_device *adev,  	const struct imu_firmware_header_v1_0 *imu_hdr = NULL;  	u8 *ucode_addr; -	if (NULL == ucode->fw) +	if (!ucode->fw)  		return 0;  	ucode->mc_addr = mc_addr; @@ -972,7 +972,7 @@ static int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode,  	uint8_t *src_addr = NULL;  	uint8_t *dst_addr = NULL; -	if (NULL == ucode->fw) +	if (!ucode->fw)  		return 0;  	comm_hdr = (const struct common_firmware_header *)ucode->fw->data; @@ -1043,6 +1043,7 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)  			if (i == AMDGPU_UCODE_ID_CP_MEC1 &&  			    adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {  				const struct gfx_firmware_header_v1_0 *cp_hdr; +  				cp_hdr = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;  				amdgpu_ucode_patch_jt(ucode,  adev->firmware.fw_buf_mc + fw_offset,  						    adev->firmware.fw_buf_ptr + fw_offset); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h index 86133f77a9a4..43321f57f557 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h @@ -59,6 +59,8 @@ struct amdgpu_umc_ras {  				      void *ras_error_status);  	void (*ecc_info_query_ras_error_address)(struct amdgpu_device *adev,  					void *ras_error_status); +	/* support different eeprom table version for different asic */ +	void (*set_eeprom_table_version)(struct amdgpu_ras_eeprom_table_header *hdr);  };  struct amdgpu_umc_funcs { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umr.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_umr.h index 919d9d401750..107f9bb0e24f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umr.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umr.h @@ -35,17 +35,51 @@ struct amdgpu_debugfs_regs2_iocdata {  	} srbm;  }; +struct amdgpu_debugfs_regs2_iocdata_v2 { +	__u32 use_srbm, use_grbm, pg_lock; +	struct { +		__u32 se, sh, instance; +	} grbm; +	struct { +		__u32 me, pipe, queue, vmid; +	} srbm; +	u32 xcc_id; +}; + +struct amdgpu_debugfs_gprwave_iocdata { +	u32 gpr_or_wave, se, sh, cu, wave, simd, xcc_id; +	struct { +		u32 thread, vpgr_or_sgpr; +	} gpr; +}; +  /*   * MMIO debugfs state data (per file* handle)   */  struct amdgpu_debugfs_regs2_data {  	struct amdgpu_device *adev;  	struct mutex lock; -	struct amdgpu_debugfs_regs2_iocdata id; +	struct amdgpu_debugfs_regs2_iocdata_v2 id; +}; + +struct amdgpu_debugfs_gprwave_data { +	struct amdgpu_device *adev; +	struct mutex lock; +	struct amdgpu_debugfs_gprwave_iocdata id;  };  enum AMDGPU_DEBUGFS_REGS2_CMDS {  	AMDGPU_DEBUGFS_REGS2_CMD_SET_STATE=0, +	AMDGPU_DEBUGFS_REGS2_CMD_SET_STATE_V2, +}; + +enum AMDGPU_DEBUGFS_GPRWAVE_CMDS { +	AMDGPU_DEBUGFS_GPRWAVE_CMD_SET_STATE=0,  }; +//reg2 interface  #define AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE _IOWR(0x20, AMDGPU_DEBUGFS_REGS2_CMD_SET_STATE, struct amdgpu_debugfs_regs2_iocdata) +#define AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE_V2 _IOWR(0x20, AMDGPU_DEBUGFS_REGS2_CMD_SET_STATE_V2, struct amdgpu_debugfs_regs2_iocdata_v2) + +//gprwave interface +#define AMDGPU_DEBUGFS_GPRWAVE_IOC_SET_STATE _IOWR(0x20, AMDGPU_DEBUGFS_GPRWAVE_CMD_SET_STATE, struct amdgpu_debugfs_gprwave_iocdata) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 6887109abb13..b7441654e6fa 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c @@ -96,16 +96,16 @@   */  struct amdgpu_uvd_cs_ctx {  	struct amdgpu_cs_parser *parser; -	unsigned reg, count; -	unsigned data0, data1; -	unsigned idx; +	unsigned int reg, count; +	unsigned int data0, data1; +	unsigned int idx;  	struct amdgpu_ib *ib;  	/* does the IB has a msg command */  	bool has_msg_cmd;  	/* minimum buffer sizes */ -	unsigned *buf_sizes; +	unsigned int *buf_sizes;  };  #ifdef CONFIG_DRM_AMDGPU_SI @@ -186,7 +186,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)  	unsigned long bo_size;  	const char *fw_name;  	const struct common_firmware_header *hdr; -	unsigned family_id; +	unsigned int family_id;  	int i, j, r;  	INIT_DELAYED_WORK(&adev->uvd.idle_work, amdgpu_uvd_idle_work_handler); @@ -275,7 +275,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)  	family_id = le32_to_cpu(hdr->ucode_version) & 0xff;  	if (adev->asic_type < CHIP_VEGA20) { -		unsigned version_major, version_minor; +		unsigned int version_major, version_minor;  		version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;  		version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff; @@ -420,7 +420,7 @@ int amdgpu_uvd_entity_init(struct amdgpu_device *adev)  int amdgpu_uvd_suspend(struct amdgpu_device *adev)  { -	unsigned size; +	unsigned int size;  	void *ptr;  	int i, j, idx;  	bool in_ras_intr = amdgpu_ras_intr_triggered(); @@ -469,7 +469,7 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)  int amdgpu_uvd_resume(struct amdgpu_device *adev)  { -	unsigned size; +	unsigned int size;  	void *ptr;  	int i, idx; @@ -491,7 +491,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)  			adev->uvd.inst[i].saved_bo = NULL;  		} else {  			const struct common_firmware_header *hdr; -			unsigned offset; +			unsigned int offset;  			hdr = (const struct common_firmware_header *)adev->uvd.fw->data;  			if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { @@ -542,6 +542,7 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)  static void amdgpu_uvd_force_into_uvd_segment(struct amdgpu_bo *abo)  {  	int i; +  	for (i = 0; i < abo->placement.num_placement; ++i) {  		abo->placements[i].fpfn = 0 >> PAGE_SHIFT;  		abo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT; @@ -579,7 +580,7 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)  	r = amdgpu_cs_find_mapping(ctx->parser, addr, &bo, &mapping);  	if (r) { -		DRM_ERROR("Can't find BO for addr 0x%08Lx\n", addr); +		DRM_ERROR("Can't find BO for addr 0x%08llx\n", addr);  		return r;  	} @@ -589,6 +590,7 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)  		if (cmd == 0x0 || cmd == 0x3) {  			/* yes, force it into VRAM */  			uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM; +  			amdgpu_bo_placement_from_domain(bo, domain);  		}  		amdgpu_uvd_force_into_uvd_segment(bo); @@ -609,21 +611,21 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)   * Peek into the decode message and calculate the necessary buffer sizes.   */  static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg, -	unsigned buf_sizes[]) +	unsigned int buf_sizes[])  { -	unsigned stream_type = msg[4]; -	unsigned width = msg[6]; -	unsigned height = msg[7]; -	unsigned dpb_size = msg[9]; -	unsigned pitch = msg[28]; -	unsigned level = msg[57]; +	unsigned int stream_type = msg[4]; +	unsigned int width = msg[6]; +	unsigned int height = msg[7]; +	unsigned int dpb_size = msg[9]; +	unsigned int pitch = msg[28]; +	unsigned int level = msg[57]; -	unsigned width_in_mb = width / 16; -	unsigned height_in_mb = ALIGN(height / 16, 2); -	unsigned fs_in_mb = width_in_mb * height_in_mb; +	unsigned int width_in_mb = width / 16; +	unsigned int height_in_mb = ALIGN(height / 16, 2); +	unsigned int fs_in_mb = width_in_mb * height_in_mb; -	unsigned image_size, tmp, min_dpb_size, num_dpb_buffer; -	unsigned min_ctx_size = ~0; +	unsigned int image_size, tmp, min_dpb_size, num_dpb_buffer; +	unsigned int min_ctx_size = ~0;  	image_size = width * height;  	image_size += image_size / 2; @@ -631,7 +633,7 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,  	switch (stream_type) {  	case 0: /* H264 */ -		switch(level) { +		switch (level) {  		case 30:  			num_dpb_buffer = 8100 / fs_in_mb;  			break; @@ -709,7 +711,7 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,  		break;  	case 7: /* H264 Perf */ -		switch(level) { +		switch (level) {  		case 30:  			num_dpb_buffer = 8100 / fs_in_mb;  			break; @@ -742,7 +744,7 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,  		/* reference picture buffer */  		min_dpb_size = image_size * num_dpb_buffer; -		if (!adev->uvd.use_ctx_buf){ +		if (!adev->uvd.use_ctx_buf) {  			/* macroblock context buffer */  			min_dpb_size +=  				width_in_mb * height_in_mb * num_dpb_buffer * 192; @@ -805,7 +807,7 @@ static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,   * Make sure that we don't open up to many sessions.   */  static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx, -			     struct amdgpu_bo *bo, unsigned offset) +			     struct amdgpu_bo *bo, unsigned int offset)  {  	struct amdgpu_device *adev = ctx->parser->adev;  	int32_t *msg, msg_type, handle; @@ -911,7 +913,7 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)  	r = amdgpu_cs_find_mapping(ctx->parser, addr, &bo, &mapping);  	if (r) { -		DRM_ERROR("Can't find BO for addr 0x%08Lx\n", addr); +		DRM_ERROR("Can't find BO for addr 0x%08llx\n", addr);  		return r;  	} @@ -930,7 +932,7 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)  	if (cmd < 0x4) {  		if ((end - start) < ctx->buf_sizes[cmd]) {  			DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd, -				  (unsigned)(end - start), +				  (unsigned int)(end - start),  				  ctx->buf_sizes[cmd]);  			return -EINVAL;  		} @@ -938,7 +940,7 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)  	} else if (cmd == 0x206) {  		if ((end - start) < ctx->buf_sizes[4]) {  			DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd, -					  (unsigned)(end - start), +					  (unsigned int)(end - start),  					  ctx->buf_sizes[4]);  			return -EINVAL;  		} @@ -949,14 +951,14 @@ static int amdgpu_uvd_cs_pass2(struct amdgpu_uvd_cs_ctx *ctx)  	if (!ctx->parser->adev->uvd.address_64_bit) {  		if ((start >> 28) != ((end - 1) >> 28)) { -			DRM_ERROR("reloc %LX-%LX crossing 256MB boundary!\n", +			DRM_ERROR("reloc %llx-%llx crossing 256MB boundary!\n",  				  start, end);  			return -EINVAL;  		}  		if ((cmd == 0 || cmd == 0x3) &&  		    (start >> 28) != (ctx->parser->adev->uvd.inst->gpu_addr >> 28)) { -			DRM_ERROR("msg/fb buffer %LX-%LX out of 256MB segment!\n", +			DRM_ERROR("msg/fb buffer %llx-%llx out of 256MB segment!\n",  				  start, end);  			return -EINVAL;  		} @@ -990,7 +992,7 @@ static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx,  	ctx->idx++;  	for (i = 0; i <= ctx->count; ++i) { -		unsigned reg = ctx->reg + i; +		unsigned int reg = ctx->reg + i;  		if (ctx->idx >= ctx->ib->length_dw) {  			DRM_ERROR("Register command after end of CS!\n"); @@ -1036,7 +1038,8 @@ static int amdgpu_uvd_cs_packets(struct amdgpu_uvd_cs_ctx *ctx,  	for (ctx->idx = 0 ; ctx->idx < ctx->ib->length_dw; ) {  		uint32_t cmd = amdgpu_ib_get_value(ctx->ib, ctx->idx); -		unsigned type = CP_PACKET_GET_TYPE(cmd); +		unsigned int type = CP_PACKET_GET_TYPE(cmd); +  		switch (type) {  		case PACKET_TYPE0:  			ctx->reg = CP_PACKET0_GET_REG(cmd); @@ -1070,7 +1073,7 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser,  			     struct amdgpu_ib *ib)  {  	struct amdgpu_uvd_cs_ctx ctx = {}; -	unsigned buf_sizes[] = { +	unsigned int buf_sizes[] = {  		[0x00000000]	=	2048,  		[0x00000001]	=	0xFFFFFFFF,  		[0x00000002]	=	0xFFFFFFFF, @@ -1185,8 +1188,9 @@ err_free:  }  /* multiple fence commands without any stream commands in between can -   crash the vcpu so just try to emmit a dummy create/destroy msg to -   avoid this */ + * crash the vcpu so just try to emmit a dummy create/destroy msg to + * avoid this + */  int amdgpu_uvd_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,  			      struct dma_fence **fence)  { @@ -1252,15 +1256,14 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work)  {  	struct amdgpu_device *adev =  		container_of(work, struct amdgpu_device, uvd.idle_work.work); -	unsigned fences = 0, i, j; +	unsigned int fences = 0, i, j;  	for (i = 0; i < adev->uvd.num_uvd_inst; ++i) {  		if (adev->uvd.harvest_config & (1 << i))  			continue;  		fences += amdgpu_fence_count_emitted(&adev->uvd.inst[i].ring); -		for (j = 0; j < adev->uvd.num_enc_rings; ++j) { +		for (j = 0; j < adev->uvd.num_enc_rings; ++j)  			fences += amdgpu_fence_count_emitted(&adev->uvd.inst[i].ring_enc[j]); -		}  	}  	if (fences == 0) { @@ -1356,7 +1359,7 @@ error:   */  uint32_t amdgpu_uvd_used_handles(struct amdgpu_device *adev)  { -	unsigned i; +	unsigned int i;  	uint32_t used_handles = 0;  	for (i = 0; i < adev->uvd.max_handles; ++i) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index e2b7324a70cb..1904edf68407 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c @@ -99,7 +99,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)  {  	const char *fw_name;  	const struct common_firmware_header *hdr; -	unsigned ucode_version, version_major, version_minor, binary_id; +	unsigned int ucode_version, version_major, version_minor, binary_id;  	int i, r;  	switch (adev->asic_type) { @@ -207,7 +207,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)   */  int amdgpu_vce_sw_fini(struct amdgpu_device *adev)  { -	unsigned i; +	unsigned int i;  	if (adev->vce.vcpu_bo == NULL)  		return 0; @@ -286,7 +286,7 @@ int amdgpu_vce_resume(struct amdgpu_device *adev)  {  	void *cpu_addr;  	const struct common_firmware_header *hdr; -	unsigned offset; +	unsigned int offset;  	int r, idx;  	if (adev->vce.vcpu_bo == NULL) @@ -332,7 +332,7 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work)  {  	struct amdgpu_device *adev =  		container_of(work, struct amdgpu_device, vce.idle_work.work); -	unsigned i, count = 0; +	unsigned int i, count = 0;  	for (i = 0; i < adev->vce.num_rings; i++)  		count += amdgpu_fence_count_emitted(&adev->vce.ring[i]); @@ -409,6 +409,7 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp)  {  	struct amdgpu_ring *ring = &adev->vce.ring[0];  	int i, r; +  	for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) {  		uint32_t handle = atomic_read(&adev->vce.handles[i]); @@ -436,7 +437,7 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp)  static int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,  				     struct dma_fence **fence)  { -	const unsigned ib_size_dw = 1024; +	const unsigned int ib_size_dw = 1024;  	struct amdgpu_job *job;  	struct amdgpu_ib *ib;  	struct amdgpu_ib ib_msg; @@ -528,7 +529,7 @@ err:  static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,  				      bool direct, struct dma_fence **fence)  { -	const unsigned ib_size_dw = 1024; +	const unsigned int ib_size_dw = 1024;  	struct amdgpu_job *job;  	struct amdgpu_ib *ib;  	struct dma_fence *f = NULL; @@ -596,12 +597,12 @@ err:   */  static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p,  				  struct amdgpu_ib *ib, int lo, int hi, -				  unsigned size, int32_t index) +				  unsigned int size, int32_t index)  {  	int64_t offset = ((uint64_t)size) * ((int64_t)index);  	struct ttm_operation_ctx ctx = { false, false };  	struct amdgpu_bo_va_mapping *mapping; -	unsigned i, fpfn, lpfn; +	unsigned int i, fpfn, lpfn;  	struct amdgpu_bo *bo;  	uint64_t addr;  	int r; @@ -619,7 +620,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p,  	r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping);  	if (r) { -		DRM_ERROR("Can't find BO for addr 0x%010Lx %d %d %d %d\n", +		DRM_ERROR("Can't find BO for addr 0x%010llx %d %d %d %d\n",  			  addr, lo, hi, size, index);  		return r;  	} @@ -646,7 +647,7 @@ static int amdgpu_vce_validate_bo(struct amdgpu_cs_parser *p,   * Patch relocation inside command stream with real buffer address   */  static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, struct amdgpu_ib *ib, -			       int lo, int hi, unsigned size, uint32_t index) +			       int lo, int hi, unsigned int size, uint32_t index)  {  	struct amdgpu_bo_va_mapping *mapping;  	struct amdgpu_bo *bo; @@ -662,14 +663,14 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, struct amdgpu_ib *ib,  	r = amdgpu_cs_find_mapping(p, addr, &bo, &mapping);  	if (r) { -		DRM_ERROR("Can't find BO for addr 0x%010Lx %d %d %d %d\n", +		DRM_ERROR("Can't find BO for addr 0x%010llx %d %d %d %d\n",  			  addr, lo, hi, size, index);  		return r;  	}  	if ((addr + (uint64_t)size) >  	    (mapping->last + 1) * AMDGPU_GPU_PAGE_SIZE) { -		DRM_ERROR("BO too small for addr 0x%010Lx %d %d\n", +		DRM_ERROR("BO too small for addr 0x%010llx %d %d\n",  			  addr, lo, hi);  		return -EINVAL;  	} @@ -692,12 +693,12 @@ static int amdgpu_vce_cs_reloc(struct amdgpu_cs_parser *p, struct amdgpu_ib *ib,   * @allocated: allocated a new handle?   *   * Validates the handle and return the found session index or -EINVAL - * we we don't have another free session index. + * we don't have another free session index.   */  static int amdgpu_vce_validate_handle(struct amdgpu_cs_parser *p,  				      uint32_t handle, uint32_t *allocated)  { -	unsigned i; +	unsigned int i;  	/* validate the handle */  	for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) { @@ -735,14 +736,14 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p,  			     struct amdgpu_job *job,  			     struct amdgpu_ib *ib)  { -	unsigned fb_idx = 0, bs_idx = 0; +	unsigned int fb_idx = 0, bs_idx = 0;  	int session_idx = -1;  	uint32_t destroyed = 0;  	uint32_t created = 0;  	uint32_t allocated = 0;  	uint32_t tmp, handle = 0;  	uint32_t *size = &tmp; -	unsigned idx; +	unsigned int idx;  	int i, r = 0;  	job->vm = NULL; @@ -1084,7 +1085,7 @@ void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring,   *   */  void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, -				unsigned flags) +				unsigned int flags)  {  	WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); @@ -1106,7 +1107,7 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	uint32_t rptr; -	unsigned i; +	unsigned int i;  	int r, timeout = adev->usec_timeout;  	/* skip ring test for sriov*/ @@ -1171,7 +1172,7 @@ error:  enum amdgpu_ring_priority_level amdgpu_vce_get_ring_prio(int ring)  { -	switch(ring) { +	switch (ring) {  	case 0:  		return AMDGPU_RING_PRIO_0;  	case 1: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index e63fcc58e8e0..acbef1a24b9c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -56,6 +56,7 @@  #define FIRMWARE_VCN_3_1_2		"amdgpu/vcn_3_1_2.bin"  #define FIRMWARE_VCN4_0_0		"amdgpu/vcn_4_0_0.bin"  #define FIRMWARE_VCN4_0_2		"amdgpu/vcn_4_0_2.bin" +#define FIRMWARE_VCN4_0_3		"amdgpu/vcn_4_0_3.bin"  #define FIRMWARE_VCN4_0_4		"amdgpu/vcn_4_0_4.bin"  MODULE_FIRMWARE(FIRMWARE_RAVEN); @@ -77,6 +78,7 @@ MODULE_FIRMWARE(FIRMWARE_YELLOW_CARP);  MODULE_FIRMWARE(FIRMWARE_VCN_3_1_2);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_0);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_2); +MODULE_FIRMWARE(FIRMWARE_VCN4_0_3);  MODULE_FIRMWARE(FIRMWARE_VCN4_0_4);  static void amdgpu_vcn_idle_work_handler(struct work_struct *work); @@ -167,7 +169,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)  		bo_size += AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); -	if (adev->ip_versions[UVD_HWIP][0] >= IP_VERSION(4, 0, 0)){ +	if (adev->ip_versions[UVD_HWIP][0] >= IP_VERSION(4, 0, 0)) {  		fw_shared_size = AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn4_fw_shared));  		log_offset = offsetof(struct amdgpu_vcn4_fw_shared, fw_log);  	} else { @@ -233,11 +235,11 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  		if (adev->vcn.harvest_config & (1 << j))  			continue; -		if (adev->vcn.indirect_sram) { -			amdgpu_bo_free_kernel(&adev->vcn.inst[j].dpg_sram_bo, -						  &adev->vcn.inst[j].dpg_sram_gpu_addr, -						  (void **)&adev->vcn.inst[j].dpg_sram_cpu_addr); -		} +		amdgpu_bo_free_kernel( +			&adev->vcn.inst[j].dpg_sram_bo, +			&adev->vcn.inst[j].dpg_sram_gpu_addr, +			(void **)&adev->vcn.inst[j].dpg_sram_cpu_addr); +  		kvfree(adev->vcn.inst[j].saved_bo);  		amdgpu_bo_free_kernel(&adev->vcn.inst[j].vcpu_bo, @@ -274,20 +276,19 @@ bool amdgpu_vcn_is_disabled_vcn(struct amdgpu_device *adev, enum vcn_ring_type t  	bool ret = false;  	int vcn_config = adev->vcn.vcn_config[vcn_instance]; -	if ((type == VCN_ENCODE_RING) && (vcn_config & VCN_BLOCK_ENCODE_DISABLE_MASK)) { +	if ((type == VCN_ENCODE_RING) && (vcn_config & VCN_BLOCK_ENCODE_DISABLE_MASK))  		ret = true; -	} else if ((type == VCN_DECODE_RING) && (vcn_config & VCN_BLOCK_DECODE_DISABLE_MASK)) { +	else if ((type == VCN_DECODE_RING) && (vcn_config & VCN_BLOCK_DECODE_DISABLE_MASK))  		ret = true; -	} else if ((type == VCN_UNIFIED_RING) && (vcn_config & VCN_BLOCK_QUEUE_DISABLE_MASK)) { +	else if ((type == VCN_UNIFIED_RING) && (vcn_config & VCN_BLOCK_QUEUE_DISABLE_MASK))  		ret = true; -	}  	return ret;  }  int amdgpu_vcn_suspend(struct amdgpu_device *adev)  { -	unsigned size; +	unsigned int size;  	void *ptr;  	int i, idx; @@ -316,7 +317,7 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)  int amdgpu_vcn_resume(struct amdgpu_device *adev)  { -	unsigned size; +	unsigned int size;  	void *ptr;  	int i, idx; @@ -338,7 +339,7 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)  			adev->vcn.inst[i].saved_bo = NULL;  		} else {  			const struct common_firmware_header *hdr; -			unsigned offset; +			unsigned int offset;  			hdr = (const struct common_firmware_header *)adev->vcn.fw->data;  			if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { @@ -369,9 +370,8 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  		if (adev->vcn.harvest_config & (1 << j))  			continue; -		for (i = 0; i < adev->vcn.num_enc_rings; ++i) { +		for (i = 0; i < adev->vcn.num_enc_rings; ++i)  			fence[j] += amdgpu_fence_count_emitted(&adev->vcn.inst[j].ring_enc[i]); -		}  		if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)	{  			struct dpg_pause_state new_state; @@ -458,7 +458,7 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	uint32_t tmp = 0; -	unsigned i; +	unsigned int i;  	int r;  	/* VCN in SRIOV does not support direct register read/write */ @@ -795,7 +795,7 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	uint32_t rptr; -	unsigned i; +	unsigned int i;  	int r;  	if (amdgpu_sriov_vf(adev)) @@ -993,11 +993,14 @@ error:  int amdgpu_vcn_unified_ring_test_ib(struct amdgpu_ring *ring, long timeout)  { +	struct amdgpu_device *adev = ring->adev;  	long r; -	r = amdgpu_vcn_enc_ring_test_ib(ring, timeout); -	if (r) -		goto error; +	if (adev->ip_versions[UVD_HWIP][0] != IP_VERSION(4, 0, 3)) { +		r = amdgpu_vcn_enc_ring_test_ib(ring, timeout); +		if (r) +			goto error; +	}  	r =  amdgpu_vcn_dec_sw_ring_test_ib(ring, timeout); @@ -1007,7 +1010,7 @@ error:  enum amdgpu_ring_priority_level amdgpu_vcn_get_enc_ring_prio(int ring)  { -	switch(ring) { +	switch (ring) {  	case 0:  		return AMDGPU_RING_PRIO_0;  	case 1: @@ -1026,6 +1029,7 @@ void amdgpu_vcn_setup_ucode(struct amdgpu_device *adev)  	if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {  		const struct common_firmware_header *hdr; +  		hdr = (const struct common_firmware_header *)adev->vcn.fw->data;  		for (i = 0; i < adev->vcn.num_vcn_inst; i++) { @@ -1041,6 +1045,9 @@ void amdgpu_vcn_setup_ucode(struct amdgpu_device *adev)  			adev->firmware.ucode[idx].fw = adev->vcn.fw;  			adev->firmware.fw_size +=  				ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE); + +			if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(4, 0, 3)) +				break;  		}  		dev_info(adev->dev, "Will use PSP to load VCN firmware\n");  	} @@ -1051,7 +1058,7 @@ void amdgpu_vcn_setup_ucode(struct amdgpu_device *adev)   */  #if defined(CONFIG_DEBUG_FS)  static ssize_t amdgpu_debugfs_vcn_fwlog_read(struct file *f, char __user *buf, -                                             size_t size, loff_t *pos) +					     size_t size, loff_t *pos)  {  	struct amdgpu_vcn_inst *vcn;  	void *log_buf; @@ -1097,7 +1104,7 @@ static ssize_t amdgpu_debugfs_vcn_fwlog_read(struct file *f, char __user *buf,  			if (read_pos == AMDGPU_VCNFW_LOG_SIZE)  				read_pos = plog->header_size;  			if (read_num[i] == copy_to_user((buf + read_bytes), -			                                (log_buf + read_pos), read_num[i])) +							(log_buf + read_pos), read_num[i]))  				return -EFAULT;  			read_bytes += read_num[i]; @@ -1118,7 +1125,7 @@ static const struct file_operations amdgpu_debugfs_vcnfwlog_fops = {  #endif  void amdgpu_debugfs_vcn_fwlog_init(struct amdgpu_device *adev, uint8_t i, -                                   struct amdgpu_vcn_inst *vcn) +				   struct amdgpu_vcn_inst *vcn)  {  #if defined(CONFIG_DEBUG_FS)  	struct drm_minor *minor = adev_to_drm(adev)->primary; @@ -1126,7 +1133,7 @@ void amdgpu_debugfs_vcn_fwlog_init(struct amdgpu_device *adev, uint8_t i,  	char name[32];  	sprintf(name, "amdgpu_vcn_%d_fwlog", i); -	debugfs_create_file_size(name, S_IFREG | S_IRUGO, root, vcn, +	debugfs_create_file_size(name, S_IFREG | 0444, root, vcn,  				 &amdgpu_debugfs_vcnfwlog_fops,  				 AMDGPU_VCNFW_LOG_SIZE);  #endif @@ -1140,7 +1147,7 @@ void amdgpu_vcn_fwlog_init(struct amdgpu_vcn_inst *vcn)  	uint64_t fw_log_gpu_addr = vcn->fw_shared.gpu_addr + vcn->fw_shared.mem_size;  	volatile struct amdgpu_vcn_fwlog *log_buf = fw_log_cpu_addr;  	volatile struct amdgpu_fw_shared_fw_logging *fw_log = vcn->fw_shared.cpu_addr -                                                         + vcn->fw_shared.log_offset; +							 + vcn->fw_shared.log_offset;  	*flag |= cpu_to_le32(AMDGPU_VCN_FW_LOGGING_FLAG);  	fw_log->is_enabled = 1;  	fw_log->addr_lo = cpu_to_le32(fw_log_gpu_addr & 0xFFFFFFFF); @@ -1181,6 +1188,31 @@ int amdgpu_vcn_process_poison_irq(struct amdgpu_device *adev,  	return 0;  } +int amdgpu_vcn_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block) +{ +	int r, i; + +	r = amdgpu_ras_block_late_init(adev, ras_block); +	if (r) +		return r; + +	if (amdgpu_ras_is_supported(adev, ras_block->block)) { +		for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +			if (adev->vcn.harvest_config & (1 << i)) +				continue; + +			r = amdgpu_irq_get(adev, &adev->vcn.inst[i].ras_poison_irq, 0); +			if (r) +				goto late_fini; +		} +	} +	return 0; + +late_fini: +	amdgpu_ras_block_late_fini(adev, ras_block); +	return r; +} +  int amdgpu_vcn_ras_sw_init(struct amdgpu_device *adev)  {  	int err; @@ -1202,7 +1234,7 @@ int amdgpu_vcn_ras_sw_init(struct amdgpu_device *adev)  	adev->vcn.ras_if = &ras->ras_block.ras_comm;  	if (!ras->ras_block.ras_late_init) -		ras->ras_block.ras_late_init = amdgpu_ras_block_late_init; +		ras->ras_block.ras_late_init = amdgpu_vcn_ras_late_init;  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h index c730949ece7d..92d5534df5f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h @@ -32,7 +32,7 @@  #define AMDGPU_VCN_FIRMWARE_OFFSET	256  #define AMDGPU_VCN_MAX_ENC_RINGS	3 -#define AMDGPU_MAX_VCN_INSTANCES	2 +#define AMDGPU_MAX_VCN_INSTANCES	4  #define AMDGPU_MAX_VCN_ENC_RINGS  AMDGPU_VCN_MAX_ENC_RINGS * AMDGPU_MAX_VCN_INSTANCES  #define AMDGPU_VCN_HARVEST_VCN0 (1 << 0) @@ -141,18 +141,23 @@  		RREG32_SOC15(VCN, inst_idx, mmUVD_DPG_LMA_DATA);				\  	}) -#define WREG32_SOC15_DPG_MODE(inst_idx, offset, value, mask_en, indirect)			\ -	do {											\ -		if (!indirect) {								\ -			WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_LMA_DATA, value);			\ -			WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_LMA_CTL, 				\ -				(0x1 << UVD_DPG_LMA_CTL__READ_WRITE__SHIFT |			\ -				 mask_en << UVD_DPG_LMA_CTL__MASK_EN__SHIFT |			\ -				 offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT));		\ -		} else {									\ -			*adev->vcn.inst[inst_idx].dpg_sram_curr_addr++ = offset;		\ -			*adev->vcn.inst[inst_idx].dpg_sram_curr_addr++ = value;			\ -		}										\ +#define WREG32_SOC15_DPG_MODE(inst_idx, offset, value, mask_en, indirect)             \ +	do {                                                                          \ +		if (!indirect) {                                                      \ +			WREG32_SOC15(VCN, GET_INST(VCN, inst_idx),                    \ +				     mmUVD_DPG_LMA_DATA, value);                      \ +			WREG32_SOC15(                                                 \ +				VCN, GET_INST(VCN, inst_idx),                         \ +				mmUVD_DPG_LMA_CTL,                                    \ +				(0x1 << UVD_DPG_LMA_CTL__READ_WRITE__SHIFT |          \ +				 mask_en << UVD_DPG_LMA_CTL__MASK_EN__SHIFT |         \ +				 offset << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT)); \ +		} else {                                                              \ +			*adev->vcn.inst[inst_idx].dpg_sram_curr_addr++ =              \ +				offset;                                               \ +			*adev->vcn.inst[inst_idx].dpg_sram_curr_addr++ =              \ +				value;                                                \ +		}                                                                     \  	} while (0)  #define AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE (1 << 2) @@ -234,6 +239,7 @@ struct amdgpu_vcn_inst {  	struct amdgpu_ring	ring_enc[AMDGPU_VCN_MAX_ENC_RINGS];  	atomic_t		sched_score;  	struct amdgpu_irq_src	irq; +	struct amdgpu_irq_src	ras_poison_irq;  	struct amdgpu_vcn_reg	external;  	struct amdgpu_bo	*dpg_sram_bo;  	struct dpg_pause_state	pause_state; @@ -242,6 +248,7 @@ struct amdgpu_vcn_inst {  	uint32_t		*dpg_sram_curr_addr;  	atomic_t		dpg_enc_submission_cnt;  	struct amdgpu_vcn_fw_shared fw_shared; +	uint8_t			aid_id;  };  struct amdgpu_vcn_ras { @@ -271,6 +278,9 @@ struct amdgpu_vcn {  	struct ras_common_if    *ras_if;  	struct amdgpu_vcn_ras   *ras; + +	uint16_t inst_mask; +	uint8_t	num_inst_per_aid;  };  struct amdgpu_fw_shared_rb_ptrs_struct { @@ -400,6 +410,8 @@ void amdgpu_debugfs_vcn_fwlog_init(struct amdgpu_device *adev,  int amdgpu_vcn_process_poison_irq(struct amdgpu_device *adev,  			struct amdgpu_irq_src *source,  			struct amdgpu_iv_entry *entry); +int amdgpu_vcn_ras_late_init(struct amdgpu_device *adev, +			struct ras_common_if *ras_block);  int amdgpu_vcn_ras_sw_init(struct amdgpu_device *adev);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index f2e2cbaa7fde..25b4d7f0bd35 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -56,7 +56,8 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)  	/* enable virtual display */  	if (adev->asic_type != CHIP_ALDEBARAN && -	    adev->asic_type != CHIP_ARCTURUS) { +	    adev->asic_type != CHIP_ARCTURUS && +	    ((adev->pdev->class >> 8) != PCI_CLASS_ACCELERATOR_PROCESSING)) {  		if (adev->mode_info.num_crtc == 0)  			adev->mode_info.num_crtc = 1;  		adev->enable_virtual_display = true; @@ -65,16 +66,19 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)  	adev->cg_flags = 0;  	adev->pg_flags = 0; -	/* enable mcbp for sriov asic_type before soc21 */ -	amdgpu_mcbp = (adev->asic_type < CHIP_IP_DISCOVERY) ? 1 : 0; +	/* enable mcbp for sriov */ +	amdgpu_mcbp = 1; +	/* Reduce kcq number to 2 to reduce latency */ +	if (amdgpu_num_kcq == -1) +		amdgpu_num_kcq = 2;  }  void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,  					uint32_t reg0, uint32_t reg1,  					uint32_t ref, uint32_t mask)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *ring = &kiq->ring;  	signed long r, cnt = 0;  	unsigned long flags; @@ -557,7 +561,6 @@ static void amdgpu_virt_populate_vf2pf_ucode_info(struct amdgpu_device *adev)  	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_RLC_SRLS, adev->gfx.rlc_srls_fw_version);  	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_MEC,      adev->gfx.mec_fw_version);  	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_MEC2,     adev->gfx.mec2_fw_version); -	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_IMU,      adev->gfx.imu_fw_version);  	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_SOS,      adev->psp.sos.fw_version);  	POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_ASD,  			    adev->psp.asd_context.bin_desc.fw_version); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 3c0310576b3b..dc80c9c8fd14 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1358,6 +1358,7 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,  	amdgpu_vm_bo_base_init(&bo_va->base, vm, bo);  	bo_va->ref_count = 1; +	bo_va->last_pt_update = dma_fence_get_stub();  	INIT_LIST_HEAD(&bo_va->valids);  	INIT_LIST_HEAD(&bo_va->invalids); @@ -1433,14 +1434,14 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,  	uint64_t eaddr;  	/* validate the parameters */ -	if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || -	    size == 0 || size & ~PAGE_MASK) +	if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || size & ~PAGE_MASK) +		return -EINVAL; +	if (saddr + size <= saddr || offset + size <= offset)  		return -EINVAL;  	/* make sure object fit at this offset */  	eaddr = saddr + size - 1; -	if (saddr >= eaddr || -	    (bo && offset + size > amdgpu_bo_size(bo)) || +	if ((bo && offset + size > amdgpu_bo_size(bo)) ||  	    (eaddr >= adev->vm_manager.max_pfn << AMDGPU_GPU_PAGE_SHIFT))  		return -EINVAL; @@ -1499,14 +1500,14 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev,  	int r;  	/* validate the parameters */ -	if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || -	    size == 0 || size & ~PAGE_MASK) +	if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || size & ~PAGE_MASK) +		return -EINVAL; +	if (saddr + size <= saddr || offset + size <= offset)  		return -EINVAL;  	/* make sure object fit at this offset */  	eaddr = saddr + size - 1; -	if (saddr >= eaddr || -	    (bo && offset + size > amdgpu_bo_size(bo)) || +	if ((bo && offset + size > amdgpu_bo_size(bo)) ||  	    (eaddr >= adev->vm_manager.max_pfn << AMDGPU_GPU_PAGE_SHIFT))  		return -EINVAL; @@ -2067,7 +2068,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		vm->update_funcs = &amdgpu_vm_cpu_funcs;  	else  		vm->update_funcs = &amdgpu_vm_sdma_funcs; -	vm->last_update = NULL; + +	vm->last_update = dma_fence_get_stub();  	vm->last_unlocked = dma_fence_get_stub();  	vm->last_tlb_flush = dma_fence_get_stub(); @@ -2192,7 +2194,7 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		goto unreserve_bo;  	dma_fence_put(vm->last_update); -	vm->last_update = NULL; +	vm->last_update = dma_fence_get_stub();  	vm->is_compute_context = true;  	/* Free the shadow bo for compute VM */ @@ -2282,8 +2284,14 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	}  	dma_fence_put(vm->last_update); -	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) -		amdgpu_vmid_free_reserved(adev, vm, i); + +	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) { +		if (vm->reserved_vmid[i]) { +			amdgpu_vmid_free_reserved(adev, i); +			vm->reserved_vmid[i] = false; +		} +	} +  }  /** @@ -2366,18 +2374,25 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  	union drm_amdgpu_vm *args = data;  	struct amdgpu_device *adev = drm_to_adev(dev);  	struct amdgpu_fpriv *fpriv = filp->driver_priv; -	int r; + +	/* No valid flags defined yet */ +	if (args->in.flags) +		return -EINVAL;  	switch (args->in.op) {  	case AMDGPU_VM_OP_RESERVE_VMID:  		/* We only have requirement to reserve vmid from gfxhub */ -		r = amdgpu_vmid_alloc_reserved(adev, &fpriv->vm, -					       AMDGPU_GFXHUB_0); -		if (r) -			return r; +		if (!fpriv->vm.reserved_vmid[AMDGPU_GFXHUB(0)]) { +			amdgpu_vmid_alloc_reserved(adev, AMDGPU_GFXHUB(0)); +			fpriv->vm.reserved_vmid[AMDGPU_GFXHUB(0)] = true; +		} +  		break;  	case AMDGPU_VM_OP_UNRESERVE_VMID: -		amdgpu_vmid_free_reserved(adev, &fpriv->vm, AMDGPU_GFXHUB_0); +		if (fpriv->vm.reserved_vmid[AMDGPU_GFXHUB(0)]) { +			amdgpu_vmid_free_reserved(adev, AMDGPU_GFXHUB(0)); +			fpriv->vm.reserved_vmid[AMDGPU_GFXHUB(0)] = false; +		}  		break;  	default:  		return -EINVAL; @@ -2432,6 +2447,9 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)   * amdgpu_vm_handle_fault - graceful handling of VM faults.   * @adev: amdgpu device pointer   * @pasid: PASID of the VM + * @vmid: VMID, only used for GFX 9.4.3. + * @node_id: Node_id received in IH cookie. Only applicable for + *           GFX 9.4.3.   * @addr: Address of the fault   * @write_fault: true is write fault, false is read fault   * @@ -2439,7 +2457,8 @@ void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)   * shouldn't be reported any more.   */  bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, -			    uint64_t addr, bool write_fault) +			    u32 vmid, u32 node_id, uint64_t addr, +			    bool write_fault)  {  	bool is_compute_context = false;  	struct amdgpu_bo *root; @@ -2463,8 +2482,8 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,  	addr /= AMDGPU_GPU_PAGE_SIZE; -	if (is_compute_context && -	    !svm_range_restore_pages(adev, pasid, addr, write_fault)) { +	if (is_compute_context && !svm_range_restore_pages(adev, pasid, vmid, +	    node_id, addr, write_fault)) {  		amdgpu_bo_unref(&root);  		return true;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index 6f085f0b4ef3..14f9a2bf3acb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -111,11 +111,14 @@ struct amdgpu_mem_stats;  /* Reserve 4MB VRAM for page tables */  #define AMDGPU_VM_RESERVED_VRAM		(8ULL << 20) -/* max number of VMHUB */ -#define AMDGPU_MAX_VMHUBS			3 -#define AMDGPU_GFXHUB_0				0 -#define AMDGPU_MMHUB_0				1 -#define AMDGPU_MMHUB_1				2 +/* + * max number of VMHUB + * layout: max 8 GFXHUB + 4 MMHUB0 + 1 MMHUB1 + */ +#define AMDGPU_MAX_VMHUBS			13 +#define AMDGPU_GFXHUB(x)			(x) +#define AMDGPU_MMHUB0(x)			(8 + x) +#define AMDGPU_MMHUB1(x)			(8 + 4 + x)  /* Reserve 2MB at top/bottom of address space for kernel use */  #define AMDGPU_VA_RESERVED_SIZE			(2ULL << 20) @@ -326,6 +329,9 @@ struct amdgpu_vm {  	struct ttm_lru_bulk_move lru_bulk_move;  	/* Flag to indicate if VM is used for compute */  	bool			is_compute_context; + +	/* Memory partition number, -1 means any partition */ +	int8_t			mem_id;  };  struct amdgpu_vm_manager { @@ -452,7 +458,8 @@ void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev);  void amdgpu_vm_get_task_info(struct amdgpu_device *adev, u32 pasid,  			     struct amdgpu_task_info *task_info);  bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, -			    uint64_t addr, bool write_fault); +			    u32 vmid, u32 node_id, uint64_t addr, +			    bool write_fault);  void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c index df63dc3bca18..dea1a64be44d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c @@ -502,6 +502,7 @@ exit:  int amdgpu_vm_pt_create(struct amdgpu_device *adev, struct amdgpu_vm *vm,  			int level, bool immediate, struct amdgpu_bo_vm **vmbo)  { +	struct amdgpu_fpriv *fpriv = container_of(vm, struct amdgpu_fpriv, vm);  	struct amdgpu_bo_param bp;  	struct amdgpu_bo *bo;  	struct dma_resv *resv; @@ -512,7 +513,12 @@ int amdgpu_vm_pt_create(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	bp.size = amdgpu_vm_pt_size(adev, level);  	bp.byte_align = AMDGPU_GPU_PAGE_SIZE; -	bp.domain = AMDGPU_GEM_DOMAIN_VRAM; + +	if (!adev->gmc.is_app_apu) +		bp.domain = AMDGPU_GEM_DOMAIN_VRAM; +	else +		bp.domain = AMDGPU_GEM_DOMAIN_GTT; +  	bp.domain = amdgpu_bo_get_preferred_domain(adev, bp.domain);  	bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |  		AMDGPU_GEM_CREATE_CPU_GTT_USWC; @@ -529,6 +535,8 @@ int amdgpu_vm_pt_create(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	bp.type = ttm_bo_type_kernel;  	bp.no_wait_gpu = immediate; +	bp.xcp_id_plus1 = fpriv->xcp_id == ~0 ? 0 : fpriv->xcp_id + 1; +  	if (vm->root.bo)  		bp.resv = vm->root.bo->tbo.base.resv; @@ -553,6 +561,7 @@ int amdgpu_vm_pt_create(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	bp.type = ttm_bo_type_kernel;  	bp.resv = bo->tbo.base.resv;  	bp.bo_ptr_size = sizeof(struct amdgpu_bo); +	bp.xcp_id_plus1 = fpriv->xcp_id == ~0 ? 0 : fpriv->xcp_id + 1;  	r = amdgpu_bo_create(adev, &bp, &(*vmbo)->shadow); @@ -564,7 +573,6 @@ int amdgpu_vm_pt_create(struct amdgpu_device *adev, struct amdgpu_vm *vm,  		return r;  	} -	(*vmbo)->shadow->parent = amdgpu_bo_ref(bo);  	amdgpu_bo_add_to_shadow_list(*vmbo);  	return 0; @@ -781,13 +789,14 @@ static void amdgpu_vm_pte_update_flags(struct amdgpu_vm_update_params *params,  				       uint64_t pe, uint64_t addr,  				       unsigned int count, uint32_t incr,  				       uint64_t flags) -  { +	struct amdgpu_device *adev = params->adev; +  	if (level != AMDGPU_VM_PTB) {  		flags |= AMDGPU_PDE_PTE; -		amdgpu_gmc_get_vm_pde(params->adev, level, &addr, &flags); +		amdgpu_gmc_get_vm_pde(adev, level, &addr, &flags); -	} else if (params->adev->asic_type >= CHIP_VEGA10 && +	} else if (adev->asic_type >= CHIP_VEGA10 &&  		   !(flags & AMDGPU_PTE_VALID) &&  		   !(flags & AMDGPU_PTE_PRT)) { @@ -795,6 +804,21 @@ static void amdgpu_vm_pte_update_flags(struct amdgpu_vm_update_params *params,  		flags |= AMDGPU_PTE_EXECUTABLE;  	} +	/* APUs mapping system memory may need different MTYPEs on different +	 * NUMA nodes. Only do this for contiguous ranges that can be assumed +	 * to be on the same NUMA node. +	 */ +	if ((flags & AMDGPU_PTE_SYSTEM) && (adev->flags & AMD_IS_APU) && +	    adev->gmc.gmc_funcs->override_vm_pte_flags && +	    num_possible_nodes() > 1) { +		if (!params->pages_addr) +			amdgpu_gmc_override_vm_pte_flags(adev, params->vm, +							 addr, &flags); +		else +			dev_dbg(adev->dev, +				"override_vm_pte_flags skipped: non-contiguous\n"); +	} +  	params->vm->update_funcs->update(params, pt, pe, addr, count, incr,  					 flags);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 43d6a9d6a538..c7085a747b03 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -370,6 +370,45 @@ out:  	return ret;  } +static void amdgpu_dummy_vram_mgr_debug(struct ttm_resource_manager *man, +				  struct drm_printer *printer) +{ +	DRM_DEBUG_DRIVER("Dummy vram mgr debug\n"); +} + +static bool amdgpu_dummy_vram_mgr_compatible(struct ttm_resource_manager *man, +				       struct ttm_resource *res, +				       const struct ttm_place *place, +				       size_t size) +{ +	DRM_DEBUG_DRIVER("Dummy vram mgr compatible\n"); +	return false; +} + +static bool amdgpu_dummy_vram_mgr_intersects(struct ttm_resource_manager *man, +				       struct ttm_resource *res, +				       const struct ttm_place *place, +				       size_t size) +{ +	DRM_DEBUG_DRIVER("Dummy vram mgr intersects\n"); +	return true; +} + +static void amdgpu_dummy_vram_mgr_del(struct ttm_resource_manager *man, +				struct ttm_resource *res) +{ +	DRM_DEBUG_DRIVER("Dummy vram mgr deleted\n"); +} + +static int amdgpu_dummy_vram_mgr_new(struct ttm_resource_manager *man, +			       struct ttm_buffer_object *tbo, +			       const struct ttm_place *place, +			       struct ttm_resource **res) +{ +	DRM_DEBUG_DRIVER("Dummy vram mgr new\n"); +	return -ENOSPC; +} +  /**   * amdgpu_vram_mgr_new - allocate new ranges   * @@ -800,7 +839,7 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man,  {  	struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);  	struct drm_buddy *mm = &mgr->mm; -	struct drm_buddy_block *block; +	struct amdgpu_vram_reservation *rsv;  	drm_printf(printer, "  vis usage:%llu\n",  		   amdgpu_vram_mgr_vis_usage(mgr)); @@ -812,11 +851,20 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man,  	drm_buddy_print(mm, printer);  	drm_printf(printer, "reserved:\n"); -	list_for_each_entry(block, &mgr->reserved_pages, link) -		drm_buddy_block_print(mm, block, printer); +	list_for_each_entry(rsv, &mgr->reserved_pages, blocks) +		drm_printf(printer, "%#018llx-%#018llx: %llu\n", +			rsv->start, rsv->start + rsv->size, rsv->size);  	mutex_unlock(&mgr->lock);  } +static const struct ttm_resource_manager_func amdgpu_dummy_vram_mgr_func = { +	.alloc	= amdgpu_dummy_vram_mgr_new, +	.free	= amdgpu_dummy_vram_mgr_del, +	.intersects = amdgpu_dummy_vram_mgr_intersects, +	.compatible = amdgpu_dummy_vram_mgr_compatible, +	.debug	= amdgpu_dummy_vram_mgr_debug +}; +  static const struct ttm_resource_manager_func amdgpu_vram_mgr_func = {  	.alloc	= amdgpu_vram_mgr_new,  	.free	= amdgpu_vram_mgr_del, @@ -841,17 +889,22 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev)  	ttm_resource_manager_init(man, &adev->mman.bdev,  				  adev->gmc.real_vram_size); -	man->func = &amdgpu_vram_mgr_func; - -	err = drm_buddy_init(&mgr->mm, man->size, PAGE_SIZE); -	if (err) -		return err; -  	mutex_init(&mgr->lock);  	INIT_LIST_HEAD(&mgr->reservations_pending);  	INIT_LIST_HEAD(&mgr->reserved_pages);  	mgr->default_page_size = PAGE_SIZE; +	if (!adev->gmc.is_app_apu) { +		man->func = &amdgpu_vram_mgr_func; + +		err = drm_buddy_init(&mgr->mm, man->size, PAGE_SIZE); +		if (err) +			return err; +	} else { +		man->func = &amdgpu_dummy_vram_mgr_func; +		DRM_INFO("Setup dummy vram mgr\n"); +	} +  	ttm_set_driver_manager(&adev->mman.bdev, TTM_PL_VRAM, &mgr->manager);  	ttm_resource_manager_set_used(man, true);  	return 0; @@ -886,7 +939,8 @@ void amdgpu_vram_mgr_fini(struct amdgpu_device *adev)  		drm_buddy_free_list(&mgr->mm, &rsv->allocated);  		kfree(rsv);  	} -	drm_buddy_fini(&mgr->mm); +	if (!adev->gmc.is_app_apu) +		drm_buddy_fini(&mgr->mm);  	mutex_unlock(&mgr->lock);  	ttm_resource_manager_cleanup(man); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c new file mode 100644 index 000000000000..d733fa6e7477 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c @@ -0,0 +1,399 @@ +/* + * Copyright 2022 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 "amdgpu_xcp.h" +#include "amdgpu_drv.h" + +#include <drm/drm_drv.h> +#include "../amdxcp/amdgpu_xcp_drv.h" + +static int __amdgpu_xcp_run(struct amdgpu_xcp_mgr *xcp_mgr, +			    struct amdgpu_xcp_ip *xcp_ip, int xcp_state) +{ +	int (*run_func)(void *handle, uint32_t inst_mask); +	int ret = 0; + +	if (!xcp_ip || !xcp_ip->valid || !xcp_ip->ip_funcs) +		return 0; + +	run_func = NULL; + +	switch (xcp_state) { +	case AMDGPU_XCP_PREPARE_SUSPEND: +		run_func = xcp_ip->ip_funcs->prepare_suspend; +		break; +	case AMDGPU_XCP_SUSPEND: +		run_func = xcp_ip->ip_funcs->suspend; +		break; +	case AMDGPU_XCP_PREPARE_RESUME: +		run_func = xcp_ip->ip_funcs->prepare_resume; +		break; +	case AMDGPU_XCP_RESUME: +		run_func = xcp_ip->ip_funcs->resume; +		break; +	} + +	if (run_func) +		ret = run_func(xcp_mgr->adev, xcp_ip->inst_mask); + +	return ret; +} + +static int amdgpu_xcp_run_transition(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id, +				     int state) +{ +	struct amdgpu_xcp_ip *xcp_ip; +	struct amdgpu_xcp *xcp; +	int i, ret; + +	if (xcp_id >= MAX_XCP || !xcp_mgr->xcp[xcp_id].valid) +		return -EINVAL; + +	xcp = &xcp_mgr->xcp[xcp_id]; +	for (i = 0; i < AMDGPU_XCP_MAX_BLOCKS; ++i) { +		xcp_ip = &xcp->ip[i]; +		ret = __amdgpu_xcp_run(xcp_mgr, xcp_ip, state); +		if (ret) +			break; +	} + +	return ret; +} + +int amdgpu_xcp_prepare_suspend(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id) +{ +	return amdgpu_xcp_run_transition(xcp_mgr, xcp_id, +					 AMDGPU_XCP_PREPARE_SUSPEND); +} + +int amdgpu_xcp_suspend(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id) +{ +	return amdgpu_xcp_run_transition(xcp_mgr, xcp_id, AMDGPU_XCP_SUSPEND); +} + +int amdgpu_xcp_prepare_resume(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id) +{ +	return amdgpu_xcp_run_transition(xcp_mgr, xcp_id, +					 AMDGPU_XCP_PREPARE_RESUME); +} + +int amdgpu_xcp_resume(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id) +{ +	return amdgpu_xcp_run_transition(xcp_mgr, xcp_id, AMDGPU_XCP_RESUME); +} + +static void __amdgpu_xcp_add_block(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id, +				   struct amdgpu_xcp_ip *ip) +{ +	struct amdgpu_xcp *xcp; + +	if (!ip) +		return; + +	xcp = &xcp_mgr->xcp[xcp_id]; +	xcp->ip[ip->ip_id] = *ip; +	xcp->ip[ip->ip_id].valid = true; + +	xcp->valid = true; +} + +int amdgpu_xcp_init(struct amdgpu_xcp_mgr *xcp_mgr, int num_xcps, int mode) +{ +	struct amdgpu_device *adev = xcp_mgr->adev; +	struct amdgpu_xcp_ip ip; +	uint8_t mem_id; +	int i, j, ret; + +	if (!num_xcps || num_xcps > MAX_XCP) +		return -EINVAL; + +	xcp_mgr->mode = mode; + +	for (i = 0; i < MAX_XCP; ++i) +		xcp_mgr->xcp[i].valid = false; + +	for (i = 0; i < num_xcps; ++i) { +		for (j = AMDGPU_XCP_GFXHUB; j < AMDGPU_XCP_MAX_BLOCKS; ++j) { +			ret = xcp_mgr->funcs->get_ip_details(xcp_mgr, i, j, +							     &ip); +			if (ret) +				continue; + +			__amdgpu_xcp_add_block(xcp_mgr, i, &ip); +		} + +		xcp_mgr->xcp[i].id = i; + +		if (xcp_mgr->funcs->get_xcp_mem_id) { +			ret = xcp_mgr->funcs->get_xcp_mem_id( +				xcp_mgr, &xcp_mgr->xcp[i], &mem_id); +			if (ret) +				continue; +			else +				xcp_mgr->xcp[i].mem_id = mem_id; +		} +	} + +	xcp_mgr->num_xcps = num_xcps; +	amdgpu_xcp_update_partition_sched_list(adev); + +	xcp_mgr->num_xcp_per_mem_partition = num_xcps / xcp_mgr->adev->gmc.num_mem_partitions; +	return 0; +} + +int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode) +{ +	int ret, curr_mode, num_xcps = 0; + +	if (!xcp_mgr || mode == AMDGPU_XCP_MODE_NONE) +		return -EINVAL; + +	if (xcp_mgr->mode == mode) +		return 0; + +	if (!xcp_mgr->funcs || !xcp_mgr->funcs->switch_partition_mode) +		return 0; + +	mutex_lock(&xcp_mgr->xcp_lock); + +	curr_mode = xcp_mgr->mode; +	/* State set to transient mode */ +	xcp_mgr->mode = AMDGPU_XCP_MODE_TRANS; + +	ret = xcp_mgr->funcs->switch_partition_mode(xcp_mgr, mode, &num_xcps); + +	if (ret) { +		/* Failed, get whatever mode it's at now */ +		if (xcp_mgr->funcs->query_partition_mode) +			xcp_mgr->mode = amdgpu_xcp_query_partition_mode( +				xcp_mgr, AMDGPU_XCP_FL_LOCKED); +		else +			xcp_mgr->mode = curr_mode; + +		goto out; +	} + +out: +	mutex_unlock(&xcp_mgr->xcp_lock); + +	return ret; +} + +int amdgpu_xcp_query_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags) +{ +	int mode; + +	if (xcp_mgr->mode == AMDGPU_XCP_MODE_NONE) +		return xcp_mgr->mode; + +	if (!xcp_mgr->funcs || !xcp_mgr->funcs->query_partition_mode) +		return xcp_mgr->mode; + +	if (!(flags & AMDGPU_XCP_FL_LOCKED)) +		mutex_lock(&xcp_mgr->xcp_lock); +	mode = xcp_mgr->funcs->query_partition_mode(xcp_mgr); +	if (xcp_mgr->mode != AMDGPU_XCP_MODE_TRANS && mode != xcp_mgr->mode) +		dev_WARN( +			xcp_mgr->adev->dev, +			"Cached partition mode %d not matching with device mode %d", +			xcp_mgr->mode, mode); + +	if (!(flags & AMDGPU_XCP_FL_LOCKED)) +		mutex_unlock(&xcp_mgr->xcp_lock); + +	return mode; +} + +static int amdgpu_xcp_dev_alloc(struct amdgpu_device *adev) +{ +	struct drm_device *p_ddev; +	struct drm_device *ddev; +	int i, ret; + +	ddev = adev_to_drm(adev); + +	for (i = 0; i < MAX_XCP; i++) { +		ret = amdgpu_xcp_drm_dev_alloc(&p_ddev); +		if (ret) +			return ret; + +		/* Redirect all IOCTLs to the primary device */ +		adev->xcp_mgr->xcp[i].rdev = p_ddev->render->dev; +		adev->xcp_mgr->xcp[i].pdev = p_ddev->primary->dev; +		adev->xcp_mgr->xcp[i].driver = (struct drm_driver *)p_ddev->driver; +		adev->xcp_mgr->xcp[i].vma_offset_manager = p_ddev->vma_offset_manager; +		p_ddev->render->dev = ddev; +		p_ddev->primary->dev = ddev; +		p_ddev->vma_offset_manager = ddev->vma_offset_manager; +		p_ddev->driver = &amdgpu_partition_driver; +		adev->xcp_mgr->xcp[i].ddev = p_ddev; +	} + +	return 0; +} + +int amdgpu_xcp_mgr_init(struct amdgpu_device *adev, int init_mode, +			int init_num_xcps, +			struct amdgpu_xcp_mgr_funcs *xcp_funcs) +{ +	struct amdgpu_xcp_mgr *xcp_mgr; + +	if (!xcp_funcs || !xcp_funcs->switch_partition_mode || +	    !xcp_funcs->get_ip_details) +		return -EINVAL; + +	xcp_mgr = kzalloc(sizeof(*xcp_mgr), GFP_KERNEL); + +	if (!xcp_mgr) +		return -ENOMEM; + +	xcp_mgr->adev = adev; +	xcp_mgr->funcs = xcp_funcs; +	xcp_mgr->mode = init_mode; +	mutex_init(&xcp_mgr->xcp_lock); + +	if (init_mode != AMDGPU_XCP_MODE_NONE) +		amdgpu_xcp_init(xcp_mgr, init_num_xcps, init_mode); + +	adev->xcp_mgr = xcp_mgr; + +	return amdgpu_xcp_dev_alloc(adev); +} + +int amdgpu_xcp_get_partition(struct amdgpu_xcp_mgr *xcp_mgr, +			     enum AMDGPU_XCP_IP_BLOCK ip, int instance) +{ +	struct amdgpu_xcp *xcp; +	int i, id_mask = 0; + +	if (ip >= AMDGPU_XCP_MAX_BLOCKS) +		return -EINVAL; + +	for (i = 0; i < xcp_mgr->num_xcps; ++i) { +		xcp = &xcp_mgr->xcp[i]; +		if ((xcp->valid) && (xcp->ip[ip].valid) && +		    (xcp->ip[ip].inst_mask & BIT(instance))) +			id_mask |= BIT(i); +	} + +	if (!id_mask) +		id_mask = -ENXIO; + +	return id_mask; +} + +int amdgpu_xcp_get_inst_details(struct amdgpu_xcp *xcp, +				enum AMDGPU_XCP_IP_BLOCK ip, +				uint32_t *inst_mask) +{ +	if (!xcp->valid || !inst_mask || !(xcp->ip[ip].valid)) +		return -EINVAL; + +	*inst_mask = xcp->ip[ip].inst_mask; + +	return 0; +} + +int amdgpu_xcp_dev_register(struct amdgpu_device *adev, +			const struct pci_device_id *ent) +{ +	int i, ret; + +	if (!adev->xcp_mgr) +		return 0; + +	for (i = 0; i < MAX_XCP; i++) { +		ret = drm_dev_register(adev->xcp_mgr->xcp[i].ddev, ent->driver_data); +		if (ret) +			return ret; +	} + +	return 0; +} + +void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev) +{ +	struct drm_device *p_ddev; +	int i; + +	if (!adev->xcp_mgr) +		return; + +	for (i = 0; i < MAX_XCP; i++) { +		p_ddev = adev->xcp_mgr->xcp[i].ddev; +		drm_dev_unplug(p_ddev); +		p_ddev->render->dev = adev->xcp_mgr->xcp[i].rdev; +		p_ddev->primary->dev = adev->xcp_mgr->xcp[i].pdev; +		p_ddev->driver =  adev->xcp_mgr->xcp[i].driver; +		p_ddev->vma_offset_manager = adev->xcp_mgr->xcp[i].vma_offset_manager; +	} +} + +int amdgpu_xcp_open_device(struct amdgpu_device *adev, +			   struct amdgpu_fpriv *fpriv, +			   struct drm_file *file_priv) +{ +	int i; + +	if (!adev->xcp_mgr) +		return 0; + +	fpriv->xcp_id = ~0; +	for (i = 0; i < MAX_XCP; ++i) { +		if (!adev->xcp_mgr->xcp[i].ddev) +			break; + +		if (file_priv->minor == adev->xcp_mgr->xcp[i].ddev->render) { +			if (adev->xcp_mgr->xcp[i].valid == FALSE) { +				dev_err(adev->dev, "renderD%d partition %d not valid!", +						file_priv->minor->index, i); +				return -ENOENT; +			} +			dev_dbg(adev->dev, "renderD%d partition %d opened!", +					file_priv->minor->index, i); +			fpriv->xcp_id = i; +			break; +		} +	} + +	fpriv->vm.mem_id = fpriv->xcp_id == ~0 ? -1 : +				adev->xcp_mgr->xcp[fpriv->xcp_id].mem_id; +	return 0; +} + +void amdgpu_xcp_release_sched(struct amdgpu_device *adev, +				  struct amdgpu_ctx_entity *entity) +{ +	struct drm_gpu_scheduler *sched; +	struct amdgpu_ring *ring; + +	if (!adev->xcp_mgr) +		return; + +	sched = entity->entity.rq->sched; +	if (sched->ready) { +		ring = to_amdgpu_ring(entity->entity.rq->sched); +		atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt); +	} +} + diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h new file mode 100644 index 000000000000..0f8026d64ea5 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h @@ -0,0 +1,182 @@ +/* + * Copyright 2022 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. + * + */ + +#ifndef AMDGPU_XCP_H +#define AMDGPU_XCP_H + +#include <linux/pci.h> +#include <linux/xarray.h> + +#include "amdgpu_ctx.h" + +#define MAX_XCP 8 + +#define AMDGPU_XCP_MODE_NONE -1 +#define AMDGPU_XCP_MODE_TRANS -2 + +#define AMDGPU_XCP_FL_NONE 0 +#define AMDGPU_XCP_FL_LOCKED (1 << 0) + +struct amdgpu_fpriv; + +enum AMDGPU_XCP_IP_BLOCK { +	AMDGPU_XCP_GFXHUB, +	AMDGPU_XCP_GFX, +	AMDGPU_XCP_SDMA, +	AMDGPU_XCP_VCN, +	AMDGPU_XCP_MAX_BLOCKS +}; + +enum AMDGPU_XCP_STATE { +	AMDGPU_XCP_PREPARE_SUSPEND, +	AMDGPU_XCP_SUSPEND, +	AMDGPU_XCP_PREPARE_RESUME, +	AMDGPU_XCP_RESUME, +}; + +struct amdgpu_xcp_ip_funcs { +	int (*prepare_suspend)(void *handle, uint32_t inst_mask); +	int (*suspend)(void *handle, uint32_t inst_mask); +	int (*prepare_resume)(void *handle, uint32_t inst_mask); +	int (*resume)(void *handle, uint32_t inst_mask); +}; + +struct amdgpu_xcp_ip { +	struct amdgpu_xcp_ip_funcs *ip_funcs; +	uint32_t inst_mask; + +	enum AMDGPU_XCP_IP_BLOCK ip_id; +	bool valid; +}; + +struct amdgpu_xcp { +	struct amdgpu_xcp_ip ip[AMDGPU_XCP_MAX_BLOCKS]; + +	uint8_t id; +	uint8_t mem_id; +	bool valid; +	atomic_t	ref_cnt; +	struct drm_device *ddev; +	struct drm_device *rdev; +	struct drm_device *pdev; +	struct drm_driver *driver; +	struct drm_vma_offset_manager *vma_offset_manager; +	struct amdgpu_sched	gpu_sched[AMDGPU_HW_IP_NUM][AMDGPU_RING_PRIO_MAX]; +}; + +struct amdgpu_xcp_mgr { +	struct amdgpu_device *adev; +	struct mutex xcp_lock; +	struct amdgpu_xcp_mgr_funcs *funcs; + +	struct amdgpu_xcp xcp[MAX_XCP]; +	uint8_t num_xcps; +	int8_t mode; + +	 /* Used to determine KFD memory size limits per XCP */ +	unsigned int num_xcp_per_mem_partition; +}; + +struct amdgpu_xcp_mgr_funcs { +	int (*switch_partition_mode)(struct amdgpu_xcp_mgr *xcp_mgr, int mode, +				     int *num_xcps); +	int (*query_partition_mode)(struct amdgpu_xcp_mgr *xcp_mgr); +	int (*get_ip_details)(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id, +			      enum AMDGPU_XCP_IP_BLOCK ip_id, +			      struct amdgpu_xcp_ip *ip); +	int (*get_xcp_mem_id)(struct amdgpu_xcp_mgr *xcp_mgr, +			      struct amdgpu_xcp *xcp, uint8_t *mem_id); + +	int (*prepare_suspend)(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +	int (*suspend)(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +	int (*prepare_resume)(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +	int (*resume)(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +	int (*select_scheds)(struct amdgpu_device *adev, +				  u32 hw_ip, u32 hw_prio, struct amdgpu_fpriv *fpriv, +				  unsigned int *num_scheds, struct drm_gpu_scheduler ***scheds); +	int (*update_partition_sched_list)(struct amdgpu_device *adev); +}; + +int amdgpu_xcp_prepare_suspend(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +int amdgpu_xcp_suspend(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +int amdgpu_xcp_prepare_resume(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); +int amdgpu_xcp_resume(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id); + +int amdgpu_xcp_mgr_init(struct amdgpu_device *adev, int init_mode, +			int init_xcps, struct amdgpu_xcp_mgr_funcs *xcp_funcs); +int amdgpu_xcp_init(struct amdgpu_xcp_mgr *xcp_mgr, int num_xcps, int mode); +int amdgpu_xcp_query_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags); +int amdgpu_xcp_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, int mode); +int amdgpu_xcp_get_partition(struct amdgpu_xcp_mgr *xcp_mgr, +			     enum AMDGPU_XCP_IP_BLOCK ip, int instance); + +int amdgpu_xcp_get_inst_details(struct amdgpu_xcp *xcp, +				enum AMDGPU_XCP_IP_BLOCK ip, +				uint32_t *inst_mask); + +int amdgpu_xcp_dev_register(struct amdgpu_device *adev, +				const struct pci_device_id *ent); +void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev); +int amdgpu_xcp_open_device(struct amdgpu_device *adev, +			   struct amdgpu_fpriv *fpriv, +			   struct drm_file *file_priv); +void amdgpu_xcp_release_sched(struct amdgpu_device *adev, +			      struct amdgpu_ctx_entity *entity); + +#define amdgpu_xcp_select_scheds(adev, e, c, d, x, y) \ +	((adev)->xcp_mgr && (adev)->xcp_mgr->funcs && \ +	(adev)->xcp_mgr->funcs->select_scheds ? \ +	(adev)->xcp_mgr->funcs->select_scheds((adev), (e), (c), (d), (x), (y)) : -ENOENT) +#define amdgpu_xcp_update_partition_sched_list(adev) \ +	((adev)->xcp_mgr && (adev)->xcp_mgr->funcs && \ +	(adev)->xcp_mgr->funcs->update_partition_sched_list ? \ +	(adev)->xcp_mgr->funcs->update_partition_sched_list(adev) : 0) + +static inline int amdgpu_xcp_get_num_xcp(struct amdgpu_xcp_mgr *xcp_mgr) +{ +	if (!xcp_mgr) +		return 1; +	else +		return xcp_mgr->num_xcps; +} + +static inline struct amdgpu_xcp * +amdgpu_get_next_xcp(struct amdgpu_xcp_mgr *xcp_mgr, int *from) +{ +	if (!xcp_mgr) +		return NULL; + +	while (*from < MAX_XCP) { +		if (xcp_mgr->xcp[*from].valid) +			return &xcp_mgr->xcp[*from]; +		++(*from); +	} + +	return NULL; +} + +#define for_each_xcp(xcp_mgr, xcp, i)                            \ +	for (i = 0, xcp = amdgpu_get_next_xcp(xcp_mgr, &i); xcp; \ +	     xcp = amdgpu_get_next_xcp(xcp_mgr, &i)) + +#endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c index 439925477fb8..85ee1af963dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c @@ -1014,7 +1014,8 @@ static void amdgpu_xgmi_query_ras_error_count(struct amdgpu_device *adev,  }  /* Trigger XGMI/WAFL error */ -static int amdgpu_ras_error_inject_xgmi(struct amdgpu_device *adev,  void *inject_if) +static int amdgpu_ras_error_inject_xgmi(struct amdgpu_device *adev, +			void *inject_if, uint32_t instance_mask)  {  	int ret = 0;  	struct ta_ras_trigger_error_input *block_info = @@ -1026,7 +1027,7 @@ static int amdgpu_ras_error_inject_xgmi(struct amdgpu_device *adev,  void *injec  	if (amdgpu_dpm_allow_xgmi_power_down(adev, false))  		dev_warn(adev->dev, "Failed to disallow XGMI power down"); -	ret = psp_ras_trigger_error(&adev->psp, block_info); +	ret = psp_ras_trigger_error(&adev->psp, block_info, instance_mask);  	if (amdgpu_ras_intr_triggered())  		return ret; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h index 24d42d24e6a0..104a5ad8397d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h @@ -70,7 +70,6 @@ enum amd_sriov_ucode_engine_id {  	AMD_SRIOV_UCODE_ID_RLC_SRLS,  	AMD_SRIOV_UCODE_ID_MEC,  	AMD_SRIOV_UCODE_ID_MEC2, -	AMD_SRIOV_UCODE_ID_IMU,  	AMD_SRIOV_UCODE_ID_SOS,  	AMD_SRIOV_UCODE_ID_ASD,  	AMD_SRIOV_UCODE_ID_TA_RAS, diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram_reg_init.c b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram_reg_init.c new file mode 100644 index 000000000000..a595bb958215 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram_reg_init.c @@ -0,0 +1,661 @@ +/* + * Copyright 2022 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 "soc15.h" + +#include "soc15_common.h" +#include "amdgpu_xcp.h" +#include "gfx_v9_4_3.h" +#include "gfxhub_v1_2.h" +#include "sdma_v4_4_2.h" + +#define XCP_INST_MASK(num_inst, xcp_id)                                        \ +	(num_inst ? GENMASK(num_inst - 1, 0) << (xcp_id * num_inst) : 0) + +#define AMDGPU_XCP_OPS_KFD	(1 << 0) + +void aqua_vanjaram_doorbell_index_init(struct amdgpu_device *adev) +{ +	int i; + +	adev->doorbell_index.kiq = AMDGPU_DOORBELL_LAYOUT1_KIQ_START; + +	adev->doorbell_index.mec_ring0 = AMDGPU_DOORBELL_LAYOUT1_MEC_RING_START; + +	adev->doorbell_index.userqueue_start = AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_START; +	adev->doorbell_index.userqueue_end = AMDGPU_DOORBELL_LAYOUT1_USERQUEUE_END; +	adev->doorbell_index.xcc_doorbell_range = AMDGPU_DOORBELL_LAYOUT1_XCC_RANGE; + +	adev->doorbell_index.sdma_doorbell_range = 20; +	for (i = 0; i < adev->sdma.num_instances; i++) +		adev->doorbell_index.sdma_engine[i] = +			AMDGPU_DOORBELL_LAYOUT1_sDMA_ENGINE_START + +			i * (adev->doorbell_index.sdma_doorbell_range >> 1); + +	adev->doorbell_index.ih = AMDGPU_DOORBELL_LAYOUT1_IH; +	adev->doorbell_index.vcn.vcn_ring0_1 = AMDGPU_DOORBELL_LAYOUT1_VCN_START; + +	adev->doorbell_index.first_non_cp = AMDGPU_DOORBELL_LAYOUT1_FIRST_NON_CP; +	adev->doorbell_index.last_non_cp = AMDGPU_DOORBELL_LAYOUT1_LAST_NON_CP; + +	adev->doorbell_index.max_assignment = AMDGPU_DOORBELL_LAYOUT1_MAX_ASSIGNMENT << 1; +} + +static void aqua_vanjaram_set_xcp_id(struct amdgpu_device *adev, +			     uint32_t inst_idx, struct amdgpu_ring *ring) +{ +	int xcp_id; +	enum AMDGPU_XCP_IP_BLOCK ip_blk; +	uint32_t inst_mask; + +	ring->xcp_id = ~0; +	if (adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE) +		return; + +	inst_mask = 1 << inst_idx; + +	switch (ring->funcs->type) { +	case AMDGPU_HW_IP_GFX: +	case AMDGPU_RING_TYPE_COMPUTE: +	case AMDGPU_RING_TYPE_KIQ: +		ip_blk = AMDGPU_XCP_GFX; +		break; +	case AMDGPU_RING_TYPE_SDMA: +		ip_blk = AMDGPU_XCP_SDMA; +		break; +	case AMDGPU_RING_TYPE_VCN_ENC: +	case AMDGPU_RING_TYPE_VCN_JPEG: +		ip_blk = AMDGPU_XCP_VCN; +		if (adev->xcp_mgr->mode == AMDGPU_CPX_PARTITION_MODE) +			inst_mask = 1 << (inst_idx * 2); +		break; +	default: +		DRM_ERROR("Not support ring type %d!", ring->funcs->type); +		return; +	} + +	for (xcp_id = 0; xcp_id < adev->xcp_mgr->num_xcps; xcp_id++) { +		if (adev->xcp_mgr->xcp[xcp_id].ip[ip_blk].inst_mask & inst_mask) { +			ring->xcp_id = xcp_id; +			break; +		} +	} +} + +static void aqua_vanjaram_xcp_gpu_sched_update( +		struct amdgpu_device *adev, +		struct amdgpu_ring *ring, +		unsigned int sel_xcp_id) +{ +	unsigned int *num_gpu_sched; + +	num_gpu_sched = &adev->xcp_mgr->xcp[sel_xcp_id] +			.gpu_sched[ring->funcs->type][ring->hw_prio].num_scheds; +	adev->xcp_mgr->xcp[sel_xcp_id].gpu_sched[ring->funcs->type][ring->hw_prio] +			.sched[(*num_gpu_sched)++] = &ring->sched; +	DRM_DEBUG("%s :[%d] gpu_sched[%d][%d] = %d", ring->name, +			sel_xcp_id, ring->funcs->type, +			ring->hw_prio, *num_gpu_sched); +} + +static int aqua_vanjaram_xcp_sched_list_update( +		struct amdgpu_device *adev) +{ +	struct amdgpu_ring *ring; +	int i; + +	for (i = 0; i < MAX_XCP; i++) { +		atomic_set(&adev->xcp_mgr->xcp[i].ref_cnt, 0); +		memset(adev->xcp_mgr->xcp[i].gpu_sched, 0, sizeof(adev->xcp_mgr->xcp->gpu_sched)); +	} + +	if (adev->xcp_mgr->mode == AMDGPU_XCP_MODE_NONE) +		return 0; + +	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { +		ring = adev->rings[i]; +		if (!ring || !ring->sched.ready) +			continue; + +		aqua_vanjaram_xcp_gpu_sched_update(adev, ring, ring->xcp_id); + +		/* VCN is shared by two partitions under CPX MODE */ +		if ((ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC || +			ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG) && +			adev->xcp_mgr->mode == AMDGPU_CPX_PARTITION_MODE) +			aqua_vanjaram_xcp_gpu_sched_update(adev, ring, ring->xcp_id + 1); +	} + +	return 0; +} + +static int aqua_vanjaram_update_partition_sched_list(struct amdgpu_device *adev) +{ +	int i; + +	for (i = 0; i < adev->num_rings; i++) { +		struct amdgpu_ring *ring = adev->rings[i]; + +		if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE || +			ring->funcs->type == AMDGPU_RING_TYPE_KIQ) +			aqua_vanjaram_set_xcp_id(adev, ring->xcc_id, ring); +		else +			aqua_vanjaram_set_xcp_id(adev, ring->me, ring); +	} + +	return aqua_vanjaram_xcp_sched_list_update(adev); +} + +static int aqua_vanjaram_select_scheds( +		struct amdgpu_device *adev, +		u32 hw_ip, +		u32 hw_prio, +		struct amdgpu_fpriv *fpriv, +		unsigned int *num_scheds, +		struct drm_gpu_scheduler ***scheds) +{ +	u32 sel_xcp_id; +	int i; + +	if (fpriv->xcp_id == ~0) { +		u32 least_ref_cnt = ~0; + +		fpriv->xcp_id = 0; +		for (i = 0; i < adev->xcp_mgr->num_xcps; i++) { +			u32 total_ref_cnt; + +			total_ref_cnt = atomic_read(&adev->xcp_mgr->xcp[i].ref_cnt); +			if (total_ref_cnt < least_ref_cnt) { +				fpriv->xcp_id = i; +				least_ref_cnt = total_ref_cnt; +			} +		} +	} +	sel_xcp_id = fpriv->xcp_id; + +	if (adev->xcp_mgr->xcp[sel_xcp_id].gpu_sched[hw_ip][hw_prio].num_scheds) { +		*num_scheds = adev->xcp_mgr->xcp[fpriv->xcp_id].gpu_sched[hw_ip][hw_prio].num_scheds; +		*scheds = adev->xcp_mgr->xcp[fpriv->xcp_id].gpu_sched[hw_ip][hw_prio].sched; +		atomic_inc(&adev->xcp_mgr->xcp[sel_xcp_id].ref_cnt); +		DRM_DEBUG("Selected partition #%d", sel_xcp_id); +	} else { +		DRM_ERROR("Failed to schedule partition #%d.", sel_xcp_id); +		return -ENOENT; +	} + +	return 0; +} + +static int8_t aqua_vanjaram_logical_to_dev_inst(struct amdgpu_device *adev, +					 enum amd_hw_ip_block_type block, +					 int8_t inst) +{ +	int8_t dev_inst; + +	switch (block) { +	case GC_HWIP: +	case SDMA0_HWIP: +	/* Both JPEG and VCN as JPEG is only alias of VCN */ +	case VCN_HWIP: +		dev_inst = adev->ip_map.dev_inst[block][inst]; +		break; +	default: +		/* For rest of the IPs, no look up required. +		 * Assume 'logical instance == physical instance' for all configs. */ +		dev_inst = inst; +		break; +	} + +	return dev_inst; +} + +static uint32_t aqua_vanjaram_logical_to_dev_mask(struct amdgpu_device *adev, +					 enum amd_hw_ip_block_type block, +					 uint32_t mask) +{ +	uint32_t dev_mask = 0; +	int8_t log_inst, dev_inst; + +	while (mask) { +		log_inst = ffs(mask) - 1; +		dev_inst = aqua_vanjaram_logical_to_dev_inst(adev, block, log_inst); +		dev_mask |= (1 << dev_inst); +		mask &= ~(1 << log_inst); +	} + +	return dev_mask; +} + +static void aqua_vanjaram_populate_ip_map(struct amdgpu_device *adev, +					  enum amd_hw_ip_block_type ip_block, +					  uint32_t inst_mask) +{ +	int l = 0, i; + +	while (inst_mask) { +		i = ffs(inst_mask) - 1; +		adev->ip_map.dev_inst[ip_block][l++] = i; +		inst_mask &= ~(1 << i); +	} +	for (; l < HWIP_MAX_INSTANCE; l++) +		adev->ip_map.dev_inst[ip_block][l] = -1; +} + +void aqua_vanjaram_ip_map_init(struct amdgpu_device *adev) +{ +	u32 ip_map[][2] = { +		{ GC_HWIP, adev->gfx.xcc_mask }, +		{ SDMA0_HWIP, adev->sdma.sdma_mask }, +		{ VCN_HWIP, adev->vcn.inst_mask }, +	}; +	int i; + +	for (i = 0; i < ARRAY_SIZE(ip_map); ++i) +		aqua_vanjaram_populate_ip_map(adev, ip_map[i][0], ip_map[i][1]); + +	adev->ip_map.logical_to_dev_inst = aqua_vanjaram_logical_to_dev_inst; +	adev->ip_map.logical_to_dev_mask = aqua_vanjaram_logical_to_dev_mask; +} + +/* Fixed pattern for smn addressing on different AIDs: + *   bit[34]: indicate cross AID access + *   bit[33:32]: indicate target AID id + * AID id range is 0 ~ 3 as maximum AID number is 4. + */ +u64 aqua_vanjaram_encode_ext_smn_addressing(int ext_id) +{ +	u64 ext_offset; + +	/* local routing and bit[34:32] will be zeros */ +	if (ext_id == 0) +		return 0; + +	/* Initiated from host, accessing to all non-zero aids are cross traffic */ +	ext_offset = ((u64)(ext_id & 0x3) << 32) | (1ULL << 34); + +	return ext_offset; +} + +static int aqua_vanjaram_query_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr) +{ +	enum amdgpu_gfx_partition mode = AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE; +	struct amdgpu_device *adev = xcp_mgr->adev; + +	if (adev->nbio.funcs->get_compute_partition_mode) +		mode = adev->nbio.funcs->get_compute_partition_mode(adev); + +	return mode; +} + +static int __aqua_vanjaram_get_xcc_per_xcp(struct amdgpu_xcp_mgr *xcp_mgr, int mode) +{ +	int num_xcc, num_xcc_per_xcp = 0; + +	num_xcc = NUM_XCC(xcp_mgr->adev->gfx.xcc_mask); + +	switch (mode) { +	case AMDGPU_SPX_PARTITION_MODE: +		num_xcc_per_xcp = num_xcc; +		break; +	case AMDGPU_DPX_PARTITION_MODE: +		num_xcc_per_xcp = num_xcc / 2; +		break; +	case AMDGPU_TPX_PARTITION_MODE: +		num_xcc_per_xcp = num_xcc / 3; +		break; +	case AMDGPU_QPX_PARTITION_MODE: +		num_xcc_per_xcp = num_xcc / 4; +		break; +	case AMDGPU_CPX_PARTITION_MODE: +		num_xcc_per_xcp = 1; +		break; +	} + +	return num_xcc_per_xcp; +} + +static int __aqua_vanjaram_get_xcp_ip_info(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id, +				    enum AMDGPU_XCP_IP_BLOCK ip_id, +				    struct amdgpu_xcp_ip *ip) +{ +	struct amdgpu_device *adev = xcp_mgr->adev; +	int num_xcc_xcp, num_sdma_xcp, num_vcn_xcp; +	int num_sdma, num_vcn; + +	num_sdma = adev->sdma.num_instances; +	num_vcn = adev->vcn.num_vcn_inst; + +	switch (xcp_mgr->mode) { +	case AMDGPU_SPX_PARTITION_MODE: +		num_sdma_xcp = num_sdma; +		num_vcn_xcp = num_vcn; +		break; +	case AMDGPU_DPX_PARTITION_MODE: +		num_sdma_xcp = num_sdma / 2; +		num_vcn_xcp = num_vcn / 2; +		break; +	case AMDGPU_TPX_PARTITION_MODE: +		num_sdma_xcp = num_sdma / 3; +		num_vcn_xcp = num_vcn / 3; +		break; +	case AMDGPU_QPX_PARTITION_MODE: +		num_sdma_xcp = num_sdma / 4; +		num_vcn_xcp = num_vcn / 4; +		break; +	case AMDGPU_CPX_PARTITION_MODE: +		num_sdma_xcp = 2; +		num_vcn_xcp = num_vcn ? 1 : 0; +		break; +	default: +		return -EINVAL; +	} + +	num_xcc_xcp = adev->gfx.num_xcc_per_xcp; + +	switch (ip_id) { +	case AMDGPU_XCP_GFXHUB: +		ip->inst_mask = XCP_INST_MASK(num_xcc_xcp, xcp_id); +		ip->ip_funcs = &gfxhub_v1_2_xcp_funcs; +		break; +	case AMDGPU_XCP_GFX: +		ip->inst_mask = XCP_INST_MASK(num_xcc_xcp, xcp_id); +		ip->ip_funcs = &gfx_v9_4_3_xcp_funcs; +		break; +	case AMDGPU_XCP_SDMA: +		ip->inst_mask = XCP_INST_MASK(num_sdma_xcp, xcp_id); +		ip->ip_funcs = &sdma_v4_4_2_xcp_funcs; +		break; +	case AMDGPU_XCP_VCN: +		ip->inst_mask = XCP_INST_MASK(num_vcn_xcp, xcp_id); +		/* TODO : Assign IP funcs */ +		break; +	default: +		return -EINVAL; +	} + +	ip->ip_id = ip_id; + +	return 0; +} + +static enum amdgpu_gfx_partition +__aqua_vanjaram_get_auto_mode(struct amdgpu_xcp_mgr *xcp_mgr) +{ +	struct amdgpu_device *adev = xcp_mgr->adev; +	int num_xcc; + +	num_xcc = NUM_XCC(xcp_mgr->adev->gfx.xcc_mask); + +	if (adev->gmc.num_mem_partitions == 1) +		return AMDGPU_SPX_PARTITION_MODE; + +	if (adev->gmc.num_mem_partitions == num_xcc) +		return AMDGPU_CPX_PARTITION_MODE; + +	if (adev->gmc.num_mem_partitions == num_xcc / 2) +		return (adev->flags & AMD_IS_APU) ? AMDGPU_TPX_PARTITION_MODE : +						    AMDGPU_QPX_PARTITION_MODE; + +	if (adev->gmc.num_mem_partitions == 2 && !(adev->flags & AMD_IS_APU)) +		return AMDGPU_DPX_PARTITION_MODE; + +	return AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE; +} + +static bool __aqua_vanjaram_is_valid_mode(struct amdgpu_xcp_mgr *xcp_mgr, +					  enum amdgpu_gfx_partition mode) +{ +	struct amdgpu_device *adev = xcp_mgr->adev; +	int num_xcc, num_xccs_per_xcp; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	switch (mode) { +	case AMDGPU_SPX_PARTITION_MODE: +		return adev->gmc.num_mem_partitions == 1 && num_xcc > 0; +	case AMDGPU_DPX_PARTITION_MODE: +		return adev->gmc.num_mem_partitions != 8 && (num_xcc % 4) == 0; +	case AMDGPU_TPX_PARTITION_MODE: +		return (adev->gmc.num_mem_partitions == 1 || +			adev->gmc.num_mem_partitions == 3) && +		       ((num_xcc % 3) == 0); +	case AMDGPU_QPX_PARTITION_MODE: +		num_xccs_per_xcp = num_xcc / 4; +		return (adev->gmc.num_mem_partitions == 1 || +			adev->gmc.num_mem_partitions == 4) && +		       (num_xccs_per_xcp >= 2); +	case AMDGPU_CPX_PARTITION_MODE: +		return ((num_xcc > 1) && +		       (adev->gmc.num_mem_partitions == 1 || adev->gmc.num_mem_partitions == 4) && +		       (num_xcc % adev->gmc.num_mem_partitions) == 0); +	default: +		return false; +	} + +	return false; +} + +static int __aqua_vanjaram_pre_partition_switch(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags) +{ +	/* TODO: +	 * Stop user queues and threads, and make sure GPU is empty of work. +	 */ + +	if (flags & AMDGPU_XCP_OPS_KFD) +		amdgpu_amdkfd_device_fini_sw(xcp_mgr->adev); + +	return 0; +} + +static int __aqua_vanjaram_post_partition_switch(struct amdgpu_xcp_mgr *xcp_mgr, u32 flags) +{ +	int ret = 0; + +	if (flags & AMDGPU_XCP_OPS_KFD) { +		amdgpu_amdkfd_device_probe(xcp_mgr->adev); +		amdgpu_amdkfd_device_init(xcp_mgr->adev); +		/* If KFD init failed, return failure */ +		if (!xcp_mgr->adev->kfd.init_complete) +			ret = -EIO; +	} + +	return ret; +} + +static int aqua_vanjaram_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr, +					       int mode, int *num_xcps) +{ +	int num_xcc_per_xcp, num_xcc, ret; +	struct amdgpu_device *adev; +	u32 flags = 0; + +	adev = xcp_mgr->adev; +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); + +	if (mode == AMDGPU_AUTO_COMPUTE_PARTITION_MODE) { +		mode = __aqua_vanjaram_get_auto_mode(xcp_mgr); +	} else if (!__aqua_vanjaram_is_valid_mode(xcp_mgr, mode)) { +		dev_err(adev->dev, +			"Invalid compute partition mode requested, requested: %s, available memory partitions: %d", +			amdgpu_gfx_compute_mode_desc(mode), adev->gmc.num_mem_partitions); +		return -EINVAL; +	} + +	if (adev->kfd.init_complete) +		flags |= AMDGPU_XCP_OPS_KFD; + +	if (flags & AMDGPU_XCP_OPS_KFD) { +		ret = amdgpu_amdkfd_check_and_lock_kfd(adev); +		if (ret) +			goto out; +	} + +	ret = __aqua_vanjaram_pre_partition_switch(xcp_mgr, flags); +	if (ret) +		goto unlock; + +	num_xcc_per_xcp = __aqua_vanjaram_get_xcc_per_xcp(xcp_mgr, mode); +	if (adev->gfx.funcs->switch_partition_mode) +		adev->gfx.funcs->switch_partition_mode(xcp_mgr->adev, +						       num_xcc_per_xcp); + +	if (adev->nbio.funcs->set_compute_partition_mode) +		adev->nbio.funcs->set_compute_partition_mode(adev, mode); + +	/* Init info about new xcps */ +	*num_xcps = num_xcc / num_xcc_per_xcp; +	amdgpu_xcp_init(xcp_mgr, *num_xcps, mode); + +	ret = __aqua_vanjaram_post_partition_switch(xcp_mgr, flags); +unlock: +	if (flags & AMDGPU_XCP_OPS_KFD) +		amdgpu_amdkfd_unlock_kfd(adev); +out: +	return ret; +} + +static int __aqua_vanjaram_get_xcp_mem_id(struct amdgpu_device *adev, +					  int xcc_id, uint8_t *mem_id) +{ +	/* memory/spatial modes validation check is already done */ +	*mem_id = xcc_id / adev->gfx.num_xcc_per_xcp; +	*mem_id /= adev->xcp_mgr->num_xcp_per_mem_partition; + +	return 0; +} + +static int aqua_vanjaram_get_xcp_mem_id(struct amdgpu_xcp_mgr *xcp_mgr, +					struct amdgpu_xcp *xcp, uint8_t *mem_id) +{ +	struct amdgpu_numa_info numa_info; +	struct amdgpu_device *adev; +	uint32_t xcc_mask; +	int r, i, xcc_id; + +	adev = xcp_mgr->adev; +	/* TODO: BIOS is not returning the right info now +	 * Check on this later +	 */ +	/* +	if (adev->gmc.gmc_funcs->query_mem_partition_mode) +		mode = adev->gmc.gmc_funcs->query_mem_partition_mode(adev); +	*/ +	if (adev->gmc.num_mem_partitions == 1) { +		/* Only one range */ +		*mem_id = 0; +		return 0; +	} + +	r = amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_GFX, &xcc_mask); +	if (r || !xcc_mask) +		return -EINVAL; + +	xcc_id = ffs(xcc_mask) - 1; +	if (!adev->gmc.is_app_apu) +		return __aqua_vanjaram_get_xcp_mem_id(adev, xcc_id, mem_id); + +	r = amdgpu_acpi_get_mem_info(adev, xcc_id, &numa_info); + +	if (r) +		return r; + +	r = -EINVAL; +	for (i = 0; i < adev->gmc.num_mem_partitions; ++i) { +		if (adev->gmc.mem_partitions[i].numa.node == numa_info.nid) { +			*mem_id = i; +			r = 0; +			break; +		} +	} + +	return r; +} + +static int aqua_vanjaram_get_xcp_ip_details(struct amdgpu_xcp_mgr *xcp_mgr, int xcp_id, +				     enum AMDGPU_XCP_IP_BLOCK ip_id, +				     struct amdgpu_xcp_ip *ip) +{ +	if (!ip) +		return -EINVAL; + +	return __aqua_vanjaram_get_xcp_ip_info(xcp_mgr, xcp_id, ip_id, ip); +} + +struct amdgpu_xcp_mgr_funcs aqua_vanjaram_xcp_funcs = { +	.switch_partition_mode = &aqua_vanjaram_switch_partition_mode, +	.query_partition_mode = &aqua_vanjaram_query_partition_mode, +	.get_ip_details = &aqua_vanjaram_get_xcp_ip_details, +	.get_xcp_mem_id = &aqua_vanjaram_get_xcp_mem_id, +	.select_scheds = &aqua_vanjaram_select_scheds, +	.update_partition_sched_list = &aqua_vanjaram_update_partition_sched_list +}; + +static int aqua_vanjaram_xcp_mgr_init(struct amdgpu_device *adev) +{ +	int ret; + +	ret = amdgpu_xcp_mgr_init(adev, AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE, 1, +				  &aqua_vanjaram_xcp_funcs); +	if (ret) +		return ret; + +	/* TODO: Default memory node affinity init */ + +	return ret; +} + +int aqua_vanjaram_init_soc_config(struct amdgpu_device *adev) +{ +	u32 mask, inst_mask = adev->sdma.sdma_mask; +	int ret, i; + +	/* generally 1 AID supports 4 instances */ +	adev->sdma.num_inst_per_aid = 4; +	adev->sdma.num_instances = NUM_SDMA(adev->sdma.sdma_mask); + +	adev->aid_mask = i = 1; +	inst_mask >>= adev->sdma.num_inst_per_aid; + +	for (mask = (1 << adev->sdma.num_inst_per_aid) - 1; inst_mask; +	     inst_mask >>= adev->sdma.num_inst_per_aid, ++i) { +		if ((inst_mask & mask) == mask) +			adev->aid_mask |= (1 << i); +	} + +	/* Harvest config is not used for aqua vanjaram. VCN and JPEGs will be +	 * addressed based on logical instance ids. +	 */ +	adev->vcn.harvest_config = 0; +	adev->vcn.num_inst_per_aid = 1; +	adev->vcn.num_vcn_inst = hweight32(adev->vcn.inst_mask); +	adev->jpeg.harvest_config = 0; +	adev->jpeg.num_inst_per_aid = 1; +	adev->jpeg.num_jpeg_inst = hweight32(adev->jpeg.inst_mask); + +	ret = aqua_vanjaram_xcp_mgr_init(adev); +	if (ret) +		return ret; + +	aqua_vanjaram_ip_map_init(adev); + +	return 0; +} diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index de6d10390ab2..5641cf05d856 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -1141,12 +1141,12 @@ static uint32_t cik_get_register_value(struct amdgpu_device *adev,  		mutex_lock(&adev->grbm_idx_mutex);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  		val = RREG32(reg_offset);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		mutex_unlock(&adev->grbm_idx_mutex);  		return val;  	} else { diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 67d16236b216..52598fbc9b39 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -489,8 +489,6 @@ static int cik_sdma_gfx_resume(struct amdgpu_device *adev)  #endif  		/* enable DMA IBs */  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); - -		ring->sched.ready = true;  	}  	cik_sdma_enable(adev, true); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index f5b5ce1051a2..be984f8c71c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -3490,7 +3490,7 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,  				 struct amdgpu_cu_info *cu_info);  static uint64_t gfx_v10_0_get_gpu_clock_counter(struct amdgpu_device *adev);  static void gfx_v10_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, -				   u32 sh_num, u32 instance); +				   u32 sh_num, u32 instance, int xcc_id);  static u32 gfx_v10_0_get_wgp_active_bitmap_per_sh(struct amdgpu_device *adev);  static int gfx_v10_0_rlc_backdoor_autoload_buffer_init(struct amdgpu_device *adev); @@ -3568,7 +3568,7 @@ static void gfx10_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,  	struct amdgpu_device *adev = kiq_ring->adev;  	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0; -	if (adev->enable_mes && !adev->gfx.kiq.ring.sched.ready) { +	if (adev->enable_mes && !adev->gfx.kiq[0].ring.sched.ready) {  		amdgpu_mes_unmap_legacy_queue(adev, ring, action, gpu_addr, seq);  		return;  	} @@ -3636,7 +3636,7 @@ static const struct kiq_pm4_funcs gfx_v10_0_kiq_pm4_funcs = {  static void gfx_v10_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)  { -	adev->gfx.kiq.pmf = &gfx_v10_0_kiq_pm4_funcs; +	adev->gfx.kiq[0].pmf = &gfx_v10_0_kiq_pm4_funcs;  }  static void gfx_v10_0_init_spm_golden_registers(struct amdgpu_device *adev) @@ -4219,7 +4219,7 @@ static int gfx_v10_0_mec_init(struct amdgpu_device *adev)  	const struct gfx_firmware_header_v1_0 *mec_hdr = NULL; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -4291,7 +4291,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t wave,  		*(out++) = RREG32_SOC15(GC, 0, mmSQ_IND_DATA);  } -static void gfx_v10_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v10_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* in gfx10 the SIMD_ID is specified as part of the INSTANCE  	 * field when performing a select_se_sh so it should be @@ -4318,7 +4318,7 @@ static void gfx_v10_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd,  	dst[(*no_fields)++] = wave_read_ind(adev, wave, ixSQ_WAVE_MODE);  } -static void gfx_v10_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v10_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -4329,7 +4329,7 @@ static void gfx_v10_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,  		dst);  } -static void gfx_v10_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v10_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				      uint32_t wave, uint32_t thread,  				      uint32_t start, uint32_t size,  				      uint32_t *dst) @@ -4340,7 +4340,7 @@ static void gfx_v10_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd,  }  static void gfx_v10_0_select_me_pipe_q(struct amdgpu_device *adev, -				       u32 me, u32 pipe, u32 q, u32 vm) +				       u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	nv_grbm_select(adev, me, pipe, q, vm);  } @@ -4461,7 +4461,7 @@ static int gfx_v10_0_gfx_ring_init(struct amdgpu_device *adev, int ring_id,  		ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;  	else  		ring->doorbell_index = adev->doorbell_index.gfx_ring1 << 1; -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->vm_hub = AMDGPU_GFXHUB(0);  	sprintf(ring->name, "gfx_%d.%d.%d", ring->me, ring->pipe, ring->queue);  	irq_type = AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP + ring->pipe; @@ -4490,7 +4490,7 @@ static int gfx_v10_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1;  	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr  				+ (ring_id * GFX10_MEC_HPD_SIZE); -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->vm_hub = AMDGPU_GFXHUB(0);  	sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);  	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP @@ -4550,7 +4550,7 @@ static int gfx_v10_0_sw_init(void *handle)  	/* KIQ event */  	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP,  			      GFX_10_1__SRCID__CP_IB2_INTERRUPT_PKT, -			      &adev->gfx.kiq.irq); +			      &adev->gfx.kiq[0].irq);  	if (r)  		return r; @@ -4614,8 +4614,8 @@ static int gfx_v10_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, -								     j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v10_0_compute_ring_init(adev, ring_id, @@ -4629,19 +4629,19 @@ static int gfx_v10_0_sw_init(void *handle)  	}  	if (!adev->enable_mes_kiq) { -		r = amdgpu_gfx_kiq_init(adev, GFX10_MEC_HPD_SIZE); +		r = amdgpu_gfx_kiq_init(adev, GFX10_MEC_HPD_SIZE, 0);  		if (r) {  			DRM_ERROR("Failed to init KIQ BOs!\n");  			return r;  		} -		kiq = &adev->gfx.kiq; -		r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); +		kiq = &adev->gfx.kiq[0]; +		r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);  		if (r)  			return r;  	} -	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v10_compute_mqd)); +	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v10_compute_mqd), 0);  	if (r)  		return r; @@ -4690,11 +4690,11 @@ static int gfx_v10_0_sw_fini(void *handle)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); -	amdgpu_gfx_mqd_sw_fini(adev); +	amdgpu_gfx_mqd_sw_fini(adev, 0);  	if (!adev->enable_mes_kiq) { -		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); -		amdgpu_gfx_kiq_fini(adev); +		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring); +		amdgpu_gfx_kiq_fini(adev, 0);  	}  	gfx_v10_0_pfp_fini(adev); @@ -4712,7 +4712,7 @@ static int gfx_v10_0_sw_fini(void *handle)  }  static void gfx_v10_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, -				   u32 sh_num, u32 instance) +				   u32 sh_num, u32 instance, int xcc_id)  {  	u32 data; @@ -4772,13 +4772,13 @@ static void gfx_v10_0_setup_rb(struct amdgpu_device *adev)  				(adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 6))) &&  			    ((gfx_v10_3_get_disabled_sa(adev) >> bitmap) & 1))  				continue; -			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v10_0_get_rb_active_bitmap(adev);  			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *  					       rb_bitmap_width_per_sh);  		}  	} -	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	adev->gfx.config.backend_enable_mask = active_rbs; @@ -4825,6 +4825,29 @@ static u32 gfx_v10_0_init_pa_sc_tile_steering_override(struct amdgpu_device *ade  #define DEFAULT_SH_MEM_BASES	(0x6000) +static void gfx_v10_0_debug_trap_config_init(struct amdgpu_device *adev, +				uint32_t first_vmid, +				uint32_t last_vmid) +{ +	uint32_t data; +	uint32_t trap_config_vmid_mask = 0; +	int i; + +	/* Calculate trap config vmid mask */ +	for (i = first_vmid; i < last_vmid; i++) +		trap_config_vmid_mask |= (1 << i); + +	data = REG_SET_FIELD(0, SPI_GDBG_TRAP_CONFIG, +			VMID_SEL, trap_config_vmid_mask); +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG, +			TRAP_EN, 1); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_CONFIG), data); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA0), 0); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA1), 0); +} +  static void gfx_v10_0_init_compute_vmid(struct amdgpu_device *adev)  {  	int i; @@ -4856,6 +4879,9 @@ static void gfx_v10_0_init_compute_vmid(struct amdgpu_device *adev)  		WREG32_SOC15_OFFSET(GC, 0, mmGDS_GWS_VMID0, i, 0);  		WREG32_SOC15_OFFSET(GC, 0, mmGDS_OA_VMID0, i, 0);  	} + +	gfx_v10_0_debug_trap_config_init(adev, adev->vm_manager.first_kfd_vmid, +					AMDGPU_NUM_VMID);  }  static void gfx_v10_0_init_gds_vmid(struct amdgpu_device *adev) @@ -4907,7 +4933,7 @@ static void gfx_v10_0_tcp_harvest(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			wgp_active_bitmap = gfx_v10_0_get_wgp_active_bitmap_per_sh(adev);  			/*  			 * Set corresponding TCP bits for the inactive WGPs in @@ -4940,7 +4966,7 @@ static void gfx_v10_0_tcp_harvest(struct amdgpu_device *adev)  		}  	} -	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -4978,7 +5004,7 @@ static void gfx_v10_0_constants_init(struct amdgpu_device *adev)  	/* XXX SH_MEM regs */  	/* where to put LDS, scratch, GPUVM in FSA64 space */  	mutex_lock(&adev->srbm_mutex); -	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB_0].num_ids; i++) { +	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) {  		nv_grbm_select(adev, 0, 0, 0, i);  		/* CP and shaders */  		WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, DEFAULT_SH_MEM_CONFIG); @@ -6073,7 +6099,6 @@ static int gfx_v10_0_cp_gfx_resume(struct amdgpu_device *adev)  	u32 tmp;  	u32 rb_bufsz;  	u64 rb_addr, rptr_addr, wptr_gpu_addr; -	u32 i;  	/* Set the write pointer delay */  	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_DELAY, 0); @@ -6168,11 +6193,6 @@ static int gfx_v10_0_cp_gfx_resume(struct amdgpu_device *adev)  	/* start the ring */  	gfx_v10_0_cp_gfx_start(adev); -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) { -		ring = &adev->gfx.gfx_ring[i]; -		ring->sched.ready = true; -	} -  	return 0;  } @@ -6214,7 +6234,7 @@ static void gfx_v10_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  				      CP_MEC_CNTL__MEC_ME2_HALT_MASK));  			break;  		} -		adev->gfx.kiq.ring.sched.ready = false; +		adev->gfx.kiq[0].ring.sched.ready = false;  	}  	udelay(50);  } @@ -6423,55 +6443,6 @@ static int gfx_v10_0_gfx_mqd_init(struct amdgpu_device *adev, void *m,  	return 0;  } -#ifdef BRING_UP_DEBUG -static int gfx_v10_0_gfx_queue_init_register(struct amdgpu_ring *ring) -{ -	struct amdgpu_device *adev = ring->adev; -	struct v10_gfx_mqd *mqd = ring->mqd_ptr; - -	/* set mmCP_GFX_HQD_WPTR/_HI to 0 */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_WPTR, mqd->cp_gfx_hqd_wptr); -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_WPTR_HI, mqd->cp_gfx_hqd_wptr_hi); - -	/* set GFX_MQD_BASE */ -	WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR, mqd->cp_mqd_base_addr); -	WREG32_SOC15(GC, 0, mmCP_MQD_BASE_ADDR_HI, mqd->cp_mqd_base_addr_hi); - -	/* set GFX_MQD_CONTROL */ -	WREG32_SOC15(GC, 0, mmCP_GFX_MQD_CONTROL, mqd->cp_gfx_mqd_control); - -	/* set GFX_HQD_VMID to 0 */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_VMID, mqd->cp_gfx_hqd_vmid); - -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_QUEUE_PRIORITY, -			mqd->cp_gfx_hqd_queue_priority); -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_QUANTUM, mqd->cp_gfx_hqd_quantum); - -	/* set GFX_HQD_BASE, similar as CP_RB_BASE */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_BASE, mqd->cp_gfx_hqd_base); -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_BASE_HI, mqd->cp_gfx_hqd_base_hi); - -	/* set GFX_HQD_RPTR_ADDR, similar as CP_RB_RPTR */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_RPTR_ADDR, mqd->cp_gfx_hqd_rptr_addr); -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_RPTR_ADDR_HI, mqd->cp_gfx_hqd_rptr_addr_hi); - -	/* set GFX_HQD_CNTL, similar as CP_RB_CNTL */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_CNTL, mqd->cp_gfx_hqd_cntl); - -	/* set RB_WPTR_POLL_ADDR */ -	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_LO, mqd->cp_rb_wptr_poll_addr_lo); -	WREG32_SOC15(GC, 0, mmCP_RB_WPTR_POLL_ADDR_HI, mqd->cp_rb_wptr_poll_addr_hi); - -	/* set RB_DOORBELL_CONTROL */ -	WREG32_SOC15(GC, 0, mmCP_RB_DOORBELL_CONTROL, mqd->cp_rb_doorbell_control); - -	/* active the queue */ -	WREG32_SOC15(GC, 0, mmCP_GFX_HQD_ACTIVE, mqd->cp_gfx_hqd_active); - -	return 0; -} -#endif -  static int gfx_v10_0_gfx_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; @@ -6492,59 +6463,23 @@ static int gfx_v10_0_gfx_init_queue(struct amdgpu_ring *ring)  		if (ring->doorbell_index == adev->doorbell_index.gfx_ring0 << 1)  			gfx_v10_0_cp_gfx_set_doorbell(adev, ring); -#ifdef BRING_UP_DEBUG -		gfx_v10_0_gfx_queue_init_register(ring); -#endif  		nv_grbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  		if (adev->gfx.me.mqd_backup[mqd_idx])  			memcpy(adev->gfx.me.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); -	} else if (amdgpu_in_reset(adev)) { -		/* reset mqd with the backup copy */ +	} else { +		/* restore mqd with the backup copy */  		if (adev->gfx.me.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.me.mqd_backup[mqd_idx], sizeof(*mqd));  		/* reset the ring */  		ring->wptr = 0;  		*ring->wptr_cpu_addr = 0;  		amdgpu_ring_clear_ring(ring); -#ifdef BRING_UP_DEBUG -		mutex_lock(&adev->srbm_mutex); -		nv_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0); -		gfx_v10_0_gfx_queue_init_register(ring); -		nv_grbm_select(adev, 0, 0, 0, 0); -		mutex_unlock(&adev->srbm_mutex); -#endif -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0;  } -#ifndef BRING_UP_DEBUG -static int gfx_v10_0_kiq_enable_kgq(struct amdgpu_device *adev) -{ -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; -	int r, i; - -	if (!kiq->pmf || !kiq->pmf->kiq_map_queues) -		return -EINVAL; - -	r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size * -					adev->gfx.num_gfx_rings); -	if (r) { -		DRM_ERROR("Failed to lock KIQ (%d).\n", r); -		return r; -	} - -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) -		kiq->pmf->kiq_map_queues(kiq_ring, &adev->gfx.gfx_ring[i]); - -	return amdgpu_ring_test_helper(kiq_ring); -} -#endif -  static int gfx_v10_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  {  	int r, i; @@ -6555,7 +6490,7 @@ static int gfx_v10_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  		r = amdgpu_bo_reserve(ring->mqd_obj, false);  		if (unlikely(r != 0)) -			goto done; +			return r;  		r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);  		if (!r) { @@ -6565,23 +6500,14 @@ static int gfx_v10_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  		}  		amdgpu_bo_unreserve(ring->mqd_obj);  		if (r) -			goto done; +			return r;  	} -#ifndef BRING_UP_DEBUG -	r = gfx_v10_0_kiq_enable_kgq(adev); -	if (r) -		goto done; -#endif -	r = gfx_v10_0_cp_gfx_start(adev); + +	r = amdgpu_gfx_enable_kgq(adev, 0);  	if (r) -		goto done; +		return r; -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) { -		ring = &adev->gfx.gfx_ring[i]; -		ring->sched.ready = true; -	} -done: -	return r; +	return gfx_v10_0_cp_gfx_start(adev);  }  static int gfx_v10_0_compute_mqd_init(struct amdgpu_device *adev, void *m, @@ -6812,14 +6738,13 @@ static int gfx_v10_0_kiq_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	struct v10_compute_mqd *mqd = ring->mqd_ptr; -	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;  	gfx_v10_0_kiq_setting(ring);  	if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */  		/* reset MQD to a clean status */ -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(*mqd)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(*mqd));  		/* reset ring buffer */  		ring->wptr = 0; @@ -6841,8 +6766,8 @@ static int gfx_v10_0_kiq_init_queue(struct amdgpu_ring *ring)  		nv_grbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex); -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(*mqd));  	}  	return 0; @@ -6864,17 +6789,14 @@ static int gfx_v10_0_kcq_init_queue(struct amdgpu_ring *ring)  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); -	} else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ -		/* reset MQD to a clean status */ +	} else { +		/* restore MQD to a clean status */  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(*mqd)); -  		/* reset ring buffer */  		ring->wptr = 0;  		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0);  		amdgpu_ring_clear_ring(ring); -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0; @@ -6885,21 +6807,22 @@ static int gfx_v10_0_kiq_resume(struct amdgpu_device *adev)  	struct amdgpu_ring *ring;  	int r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_bo_reserve(ring->mqd_obj, false);  	if (unlikely(r != 0))  		return r;  	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr); -	if (unlikely(r != 0)) +	if (unlikely(r != 0)) { +		amdgpu_bo_unreserve(ring->mqd_obj);  		return r; +	}  	gfx_v10_0_kiq_init_queue(ring);  	amdgpu_bo_kunmap(ring->mqd_obj);  	ring->mqd_ptr = NULL;  	amdgpu_bo_unreserve(ring->mqd_obj); -	ring->sched.ready = true;  	return 0;  } @@ -6927,7 +6850,7 @@ static int gfx_v10_0_kcq_resume(struct amdgpu_device *adev)  			goto done;  	} -	r = amdgpu_gfx_enable_kcq(adev); +	r = amdgpu_gfx_enable_kcq(adev, 0);  done:  	return r;  } @@ -7240,47 +7163,20 @@ static int gfx_v10_0_hw_init(void *handle)  	return r;  } -#ifndef BRING_UP_DEBUG -static int gfx_v10_0_kiq_disable_kgq(struct amdgpu_device *adev) -{ -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &kiq->ring; -	int i; - -	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) -		return -EINVAL; - -	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size * -					adev->gfx.num_gfx_rings)) -		return -ENOMEM; - -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) -		kiq->pmf->kiq_unmap_queues(kiq_ring, &adev->gfx.gfx_ring[i], -					   PREEMPT_QUEUES, 0, 0); -	if (!adev->job_hang) -		return amdgpu_ring_test_helper(kiq_ring); -	else -		return 0; -} -#endif -  static int gfx_v10_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	int r;  	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);  	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);  	if (!adev->no_hw_access) { -#ifndef BRING_UP_DEBUG  		if (amdgpu_async_gfx_ring) { -			r = gfx_v10_0_kiq_disable_kgq(adev); -			if (r) +			if (amdgpu_gfx_disable_kgq(adev, 0))  				DRM_ERROR("KGQ disable failed\n");  		} -#endif -		if (amdgpu_gfx_disable_kcq(adev)) + +		if (amdgpu_gfx_disable_kcq(adev, 0))  			DRM_ERROR("KCQ disable failed\n");  	} @@ -7572,7 +7468,7 @@ static bool gfx_v10_0_is_rlc_enabled(struct amdgpu_device *adev)  	return (REG_GET_FIELD(rlc_cntl, RLC_CNTL, RLC_ENABLE_F32)) ? true : false;  } -static void gfx_v10_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v10_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -7613,7 +7509,7 @@ static void gfx_v10_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v10_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v10_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data; @@ -7960,7 +7856,7 @@ static void gfx_v10_0_apply_medium_grain_clock_gating_workaround(struct amdgpu_d  static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  					    bool enable)  { -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (enable) {  		/* enable FGCG firstly*/ @@ -7999,7 +7895,7 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  	     AMD_CG_SUPPORT_GFX_3D_CGLS))  		gfx_v10_0_enable_gui_idle_interrupt(adev, enable); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -8093,11 +7989,11 @@ static void gfx_v10_cntl_power_gating(struct amdgpu_device *adev, bool enable)  static void gfx_v10_cntl_pg(struct amdgpu_device *adev, bool enable)  { -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	gfx_v10_cntl_power_gating(adev, enable); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs = { @@ -8152,8 +8048,14 @@ static int gfx_v10_0_set_powergating_state(void *handle,  	case IP_VERSION(10, 3, 3):  	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 7): +		if (!enable) +			amdgpu_gfx_off_ctrl(adev, false); +  		gfx_v10_cntl_pg(adev, enable); -		amdgpu_gfx_off_ctrl(adev, enable); + +		if (enable) +			amdgpu_gfx_off_ctrl(adev, true); +  		break;  	default:  		break; @@ -8640,7 +8542,7 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)  {  	int i, r = 0;  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *kiq_ring = &kiq->ring;  	unsigned long flags; @@ -9148,7 +9050,7 @@ static int gfx_v10_0_kiq_set_interrupt_state(struct amdgpu_device *adev,  					     enum amdgpu_interrupt_state state)  {  	uint32_t tmp, target; -	struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); +	struct amdgpu_ring *ring = &(adev->gfx.kiq[0].ring);  	if (ring->me == 1)  		target = SOC15_REG_OFFSET(GC, 0, mmCP_ME1_PIPE0_INT_CNTL); @@ -9192,7 +9094,7 @@ static int gfx_v10_0_kiq_irq(struct amdgpu_device *adev,  			     struct amdgpu_iv_entry *entry)  {  	u8 me_id, pipe_id, queue_id; -	struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); +	struct amdgpu_ring *ring = &(adev->gfx.kiq[0].ring);  	me_id = (entry->ring_id & 0x0c) >> 2;  	pipe_id = (entry->ring_id & 0x03) >> 0; @@ -9369,7 +9271,7 @@ static void gfx_v10_0_set_ring_funcs(struct amdgpu_device *adev)  {  	int i; -	adev->gfx.kiq.ring.funcs = &gfx_v10_0_ring_funcs_kiq; +	adev->gfx.kiq[0].ring.funcs = &gfx_v10_0_ring_funcs_kiq;  	for (i = 0; i < adev->gfx.num_gfx_rings; i++)  		adev->gfx.gfx_ring[i].funcs = &gfx_v10_0_ring_funcs_gfx; @@ -9403,8 +9305,8 @@ static void gfx_v10_0_set_irq_funcs(struct amdgpu_device *adev)  	adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;  	adev->gfx.eop_irq.funcs = &gfx_v10_0_eop_irq_funcs; -	adev->gfx.kiq.irq.num_types = AMDGPU_CP_KIQ_IRQ_LAST; -	adev->gfx.kiq.irq.funcs = &gfx_v10_0_kiq_irq_funcs; +	adev->gfx.kiq[0].irq.num_types = AMDGPU_CP_KIQ_IRQ_LAST; +	adev->gfx.kiq[0].irq.funcs = &gfx_v10_0_kiq_irq_funcs;  	adev->gfx.priv_reg_irq.num_types = 1;  	adev->gfx.priv_reg_irq.funcs = &gfx_v10_0_priv_reg_irq_funcs; @@ -9541,7 +9443,7 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v10_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 4 && j < 2)  				gfx_v10_0_set_user_wgp_inactive_bitmap_per_sh(  					adev, disable_masks[i * 2 + j]); @@ -9562,7 +9464,7 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,  			cu_info->ao_cu_bitmap[i][j] = ao_bitmap;  		}  	} -	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v10_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c index f5c376276984..690e121d9dda 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c @@ -112,7 +112,7 @@ static int gfx_v11_0_get_cu_info(struct amdgpu_device *adev,                                   struct amdgpu_cu_info *cu_info);  static uint64_t gfx_v11_0_get_gpu_clock_counter(struct amdgpu_device *adev);  static void gfx_v11_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, -				   u32 sh_num, u32 instance); +				   u32 sh_num, u32 instance, int xcc_id);  static u32 gfx_v11_0_get_wgp_active_bitmap_per_sh(struct amdgpu_device *adev);  static void gfx_v11_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume); @@ -123,8 +123,8 @@ static int gfx_v11_0_wait_for_rlc_autoload_complete(struct amdgpu_device *adev);  static void gfx_v11_0_ring_invalidate_tlbs(struct amdgpu_ring *ring,  					   uint16_t pasid, uint32_t flush_type,  					   bool all_hub, uint8_t dst_sel); -static void gfx_v11_0_set_safe_mode(struct amdgpu_device *adev); -static void gfx_v11_0_unset_safe_mode(struct amdgpu_device *adev); +static void gfx_v11_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id); +static void gfx_v11_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id);  static void gfx_v11_0_update_perf_clk(struct amdgpu_device *adev,  				      bool enable); @@ -192,7 +192,7 @@ static void gfx11_kiq_unmap_queues(struct amdgpu_ring *kiq_ring,  	struct amdgpu_device *adev = kiq_ring->adev;  	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0; -	if (adev->enable_mes && !adev->gfx.kiq.ring.sched.ready) { +	if (adev->enable_mes && !adev->gfx.kiq[0].ring.sched.ready) {  		amdgpu_mes_unmap_legacy_queue(adev, ring, action, gpu_addr, seq);  		return;  	} @@ -260,7 +260,7 @@ static const struct kiq_pm4_funcs gfx_v11_0_kiq_pm4_funcs = {  static void gfx_v11_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)  { -	adev->gfx.kiq.pmf = &gfx_v11_0_kiq_pm4_funcs; +	adev->gfx.kiq[0].pmf = &gfx_v11_0_kiq_pm4_funcs;  }  static void gfx_v11_0_init_golden_registers(struct amdgpu_device *adev) @@ -463,6 +463,23 @@ out:  	return err;  } +static void gfx_v11_0_check_fw_cp_gfx_shadow(struct amdgpu_device *adev) +{ +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(11, 0, 0): +	case IP_VERSION(11, 0, 2): +	case IP_VERSION(11, 0, 3): +		if ((adev->gfx.me_fw_version >= 1505) && +		    (adev->gfx.pfp_fw_version >= 1600) && +		    (adev->gfx.mec_fw_version >= 512)) +			adev->gfx.cp_gfx_shadow = true; +		break; +	default: +		adev->gfx.cp_gfx_shadow = false; +		break; +	} +} +  static int gfx_v11_0_init_microcode(struct amdgpu_device *adev)  {  	char fw_name[40]; @@ -539,6 +556,7 @@ static int gfx_v11_0_init_microcode(struct amdgpu_device *adev)  	/* only one MEC for gfx 11.0.0. */  	adev->gfx.mec2_fw = NULL; +	gfx_v11_0_check_fw_cp_gfx_shadow(adev);  out:  	if (err) {  		amdgpu_ucode_release(&adev->gfx.pfp_fw); @@ -699,7 +717,7 @@ static int gfx_v11_0_mec_init(struct amdgpu_device *adev)  	u32 *hpd;  	size_t mec_hpd_size; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -747,7 +765,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t wave,  		*(out++) = RREG32_SOC15(GC, 0, regSQ_IND_DATA);  } -static void gfx_v11_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v11_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* in gfx11 the SIMD_ID is specified as part of the INSTANCE  	 * field when performing a select_se_sh so it should be @@ -773,7 +791,7 @@ static void gfx_v11_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd,  	dst[(*no_fields)++] = wave_read_ind(adev, wave, ixSQ_WAVE_MODE);  } -static void gfx_v11_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v11_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -784,7 +802,7 @@ static void gfx_v11_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,  		dst);  } -static void gfx_v11_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v11_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				      uint32_t wave, uint32_t thread,  				      uint32_t start, uint32_t size,  				      uint32_t *dst) @@ -795,11 +813,32 @@ static void gfx_v11_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd,  }  static void gfx_v11_0_select_me_pipe_q(struct amdgpu_device *adev, -									  u32 me, u32 pipe, u32 q, u32 vm) +					u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	soc21_grbm_select(adev, me, pipe, q, vm);  } +/* all sizes are in bytes */ +#define MQD_SHADOW_BASE_SIZE      73728 +#define MQD_SHADOW_BASE_ALIGNMENT 256 +#define MQD_FWWORKAREA_SIZE       484 +#define MQD_FWWORKAREA_ALIGNMENT  256 + +static int gfx_v11_0_get_gfx_shadow_info(struct amdgpu_device *adev, +					 struct amdgpu_gfx_shadow_info *shadow_info) +{ +	if (adev->gfx.cp_gfx_shadow) { +		shadow_info->shadow_size = MQD_SHADOW_BASE_SIZE; +		shadow_info->shadow_alignment = MQD_SHADOW_BASE_ALIGNMENT; +		shadow_info->csa_size = MQD_FWWORKAREA_SIZE; +		shadow_info->csa_alignment = MQD_FWWORKAREA_ALIGNMENT; +		return 0; +	} else { +		memset(shadow_info, 0, sizeof(struct amdgpu_gfx_shadow_info)); +		return -ENOTSUPP; +	} +} +  static const struct amdgpu_gfx_funcs gfx_v11_0_gfx_funcs = {  	.get_gpu_clock_counter = &gfx_v11_0_get_gpu_clock_counter,  	.select_se_sh = &gfx_v11_0_select_se_sh, @@ -808,6 +847,7 @@ static const struct amdgpu_gfx_funcs gfx_v11_0_gfx_funcs = {  	.read_wave_vgprs = &gfx_v11_0_read_wave_vgprs,  	.select_me_pipe_q = &gfx_v11_0_select_me_pipe_q,  	.update_perfmon_mgcg = &gfx_v11_0_update_perf_clk, +	.get_gfx_shadow_info = &gfx_v11_0_get_gfx_shadow_info,  };  static int gfx_v11_0_gpu_early_init(struct amdgpu_device *adev) @@ -866,7 +906,7 @@ static int gfx_v11_0_gfx_ring_init(struct amdgpu_device *adev, int ring_id,  		ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;  	else  		ring->doorbell_index = adev->doorbell_index.gfx_ring1 << 1; -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->vm_hub = AMDGPU_GFXHUB(0);  	sprintf(ring->name, "gfx_%d.%d.%d", ring->me, ring->pipe, ring->queue);  	irq_type = AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP + ring->pipe; @@ -897,7 +937,7 @@ static int gfx_v11_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1;  	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr  				+ (ring_id * GFX11_MEC_HPD_SIZE); -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->vm_hub = AMDGPU_GFXHUB(0);  	sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);  	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP @@ -1367,8 +1407,8 @@ static int gfx_v11_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, -								     j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v11_0_compute_ring_init(adev, ring_id, @@ -1382,19 +1422,19 @@ static int gfx_v11_0_sw_init(void *handle)  	}  	if (!adev->enable_mes_kiq) { -		r = amdgpu_gfx_kiq_init(adev, GFX11_MEC_HPD_SIZE); +		r = amdgpu_gfx_kiq_init(adev, GFX11_MEC_HPD_SIZE, 0);  		if (r) {  			DRM_ERROR("Failed to init KIQ BOs!\n");  			return r;  		} -		kiq = &adev->gfx.kiq; -		r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); +		kiq = &adev->gfx.kiq[0]; +		r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);  		if (r)  			return r;  	} -	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v11_compute_mqd)); +	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v11_compute_mqd), 0);  	if (r)  		return r; @@ -1456,11 +1496,11 @@ static int gfx_v11_0_sw_fini(void *handle)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); -	amdgpu_gfx_mqd_sw_fini(adev); +	amdgpu_gfx_mqd_sw_fini(adev, 0);  	if (!adev->enable_mes_kiq) { -		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); -		amdgpu_gfx_kiq_fini(adev); +		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring); +		amdgpu_gfx_kiq_fini(adev, 0);  	}  	gfx_v11_0_pfp_fini(adev); @@ -1477,7 +1517,7 @@ static int gfx_v11_0_sw_fini(void *handle)  }  static void gfx_v11_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, -				   u32 sh_num, u32 instance) +				   u32 sh_num, u32 instance, int xcc_id)  {  	u32 data; @@ -1598,6 +1638,7 @@ static void gfx_v11_0_init_compute_vmid(struct amdgpu_device *adev)  		/* Enable trap for each kfd vmid. */  		data = RREG32_SOC15(GC, 0, regSPI_GDBG_PER_VMID_CNTL);  		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1); +		WREG32_SOC15(GC, 0, regSPI_GDBG_PER_VMID_CNTL, data);  	}  	soc21_grbm_select(adev, 0, 0, 0, 0);  	mutex_unlock(&adev->srbm_mutex); @@ -1667,7 +1708,7 @@ static void gfx_v11_0_constants_init(struct amdgpu_device *adev)  	/* XXX SH_MEM regs */  	/* where to put LDS, scratch, GPUVM in FSA64 space */  	mutex_lock(&adev->srbm_mutex); -	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB_0].num_ids; i++) { +	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) {  		soc21_grbm_select(adev, 0, 0, 0, i);  		/* CP and shaders */  		WREG32_SOC15(GC, 0, regSH_MEM_CONFIG, DEFAULT_SH_MEM_CONFIG); @@ -3188,7 +3229,6 @@ static int gfx_v11_0_cp_gfx_resume(struct amdgpu_device *adev)  	u32 tmp;  	u32 rb_bufsz;  	u64 rb_addr, rptr_addr, wptr_gpu_addr; -	u32 i;  	/* Set the write pointer delay */  	WREG32_SOC15(GC, 0, regCP_RB_WPTR_DELAY, 0); @@ -3280,11 +3320,6 @@ static int gfx_v11_0_cp_gfx_resume(struct amdgpu_device *adev)  	/* start the ring */  	gfx_v11_0_cp_gfx_start(adev); -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) { -		ring = &adev->gfx.gfx_ring[i]; -		ring->sched.ready = true; -	} -  	return 0;  } @@ -3330,8 +3365,6 @@ static void gfx_v11_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  		WREG32_SOC15(GC, 0, regCP_MEC_CNTL, data);  	} -	adev->gfx.kiq.ring.sched.ready = enable; -  	udelay(50);  } @@ -3633,55 +3666,6 @@ static int gfx_v11_0_gfx_mqd_init(struct amdgpu_device *adev, void *m,  	return 0;  } -#ifdef BRING_UP_DEBUG -static int gfx_v11_0_gfx_queue_init_register(struct amdgpu_ring *ring) -{ -	struct amdgpu_device *adev = ring->adev; -	struct v11_gfx_mqd *mqd = ring->mqd_ptr; - -	/* set mmCP_GFX_HQD_WPTR/_HI to 0 */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_WPTR, mqd->cp_gfx_hqd_wptr); -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_WPTR_HI, mqd->cp_gfx_hqd_wptr_hi); - -	/* set GFX_MQD_BASE */ -	WREG32_SOC15(GC, 0, regCP_MQD_BASE_ADDR, mqd->cp_mqd_base_addr); -	WREG32_SOC15(GC, 0, regCP_MQD_BASE_ADDR_HI, mqd->cp_mqd_base_addr_hi); - -	/* set GFX_MQD_CONTROL */ -	WREG32_SOC15(GC, 0, regCP_GFX_MQD_CONTROL, mqd->cp_gfx_mqd_control); - -	/* set GFX_HQD_VMID to 0 */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_VMID, mqd->cp_gfx_hqd_vmid); - -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_QUEUE_PRIORITY, -			mqd->cp_gfx_hqd_queue_priority); -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_QUANTUM, mqd->cp_gfx_hqd_quantum); - -	/* set GFX_HQD_BASE, similar as CP_RB_BASE */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_BASE, mqd->cp_gfx_hqd_base); -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_BASE_HI, mqd->cp_gfx_hqd_base_hi); - -	/* set GFX_HQD_RPTR_ADDR, similar as CP_RB_RPTR */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_RPTR_ADDR, mqd->cp_gfx_hqd_rptr_addr); -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_RPTR_ADDR_HI, mqd->cp_gfx_hqd_rptr_addr_hi); - -	/* set GFX_HQD_CNTL, similar as CP_RB_CNTL */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_CNTL, mqd->cp_gfx_hqd_cntl); - -	/* set RB_WPTR_POLL_ADDR */ -	WREG32_SOC15(GC, 0, regCP_RB_WPTR_POLL_ADDR_LO, mqd->cp_rb_wptr_poll_addr_lo); -	WREG32_SOC15(GC, 0, regCP_RB_WPTR_POLL_ADDR_HI, mqd->cp_rb_wptr_poll_addr_hi); - -	/* set RB_DOORBELL_CONTROL */ -	WREG32_SOC15(GC, 0, regCP_RB_DOORBELL_CONTROL, mqd->cp_rb_doorbell_control); - -	/* active the queue */ -	WREG32_SOC15(GC, 0, regCP_GFX_HQD_ACTIVE, mqd->cp_gfx_hqd_active); - -	return 0; -} -#endif -  static int gfx_v11_0_gfx_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; @@ -3693,59 +3677,23 @@ static int gfx_v11_0_gfx_init_queue(struct amdgpu_ring *ring)  		mutex_lock(&adev->srbm_mutex);  		soc21_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);  		amdgpu_ring_init_mqd(ring); -#ifdef BRING_UP_DEBUG -		gfx_v11_0_gfx_queue_init_register(ring); -#endif  		soc21_grbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  		if (adev->gfx.me.mqd_backup[mqd_idx])  			memcpy(adev->gfx.me.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); -	} else if (amdgpu_in_reset(adev)) { -		/* reset mqd with the backup copy */ +	} else { +		/* restore mqd with the backup copy */  		if (adev->gfx.me.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.me.mqd_backup[mqd_idx], sizeof(*mqd));  		/* reset the ring */  		ring->wptr = 0;  		*ring->wptr_cpu_addr = 0;  		amdgpu_ring_clear_ring(ring); -#ifdef BRING_UP_DEBUG -		mutex_lock(&adev->srbm_mutex); -		soc21_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0); -		gfx_v11_0_gfx_queue_init_register(ring); -		soc21_grbm_select(adev, 0, 0, 0, 0); -		mutex_unlock(&adev->srbm_mutex); -#endif -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0;  } -#ifndef BRING_UP_DEBUG -static int gfx_v11_0_kiq_enable_kgq(struct amdgpu_device *adev) -{ -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; -	int r, i; - -	if (!kiq->pmf || !kiq->pmf->kiq_map_queues) -		return -EINVAL; - -	r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size * -					adev->gfx.num_gfx_rings); -	if (r) { -		DRM_ERROR("Failed to lock KIQ (%d).\n", r); -		return r; -	} - -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) -		kiq->pmf->kiq_map_queues(kiq_ring, &adev->gfx.gfx_ring[i]); - -	return amdgpu_ring_test_helper(kiq_ring); -} -#endif -  static int gfx_v11_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  {  	int r, i; @@ -3756,7 +3704,7 @@ static int gfx_v11_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  		r = amdgpu_bo_reserve(ring->mqd_obj, false);  		if (unlikely(r != 0)) -			goto done; +			return r;  		r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);  		if (!r) { @@ -3766,23 +3714,14 @@ static int gfx_v11_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)  		}  		amdgpu_bo_unreserve(ring->mqd_obj);  		if (r) -			goto done; +			return r;  	} -#ifndef BRING_UP_DEBUG -	r = gfx_v11_0_kiq_enable_kgq(adev); -	if (r) -		goto done; -#endif -	r = gfx_v11_0_cp_gfx_start(adev); + +	r = amdgpu_gfx_enable_kgq(adev, 0);  	if (r) -		goto done; +		return r; -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) { -		ring = &adev->gfx.gfx_ring[i]; -		ring->sched.ready = true; -	} -done: -	return r; +	return gfx_v11_0_cp_gfx_start(adev);  }  static int gfx_v11_0_compute_mqd_init(struct amdgpu_device *adev, void *m, @@ -4028,14 +3967,13 @@ static int gfx_v11_0_kiq_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	struct v11_compute_mqd *mqd = ring->mqd_ptr; -	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;  	gfx_v11_0_kiq_setting(ring);  	if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */  		/* reset MQD to a clean status */ -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(*mqd)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(*mqd));  		/* reset ring buffer */  		ring->wptr = 0; @@ -4057,8 +3995,8 @@ static int gfx_v11_0_kiq_init_queue(struct amdgpu_ring *ring)  		soc21_grbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex); -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(*mqd));  	}  	return 0; @@ -4080,17 +4018,14 @@ static int gfx_v11_0_kcq_init_queue(struct amdgpu_ring *ring)  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(*mqd)); -	} else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ -		/* reset MQD to a clean status */ +	} else { +		/* restore MQD to a clean status */  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(*mqd)); -  		/* reset ring buffer */  		ring->wptr = 0;  		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0);  		amdgpu_ring_clear_ring(ring); -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0; @@ -4101,7 +4036,7 @@ static int gfx_v11_0_kiq_resume(struct amdgpu_device *adev)  	struct amdgpu_ring *ring;  	int r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_bo_reserve(ring->mqd_obj, false);  	if (unlikely(r != 0)) @@ -4146,7 +4081,7 @@ static int gfx_v11_0_kcq_resume(struct amdgpu_device *adev)  			goto done;  	} -	r = amdgpu_gfx_enable_kcq(adev); +	r = amdgpu_gfx_enable_kcq(adev, 0);  done:  	return r;  } @@ -4239,7 +4174,7 @@ static int gfx_v11_0_gfxhub_enable(struct amdgpu_device *adev)  		false : true;  	adev->gfxhub.funcs->set_fault_enable_default(adev, value); -	amdgpu_gmc_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB_0, 0); +	amdgpu_gmc_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB(0), 0);  	return 0;  } @@ -4407,48 +4342,20 @@ static int gfx_v11_0_hw_init(void *handle)  	return r;  } -#ifndef BRING_UP_DEBUG -static int gfx_v11_0_kiq_disable_kgq(struct amdgpu_device *adev) -{ -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &kiq->ring; -	int i, r = 0; - -	if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) -		return -EINVAL; - -	if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size * -					adev->gfx.num_gfx_rings)) -		return -ENOMEM; - -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) -		kiq->pmf->kiq_unmap_queues(kiq_ring, &adev->gfx.gfx_ring[i], -					   PREEMPT_QUEUES, 0, 0); - -	if (adev->gfx.kiq.ring.sched.ready) -		r = amdgpu_ring_test_helper(kiq_ring); - -	return r; -} -#endif -  static int gfx_v11_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	int r;  	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);  	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);  	if (!adev->no_hw_access) { -#ifndef BRING_UP_DEBUG  		if (amdgpu_async_gfx_ring) { -			r = gfx_v11_0_kiq_disable_kgq(adev); -			if (r) +			if (amdgpu_gfx_disable_kgq(adev, 0))  				DRM_ERROR("KGQ disable failed\n");  		} -#endif -		if (amdgpu_gfx_disable_kcq(adev)) + +		if (amdgpu_gfx_disable_kcq(adev, 0))  			DRM_ERROR("KCQ disable failed\n");  		amdgpu_mes_kiq_hw_fini(adev); @@ -4525,7 +4432,7 @@ static int gfx_v11_0_soft_reset(void *handle)  	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL, GFX_IDLE_INT_ENABLE, 0);  	WREG32_SOC15(GC, 0, regCP_INT_CNTL, tmp); -	gfx_v11_0_set_safe_mode(adev); +	gfx_v11_0_set_safe_mode(adev, 0);  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) { @@ -4625,7 +4532,7 @@ static int gfx_v11_0_soft_reset(void *handle)  	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL, GFX_IDLE_INT_ENABLE, 1);  	WREG32_SOC15(GC, 0, regCP_INT_CNTL, tmp); -	gfx_v11_0_unset_safe_mode(adev); +	gfx_v11_0_unset_safe_mode(adev, 0);  	return gfx_v11_0_cp_resume(adev);  } @@ -4667,24 +4574,27 @@ static uint64_t gfx_v11_0_get_gpu_clock_counter(struct amdgpu_device *adev)  	uint64_t clock;  	uint64_t clock_counter_lo, clock_counter_hi_pre, clock_counter_hi_after; -	amdgpu_gfx_off_ctrl(adev, false); -	mutex_lock(&adev->gfx.gpu_clock_mutex);  	if (amdgpu_sriov_vf(adev)) { +		amdgpu_gfx_off_ctrl(adev, false); +		mutex_lock(&adev->gfx.gpu_clock_mutex);  		clock_counter_hi_pre = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_HI);  		clock_counter_lo = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_LO);  		clock_counter_hi_after = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_HI);  		if (clock_counter_hi_pre != clock_counter_hi_after)  			clock_counter_lo = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_LO); +		mutex_unlock(&adev->gfx.gpu_clock_mutex); +		amdgpu_gfx_off_ctrl(adev, true);  	} else { +		preempt_disable();  		clock_counter_hi_pre = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_UPPER);  		clock_counter_lo = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_LOWER);  		clock_counter_hi_after = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_UPPER);  		if (clock_counter_hi_pre != clock_counter_hi_after)  			clock_counter_lo = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_LOWER); +		preempt_enable();  	}  	clock = clock_counter_lo | (clock_counter_hi_after << 32ULL); -	mutex_unlock(&adev->gfx.gpu_clock_mutex); -	amdgpu_gfx_off_ctrl(adev, true); +  	return clock;  } @@ -4791,7 +4701,7 @@ static bool gfx_v11_0_is_rlc_enabled(struct amdgpu_device *adev)  	return (REG_GET_FIELD(rlc_cntl, RLC_CNTL, RLC_ENABLE_F32)) ? true : false;  } -static void gfx_v11_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v11_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -4810,7 +4720,7 @@ static void gfx_v11_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v11_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v11_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	WREG32_SOC15(GC, 0, regRLC_SAFE_MODE, RLC_SAFE_MODE__CMD_MASK);  } @@ -5038,7 +4948,7 @@ static void gfx_v11_0_update_coarse_grain_clock_gating(struct amdgpu_device *ade  static int gfx_v11_0_update_gfx_clock_gating(struct amdgpu_device *adev,  					    bool enable)  { -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	gfx_v11_0_update_coarse_grain_clock_gating(adev, enable); @@ -5058,7 +4968,7 @@ static int gfx_v11_0_update_gfx_clock_gating(struct amdgpu_device *adev,  	     AMD_CG_SUPPORT_GFX_3D_CGLS))  	        gfx_v11_0_enable_gui_idle_interrupt(adev, enable); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -5126,11 +5036,11 @@ static void gfx_v11_cntl_power_gating(struct amdgpu_device *adev, bool enable)  static void gfx_v11_cntl_pg(struct amdgpu_device *adev, bool enable)  { -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	gfx_v11_cntl_power_gating(adev, enable); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static int gfx_v11_0_set_powergating_state(void *handle, @@ -5150,8 +5060,14 @@ static int gfx_v11_0_set_powergating_state(void *handle,  		break;  	case IP_VERSION(11, 0, 1):  	case IP_VERSION(11, 0, 4): +		if (!enable) +			amdgpu_gfx_off_ctrl(adev, false); +  		gfx_v11_cntl_pg(adev, enable); -		amdgpu_gfx_off_ctrl(adev, enable); + +		if (enable) +			amdgpu_gfx_off_ctrl(adev, true); +  		break;  	default:  		break; @@ -5583,6 +5499,29 @@ static void gfx_v11_0_ring_emit_cntxcntl(struct amdgpu_ring *ring,  	amdgpu_ring_write(ring, 0);  } +static void gfx_v11_0_ring_emit_gfx_shadow(struct amdgpu_ring *ring, +					   u64 shadow_va, u64 csa_va, +					   u64 gds_va, bool init_shadow, +					   int vmid) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (!adev->gfx.cp_gfx_shadow) +		return; + +	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_Q_PREEMPTION_MODE, 7)); +	amdgpu_ring_write(ring, lower_32_bits(shadow_va)); +	amdgpu_ring_write(ring, upper_32_bits(shadow_va)); +	amdgpu_ring_write(ring, lower_32_bits(gds_va)); +	amdgpu_ring_write(ring, upper_32_bits(gds_va)); +	amdgpu_ring_write(ring, lower_32_bits(csa_va)); +	amdgpu_ring_write(ring, upper_32_bits(csa_va)); +	amdgpu_ring_write(ring, shadow_va ? +			  PACKET3_SET_Q_PREEMPTION_MODE_IB_VMID(vmid) : 0); +	amdgpu_ring_write(ring, init_shadow ? +			  PACKET3_SET_Q_PREEMPTION_MODE_INIT_SHADOW_MEM : 0); +} +  static unsigned gfx_v11_0_ring_emit_init_cond_exec(struct amdgpu_ring *ring)  {  	unsigned ret; @@ -5614,7 +5553,7 @@ static int gfx_v11_0_ring_preempt_ib(struct amdgpu_ring *ring)  {  	int i, r = 0;  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *kiq_ring = &kiq->ring;  	unsigned long flags; @@ -6082,7 +6021,7 @@ static int gfx_v11_0_kiq_set_interrupt_state(struct amdgpu_device *adev,  					     enum amdgpu_interrupt_state state)  {  	uint32_t tmp, target; -	struct amdgpu_ring *ring = &(adev->gfx.kiq.ring); +	struct amdgpu_ring *ring = &(adev->gfx.kiq[0].ring);  	target = SOC15_REG_OFFSET(GC, 0, regCP_ME1_PIPE0_INT_CNTL);  	target += ring->pipe; @@ -6173,6 +6112,7 @@ static const struct amdgpu_ring_funcs gfx_v11_0_ring_funcs_gfx = {  	.set_wptr = gfx_v11_0_ring_set_wptr_gfx,  	.emit_frame_size = /* totally 242 maximum if 16 IBs */  		5 + /* COND_EXEC */ +		9 + /* SET_Q_PREEMPTION_MODE */  		7 + /* PIPELINE_SYNC */  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 + @@ -6199,6 +6139,7 @@ static const struct amdgpu_ring_funcs gfx_v11_0_ring_funcs_gfx = {  	.insert_nop = amdgpu_ring_insert_nop,  	.pad_ib = amdgpu_ring_generic_pad_ib,  	.emit_cntxcntl = gfx_v11_0_ring_emit_cntxcntl, +	.emit_gfx_shadow = gfx_v11_0_ring_emit_gfx_shadow,  	.init_cond_exec = gfx_v11_0_ring_emit_init_cond_exec,  	.patch_cond_exec = gfx_v11_0_ring_emit_patch_cond_exec,  	.preempt_ib = gfx_v11_0_ring_preempt_ib, @@ -6279,7 +6220,7 @@ static void gfx_v11_0_set_ring_funcs(struct amdgpu_device *adev)  {  	int i; -	adev->gfx.kiq.ring.funcs = &gfx_v11_0_ring_funcs_kiq; +	adev->gfx.kiq[0].ring.funcs = &gfx_v11_0_ring_funcs_kiq;  	for (i = 0; i < adev->gfx.num_gfx_rings; i++)  		adev->gfx.gfx_ring[i].funcs = &gfx_v11_0_ring_funcs_gfx; @@ -6428,7 +6369,7 @@ static int gfx_v11_0_get_cu_info(struct amdgpu_device *adev,  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {  			mask = 1;  			counter = 0; -			gfx_v11_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v11_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 8 && j < 2)  				gfx_v11_0_set_user_wgp_inactive_bitmap_per_sh(  					adev, disable_masks[i * 2 + j]); @@ -6460,7 +6401,7 @@ static int gfx_v11_0_get_cu_info(struct amdgpu_device *adev,  			active_cu_number += counter;  		}  	} -	gfx_v11_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v11_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.c index 068b9586a223..26d6286d86c9 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.c @@ -84,8 +84,20 @@ static int gfx_v11_0_3_poison_consumption_handler(struct amdgpu_device *adev,  	/* Workaround: when vmid and pasid are both zero, trigger gpu reset in KGD. */  	if (entry && (entry->client_id == SOC21_IH_CLIENTID_GFX) &&  	    (entry->src_id == GFX_11_0_0__SRCID__RLC_GC_FED_INTERRUPT) && -	     !entry->vmid && !entry->pasid) +	     !entry->vmid && !entry->pasid) { +		uint32_t rlc_status0 = 0; + +		rlc_status0 = RREG32_SOC15(GC, 0, regRLC_RLCS_FED_STATUS_0); + +		if (REG_GET_FIELD(rlc_status0, RLC_RLCS_FED_STATUS_0, SDMA0_FED_ERR) || +		    REG_GET_FIELD(rlc_status0, RLC_RLCS_FED_STATUS_0, SDMA1_FED_ERR)) { +			struct amdgpu_ras *ras = amdgpu_ras_get_context(adev); + +			ras->gpu_reset_flags |= AMDGPU_RAS_GPU_RESET_MODE2_RESET; +		} +  		amdgpu_ras_reset_gpu(adev); +	}  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c index c41219e23151..da6caff78c22 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c @@ -1285,7 +1285,7 @@ static void gfx_v6_0_tiling_mode_table_init(struct amdgpu_device *adev)  }  static void gfx_v6_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, -				  u32 sh_num, u32 instance) +				  u32 sh_num, u32 instance, int xcc_id)  {  	u32 data; @@ -1438,12 +1438,12 @@ static void gfx_v6_0_write_harvested_raster_configs(struct amdgpu_device *adev,  		}  		/* GRBM_GFX_INDEX has a different offset on SI */ -		gfx_v6_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); +		gfx_v6_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff, 0);  		WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);  	}  	/* GRBM_GFX_INDEX has a different offset on SI */ -	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  }  static void gfx_v6_0_setup_rb(struct amdgpu_device *adev) @@ -1459,14 +1459,14 @@ static void gfx_v6_0_setup_rb(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v6_0_get_rb_active_bitmap(adev);  			active_rbs |= data <<  				((i * adev->gfx.config.max_sh_per_se + j) *  				 rb_bitmap_width_per_sh);  		}  	} -	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	adev->gfx.config.backend_enable_mask = active_rbs;  	adev->gfx.config.num_rbs = hweight32(active_rbs); @@ -1487,7 +1487,7 @@ static void gfx_v6_0_setup_rb(struct amdgpu_device *adev)  	/* cache the values for userspace */  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			adev->gfx.config.rb_config[i][j].rb_backend_disable =  				RREG32(mmCC_RB_BACKEND_DISABLE);  			adev->gfx.config.rb_config[i][j].user_rb_backend_disable = @@ -1496,7 +1496,7 @@ static void gfx_v6_0_setup_rb(struct amdgpu_device *adev)  				RREG32(mmPA_SC_RASTER_CONFIG);  		}  	} -	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -1535,7 +1535,7 @@ static void gfx_v6_0_setup_spi(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = RREG32(mmSPI_STATIC_THREAD_MGMT_3);  			active_cu = gfx_v6_0_get_cu_enabled(adev); @@ -1550,7 +1550,7 @@ static void gfx_v6_0_setup_spi(struct amdgpu_device *adev)  			}  		}  	} -	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -2391,7 +2391,7 @@ static void gfx_v6_0_enable_lbpw(struct amdgpu_device *adev, bool enable)  	WREG32_FIELD(RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0);  	if (!enable) { -		gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		WREG32(mmSPI_LB_CU_MASK, 0x00ff);  	}  } @@ -2968,7 +2968,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		*(out++) = RREG32(mmSQ_IND_DATA);  } -static void gfx_v6_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v6_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 0 wave data */  	dst[(*no_fields)++] = 0; @@ -2993,7 +2993,7 @@ static void gfx_v6_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -3003,7 +3003,7 @@ static void gfx_v6_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,  }  static void gfx_v6_0_select_me_pipe_q(struct amdgpu_device *adev, -				  u32 me, u32 pipe, u32 q, u32 vm) +				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	DRM_INFO("Not implemented\n");  } @@ -3028,6 +3028,7 @@ static int gfx_v6_0_early_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	adev->gfx.xcc_mask = 1;  	adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS;  	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),  					  GFX6_NUM_COMPUTE_RINGS); @@ -3073,7 +3074,7 @@ static int gfx_v6_0_sw_init(void *handle)  		ring = &adev->gfx.gfx_ring[i];  		ring->ring_obj = NULL;  		sprintf(ring->name, "gfx"); -		r = amdgpu_ring_init(adev, ring, 1024, +		r = amdgpu_ring_init(adev, ring, 2048,  				     &adev->gfx.eop_irq,  				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP,  				     AMDGPU_RING_PRIO_DEFAULT, NULL); @@ -3571,7 +3572,7 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 4 && j < 2)  				gfx_v6_0_set_user_cu_inactive_bitmap(  					adev, disable_masks[i * 2 + j]); @@ -3593,7 +3594,7 @@ static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)  		}  	} -	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 9d5c1e29b4a3..8c174c11eaee 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -1548,11 +1548,12 @@ static void gfx_v7_0_tiling_mode_table_init(struct amdgpu_device *adev)   * @sh_num: sh block to address   * @instance: Certain registers are instanced per SE or SH.   *            0xffffffff means broadcast to all SEs or SHs (CIK). - * + * @xcc_id: xcc accelerated compute core id   * Select which SE, SH combinations to address.   */  static void gfx_v7_0_select_se_sh(struct amdgpu_device *adev, -				  u32 se_num, u32 sh_num, u32 instance) +				  u32 se_num, u32 sh_num, u32 instance, +				  int xcc_id)  {  	u32 data; @@ -1732,13 +1733,13 @@ gfx_v7_0_write_harvested_raster_configs(struct amdgpu_device *adev,  		}  		/* GRBM_GFX_INDEX has a different offset on CI+ */ -		gfx_v7_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); +		gfx_v7_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff, 0);  		WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);  		WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);  	}  	/* GRBM_GFX_INDEX has a different offset on CI+ */ -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  }  /** @@ -1761,13 +1762,13 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v7_0_get_rb_active_bitmap(adev);  			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *  					       rb_bitmap_width_per_sh);  		}  	} -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	adev->gfx.config.backend_enable_mask = active_rbs;  	adev->gfx.config.num_rbs = hweight32(active_rbs); @@ -1790,7 +1791,7 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)  	/* cache the values for userspace */  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			adev->gfx.config.rb_config[i][j].rb_backend_disable =  				RREG32(mmCC_RB_BACKEND_DISABLE);  			adev->gfx.config.rb_config[i][j].user_rb_backend_disable = @@ -1801,7 +1802,7 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)  				RREG32(mmPA_SC_RASTER_CONFIG_1);  		}  	} -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -1911,7 +1912,7 @@ static void gfx_v7_0_constants_init(struct amdgpu_device *adev)  	 * making sure that the following register writes will be broadcasted  	 * to all the shaders  	 */ -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	/* XXX SH_MEM regs */  	/* where to put LDS, scratch, GPUVM in FSA64 space */ @@ -2728,7 +2729,7 @@ static int gfx_v7_0_mec_init(struct amdgpu_device *adev)  	u32 *hpd;  	size_t mec_hpd_size; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -3301,7 +3302,7 @@ static void gfx_v7_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			for (k = 0; k < adev->usec_timeout; k++) {  				if (RREG32(mmRLC_SERDES_CU_MASTER_BUSY) == 0)  					break; @@ -3309,7 +3310,7 @@ static void gfx_v7_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  		}  	} -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK | @@ -3361,7 +3362,7 @@ static bool gfx_v7_0_is_rlc_enabled(struct amdgpu_device *adev)  	return true;  } -static void gfx_v7_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v7_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	u32 tmp, i, mask; @@ -3383,7 +3384,7 @@ static void gfx_v7_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v7_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v7_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	u32 tmp; @@ -3474,7 +3475,7 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev)  	WREG32(mmRLC_LB_CNTR_MAX, 0x00008000);  	mutex_lock(&adev->grbm_idx_mutex); -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32(mmRLC_LB_INIT_CU_MASK, 0xffffffff);  	WREG32(mmRLC_LB_PARAMS, 0x00600408);  	WREG32(mmRLC_LB_CNTL, 0x80000004); @@ -3530,7 +3531,7 @@ static void gfx_v7_0_enable_cgcg(struct amdgpu_device *adev, bool enable)  		tmp = gfx_v7_0_halt_rlc(adev);  		mutex_lock(&adev->grbm_idx_mutex); -		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);  		WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);  		tmp2 = RLC_SERDES_WR_CTRL__BPM_ADDR_MASK | @@ -3584,7 +3585,7 @@ static void gfx_v7_0_enable_mgcg(struct amdgpu_device *adev, bool enable)  		tmp = gfx_v7_0_halt_rlc(adev);  		mutex_lock(&adev->grbm_idx_mutex); -		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);  		WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);  		data = RLC_SERDES_WR_CTRL__BPM_ADDR_MASK | @@ -3635,7 +3636,7 @@ static void gfx_v7_0_enable_mgcg(struct amdgpu_device *adev, bool enable)  		tmp = gfx_v7_0_halt_rlc(adev);  		mutex_lock(&adev->grbm_idx_mutex); -		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);  		WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);  		data = RLC_SERDES_WR_CTRL__BPM_ADDR_MASK | RLC_SERDES_WR_CTRL__MGCG_OVERRIDE_1_MASK; @@ -4111,7 +4112,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		*(out++) = RREG32(mmSQ_IND_DATA);  } -static void gfx_v7_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v7_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 0 wave data */  	dst[(*no_fields)++] = 0; @@ -4136,7 +4137,7 @@ static void gfx_v7_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -4146,7 +4147,7 @@ static void gfx_v7_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,  }  static void gfx_v7_0_select_me_pipe_q(struct amdgpu_device *adev, -				  u32 me, u32 pipe, u32 q, u32 vm) +				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	cik_srbm_select(adev, me, pipe, q, vm);  } @@ -4178,6 +4179,7 @@ static int gfx_v7_0_early_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	adev->gfx.xcc_mask = 1;  	adev->gfx.num_gfx_rings = GFX7_NUM_GFX_RINGS;  	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),  					  AMDGPU_MAX_COMPUTE_RINGS); @@ -4456,7 +4458,8 @@ static int gfx_v7_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v7_0_compute_ring_init(adev, @@ -5114,7 +5117,7 @@ static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev)  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 4 && j < 2)  				gfx_v7_0_set_user_cu_inactive_bitmap(  					adev, disable_masks[i * 2 + j]); @@ -5135,7 +5138,7 @@ static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev)  			cu_info->ao_cu_bitmap[i][j] = ao_bitmap;  		}  	} -	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index b1f2684d854a..51c1745c8369 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -1304,7 +1304,7 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev)  	u32 *hpd;  	size_t mec_hpd_size; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -2001,7 +2001,8 @@ static int gfx_v8_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v8_0_compute_ring_init(adev, @@ -2015,19 +2016,19 @@ static int gfx_v8_0_sw_init(void *handle)  		}  	} -	r = amdgpu_gfx_kiq_init(adev, GFX8_MEC_HPD_SIZE); +	r = amdgpu_gfx_kiq_init(adev, GFX8_MEC_HPD_SIZE, 0);  	if (r) {  		DRM_ERROR("Failed to init KIQ BOs!\n");  		return r;  	} -	kiq = &adev->gfx.kiq; -	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); +	kiq = &adev->gfx.kiq[0]; +	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);  	if (r)  		return r;  	/* create MQD for all compute queues as well as KIQ for SRIOV case */ -	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation)); +	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation), 0);  	if (r)  		return r; @@ -2050,9 +2051,9 @@ static int gfx_v8_0_sw_fini(void *handle)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); -	amdgpu_gfx_mqd_sw_fini(adev); -	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); -	amdgpu_gfx_kiq_fini(adev); +	amdgpu_gfx_mqd_sw_fini(adev, 0); +	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring); +	amdgpu_gfx_kiq_fini(adev, 0);  	gfx_v8_0_mec_fini(adev);  	amdgpu_gfx_rlc_fini(adev); @@ -3394,7 +3395,8 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)  }  static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, -				  u32 se_num, u32 sh_num, u32 instance) +				  u32 se_num, u32 sh_num, u32 instance, +				  int xcc_id)  {  	u32 data; @@ -3417,7 +3419,7 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,  }  static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev, -				  u32 me, u32 pipe, u32 q, u32 vm) +				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	vi_srbm_select(adev, me, pipe, q, vm);  } @@ -3578,13 +3580,13 @@ gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device *adev,  		}  		/* GRBM_GFX_INDEX has a different offset on VI */ -		gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); +		gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff, 0);  		WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);  		WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);  	}  	/* GRBM_GFX_INDEX has a different offset on VI */ -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  }  static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) @@ -3600,13 +3602,13 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v8_0_get_rb_active_bitmap(adev);  			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *  					       rb_bitmap_width_per_sh);  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	adev->gfx.config.backend_enable_mask = active_rbs;  	adev->gfx.config.num_rbs = hweight32(active_rbs); @@ -3629,7 +3631,7 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  	/* cache the values for userspace */  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			adev->gfx.config.rb_config[i][j].rb_backend_disable =  				RREG32(mmCC_RB_BACKEND_DISABLE);  			adev->gfx.config.rb_config[i][j].user_rb_backend_disable = @@ -3640,7 +3642,7 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  				RREG32(mmPA_SC_RASTER_CONFIG_1);  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -3787,7 +3789,7 @@ static void gfx_v8_0_constants_init(struct amdgpu_device *adev)  	 * making sure that the following register writes will be broadcasted  	 * to all the shaders  	 */ -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32(mmPA_SC_FIFO_SIZE,  		   (adev->gfx.config.sc_prim_fifo_size_frontend << @@ -3818,7 +3820,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			for (k = 0; k < adev->usec_timeout; k++) {  				if (RREG32(mmRLC_SERDES_CU_MASTER_BUSY) == 0)  					break; @@ -3826,7 +3828,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  			if (k == adev->usec_timeout) {  				gfx_v8_0_select_se_sh(adev, 0xffffffff, -						      0xffffffff, 0xffffffff); +						      0xffffffff, 0xffffffff, 0);  				mutex_unlock(&adev->grbm_idx_mutex);  				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",  					 i, j); @@ -3834,7 +3836,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK | @@ -4281,7 +4283,6 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)  	/* start the ring */  	amdgpu_ring_clear_ring(ring);  	gfx_v8_0_cp_gfx_start(adev); -	ring->sched.ready = true;  	return 0;  } @@ -4292,7 +4293,7 @@ static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  		WREG32(mmCP_MEC_CNTL, 0);  	} else {  		WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		adev->gfx.kiq.ring.sched.ready = false; +		adev->gfx.kiq[0].ring.sched.ready = false;  	}  	udelay(50);  } @@ -4314,12 +4315,12 @@ static void gfx_v8_0_kiq_setting(struct amdgpu_ring *ring)  static int gfx_v8_0_kiq_kcq_enable(struct amdgpu_device *adev)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	uint64_t queue_mask = 0;  	int r, i;  	for (i = 0; i < AMDGPU_MAX_COMPUTE_QUEUES; ++i) { -		if (!test_bit(i, adev->gfx.mec.queue_bitmap)) +		if (!test_bit(i, adev->gfx.mec_bitmap[0].queue_bitmap))  			continue;  		/* This situation may be hit in the future if a new HW @@ -4595,14 +4596,13 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	struct vi_mqd *mqd = ring->mqd_ptr; -	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;  	gfx_v8_0_kiq_setting(ring);  	if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */  		/* reset MQD to a clean status */ -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(struct vi_mqd_allocation));  		/* reset ring buffer */  		ring->wptr = 0; @@ -4625,8 +4625,8 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)  		vi_srbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex); -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(struct vi_mqd_allocation));  	}  	return 0; @@ -4650,15 +4650,13 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); -	} else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ -		/* reset MQD to a clean status */ +	} else { +		/* restore MQD to a clean status */  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation));  		/* reset ring buffer */  		ring->wptr = 0;  		amdgpu_ring_clear_ring(ring); -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0;  } @@ -4678,21 +4676,22 @@ static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)  	struct amdgpu_ring *ring;  	int r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_bo_reserve(ring->mqd_obj, false);  	if (unlikely(r != 0))  		return r;  	r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr); -	if (unlikely(r != 0)) +	if (unlikely(r != 0)) { +		amdgpu_bo_unreserve(ring->mqd_obj);  		return r; +	}  	gfx_v8_0_kiq_init_queue(ring);  	amdgpu_bo_kunmap(ring->mqd_obj);  	ring->mqd_ptr = NULL;  	amdgpu_bo_unreserve(ring->mqd_obj); -	ring->sched.ready = true;  	return 0;  } @@ -4741,7 +4740,7 @@ static int gfx_v8_0_cp_test_all_rings(struct amdgpu_device *adev)  	if (r)  		return r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_ring_test_helper(ring);  	if (r)  		return r; @@ -4808,7 +4807,7 @@ static int gfx_v8_0_hw_init(void *handle)  static int gfx_v8_0_kcq_disable(struct amdgpu_device *adev)  {  	int r, i; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_ring_alloc(kiq_ring, 6 * adev->gfx.num_compute_rings);  	if (r) @@ -4902,7 +4901,7 @@ static int gfx_v8_0_hw_fini(void *handle)  		pr_debug("For SRIOV client, shouldn't do anything.\n");  		return 0;  	} -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (!gfx_v8_0_wait_for_idle(adev))  		gfx_v8_0_cp_enable(adev, false);  	else @@ -4911,7 +4910,7 @@ static int gfx_v8_0_hw_fini(void *handle)  		adev->gfx.rlc.funcs->stop(adev);  	else  		pr_err("rlc is busy, skip halt rlc\n"); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -5216,7 +5215,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		*(out++) = RREG32(mmSQ_IND_DATA);  } -static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 0 wave data */  	dst[(*no_fields)++] = 0; @@ -5241,7 +5240,7 @@ static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -5263,6 +5262,7 @@ static int gfx_v8_0_early_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	adev->gfx.xcc_mask = 1;  	adev->gfx.num_gfx_rings = GFX8_NUM_GFX_RINGS;  	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),  					  AMDGPU_MAX_COMPUTE_RINGS); @@ -5376,7 +5376,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,  				AMD_PG_SUPPORT_RLC_SMU_HS |  				AMD_PG_SUPPORT_CP |  				AMD_PG_SUPPORT_GFX_DMG)) -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	switch (adev->asic_type) {  	case CHIP_CARRIZO:  	case CHIP_STONEY: @@ -5430,7 +5430,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,  				AMD_PG_SUPPORT_RLC_SMU_HS |  				AMD_PG_SUPPORT_CP |  				AMD_PG_SUPPORT_GFX_DMG)) -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -5481,7 +5481,7 @@ static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,  {  	uint32_t data; -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);  	WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff); @@ -5535,7 +5535,7 @@ static bool gfx_v8_0_is_rlc_enabled(struct amdgpu_device *adev)  	return true;  } -static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -5562,7 +5562,7 @@ static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -5621,7 +5621,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  {  	uint32_t temp, data; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	/* It is disabled by HW by default */  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { @@ -5717,7 +5717,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  		gfx_v8_0_wait_for_rlc_serdes(adev);  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, @@ -5727,7 +5727,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  	temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL); -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {  		temp1 = data1 =	RREG32(mmRLC_CGTT_MGCG_OVERRIDE); @@ -5810,7 +5810,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  	gfx_v8_0_wait_for_rlc_serdes(adev); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,  					    bool enable) @@ -6723,11 +6723,11 @@ static void gfx_v8_0_parse_sq_irq(struct amdgpu_device *adev, unsigned ih_data,  			 */  			if (from_wq) {  				mutex_lock(&adev->grbm_idx_mutex); -				gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id); +				gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id, 0);  				sq_edc_source = REG_GET_FIELD(RREG32(mmSQ_EDC_INFO), SQ_EDC_INFO, SOURCE); -				gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +				gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  				mutex_unlock(&adev->grbm_idx_mutex);  			} @@ -7001,7 +7001,7 @@ static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)  {  	int i; -	adev->gfx.kiq.ring.funcs = &gfx_v8_0_ring_funcs_kiq; +	adev->gfx.kiq[0].ring.funcs = &gfx_v8_0_ring_funcs_kiq;  	for (i = 0; i < adev->gfx.num_gfx_rings; i++)  		adev->gfx.gfx_ring[i].funcs = &gfx_v8_0_ring_funcs_gfx; @@ -7116,7 +7116,7 @@ static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 4 && j < 2)  				gfx_v8_0_set_user_cu_inactive_bitmap(  					adev, disable_masks[i * 2 + j]); @@ -7137,7 +7137,7 @@ static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)  			cu_info->ao_cu_bitmap[i][j] = ao_bitmap;  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index f46d4b18a3fa..65577eca58f1 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -149,16 +149,6 @@ MODULE_FIRMWARE("amdgpu/aldebaran_sjt_mec2.bin");  #define mmGOLDEN_TSC_COUNT_LOWER_Renoir                0x0026  #define mmGOLDEN_TSC_COUNT_LOWER_Renoir_BASE_IDX       1 -#define mmGOLDEN_TSC_COUNT_UPPER_Raven   0x007a -#define mmGOLDEN_TSC_COUNT_UPPER_Raven_BASE_IDX 0 -#define mmGOLDEN_TSC_COUNT_LOWER_Raven   0x007b -#define mmGOLDEN_TSC_COUNT_LOWER_Raven_BASE_IDX 0 - -#define mmGOLDEN_TSC_COUNT_UPPER_Raven2   0x0068 -#define mmGOLDEN_TSC_COUNT_UPPER_Raven2_BASE_IDX 0 -#define mmGOLDEN_TSC_COUNT_LOWER_Raven2   0x0069 -#define mmGOLDEN_TSC_COUNT_LOWER_Raven2_BASE_IDX 0 -  enum ta_ras_gfx_subblock {  	/*CPC*/  	TA_RAS_BLOCK__GFX_CPC_INDEX_START = 0, @@ -765,12 +755,12 @@ static void gfx_v9_0_set_rlc_funcs(struct amdgpu_device *adev);  static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,  				struct amdgpu_cu_info *cu_info);  static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev); -static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume); +static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bool usegds);  static u64 gfx_v9_0_ring_get_rptr_compute(struct amdgpu_ring *ring);  static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  					  void *ras_error_status);  static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev, -				     void *inject_if); +				     void *inject_if, uint32_t instance_mask);  static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev);  static void gfx_v9_0_kiq_set_resources(struct amdgpu_ring *kiq_ring, @@ -898,7 +888,7 @@ static const struct kiq_pm4_funcs gfx_v9_0_kiq_pm4_funcs = {  static void gfx_v9_0_set_kiq_pm4_funcs(struct amdgpu_device *adev)  { -	adev->gfx.kiq.pmf = &gfx_v9_0_kiq_pm4_funcs; +	adev->gfx.kiq[0].pmf = &gfx_v9_0_kiq_pm4_funcs;  }  static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev) @@ -1504,7 +1494,7 @@ static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev)  			mask = 1;  			cu_bitmap = 0;  			counter = 0; -			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);  			for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {  				if (cu_info->bitmap[i][j] & mask) { @@ -1523,7 +1513,7 @@ static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev)  			cu_info->ao_cu_bitmap[i][j] = cu_bitmap;  		}  	} -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -1545,7 +1535,7 @@ static void gfx_v9_0_init_lbpw(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	/* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/ -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff);  	/* set mmRLC_LB_PARAMS = 0x003F_1006 */ @@ -1594,7 +1584,7 @@ static void gfx_v9_4_init_lbpw(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	/* set mmRLC_LB_INIT_CU_MASK thru broadcast mode to enable all SE/SH*/ -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32_SOC15(GC, 0, mmRLC_LB_INIT_CU_MASK, 0xffffffff);  	/* set mmRLC_LB_PARAMS = 0x003F_1006 */ @@ -1713,7 +1703,7 @@ static int gfx_v9_0_mec_init(struct amdgpu_device *adev)  	const struct gfx_firmware_header_v1_0 *mec_hdr; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -1788,7 +1778,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		*(out++) = RREG32_SOC15(GC, 0, mmSQ_IND_DATA);  } -static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 1 wave data */  	dst[(*no_fields)++] = 1; @@ -1809,7 +1799,7 @@ static void gfx_v9_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -1818,7 +1808,7 @@ static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd,  		start + SQIND_WAVE_SGPRS_OFFSET, size, dst);  } -static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t thread,  				     uint32_t start, uint32_t size,  				     uint32_t *dst) @@ -1829,9 +1819,9 @@ static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd,  }  static void gfx_v9_0_select_me_pipe_q(struct amdgpu_device *adev, -				  u32 me, u32 pipe, u32 q, u32 vm) +				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  { -	soc15_grbm_select(adev, me, pipe, q, vm); +	soc15_grbm_select(adev, me, pipe, q, vm, 0);  }  static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { @@ -2005,7 +1995,7 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	ring->doorbell_index = (adev->doorbell_index.mec_ring0 + ring_id) << 1;  	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr  				+ (ring_id * GFX9_MEC_HPD_SIZE); -	ring->vm_hub = AMDGPU_GFXHUB_0; +	ring->vm_hub = AMDGPU_GFXHUB(0);  	sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);  	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP @@ -2105,7 +2095,7 @@ static int gfx_v9_0_sw_init(void *handle)  		/* disable scheduler on the real ring */  		ring->no_scheduler = true; -		ring->vm_hub = AMDGPU_GFXHUB_0; +		ring->vm_hub = AMDGPU_GFXHUB(0);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,  				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP,  				     AMDGPU_RING_PRIO_DEFAULT, NULL); @@ -2123,7 +2113,7 @@ static int gfx_v9_0_sw_init(void *handle)  			ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;  			ring->is_sw_ring = true;  			hw_prio = amdgpu_sw_ring_priority(i); -			ring->vm_hub = AMDGPU_GFXHUB_0; +			ring->vm_hub = AMDGPU_GFXHUB(0);  			r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq,  					     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, hw_prio,  					     NULL); @@ -2154,7 +2144,8 @@ static int gfx_v9_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v9_0_compute_ring_init(adev, @@ -2168,19 +2159,19 @@ static int gfx_v9_0_sw_init(void *handle)  		}  	} -	r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE); +	r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE, 0);  	if (r) {  		DRM_ERROR("Failed to init KIQ BOs!\n");  		return r;  	} -	kiq = &adev->gfx.kiq; -	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); +	kiq = &adev->gfx.kiq[0]; +	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);  	if (r)  		return r;  	/* create MQD for all compute queues as wel as KIQ for SRIOV case */ -	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation)); +	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation), 0);  	if (r)  		return r; @@ -2215,9 +2206,9 @@ static int gfx_v9_0_sw_fini(void *handle)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); -	amdgpu_gfx_mqd_sw_fini(adev); -	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); -	amdgpu_gfx_kiq_fini(adev); +	amdgpu_gfx_mqd_sw_fini(adev, 0); +	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring); +	amdgpu_gfx_kiq_fini(adev, 0);  	gfx_v9_0_mec_fini(adev);  	amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, @@ -2240,7 +2231,7 @@ static void gfx_v9_0_tiling_mode_table_init(struct amdgpu_device *adev)  }  void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num, -			   u32 instance) +			   u32 instance, int xcc_id)  {  	u32 data; @@ -2289,19 +2280,42 @@ static void gfx_v9_0_setup_rb(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v9_0_get_rb_active_bitmap(adev);  			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *  					       rb_bitmap_width_per_sh);  		}  	} -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	adev->gfx.config.backend_enable_mask = active_rbs;  	adev->gfx.config.num_rbs = hweight32(active_rbs);  } +static void gfx_v9_0_debug_trap_config_init(struct amdgpu_device *adev, +				uint32_t first_vmid, +				uint32_t last_vmid) +{ +	uint32_t data; +	uint32_t trap_config_vmid_mask = 0; +	int i; + +	/* Calculate trap config vmid mask */ +	for (i = first_vmid; i < last_vmid; i++) +		trap_config_vmid_mask |= (1 << i); + +	data = REG_SET_FIELD(0, SPI_GDBG_TRAP_CONFIG, +			VMID_SEL, trap_config_vmid_mask); +	data = REG_SET_FIELD(data, SPI_GDBG_TRAP_CONFIG, +			TRAP_EN, 1); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_CONFIG), data); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_MASK), 0); + +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA0), 0); +	WREG32(SOC15_REG_OFFSET(GC, 0, mmSPI_GDBG_TRAP_DATA1), 0); +} +  #define DEFAULT_SH_MEM_BASES	(0x6000)  static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)  { @@ -2323,12 +2337,12 @@ static void gfx_v9_0_init_compute_vmid(struct amdgpu_device *adev)  	mutex_lock(&adev->srbm_mutex);  	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) { -		soc15_grbm_select(adev, 0, 0, 0, i); +		soc15_grbm_select(adev, 0, 0, 0, i, 0);  		/* CP and shaders */  		WREG32_SOC15_RLC(GC, 0, mmSH_MEM_CONFIG, sh_mem_config);  		WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, sh_mem_bases);  	} -	soc15_grbm_select(adev, 0, 0, 0, 0); +	soc15_grbm_select(adev, 0, 0, 0, 0, 0);  	mutex_unlock(&adev->srbm_mutex);  	/* Initialize all compute VMIDs to have no GDS, GWS, or OA @@ -2366,8 +2380,8 @@ static void gfx_v9_0_init_sq_config(struct amdgpu_device *adev)  	switch (adev->ip_versions[GC_HWIP][0]) {  	case IP_VERSION(9, 4, 1):  		tmp = RREG32_SOC15(GC, 0, mmSQ_CONFIG); -		tmp = REG_SET_FIELD(tmp, SQ_CONFIG, -					DISABLE_BARRIER_WAITCNT, 1); +		tmp = REG_SET_FIELD(tmp, SQ_CONFIG, DISABLE_BARRIER_WAITCNT, +				!READ_ONCE(adev->barrier_has_auto_waitcnt));  		WREG32_SOC15(GC, 0, mmSQ_CONFIG, tmp);  		break;  	default: @@ -2392,8 +2406,8 @@ static void gfx_v9_0_constants_init(struct amdgpu_device *adev)  	/* XXX SH_MEM regs */  	/* where to put LDS, scratch, GPUVM in FSA64 space */  	mutex_lock(&adev->srbm_mutex); -	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB_0].num_ids; i++) { -		soc15_grbm_select(adev, 0, 0, 0, i); +	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) { +		soc15_grbm_select(adev, 0, 0, 0, i, 0);  		/* CP and shaders */  		if (i == 0) {  			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, @@ -2415,7 +2429,7 @@ static void gfx_v9_0_constants_init(struct amdgpu_device *adev)  			WREG32_SOC15_RLC(GC, 0, mmSH_MEM_BASES, tmp);  		}  	} -	soc15_grbm_select(adev, 0, 0, 0, 0); +	soc15_grbm_select(adev, 0, 0, 0, 0, 0);  	mutex_unlock(&adev->srbm_mutex); @@ -2432,7 +2446,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);  			for (k = 0; k < adev->usec_timeout; k++) {  				if (RREG32_SOC15(GC, 0, mmRLC_SERDES_CU_MASTER_BUSY) == 0)  					break; @@ -2440,7 +2454,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  			if (k == adev->usec_timeout) {  				amdgpu_gfx_select_se_sh(adev, 0xffffffff, -						      0xffffffff, 0xffffffff); +						      0xffffffff, 0xffffffff, 0);  				mutex_unlock(&adev->grbm_idx_mutex);  				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",  					 i, j); @@ -2448,7 +2462,7 @@ static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  		}  	} -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK | @@ -3143,7 +3157,6 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)  	/* start the ring */  	gfx_v9_0_cp_gfx_start(adev); -	ring->sched.ready = true;  	return 0;  } @@ -3155,7 +3168,7 @@ static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  	} else {  		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL,  			(CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		adev->gfx.kiq.ring.sched.ready = false; +		adev->gfx.kiq[0].ring.sched.ready = false;  	}  	udelay(50);  } @@ -3519,7 +3532,6 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	struct v9_mqd *mqd = ring->mqd_ptr; -	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;  	struct v9_mqd *tmp_mqd;  	gfx_v9_0_kiq_setting(ring); @@ -3529,20 +3541,20 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)  	 * driver need to re-init the mqd.  	 * check mqd->cp_hqd_pq_control since this value should not be 0  	 */ -	tmp_mqd = (struct v9_mqd *)adev->gfx.mec.mqd_backup[mqd_idx]; +	tmp_mqd = (struct v9_mqd *)adev->gfx.kiq[0].mqd_backup;  	if (amdgpu_in_reset(adev) && tmp_mqd->cp_hqd_pq_control){  		/* for GPU_RESET case , reset MQD to a clean status */ -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct v9_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(struct v9_mqd_allocation));  		/* reset ring buffer */  		ring->wptr = 0;  		amdgpu_ring_clear_ring(ring);  		mutex_lock(&adev->srbm_mutex); -		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);  		gfx_v9_0_kiq_init_register(ring); -		soc15_grbm_select(adev, 0, 0, 0, 0); +		soc15_grbm_select(adev, 0, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  	} else {  		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation)); @@ -3551,14 +3563,14 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)  		if (amdgpu_sriov_vf(adev) && adev->in_suspend)  			amdgpu_ring_clear_ring(ring);  		mutex_lock(&adev->srbm_mutex); -		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);  		gfx_v9_0_mqd_init(ring);  		gfx_v9_0_kiq_init_register(ring); -		soc15_grbm_select(adev, 0, 0, 0, 0); +		soc15_grbm_select(adev, 0, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex); -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct v9_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(struct v9_mqd_allocation));  	}  	return 0; @@ -3582,24 +3594,21 @@ static int gfx_v9_0_kcq_init_queue(struct amdgpu_ring *ring)  		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;  		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;  		mutex_lock(&adev->srbm_mutex); -		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, 0);  		gfx_v9_0_mqd_init(ring); -		soc15_grbm_select(adev, 0, 0, 0, 0); +		soc15_grbm_select(adev, 0, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct v9_mqd_allocation)); -	} else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ -		/* reset MQD to a clean status */ +	} else { +		/* restore MQD to a clean status */  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct v9_mqd_allocation)); -  		/* reset ring buffer */  		ring->wptr = 0;  		atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0);  		amdgpu_ring_clear_ring(ring); -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0; @@ -3610,21 +3619,22 @@ static int gfx_v9_0_kiq_resume(struct amdgpu_device *adev)  	struct amdgpu_ring *ring;  	int r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_bo_reserve(ring->mqd_obj, false);  	if (unlikely(r != 0))  		return r;  	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr); -	if (unlikely(r != 0)) +	if (unlikely(r != 0)) { +		amdgpu_bo_unreserve(ring->mqd_obj);  		return r; +	}  	gfx_v9_0_kiq_init_queue(ring);  	amdgpu_bo_kunmap(ring->mqd_obj);  	ring->mqd_ptr = NULL;  	amdgpu_bo_unreserve(ring->mqd_obj); -	ring->sched.ready = true;  	return 0;  } @@ -3652,7 +3662,7 @@ static int gfx_v9_0_kcq_resume(struct amdgpu_device *adev)  			goto done;  	} -	r = amdgpu_gfx_enable_kcq(adev); +	r = amdgpu_gfx_enable_kcq(adev, 0);  done:  	return r;  } @@ -3772,7 +3782,7 @@ static int gfx_v9_0_hw_fini(void *handle)  	/* DF freeze and kcq disable will fail */  	if (!amdgpu_ras_intr_triggered())  		/* disable KCQ to avoid CPC touch memory not valid anymore */ -		amdgpu_gfx_disable_kcq(adev); +		amdgpu_gfx_disable_kcq(adev, 0);  	if (amdgpu_sriov_vf(adev)) {  		gfx_v9_0_cp_gfx_enable(adev, false); @@ -3790,11 +3800,11 @@ static int gfx_v9_0_hw_fini(void *handle)  	 */  	if (!amdgpu_in_reset(adev) && !adev->in_suspend) {  		mutex_lock(&adev->srbm_mutex); -		soc15_grbm_select(adev, adev->gfx.kiq.ring.me, -				adev->gfx.kiq.ring.pipe, -				adev->gfx.kiq.ring.queue, 0); -		gfx_v9_0_kiq_fini_register(&adev->gfx.kiq.ring); -		soc15_grbm_select(adev, 0, 0, 0, 0); +		soc15_grbm_select(adev, adev->gfx.kiq[0].ring.me, +				adev->gfx.kiq[0].ring.pipe, +				adev->gfx.kiq[0].ring.queue, 0, 0); +		gfx_v9_0_kiq_fini_register(&adev->gfx.kiq[0].ring); +		soc15_grbm_select(adev, 0, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex);  	} @@ -3914,7 +3924,7 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  	unsigned long flags;  	uint32_t seq, reg_val_offs = 0;  	uint64_t value = 0; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *ring = &kiq->ring;  	BUG_ON(!ring->funcs->emit_rreg); @@ -4002,36 +4012,6 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)  		preempt_enable();  		clock = clock_lo | (clock_hi << 32ULL);  		break; -	case IP_VERSION(9, 1, 0): -		preempt_disable(); -		clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven); -		clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven); -		hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven); -		/* The PWR TSC clock frequency is 100MHz, which sets 32-bit carry over -		 * roughly every 42 seconds. -		 */ -		if (hi_check != clock_hi) { -			clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven); -			clock_hi = hi_check; -		} -		preempt_enable(); -		clock = clock_lo | (clock_hi << 32ULL); -		break; -	case IP_VERSION(9, 2, 2): -		preempt_disable(); -		clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2); -		clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2); -		hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2); -		/* The PWR TSC clock frequency is 100MHz, which sets 32-bit carry over -		 * roughly every 42 seconds. -		 */ -		if (hi_check != clock_hi) { -			clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2); -			clock_hi = hi_check; -		} -		preempt_enable(); -		clock = clock_lo | (clock_hi << 32ULL); -		break;  	default:  		amdgpu_gfx_off_ctrl(adev, false);  		mutex_lock(&adev->gfx.gpu_clock_mutex); @@ -4544,6 +4524,7 @@ static int gfx_v9_0_early_init(void *handle)  		adev->gfx.num_gfx_rings = 0;  	else  		adev->gfx.num_gfx_rings = GFX9_NUM_GFX_RINGS; +	adev->gfx.xcc_mask = 1;  	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),  					  AMDGPU_MAX_COMPUTE_RINGS);  	gfx_v9_0_set_kiq_pm4_funcs(adev); @@ -4609,6 +4590,13 @@ static int gfx_v9_0_late_init(void *handle)  	if (r)  		return r; +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2)) +		gfx_v9_4_2_debug_trap_config_init(adev, +			adev->vm_manager.first_kfd_vmid, AMDGPU_NUM_VMID); +	else +		gfx_v9_0_debug_trap_config_init(adev, +			adev->vm_manager.first_kfd_vmid, AMDGPU_NUM_VMID); +  	return 0;  } @@ -4624,7 +4612,7 @@ static bool gfx_v9_0_is_rlc_enabled(struct amdgpu_device *adev)  	return true;  } -static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -4641,7 +4629,7 @@ static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data; @@ -4652,7 +4640,7 @@ static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev)  static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,  						bool enable)  { -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) {  		gfx_v9_0_enable_gfx_cg_power_gating(adev, true); @@ -4664,7 +4652,7 @@ static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,  			gfx_v9_0_enable_gfx_pipeline_powergating(adev, false);  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev, @@ -4691,7 +4679,7 @@ static void gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  {  	uint32_t data, def; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	/* It is disabled by HW by default */  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { @@ -4758,7 +4746,7 @@ static void gfx_v9_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  		}  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev, @@ -4769,7 +4757,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,  	if (!adev->gfx.num_gfx_rings)  		return; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	/* Enable 3D CGCG/CGLS */  	if (enable) { @@ -4813,7 +4801,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,  			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, @@ -4821,7 +4809,7 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  {  	uint32_t def, data; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {  		def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE); @@ -4865,7 +4853,7 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  			WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev, @@ -5165,7 +5153,8 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,  			gfx_v9_0_ring_emit_de_meta(ring,  						   (!amdgpu_sriov_vf(ring->adev) &&  						   flags & AMDGPU_IB_PREEMPTED) ? -						   true : false); +						   true : false, +						   job->gds_size > 0 && job->gds_base != 0);  	}  	amdgpu_ring_write(ring, header); @@ -5176,9 +5165,83 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,  #endif  		lower_32_bits(ib->gpu_addr));  	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); +	amdgpu_ring_ib_on_emit_cntl(ring);  	amdgpu_ring_write(ring, control);  } +static void gfx_v9_0_ring_patch_cntl(struct amdgpu_ring *ring, +				     unsigned offset) +{ +	u32 control = ring->ring[offset]; + +	control |= INDIRECT_BUFFER_PRE_RESUME(1); +	ring->ring[offset] = control; +} + +static void gfx_v9_0_ring_patch_ce_meta(struct amdgpu_ring *ring, +					unsigned offset) +{ +	struct amdgpu_device *adev = ring->adev; +	void *ce_payload_cpu_addr; +	uint64_t payload_offset, payload_size; + +	payload_size = sizeof(struct v9_ce_ib_state); + +	if (ring->is_mes_queue) { +		payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data, +					  gfx[0].gfx_meta_data) + +			offsetof(struct v9_gfx_meta_data, ce_payload); +		ce_payload_cpu_addr = +			amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset); +	} else { +		payload_offset = offsetof(struct v9_gfx_meta_data, ce_payload); +		ce_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset; +	} + +	if (offset + (payload_size >> 2) <= ring->buf_mask + 1) { +		memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr, payload_size); +	} else { +		memcpy((void *)&ring->ring[offset], ce_payload_cpu_addr, +		       (ring->buf_mask + 1 - offset) << 2); +		payload_size -= (ring->buf_mask + 1 - offset) << 2; +		memcpy((void *)&ring->ring[0], +		       ce_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2), +		       payload_size); +	} +} + +static void gfx_v9_0_ring_patch_de_meta(struct amdgpu_ring *ring, +					unsigned offset) +{ +	struct amdgpu_device *adev = ring->adev; +	void *de_payload_cpu_addr; +	uint64_t payload_offset, payload_size; + +	payload_size = sizeof(struct v9_de_ib_state); + +	if (ring->is_mes_queue) { +		payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data, +					  gfx[0].gfx_meta_data) + +			offsetof(struct v9_gfx_meta_data, de_payload); +		de_payload_cpu_addr = +			amdgpu_mes_ctx_get_offs_cpu_addr(ring, payload_offset); +	} else { +		payload_offset = offsetof(struct v9_gfx_meta_data, de_payload); +		de_payload_cpu_addr = adev->virt.csa_cpu_addr + payload_offset; +	} + +	if (offset + (payload_size >> 2) <= ring->buf_mask + 1) { +		memcpy((void *)&ring->ring[offset], de_payload_cpu_addr, payload_size); +	} else { +		memcpy((void *)&ring->ring[offset], de_payload_cpu_addr, +		       (ring->buf_mask + 1 - offset) << 2); +		payload_size -= (ring->buf_mask + 1 - offset) << 2; +		memcpy((void *)&ring->ring[0], +		       de_payload_cpu_addr + ((ring->buf_mask + 1 - offset) << 2), +		       payload_size); +	} +} +  static void gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring *ring,  					  struct amdgpu_job *job,  					  struct amdgpu_ib *ib, @@ -5374,6 +5437,8 @@ static void gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume)  	amdgpu_ring_write(ring, lower_32_bits(ce_payload_gpu_addr));  	amdgpu_ring_write(ring, upper_32_bits(ce_payload_gpu_addr)); +	amdgpu_ring_ib_on_emit_ce(ring); +  	if (resume)  		amdgpu_ring_write_multiple(ring, ce_payload_cpu_addr,  					   sizeof(ce_payload) >> 2); @@ -5386,7 +5451,7 @@ static int gfx_v9_0_ring_preempt_ib(struct amdgpu_ring *ring)  {  	int i, r = 0;  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	struct amdgpu_ring *kiq_ring = &kiq->ring;  	unsigned long flags; @@ -5407,10 +5472,6 @@ static int gfx_v9_0_ring_preempt_ib(struct amdgpu_ring *ring)  	amdgpu_ring_alloc(ring, 13);  	gfx_v9_0_ring_emit_fence(ring, ring->trail_fence_gpu_addr,  				 ring->trail_seq, AMDGPU_FENCE_FLAG_EXEC | AMDGPU_FENCE_FLAG_INT); -	/*reset the CP_VMID_PREEMPT after trailing fence*/ -	amdgpu_ring_emit_wreg(ring, -			      SOC15_REG_OFFSET(GC, 0, mmCP_VMID_PREEMPT), -			      0x0);  	/* assert IB preemption, emit the trailing fence */  	kiq->pmf->kiq_unmap_queues(kiq_ring, ring, PREEMPT_QUEUES_NO_UNMAP, @@ -5433,6 +5494,10 @@ static int gfx_v9_0_ring_preempt_ib(struct amdgpu_ring *ring)  		DRM_WARN("ring %d timeout to preempt ib\n", ring->idx);  	} +	/*reset the CP_VMID_PREEMPT after trailing fence*/ +	amdgpu_ring_emit_wreg(ring, +			      SOC15_REG_OFFSET(GC, 0, mmCP_VMID_PREEMPT), +			      0x0);  	amdgpu_ring_commit(ring);  	/* deassert preemption condition */ @@ -5440,7 +5505,7 @@ static int gfx_v9_0_ring_preempt_ib(struct amdgpu_ring *ring)  	return r;  } -static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume) +static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bool usegds)  {  	struct amdgpu_device *adev = ring->adev;  	struct v9_de_ib_state de_payload = {0}; @@ -5471,8 +5536,10 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume)  				 PAGE_SIZE);  	} -	de_payload.gds_backup_addrlo = lower_32_bits(gds_addr); -	de_payload.gds_backup_addrhi = upper_32_bits(gds_addr); +	if (usegds) { +		de_payload.gds_backup_addrlo = lower_32_bits(gds_addr); +		de_payload.gds_backup_addrhi = upper_32_bits(gds_addr); +	}  	cnt = (sizeof(de_payload) >> 2) + 4 - 2;  	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, cnt)); @@ -5483,6 +5550,7 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume)  	amdgpu_ring_write(ring, lower_32_bits(de_payload_gpu_addr));  	amdgpu_ring_write(ring, upper_32_bits(de_payload_gpu_addr)); +	amdgpu_ring_ib_on_emit_de(ring);  	if (resume)  		amdgpu_ring_write_multiple(ring, de_payload_cpu_addr,  					   sizeof(de_payload) >> 2); @@ -6342,7 +6410,7 @@ static const struct soc15_ras_field_entry gfx_v9_0_ras_fields[] = {  };  static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev, -				     void *inject_if) +				     void *inject_if, uint32_t instance_mask)  {  	struct ras_inject_if *info = (struct ras_inject_if *)inject_if;  	int ret; @@ -6381,7 +6449,7 @@ static int gfx_v9_0_ras_error_inject(struct amdgpu_device *adev,  	block_info.value = info->value;  	mutex_lock(&adev->grbm_idx_mutex); -	ret = psp_ras_trigger_error(&adev->psp, &block_info); +	ret = psp_ras_trigger_error(&adev->psp, &block_info, instance_mask);  	mutex_unlock(&adev->grbm_idx_mutex);  	return ret; @@ -6609,7 +6677,7 @@ static void gfx_v9_0_reset_ras_error_count(struct amdgpu_device *adev)  	for (i = 0; i < ARRAY_SIZE(gfx_v9_0_edc_counter_regs); i++) {  		for (j = 0; j < gfx_v9_0_edc_counter_regs[i].se_num; j++) {  			for (k = 0; k < gfx_v9_0_edc_counter_regs[i].instance; k++) { -				amdgpu_gfx_select_se_sh(adev, j, 0x0, k); +				amdgpu_gfx_select_se_sh(adev, j, 0x0, k, 0);  				RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));  			}  		} @@ -6671,7 +6739,7 @@ static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  	for (i = 0; i < ARRAY_SIZE(gfx_v9_0_edc_counter_regs); i++) {  		for (j = 0; j < gfx_v9_0_edc_counter_regs[i].se_num; j++) {  			for (k = 0; k < gfx_v9_0_edc_counter_regs[i].instance; k++) { -				amdgpu_gfx_select_se_sh(adev, j, 0, k); +				amdgpu_gfx_select_se_sh(adev, j, 0, k, 0);  				reg_value =  					RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));  				if (reg_value) @@ -6686,7 +6754,7 @@ static void gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  	err_data->ce_count += sec_count;  	err_data->ue_count += ded_count; -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	gfx_v9_0_query_utc_edc_status(adev, err_data); @@ -6893,6 +6961,9 @@ static const struct amdgpu_ring_funcs gfx_v9_0_sw_ring_funcs_gfx = {  	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait,  	.soft_recovery = gfx_v9_0_ring_soft_recovery,  	.emit_mem_sync = gfx_v9_0_emit_mem_sync, +	.patch_cntl = gfx_v9_0_ring_patch_cntl, +	.patch_de = gfx_v9_0_ring_patch_de_meta, +	.patch_ce = gfx_v9_0_ring_patch_ce_meta,  };  static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = { @@ -6965,7 +7036,7 @@ static void gfx_v9_0_set_ring_funcs(struct amdgpu_device *adev)  {  	int i; -	adev->gfx.kiq.ring.funcs = &gfx_v9_0_ring_funcs_kiq; +	adev->gfx.kiq[0].ring.funcs = &gfx_v9_0_ring_funcs_kiq;  	for (i = 0; i < adev->gfx.num_gfx_rings; i++)  		adev->gfx.gfx_ring[i].funcs = &gfx_v9_0_ring_funcs_gfx; @@ -7146,7 +7217,7 @@ static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, i, j, 0xffffffff, 0);  			gfx_v9_0_set_user_cu_inactive_bitmap(  				adev, disable_masks[i * adev->gfx.config.max_sh_per_se + j]);  			bitmap = gfx_v9_0_get_cu_active_bitmap(adev); @@ -7179,7 +7250,7 @@ static int gfx_v9_0_get_cu_info(struct amdgpu_device *adev,  			cu_info->ao_cu_bitmap[i % 4][j + i / 4] = ao_bitmap;  		}  	} -	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.h b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.h index dfe8d4841f58..f9f6edc5e558 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.h +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.h @@ -27,6 +27,6 @@  extern const struct amdgpu_ip_block_version gfx_v9_0_ip_block;  void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num, -			   u32 instance); +			   u32 instance, int xcc_id);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c index c67e387a97f5..bc8416afb62c 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c @@ -970,29 +970,6 @@ static void gfx_v9_4_reset_ras_error_count(struct amdgpu_device *adev)  	WREG32_SOC15(GC, 0, mmATC_L2_CACHE_4K_DSM_INDEX, 255);  } -static int gfx_v9_4_ras_error_inject(struct amdgpu_device *adev, -				     void *inject_if) -{ -	struct ras_inject_if *info = (struct ras_inject_if *)inject_if; -	int ret; -	struct ta_ras_trigger_error_input block_info = { 0 }; - -	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) -		return -EINVAL; - -	block_info.block_id = amdgpu_ras_block_to_ta(info->head.block); -	block_info.sub_block_index = info->head.sub_block_index; -	block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type); -	block_info.address = info->address; -	block_info.value = info->value; - -	mutex_lock(&adev->grbm_idx_mutex); -	ret = psp_ras_trigger_error(&adev->psp, &block_info); -	mutex_unlock(&adev->grbm_idx_mutex); - -	return ret; -} -  static const struct soc15_reg_entry gfx_v9_4_ea_err_status_regs =  	{ SOC15_REG_ENTRY(GC, 0, mmGCEA_ERR_STATUS), 0, 1, 32 }; @@ -1030,7 +1007,6 @@ static void gfx_v9_4_query_ras_error_status(struct amdgpu_device *adev)  const struct amdgpu_ras_block_hw_ops  gfx_v9_4_ras_ops = { -	.ras_error_inject = &gfx_v9_4_ras_error_inject,  	.query_ras_error_count = &gfx_v9_4_query_ras_error_count,  	.reset_ras_error_count = &gfx_v9_4_reset_ras_error_count,  	.query_ras_error_status = &gfx_v9_4_query_ras_error_status, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c index 3a797424579c..63f6843a069e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c @@ -761,7 +761,7 @@ void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,  	for (i = first_vmid; i < last_vmid; i++) {  		data = 0; -		soc15_grbm_select(adev, 0, 0, 0, i); +		soc15_grbm_select(adev, 0, 0, 0, i, 0);  		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, TRAP_EN, 1);  		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_EN, 0);  		data = REG_SET_FIELD(data, SPI_GDBG_PER_VMID_CNTL, EXCP_REPLACE, @@ -769,15 +769,18 @@ void gfx_v9_4_2_debug_trap_config_init(struct amdgpu_device *adev,  		WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_PER_VMID_CNTL), data);  	} -	soc15_grbm_select(adev, 0, 0, 0, 0); +	soc15_grbm_select(adev, 0, 0, 0, 0, 0);  	mutex_unlock(&adev->srbm_mutex); + +	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA0), 0); +	WREG32(SOC15_REG_OFFSET(GC, 0, regSPI_GDBG_TRAP_DATA1), 0);  }  void gfx_v9_4_2_set_power_brake_sequence(struct amdgpu_device *adev)  {  	u32 tmp; -	gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	tmp = 0;  	tmp = REG_SET_FIELD(tmp, GC_THROTTLE_CTRL, PATTERN_MODE, 1); @@ -1699,28 +1702,6 @@ static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev)  	gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL);  } -static int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if) -{ -	struct ras_inject_if *info = (struct ras_inject_if *)inject_if; -	int ret; -	struct ta_ras_trigger_error_input block_info = { 0 }; - -	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) -		return -EINVAL; - -	block_info.block_id = amdgpu_ras_block_to_ta(info->head.block); -	block_info.sub_block_index = info->head.sub_block_index; -	block_info.inject_error_type = amdgpu_ras_error_to_ta(info->head.type); -	block_info.address = info->address; -	block_info.value = info->value; - -	mutex_lock(&adev->grbm_idx_mutex); -	ret = psp_ras_trigger_error(&adev->psp, &block_info); -	mutex_unlock(&adev->grbm_idx_mutex); - -	return ret; -} -  static void gfx_v9_4_2_query_ea_err_status(struct amdgpu_device *adev)  {  	uint32_t i, j; @@ -1935,7 +1916,7 @@ static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)  	u32 status = 0;  	struct amdgpu_vmhub *hub; -	hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	status = RREG32(hub->vm_l2_pro_fault_status);  	/* reset page fault status */  	WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1); @@ -1944,7 +1925,6 @@ static bool gfx_v9_4_2_query_uctl2_poison_status(struct amdgpu_device *adev)  }  struct amdgpu_ras_block_hw_ops  gfx_v9_4_2_ras_ops = { -		.ras_error_inject = &gfx_v9_4_2_ras_error_inject,  		.query_ras_error_count = &gfx_v9_4_2_query_ras_error_count,  		.reset_ras_error_count = &gfx_v9_4_2_reset_ras_error_count,  		.query_ras_error_status = &gfx_v9_4_2_query_ras_error_status, diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c index 5f8500577c02..f5b8d3f388ff 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c @@ -25,35 +25,504 @@  #include "amdgpu.h"  #include "amdgpu_gfx.h"  #include "soc15.h" +#include "soc15d.h"  #include "soc15_common.h"  #include "vega10_enum.h" +#include "v9_structs.h" + +#include "ivsrcid/gfx/irqsrcs_gfx_9_0.h" +  #include "gc/gc_9_4_3_offset.h"  #include "gc/gc_9_4_3_sh_mask.h"  #include "gfx_v9_4_3.h" +#include "amdgpu_xcp.h" + +MODULE_FIRMWARE("amdgpu/gc_9_4_3_mec.bin"); +MODULE_FIRMWARE("amdgpu/gc_9_4_3_rlc.bin"); +#define GFX9_MEC_HPD_SIZE 4096  #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L +#define GOLDEN_GB_ADDR_CONFIG 0x2a114042 + +struct amdgpu_gfx_ras gfx_v9_4_3_ras; + +static void gfx_v9_4_3_set_ring_funcs(struct amdgpu_device *adev); +static void gfx_v9_4_3_set_irq_funcs(struct amdgpu_device *adev); +static void gfx_v9_4_3_set_gds_init(struct amdgpu_device *adev); +static void gfx_v9_4_3_set_rlc_funcs(struct amdgpu_device *adev); +static int gfx_v9_4_3_get_cu_info(struct amdgpu_device *adev, +				struct amdgpu_cu_info *cu_info); + +static void gfx_v9_4_3_kiq_set_resources(struct amdgpu_ring *kiq_ring, +				uint64_t queue_mask) +{ +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_SET_RESOURCES, 6)); +	amdgpu_ring_write(kiq_ring, +		PACKET3_SET_RESOURCES_VMID_MASK(0) | +		/* vmid_mask:0* queue_type:0 (KIQ) */ +		PACKET3_SET_RESOURCES_QUEUE_TYPE(0)); +	amdgpu_ring_write(kiq_ring, +			lower_32_bits(queue_mask));	/* queue mask lo */ +	amdgpu_ring_write(kiq_ring, +			upper_32_bits(queue_mask));	/* queue mask hi */ +	amdgpu_ring_write(kiq_ring, 0);	/* gws mask lo */ +	amdgpu_ring_write(kiq_ring, 0);	/* gws mask hi */ +	amdgpu_ring_write(kiq_ring, 0);	/* oac mask */ +	amdgpu_ring_write(kiq_ring, 0);	/* gds heap base:0, gds heap size:0 */ +} + +static void gfx_v9_4_3_kiq_map_queues(struct amdgpu_ring *kiq_ring, +				 struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = kiq_ring->adev; +	uint64_t mqd_addr = amdgpu_bo_gpu_offset(ring->mqd_obj); +	uint64_t wptr_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); +	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0; + +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_MAP_QUEUES, 5)); +	/* Q_sel:0, vmid:0, vidmem: 1, engine:0, num_Q:1*/ +	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */ +			 PACKET3_MAP_QUEUES_QUEUE_SEL(0) | /* Queue_Sel */ +			 PACKET3_MAP_QUEUES_VMID(0) | /* VMID */ +			 PACKET3_MAP_QUEUES_QUEUE(ring->queue) | +			 PACKET3_MAP_QUEUES_PIPE(ring->pipe) | +			 PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) | +			 /*queue_type: normal compute queue */ +			 PACKET3_MAP_QUEUES_QUEUE_TYPE(0) | +			 /* alloc format: all_on_one_pipe */ +			 PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) | +			 PACKET3_MAP_QUEUES_ENGINE_SEL(eng_sel) | +			 /* num_queues: must be 1 */ +			 PACKET3_MAP_QUEUES_NUM_QUEUES(1)); +	amdgpu_ring_write(kiq_ring, +			PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index)); +	amdgpu_ring_write(kiq_ring, lower_32_bits(mqd_addr)); +	amdgpu_ring_write(kiq_ring, upper_32_bits(mqd_addr)); +	amdgpu_ring_write(kiq_ring, lower_32_bits(wptr_addr)); +	amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr)); +} + +static void gfx_v9_4_3_kiq_unmap_queues(struct amdgpu_ring *kiq_ring, +				   struct amdgpu_ring *ring, +				   enum amdgpu_unmap_queues_action action, +				   u64 gpu_addr, u64 seq) +{ +	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0; + +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4)); +	amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */ +			  PACKET3_UNMAP_QUEUES_ACTION(action) | +			  PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) | +			  PACKET3_UNMAP_QUEUES_ENGINE_SEL(eng_sel) | +			  PACKET3_UNMAP_QUEUES_NUM_QUEUES(1)); +	amdgpu_ring_write(kiq_ring, +			PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index)); + +	if (action == PREEMPT_QUEUES_NO_UNMAP) { +		amdgpu_ring_write(kiq_ring, lower_32_bits(gpu_addr)); +		amdgpu_ring_write(kiq_ring, upper_32_bits(gpu_addr)); +		amdgpu_ring_write(kiq_ring, seq); +	} else { +		amdgpu_ring_write(kiq_ring, 0); +		amdgpu_ring_write(kiq_ring, 0); +		amdgpu_ring_write(kiq_ring, 0); +	} +} + +static void gfx_v9_4_3_kiq_query_status(struct amdgpu_ring *kiq_ring, +				   struct amdgpu_ring *ring, +				   u64 addr, +				   u64 seq) +{ +	uint32_t eng_sel = ring->funcs->type == AMDGPU_RING_TYPE_GFX ? 4 : 0; + +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_QUERY_STATUS, 5)); +	amdgpu_ring_write(kiq_ring, +			  PACKET3_QUERY_STATUS_CONTEXT_ID(0) | +			  PACKET3_QUERY_STATUS_INTERRUPT_SEL(0) | +			  PACKET3_QUERY_STATUS_COMMAND(2)); +	/* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */ +	amdgpu_ring_write(kiq_ring, +			PACKET3_QUERY_STATUS_DOORBELL_OFFSET(ring->doorbell_index) | +			PACKET3_QUERY_STATUS_ENG_SEL(eng_sel)); +	amdgpu_ring_write(kiq_ring, lower_32_bits(addr)); +	amdgpu_ring_write(kiq_ring, upper_32_bits(addr)); +	amdgpu_ring_write(kiq_ring, lower_32_bits(seq)); +	amdgpu_ring_write(kiq_ring, upper_32_bits(seq)); +} + +static void gfx_v9_4_3_kiq_invalidate_tlbs(struct amdgpu_ring *kiq_ring, +				uint16_t pasid, uint32_t flush_type, +				bool all_hub) +{ +	amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_INVALIDATE_TLBS, 0)); +	amdgpu_ring_write(kiq_ring, +			PACKET3_INVALIDATE_TLBS_DST_SEL(1) | +			PACKET3_INVALIDATE_TLBS_ALL_HUB(all_hub) | +			PACKET3_INVALIDATE_TLBS_PASID(pasid) | +			PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(flush_type)); +} + +static const struct kiq_pm4_funcs gfx_v9_4_3_kiq_pm4_funcs = { +	.kiq_set_resources = gfx_v9_4_3_kiq_set_resources, +	.kiq_map_queues = gfx_v9_4_3_kiq_map_queues, +	.kiq_unmap_queues = gfx_v9_4_3_kiq_unmap_queues, +	.kiq_query_status = gfx_v9_4_3_kiq_query_status, +	.kiq_invalidate_tlbs = gfx_v9_4_3_kiq_invalidate_tlbs, +	.set_resources_size = 8, +	.map_queues_size = 7, +	.unmap_queues_size = 6, +	.query_status_size = 7, +	.invalidate_tlbs_size = 2, +}; + +static void gfx_v9_4_3_set_kiq_pm4_funcs(struct amdgpu_device *adev) +{ +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) +		adev->gfx.kiq[i].pmf = &gfx_v9_4_3_kiq_pm4_funcs; +} + +static void gfx_v9_4_3_init_golden_registers(struct amdgpu_device *adev) +{ +	int i, num_xcc, dev_inst; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		dev_inst = GET_INST(GC, i); +		if (dev_inst >= 2) +			WREG32_SOC15(GC, dev_inst, regGRBM_MCM_ADDR, 0x4); + +		/* Golden settings applied by driver for ASIC with rev_id 0 */ +		if (adev->rev_id == 0) { +			WREG32_SOC15(GC, dev_inst, regGB_ADDR_CONFIG, +				     GOLDEN_GB_ADDR_CONFIG); + +			WREG32_FIELD15_PREREG(GC, dev_inst, TCP_UTCL1_CNTL1, +					      REDUCE_FIFO_DEPTH_BY_2, 2); +		} +	} +} + +static void gfx_v9_4_3_write_data_to_reg(struct amdgpu_ring *ring, int eng_sel, +				       bool wc, uint32_t reg, uint32_t val) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +	amdgpu_ring_write(ring, WRITE_DATA_ENGINE_SEL(eng_sel) | +				WRITE_DATA_DST_SEL(0) | +				(wc ? WR_CONFIRM : 0)); +	amdgpu_ring_write(ring, reg); +	amdgpu_ring_write(ring, 0); +	amdgpu_ring_write(ring, val); +} + +static void gfx_v9_4_3_wait_reg_mem(struct amdgpu_ring *ring, int eng_sel, +				  int mem_space, int opt, uint32_t addr0, +				  uint32_t addr1, uint32_t ref, uint32_t mask, +				  uint32_t inv) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); +	amdgpu_ring_write(ring, +				 /* memory (1) or register (0) */ +				 (WAIT_REG_MEM_MEM_SPACE(mem_space) | +				 WAIT_REG_MEM_OPERATION(opt) | /* wait */ +				 WAIT_REG_MEM_FUNCTION(3) |  /* equal */ +				 WAIT_REG_MEM_ENGINE(eng_sel))); + +	if (mem_space) +		BUG_ON(addr0 & 0x3); /* Dword align */ +	amdgpu_ring_write(ring, addr0); +	amdgpu_ring_write(ring, addr1); +	amdgpu_ring_write(ring, ref); +	amdgpu_ring_write(ring, mask); +	amdgpu_ring_write(ring, inv); /* poll interval */ +} + +static int gfx_v9_4_3_ring_test_ring(struct amdgpu_ring *ring) +{ +	uint32_t scratch_reg0_offset, xcc_offset; +	struct amdgpu_device *adev = ring->adev; +	uint32_t tmp = 0; +	unsigned i; +	int r; + +	/* Use register offset which is local to XCC in the packet */ +	xcc_offset = SOC15_REG_OFFSET(GC, 0, regSCRATCH_REG0); +	scratch_reg0_offset = SOC15_REG_OFFSET(GC, GET_INST(GC, ring->xcc_id), regSCRATCH_REG0); +	WREG32(scratch_reg0_offset, 0xCAFEDEAD); + +	r = amdgpu_ring_alloc(ring, 3); +	if (r) +		return r; + +	amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); +	amdgpu_ring_write(ring, xcc_offset - PACKET3_SET_UCONFIG_REG_START); +	amdgpu_ring_write(ring, 0xDEADBEEF); +	amdgpu_ring_commit(ring); + +	for (i = 0; i < adev->usec_timeout; i++) { +		tmp = RREG32(scratch_reg0_offset); +		if (tmp == 0xDEADBEEF) +			break; +		udelay(1); +	} + +	if (i >= adev->usec_timeout) +		r = -ETIMEDOUT; +	return r; +} + +static int gfx_v9_4_3_ring_test_ib(struct amdgpu_ring *ring, long timeout) +{ +	struct amdgpu_device *adev = ring->adev; +	struct amdgpu_ib ib; +	struct dma_fence *f = NULL; + +	unsigned index; +	uint64_t gpu_addr; +	uint32_t tmp; +	long r; + +	r = amdgpu_device_wb_get(adev, &index); +	if (r) +		return r; + +	gpu_addr = adev->wb.gpu_addr + (index * 4); +	adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD); +	memset(&ib, 0, sizeof(ib)); +	r = amdgpu_ib_get(adev, NULL, 16, +			  AMDGPU_IB_POOL_DIRECT, &ib); +	if (r) +		goto err1; + +	ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3); +	ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; +	ib.ptr[2] = lower_32_bits(gpu_addr); +	ib.ptr[3] = upper_32_bits(gpu_addr); +	ib.ptr[4] = 0xDEADBEEF; +	ib.length_dw = 5; + +	r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f); +	if (r) +		goto err2; + +	r = dma_fence_wait_timeout(f, false, timeout); +	if (r == 0) { +		r = -ETIMEDOUT; +		goto err2; +	} else if (r < 0) { +		goto err2; +	} + +	tmp = adev->wb.wb[index]; +	if (tmp == 0xDEADBEEF) +		r = 0; +	else +		r = -EINVAL; + +err2: +	amdgpu_ib_free(adev, &ib, NULL); +	dma_fence_put(f); +err1: +	amdgpu_device_wb_free(adev, index); +	return r; +} + + +/* This value might differs per partition */  static uint64_t gfx_v9_4_3_get_gpu_clock_counter(struct amdgpu_device *adev)  {  	uint64_t clock;  	amdgpu_gfx_off_ctrl(adev, false);  	mutex_lock(&adev->gfx.gpu_clock_mutex); -	WREG32_SOC15(GC, 0, regRLC_CAPTURE_GPU_CLOCK_COUNT, 1); -	clock = (uint64_t)RREG32_SOC15(GC, 0, regRLC_GPU_CLOCK_COUNT_LSB) | -		((uint64_t)RREG32_SOC15(GC, 0, regRLC_GPU_CLOCK_COUNT_MSB) << 32ULL); +	WREG32_SOC15(GC, GET_INST(GC, 0), regRLC_CAPTURE_GPU_CLOCK_COUNT, 1); +	clock = (uint64_t)RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_GPU_CLOCK_COUNT_LSB) | +		((uint64_t)RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_GPU_CLOCK_COUNT_MSB) << 32ULL);  	mutex_unlock(&adev->gfx.gpu_clock_mutex);  	amdgpu_gfx_off_ctrl(adev, true);  	return clock;  } -static void gfx_v9_4_3_select_se_sh(struct amdgpu_device *adev, -				    u32 se_num, -				    u32 sh_num, -				    u32 instance) +static void gfx_v9_4_3_free_microcode(struct amdgpu_device *adev) +{ +	amdgpu_ucode_release(&adev->gfx.pfp_fw); +	amdgpu_ucode_release(&adev->gfx.me_fw); +	amdgpu_ucode_release(&adev->gfx.ce_fw); +	amdgpu_ucode_release(&adev->gfx.rlc_fw); +	amdgpu_ucode_release(&adev->gfx.mec_fw); +	amdgpu_ucode_release(&adev->gfx.mec2_fw); + +	kfree(adev->gfx.rlc.register_list_format); +} + +static int gfx_v9_4_3_init_rlc_microcode(struct amdgpu_device *adev, +					  const char *chip_name) +{ +	char fw_name[30]; +	int err; +	const struct rlc_firmware_header_v2_0 *rlc_hdr; +	uint16_t version_major; +	uint16_t version_minor; + +	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); + +	err = amdgpu_ucode_request(adev, &adev->gfx.rlc_fw, fw_name); +	if (err) +		goto out; +	rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data; + +	version_major = le16_to_cpu(rlc_hdr->header.header_version_major); +	version_minor = le16_to_cpu(rlc_hdr->header.header_version_minor); +	err = amdgpu_gfx_rlc_init_microcode(adev, version_major, version_minor); +out: +	if (err) +		amdgpu_ucode_release(&adev->gfx.rlc_fw); + +	return err; +} + +static bool gfx_v9_4_3_should_disable_gfxoff(struct pci_dev *pdev) +{ +	return true; +} + +static void gfx_v9_4_3_check_if_need_gfxoff(struct amdgpu_device *adev) +{ +	if (gfx_v9_4_3_should_disable_gfxoff(adev->pdev)) +		adev->pm.pp_feature &= ~PP_GFXOFF_MASK; +} + +static int gfx_v9_4_3_init_cp_compute_microcode(struct amdgpu_device *adev, +					  const char *chip_name) +{ +	char fw_name[30]; +	int err; + +	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name); + +	err = amdgpu_ucode_request(adev, &adev->gfx.mec_fw, fw_name); +	if (err) +		goto out; +	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1); +	amdgpu_gfx_cp_init_microcode(adev, AMDGPU_UCODE_ID_CP_MEC1_JT); + +	adev->gfx.mec2_fw_version = adev->gfx.mec_fw_version; +	adev->gfx.mec2_feature_version = adev->gfx.mec_feature_version; + +	gfx_v9_4_3_check_if_need_gfxoff(adev); + +out: +	if (err) +		amdgpu_ucode_release(&adev->gfx.mec_fw); +	return err; +} + +static int gfx_v9_4_3_init_microcode(struct amdgpu_device *adev) +{ +	const char *chip_name; +	int r; + +	chip_name = "gc_9_4_3"; + +	r = gfx_v9_4_3_init_rlc_microcode(adev, chip_name); +	if (r) +		return r; + +	r = gfx_v9_4_3_init_cp_compute_microcode(adev, chip_name); +	if (r) +		return r; + +	return r; +} + +static void gfx_v9_4_3_mec_fini(struct amdgpu_device *adev) +{ +	amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); +	amdgpu_bo_free_kernel(&adev->gfx.mec.mec_fw_obj, NULL, NULL); +} + +static int gfx_v9_4_3_mec_init(struct amdgpu_device *adev) +{ +	int r, i, num_xcc; +	u32 *hpd; +	const __le32 *fw_data; +	unsigned fw_size; +	u32 *fw; +	size_t mec_hpd_size; + +	const struct gfx_firmware_header_v1_0 *mec_hdr; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) +		bitmap_zero(adev->gfx.mec_bitmap[i].queue_bitmap, +			AMDGPU_MAX_COMPUTE_QUEUES); + +	/* take ownership of the relevant compute queues */ +	amdgpu_gfx_compute_queue_acquire(adev); +	mec_hpd_size = +		adev->gfx.num_compute_rings * num_xcc * GFX9_MEC_HPD_SIZE; +	if (mec_hpd_size) { +		r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, +					      AMDGPU_GEM_DOMAIN_VRAM | +					      AMDGPU_GEM_DOMAIN_GTT, +					      &adev->gfx.mec.hpd_eop_obj, +					      &adev->gfx.mec.hpd_eop_gpu_addr, +					      (void **)&hpd); +		if (r) { +			dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); +			gfx_v9_4_3_mec_fini(adev); +			return r; +		} + +		if (amdgpu_emu_mode == 1) { +			for (i = 0; i < mec_hpd_size / 4; i++) { +				memset((void *)(hpd + i), 0, 4); +				if (i % 50 == 0) +					msleep(1); +			} +		} else { +			memset(hpd, 0, mec_hpd_size); +		} + +		amdgpu_bo_kunmap(adev->gfx.mec.hpd_eop_obj); +		amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); +	} + +	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; + +	fw_data = (const __le32 *) +		(adev->gfx.mec_fw->data + +		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes)); +	fw_size = le32_to_cpu(mec_hdr->header.ucode_size_bytes); + +	r = amdgpu_bo_create_reserved(adev, mec_hdr->header.ucode_size_bytes, +				      PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, +				      &adev->gfx.mec.mec_fw_obj, +				      &adev->gfx.mec.mec_fw_gpu_addr, +				      (void **)&fw); +	if (r) { +		dev_warn(adev->dev, "(%d) create mec firmware bo failed\n", r); +		gfx_v9_4_3_mec_fini(adev); +		return r; +	} + +	memcpy(fw, fw_data, fw_size); + +	amdgpu_bo_kunmap(adev->gfx.mec.mec_fw_obj); +	amdgpu_bo_unreserve(adev->gfx.mec.mec_fw_obj); + +	return 0; +} + +static void gfx_v9_4_3_xcc_select_se_sh(struct amdgpu_device *adev, u32 se_num, +					u32 sh_num, u32 instance, int xcc_id)  {  	u32 data; @@ -76,24 +545,24 @@ static void gfx_v9_4_3_select_se_sh(struct amdgpu_device *adev,  	else  		data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num); -	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, 0, regGRBM_GFX_INDEX, data); +	WREG32_SOC15_RLC_SHADOW_EX(reg, GC, GET_INST(GC, xcc_id), regGRBM_GFX_INDEX, data);  } -static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) +static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t address)  { -	WREG32_SOC15_RLC(GC, 0, regSQ_IND_INDEX, +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSQ_IND_INDEX,  		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |  		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |  		(address << SQ_IND_INDEX__INDEX__SHIFT) |  		(SQ_IND_INDEX__FORCE_READ_MASK)); -	return RREG32_SOC15(GC, 0, regSQ_IND_DATA); +	return RREG32_SOC15(GC, GET_INST(GC, xcc_id), regSQ_IND_DATA);  } -static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd, +static void wave_read_regs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  			   uint32_t wave, uint32_t thread,  			   uint32_t regno, uint32_t num, uint32_t *out)  { -	WREG32_SOC15_RLC(GC, 0, regSQ_IND_INDEX, +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSQ_IND_INDEX,  		(wave << SQ_IND_INDEX__WAVE_ID__SHIFT) |  		(simd << SQ_IND_INDEX__SIMD_ID__SHIFT) |  		(regno << SQ_IND_INDEX__INDEX__SHIFT) | @@ -101,53 +570,487 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		(SQ_IND_INDEX__FORCE_READ_MASK) |  		(SQ_IND_INDEX__AUTO_INCR_MASK));  	while (num--) -		*(out++) = RREG32_SOC15(GC, 0, regSQ_IND_DATA); +		*(out++) = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regSQ_IND_DATA);  }  static void gfx_v9_4_3_read_wave_data(struct amdgpu_device *adev, -				      uint32_t simd, uint32_t wave, +				      uint32_t xcc_id, uint32_t simd, uint32_t wave,  				      uint32_t *dst, int *no_fields)  {  	/* type 1 wave data */  	dst[(*no_fields)++] = 1; -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0); -	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_STATUS); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_LO); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_HI); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_LO); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_HI); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_HW_ID); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW0); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW1); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_GPR_ALLOC); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_LDS_ALLOC); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_TRAPSTS); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_IB_STS); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_IB_DBG0); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_M0); +	dst[(*no_fields)++] = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v9_4_3_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v9_4_3_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				       uint32_t wave, uint32_t start,  				       uint32_t size, uint32_t *dst)  { -	wave_read_regs(adev, simd, wave, 0, +	wave_read_regs(adev, xcc_id, simd, wave, 0,  		       start + SQIND_WAVE_SGPRS_OFFSET, size, dst);  } -static void gfx_v9_4_3_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v9_4_3_read_wave_vgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				       uint32_t wave, uint32_t thread,  				       uint32_t start, uint32_t size,  				       uint32_t *dst)  { -	wave_read_regs(adev, simd, wave, thread, +	wave_read_regs(adev, xcc_id, simd, wave, thread,  		       start + SQIND_WAVE_VGPRS_OFFSET, size, dst);  }  static void gfx_v9_4_3_select_me_pipe_q(struct amdgpu_device *adev, -					u32 me, u32 pipe, u32 q, u32 vm) +					u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  { -	soc15_grbm_select(adev, me, pipe, q, vm); +	soc15_grbm_select(adev, me, pipe, q, vm, GET_INST(GC, xcc_id)); +} + + +static int gfx_v9_4_3_switch_compute_partition(struct amdgpu_device *adev, +						int num_xccs_per_xcp) +{ +	int i, num_xcc; +	u32 tmp = 0; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); + +	for (i = 0; i < num_xcc; i++) { +		tmp = REG_SET_FIELD(tmp, CP_HYP_XCP_CTL, NUM_XCC_IN_XCP, +				    num_xccs_per_xcp); +		tmp = REG_SET_FIELD(tmp, CP_HYP_XCP_CTL, VIRTUAL_XCC_ID, +				    i % num_xccs_per_xcp); +		WREG32_SOC15(GC, GET_INST(GC, i), regCP_HYP_XCP_CTL, tmp); +	} + +	adev->gfx.num_xcc_per_xcp = num_xccs_per_xcp; + +	return 0; +} + +static int gfx_v9_4_3_ih_to_xcc_inst(struct amdgpu_device *adev, int ih_node) +{ +	int xcc; + +	xcc = hweight8(adev->gfx.xcc_mask & GENMASK(ih_node / 2, 0)); +	if (!xcc) { +		dev_err(adev->dev, "Couldn't find xcc mapping from IH node"); +		return -EINVAL; +	} + +	return xcc - 1; +} + +static const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs = { +	.get_gpu_clock_counter = &gfx_v9_4_3_get_gpu_clock_counter, +	.select_se_sh = &gfx_v9_4_3_xcc_select_se_sh, +	.read_wave_data = &gfx_v9_4_3_read_wave_data, +	.read_wave_sgprs = &gfx_v9_4_3_read_wave_sgprs, +	.read_wave_vgprs = &gfx_v9_4_3_read_wave_vgprs, +	.select_me_pipe_q = &gfx_v9_4_3_select_me_pipe_q, +	.switch_partition_mode = &gfx_v9_4_3_switch_compute_partition, +	.ih_node_to_logical_xcc = &gfx_v9_4_3_ih_to_xcc_inst, +}; + +static int gfx_v9_4_3_gpu_early_init(struct amdgpu_device *adev) +{ +	u32 gb_addr_config; + +	adev->gfx.funcs = &gfx_v9_4_3_gfx_funcs; +	adev->gfx.ras = &gfx_v9_4_3_ras; + +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(9, 4, 3): +		adev->gfx.config.max_hw_contexts = 8; +		adev->gfx.config.sc_prim_fifo_size_frontend = 0x20; +		adev->gfx.config.sc_prim_fifo_size_backend = 0x100; +		adev->gfx.config.sc_hiz_tile_fifo_size = 0x30; +		adev->gfx.config.sc_earlyz_tile_fifo_size = 0x4C0; +		gb_addr_config = RREG32_SOC15(GC, GET_INST(GC, 0), regGB_ADDR_CONFIG); +		break; +	default: +		BUG(); +		break; +	} + +	adev->gfx.config.gb_addr_config = gb_addr_config; + +	adev->gfx.config.gb_addr_config_fields.num_pipes = 1 << +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					NUM_PIPES); + +	adev->gfx.config.max_tile_pipes = +		adev->gfx.config.gb_addr_config_fields.num_pipes; + +	adev->gfx.config.gb_addr_config_fields.num_banks = 1 << +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					NUM_BANKS); +	adev->gfx.config.gb_addr_config_fields.max_compress_frags = 1 << +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					MAX_COMPRESSED_FRAGS); +	adev->gfx.config.gb_addr_config_fields.num_rb_per_se = 1 << +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					NUM_RB_PER_SE); +	adev->gfx.config.gb_addr_config_fields.num_se = 1 << +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					NUM_SHADER_ENGINES); +	adev->gfx.config.gb_addr_config_fields.pipe_interleave_size = 1 << (8 + +			REG_GET_FIELD( +					adev->gfx.config.gb_addr_config, +					GB_ADDR_CONFIG, +					PIPE_INTERLEAVE_SIZE)); + +	return 0; +} + +static int gfx_v9_4_3_compute_ring_init(struct amdgpu_device *adev, int ring_id, +				        int xcc_id, int mec, int pipe, int queue) +{ +	unsigned irq_type; +	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; +	unsigned int hw_prio; +	uint32_t xcc_doorbell_start; + +	ring = &adev->gfx.compute_ring[xcc_id * adev->gfx.num_compute_rings + +				       ring_id]; + +	/* mec0 is me1 */ +	ring->xcc_id = xcc_id; +	ring->me = mec + 1; +	ring->pipe = pipe; +	ring->queue = queue; + +	ring->ring_obj = NULL; +	ring->use_doorbell = true; +	xcc_doorbell_start = adev->doorbell_index.mec_ring0 + +			     xcc_id * adev->doorbell_index.xcc_doorbell_range; +	ring->doorbell_index = (xcc_doorbell_start + ring_id) << 1; +	ring->eop_gpu_addr = adev->gfx.mec.hpd_eop_gpu_addr + +			     (ring_id + xcc_id * adev->gfx.num_compute_rings) * +				     GFX9_MEC_HPD_SIZE; +	ring->vm_hub = AMDGPU_GFXHUB(xcc_id); +	sprintf(ring->name, "comp_%d.%d.%d.%d", +			ring->xcc_id, ring->me, ring->pipe, ring->queue); + +	irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP +		+ ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec) +		+ ring->pipe; +	hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring) ? +			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL; +	/* type-2 packets are deprecated on MEC, use type-3 instead */ +	return amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, irq_type, +				hw_prio, NULL); +} + +static int gfx_v9_4_3_sw_init(void *handle) +{ +	int i, j, k, r, ring_id, xcc_id, num_xcc; +	struct amdgpu_kiq *kiq; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	adev->gfx.mec.num_mec = 2; +	adev->gfx.mec.num_pipe_per_mec = 4; +	adev->gfx.mec.num_queue_per_pipe = 8; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); + +	/* EOP Event */ +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_EOP_INTERRUPT, &adev->gfx.eop_irq); +	if (r) +		return r; + +	/* Privileged reg */ +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_REG_FAULT, +			      &adev->gfx.priv_reg_irq); +	if (r) +		return r; + +	/* Privileged inst */ +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_GRBM_CP, GFX_9_0__SRCID__CP_PRIV_INSTR_FAULT, +			      &adev->gfx.priv_inst_irq); +	if (r) +		return r; + +	adev->gfx.gfx_current_status = AMDGPU_GFX_NORMAL_MODE; + +	r = adev->gfx.rlc.funcs->init(adev); +	if (r) { +		DRM_ERROR("Failed to init rlc BOs!\n"); +		return r; +	} + +	r = gfx_v9_4_3_mec_init(adev); +	if (r) { +		DRM_ERROR("Failed to init MEC BOs!\n"); +		return r; +	} + +	/* set up the compute queues - allocate horizontally across pipes */ +	for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) { +		ring_id = 0; +		for (i = 0; i < adev->gfx.mec.num_mec; ++i) { +			for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) { +				for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; +				     k++) { +					if (!amdgpu_gfx_is_mec_queue_enabled( +							adev, xcc_id, i, k, j)) +						continue; + +					r = gfx_v9_4_3_compute_ring_init(adev, +								       ring_id, +								       xcc_id, +								       i, k, j); +					if (r) +						return r; + +					ring_id++; +				} +			} +		} + +		r = amdgpu_gfx_kiq_init(adev, GFX9_MEC_HPD_SIZE, xcc_id); +		if (r) { +			DRM_ERROR("Failed to init KIQ BOs!\n"); +			return r; +		} + +		kiq = &adev->gfx.kiq[xcc_id]; +		r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, xcc_id); +		if (r) +			return r; + +		/* create MQD for all compute queues as wel as KIQ for SRIOV case */ +		r = amdgpu_gfx_mqd_sw_init(adev, +				sizeof(struct v9_mqd_allocation), xcc_id); +		if (r) +			return r; +	} + +	r = gfx_v9_4_3_gpu_early_init(adev); +	if (r) +		return r; + +	r = amdgpu_gfx_sysfs_init(adev); +	if (r) +		return r; + +	return amdgpu_gfx_ras_sw_init(adev); +} + +static int gfx_v9_4_3_sw_fini(void *handle) +{ +	int i, num_xcc; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < adev->gfx.num_compute_rings * num_xcc; i++) +		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); + +	for (i = 0; i < num_xcc; i++) { +		amdgpu_gfx_mqd_sw_fini(adev, i); +		amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[i].ring); +		amdgpu_gfx_kiq_fini(adev, i); +	} + +	gfx_v9_4_3_mec_fini(adev); +	amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj); +	gfx_v9_4_3_free_microcode(adev); +	amdgpu_gfx_sysfs_fini(adev); + +	return 0; +} + +#define DEFAULT_SH_MEM_BASES	(0x6000) +static void gfx_v9_4_3_xcc_init_compute_vmid(struct amdgpu_device *adev, +					     int xcc_id) +{ +	int i; +	uint32_t sh_mem_config; +	uint32_t sh_mem_bases; + +	/* +	 * Configure apertures: +	 * LDS:         0x60000000'00000000 - 0x60000001'00000000 (4GB) +	 * Scratch:     0x60000001'00000000 - 0x60000002'00000000 (4GB) +	 * GPUVM:       0x60010000'00000000 - 0x60020000'00000000 (1TB) +	 */ +	sh_mem_bases = DEFAULT_SH_MEM_BASES | (DEFAULT_SH_MEM_BASES << 16); + +	sh_mem_config = SH_MEM_ADDRESS_MODE_64 | +			SH_MEM_ALIGNMENT_MODE_UNALIGNED << +			SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; + +	mutex_lock(&adev->srbm_mutex); +	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) { +		soc15_grbm_select(adev, 0, 0, 0, i, GET_INST(GC, xcc_id)); +		/* CP and shaders */ +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSH_MEM_CONFIG, sh_mem_config); +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regSH_MEM_BASES, sh_mem_bases); +	} +	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +	mutex_unlock(&adev->srbm_mutex); + +	/* Initialize all compute VMIDs to have no GDS, GWS, or OA +	   acccess. These should be enabled by FW for target VMIDs. */ +	for (i = adev->vm_manager.first_kfd_vmid; i < AMDGPU_NUM_VMID; i++) { +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_BASE, 2 * i, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_SIZE, 2 * i, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_GWS_VMID0, i, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_OA_VMID0, i, 0); +	} +} + +static void gfx_v9_4_3_xcc_init_gds_vmid(struct amdgpu_device *adev, int xcc_id) +{ +	int vmid; + +	/* +	 * Initialize all compute and user-gfx VMIDs to have no GDS, GWS, or OA +	 * access. Compute VMIDs should be enabled by FW for target VMIDs, +	 * the driver can enable them for graphics. VMID0 should maintain +	 * access so that HWS firmware can save/restore entries. +	 */ +	for (vmid = 1; vmid < AMDGPU_NUM_VMID; vmid++) { +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_BASE, 2 * vmid, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_VMID0_SIZE, 2 * vmid, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_GWS_VMID0, vmid, 0); +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, xcc_id), regGDS_OA_VMID0, vmid, 0); +	} +} + +static void gfx_v9_4_3_xcc_constants_init(struct amdgpu_device *adev, +					  int xcc_id) +{ +	u32 tmp; +	int i; + +	/* XXX SH_MEM regs */ +	/* where to put LDS, scratch, GPUVM in FSA64 space */ +	mutex_lock(&adev->srbm_mutex); +	for (i = 0; i < adev->vm_manager.id_mgr[AMDGPU_GFXHUB(0)].num_ids; i++) { +		soc15_grbm_select(adev, 0, 0, 0, i, GET_INST(GC, xcc_id)); +		/* CP and shaders */ +		if (i == 0) { +			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, +					    SH_MEM_ALIGNMENT_MODE_UNALIGNED); +			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE, +					    !!adev->gmc.noretry); +			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), +					 regSH_MEM_CONFIG, tmp); +			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), +					 regSH_MEM_BASES, 0); +		} else { +			tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE, +					    SH_MEM_ALIGNMENT_MODE_UNALIGNED); +			tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, RETRY_DISABLE, +					    !!adev->gmc.noretry); +			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), +					 regSH_MEM_CONFIG, tmp); +			tmp = REG_SET_FIELD(0, SH_MEM_BASES, PRIVATE_BASE, +					    (adev->gmc.private_aperture_start >> +					     48)); +			tmp = REG_SET_FIELD(tmp, SH_MEM_BASES, SHARED_BASE, +					    (adev->gmc.shared_aperture_start >> +					     48)); +			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), +					 regSH_MEM_BASES, tmp); +		} +	} +	soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, 0)); + +	mutex_unlock(&adev->srbm_mutex); + +	gfx_v9_4_3_xcc_init_compute_vmid(adev, xcc_id); +	gfx_v9_4_3_xcc_init_gds_vmid(adev, xcc_id); +} + +static void gfx_v9_4_3_constants_init(struct amdgpu_device *adev) +{ +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); + +	gfx_v9_4_3_get_cu_info(adev, &adev->gfx.cu_info); +	adev->gfx.config.db_debug2 = +		RREG32_SOC15(GC, GET_INST(GC, 0), regDB_DEBUG2); + +	for (i = 0; i < num_xcc; i++) +		gfx_v9_4_3_xcc_constants_init(adev, i); +} + +static void +gfx_v9_4_3_xcc_enable_save_restore_machine(struct amdgpu_device *adev, +					   int xcc_id) +{ +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_SRM_CNTL, SRM_ENABLE, 1); +} + +static void gfx_v9_4_3_xcc_init_pg(struct amdgpu_device *adev, int xcc_id) +{ +	/* +	 * Rlc save restore list is workable since v2_1. +	 * And it's needed by gfxoff feature. +	 */ +	if (adev->gfx.rlc.is_rlc_v2_1) +		gfx_v9_4_3_xcc_enable_save_restore_machine(adev, xcc_id); +} + +static void gfx_v9_4_3_xcc_disable_gpa_mode(struct amdgpu_device *adev, int xcc_id) +{ +	uint32_t data; + +	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCPC_PSP_DEBUG); +	data |= CPC_PSP_DEBUG__UTCL2IUGPAOVERRIDE_MASK; +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCPC_PSP_DEBUG, data); +} + +static void gfx_v9_4_3_xcc_program_xcc_id(struct amdgpu_device *adev, +					  int xcc_id) +{ +	uint32_t tmp = 0; +	int num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	switch (num_xcc) { +	/* directly config VIRTUAL_XCC_ID to 0 for 1-XCC */ +	case 1: +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HYP_XCP_CTL, 0x8); +		break; +	case 2: +	case 4: +	case 6: +	case 8: +		tmp = (xcc_id % adev->gfx.num_xcc_per_xcp) << REG_FIELD_SHIFT(CP_HYP_XCP_CTL, VIRTUAL_XCC_ID); +		tmp = tmp | (adev->gfx.num_xcc_per_xcp << REG_FIELD_SHIFT(CP_HYP_XCP_CTL, NUM_XCC_IN_XCP)); +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HYP_XCP_CTL, tmp); + +		break; +	default: +		break; +	}  }  static bool gfx_v9_4_3_is_rlc_enabled(struct amdgpu_device *adev) @@ -155,36 +1058,37 @@ static bool gfx_v9_4_3_is_rlc_enabled(struct amdgpu_device *adev)  	uint32_t rlc_setting;  	/* if RLC is not enabled, do nothing */ -	rlc_setting = RREG32_SOC15(GC, 0, regRLC_CNTL); +	rlc_setting = RREG32_SOC15(GC, GET_INST(GC, 0), regRLC_CNTL);  	if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))  		return false;  	return true;  } -static void gfx_v9_4_3_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v9_4_3_xcc_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i;  	data = RLC_SAFE_MODE__CMD_MASK;  	data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT); -	WREG32_SOC15(GC, 0, regRLC_SAFE_MODE, data); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE, data);  	/* wait for RLC_SAFE_MODE */  	for (i = 0; i < adev->usec_timeout; i++) { -		if (!REG_GET_FIELD(RREG32_SOC15(GC, 0, regRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) +		if (!REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))  			break;  		udelay(1);  	}  } -static void gfx_v9_4_3_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v9_4_3_xcc_unset_safe_mode(struct amdgpu_device *adev, +					   int xcc_id)  {  	uint32_t data;  	data = RLC_SAFE_MODE__CMD_MASK; -	WREG32_SOC15(GC, 0, regRLC_SAFE_MODE, data); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SAFE_MODE, data);  }  static int gfx_v9_4_3_rlc_init(struct amdgpu_device *adev) @@ -196,7 +1100,8 @@ static int gfx_v9_4_3_rlc_init(struct amdgpu_device *adev)  	return 0;  } -static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev) +static void gfx_v9_4_3_xcc_wait_for_rlc_serdes(struct amdgpu_device *adev, +					       int xcc_id)  {  	u32 i, j, k;  	u32 mask; @@ -204,15 +1109,17 @@ static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v9_4_3_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v9_4_3_xcc_select_se_sh(adev, i, j, 0xffffffff, +						    xcc_id);  			for (k = 0; k < adev->usec_timeout; k++) { -				if (RREG32_SOC15(GC, 0, regRLC_SERDES_CU_MASTER_BUSY) == 0) +				if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SERDES_CU_MASTER_BUSY) == 0)  					break;  				udelay(1);  			}  			if (k == adev->usec_timeout) { -				gfx_v9_4_3_select_se_sh(adev, 0xffffffff, -						      0xffffffff, 0xffffffff); +				gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, +							    0xffffffff, +							    0xffffffff, xcc_id);  				mutex_unlock(&adev->grbm_idx_mutex);  				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",  					 i, j); @@ -220,7 +1127,8 @@ static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  		}  	} -	gfx_v9_4_3_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +				    xcc_id);  	mutex_unlock(&adev->grbm_idx_mutex);  	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK | @@ -228,79 +1136,108 @@ static void gfx_v9_4_3_wait_for_rlc_serdes(struct amdgpu_device *adev)  		RLC_SERDES_NONCU_MASTER_BUSY__TC0_MASTER_BUSY_MASK |  		RLC_SERDES_NONCU_MASTER_BUSY__TC1_MASTER_BUSY_MASK;  	for (k = 0; k < adev->usec_timeout; k++) { -		if ((RREG32_SOC15(GC, 0, regRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0) +		if ((RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_SERDES_NONCU_MASTER_BUSY) & mask) == 0)  			break;  		udelay(1);  	}  } -static void gfx_v9_4_3_enable_gui_idle_interrupt(struct amdgpu_device *adev, -					       bool enable) +static void gfx_v9_4_3_xcc_enable_gui_idle_interrupt(struct amdgpu_device *adev, +						     bool enable, int xcc_id)  {  	u32 tmp;  	/* These interrupts should be enabled to drive DS clock */ -	tmp = RREG32_SOC15(GC, 0, regCP_INT_CNTL_RING0); +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_INT_CNTL_RING0);  	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_BUSY_INT_ENABLE, enable ? 1 : 0);  	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CNTX_EMPTY_INT_ENABLE, enable ? 1 : 0);  	tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, CMP_BUSY_INT_ENABLE, enable ? 1 : 0); -	if (adev->gfx.num_gfx_rings) -		tmp = REG_SET_FIELD(tmp, CP_INT_CNTL_RING0, GFX_IDLE_INT_ENABLE, enable ? 1 : 0); -	WREG32_SOC15(GC, 0, regCP_INT_CNTL_RING0, tmp); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_INT_CNTL_RING0, tmp); +} + +static void gfx_v9_4_3_xcc_rlc_stop(struct amdgpu_device *adev, int xcc_id) +{ +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_CNTL, +			      RLC_ENABLE_F32, 0); +	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, false, xcc_id); +	gfx_v9_4_3_xcc_wait_for_rlc_serdes(adev, xcc_id);  }  static void gfx_v9_4_3_rlc_stop(struct amdgpu_device *adev)  { -	WREG32_FIELD15_PREREG(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 0); -	gfx_v9_4_3_enable_gui_idle_interrupt(adev, false); -	gfx_v9_4_3_wait_for_rlc_serdes(adev); +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) +		gfx_v9_4_3_xcc_rlc_stop(adev, i);  } -static void gfx_v9_4_3_rlc_reset(struct amdgpu_device *adev) +static void gfx_v9_4_3_xcc_rlc_reset(struct amdgpu_device *adev, int xcc_id)  { -	WREG32_FIELD15_PREREG(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), GRBM_SOFT_RESET, +			      SOFT_RESET_RLC, 1);  	udelay(50); -	WREG32_FIELD15_PREREG(GC, 0, GRBM_SOFT_RESET, SOFT_RESET_RLC, 0); +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), GRBM_SOFT_RESET, +			      SOFT_RESET_RLC, 0);  	udelay(50);  } -static void gfx_v9_4_3_rlc_start(struct amdgpu_device *adev) +static void gfx_v9_4_3_rlc_reset(struct amdgpu_device *adev)  { -#ifdef AMDGPU_RLC_DEBUG_RETRY -	u32 rlc_ucode_ver; -#endif +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) +		gfx_v9_4_3_xcc_rlc_reset(adev, i); +} -	WREG32_FIELD15_PREREG(GC, 0, RLC_CNTL, RLC_ENABLE_F32, 1); +static void gfx_v9_4_3_xcc_rlc_start(struct amdgpu_device *adev, int xcc_id) +{ +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), RLC_CNTL, +			      RLC_ENABLE_F32, 1);  	udelay(50);  	/* carrizo do enable cp interrupt after cp inited */  	if (!(adev->flags & AMD_IS_APU)) { -		gfx_v9_4_3_enable_gui_idle_interrupt(adev, true); +		gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, true, xcc_id);  		udelay(50);  	} +} +static void gfx_v9_4_3_rlc_start(struct amdgpu_device *adev) +{  #ifdef AMDGPU_RLC_DEBUG_RETRY -	/* RLC_GPM_GENERAL_6 : RLC Ucode version */ -	rlc_ucode_ver = RREG32_SOC15(GC, 0, regRLC_GPM_GENERAL_6); -	if (rlc_ucode_ver == 0x108) { -		dev_info(adev->dev, -			 "Using rlc debug ucode. regRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n", -			 rlc_ucode_ver, adev->gfx.rlc_fw_version); -		/* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles, -		 * default is 0x9C4 to create a 100us interval */ -		WREG32_SOC15(GC, 0, regRLC_GPM_TIMER_INT_3, 0x9C4); -		/* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr -		 * to disable the page fault retry interrupts, default is -		 * 0x100 (256) */ -		WREG32_SOC15(GC, 0, regRLC_GPM_GENERAL_12, 0x100); -	} +	u32 rlc_ucode_ver; +#endif +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		gfx_v9_4_3_xcc_rlc_start(adev, i); +#ifdef AMDGPU_RLC_DEBUG_RETRY +		/* RLC_GPM_GENERAL_6 : RLC Ucode version */ +		rlc_ucode_ver = RREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_GENERAL_6); +		if (rlc_ucode_ver == 0x108) { +			dev_info(adev->dev, +				 "Using rlc debug ucode. regRLC_GPM_GENERAL_6 ==0x08%x / fw_ver == %i \n", +				 rlc_ucode_ver, adev->gfx.rlc_fw_version); +			/* RLC_GPM_TIMER_INT_3 : Timer interval in RefCLK cycles, +			 * default is 0x9C4 to create a 100us interval */ +			WREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_TIMER_INT_3, 0x9C4); +			/* RLC_GPM_GENERAL_12 : Minimum gap between wptr and rptr +			 * to disable the page fault retry interrupts, default is +			 * 0x100 (256) */ +			WREG32_SOC15(GC, GET_INST(GC, i), regRLC_GPM_GENERAL_12, 0x100); +		}  #endif +	}  } -static int gfx_v9_4_3_rlc_load_microcode(struct amdgpu_device *adev) +static int gfx_v9_4_3_xcc_rlc_load_microcode(struct amdgpu_device *adev, +					     int xcc_id)  {  	const struct rlc_firmware_header_v2_0 *hdr;  	const __le32 *fw_data; @@ -316,49 +1253,65 @@ static int gfx_v9_4_3_rlc_load_microcode(struct amdgpu_device *adev)  			   le32_to_cpu(hdr->header.ucode_array_offset_bytes));  	fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4; -	WREG32_SOC15(GC, 0, regRLC_GPM_UCODE_ADDR, +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_ADDR,  			RLCG_UCODE_LOADING_START_ADDRESS);  	for (i = 0; i < fw_size; i++) {  		if (amdgpu_emu_mode == 1 && i % 100 == 0) {  			dev_info(adev->dev, "Write RLC ucode data %u DWs\n", i);  			msleep(1);  		} -		WREG32_SOC15(GC, 0, regRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++));  	} -	WREG32_SOC15(GC, 0, regRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_GPM_UCODE_ADDR, adev->gfx.rlc_fw_version);  	return 0;  } -static int gfx_v9_4_3_rlc_resume(struct amdgpu_device *adev) +static int gfx_v9_4_3_xcc_rlc_resume(struct amdgpu_device *adev, int xcc_id)  {  	int r; -	adev->gfx.rlc.funcs->stop(adev); +	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { +		gfx_v9_4_3_xcc_rlc_stop(adev, xcc_id); +		/* legacy rlc firmware loading */ +		r = gfx_v9_4_3_xcc_rlc_load_microcode(adev, xcc_id); +		if (r) +			return r; +		gfx_v9_4_3_xcc_rlc_start(adev, xcc_id); +	} +	amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id);  	/* disable CG */ -	WREG32_SOC15(GC, 0, regRLC_CGCG_CGLS_CTRL, 0); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, 0); +	gfx_v9_4_3_xcc_init_pg(adev, xcc_id); +	amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id); -	/* TODO: revisit pg function */ -	/* gfx_v9_4_3_init_pg(adev);*/ +	return 0; +} -	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { -		/* legacy rlc firmware loading */ -		r = gfx_v9_4_3_rlc_load_microcode(adev); +static int gfx_v9_4_3_rlc_resume(struct amdgpu_device *adev) +{ +	int r, i, num_xcc; + +	if (amdgpu_sriov_vf(adev)) +		return 0; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		r = gfx_v9_4_3_xcc_rlc_resume(adev, i);  		if (r)  			return r;  	} -	adev->gfx.rlc.funcs->start(adev); -  	return 0;  } -static void gfx_v9_4_3_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid) +static void gfx_v9_4_3_update_spm_vmid(struct amdgpu_device *adev, +				       unsigned vmid)  {  	u32 reg, data; -	reg = SOC15_REG_OFFSET(GC, 0, regRLC_SPM_MC_CNTL); +	reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL);  	if (amdgpu_sriov_is_pp_one_vf(adev))  		data = RREG32_NO_KIQ(reg);  	else @@ -368,9 +1321,9 @@ static void gfx_v9_4_3_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid  	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT;  	if (amdgpu_sriov_is_pp_one_vf(adev)) -		WREG32_SOC15_NO_KIQ(GC, 0, regRLC_SPM_MC_CNTL, data); +		WREG32_SOC15_NO_KIQ(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL, data);  	else -		WREG32_SOC15(GC, 0, regRLC_SPM_MC_CNTL, data); +		WREG32_SOC15(GC, GET_INST(GC, 0), regRLC_SPM_MC_CNTL, data);  }  static const struct soc15_reg_rlcg rlcg_access_gc_9_4_3[] = { @@ -382,7 +1335,7 @@ static bool gfx_v9_4_3_check_rlcg_range(struct amdgpu_device *adev,  					uint32_t offset,  					struct soc15_reg_rlcg *entries, int arr_size)  { -	int i; +	int i, inst;  	uint32_t reg;  	if (!entries) @@ -392,7 +1345,12 @@ static bool gfx_v9_4_3_check_rlcg_range(struct amdgpu_device *adev,  		const struct soc15_reg_rlcg *entry;  		entry = &entries[i]; -		reg = adev->reg_offset[entry->hwip][entry->instance][entry->segment] + entry->reg; +		inst = adev->ip_map.logical_to_dev_inst ? +			       adev->ip_map.logical_to_dev_inst( +				       adev, entry->hwip, entry->instance) : +			       entry->instance; +		reg = adev->reg_offset[entry->hwip][inst][entry->segment] + +		      entry->reg;  		if (offset == reg)  			return true;  	} @@ -407,19 +1365,1025 @@ static bool gfx_v9_4_3_is_rlcg_access_range(struct amdgpu_device *adev, u32 offs  					ARRAY_SIZE(rlcg_access_gc_9_4_3));  } -const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs = { -	.get_gpu_clock_counter = &gfx_v9_4_3_get_gpu_clock_counter, -	.select_se_sh = &gfx_v9_4_3_select_se_sh, -	.read_wave_data = &gfx_v9_4_3_read_wave_data, -	.read_wave_sgprs = &gfx_v9_4_3_read_wave_sgprs, -	.read_wave_vgprs = &gfx_v9_4_3_read_wave_vgprs, -	.select_me_pipe_q = &gfx_v9_4_3_select_me_pipe_q, -}; +static void gfx_v9_4_3_xcc_cp_compute_enable(struct amdgpu_device *adev, +					     bool enable, int xcc_id) +{ +	if (enable) { +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MEC_CNTL, 0); +	} else { +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MEC_CNTL, +			(CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); +		adev->gfx.kiq[xcc_id].ring.sched.ready = false; +	} +	udelay(50); +} + +static int gfx_v9_4_3_xcc_cp_compute_load_microcode(struct amdgpu_device *adev, +						    int xcc_id) +{ +	const struct gfx_firmware_header_v1_0 *mec_hdr; +	const __le32 *fw_data; +	unsigned i; +	u32 tmp; +	u32 mec_ucode_addr_offset; +	u32 mec_ucode_data_offset; + +	if (!adev->gfx.mec_fw) +		return -EINVAL; + +	gfx_v9_4_3_xcc_cp_compute_enable(adev, false, xcc_id); + +	mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; +	amdgpu_ucode_print_gfx_hdr(&mec_hdr->header); + +	fw_data = (const __le32 *) +		(adev->gfx.mec_fw->data + +		 le32_to_cpu(mec_hdr->header.ucode_array_offset_bytes)); +	tmp = 0; +	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, VMID, 0); +	tmp = REG_SET_FIELD(tmp, CP_CPC_IC_BASE_CNTL, CACHE_POLICY, 0); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_CNTL, tmp); + +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_LO, +		adev->gfx.mec.mec_fw_gpu_addr & 0xFFFFF000); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_CPC_IC_BASE_HI, +		upper_32_bits(adev->gfx.mec.mec_fw_gpu_addr)); + +	mec_ucode_addr_offset = +		SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_MEC_ME1_UCODE_ADDR); +	mec_ucode_data_offset = +		SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_MEC_ME1_UCODE_DATA); + +	/* MEC1 */ +	WREG32(mec_ucode_addr_offset, mec_hdr->jt_offset); +	for (i = 0; i < mec_hdr->jt_size; i++) +		WREG32(mec_ucode_data_offset, +		       le32_to_cpup(fw_data + mec_hdr->jt_offset + i)); + +	WREG32(mec_ucode_addr_offset, adev->gfx.mec_fw_version); +	/* Todo : Loading MEC2 firmware is only necessary if MEC2 should run different microcode than MEC1. */ + +	return 0; +} + +/* KIQ functions */ +static void gfx_v9_4_3_xcc_kiq_setting(struct amdgpu_ring *ring, int xcc_id) +{ +	uint32_t tmp; +	struct amdgpu_device *adev = ring->adev; + +	/* tell RLC which is KIQ queue */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS); +	tmp &= 0xffffff00; +	tmp |= (ring->me << 5) | (ring->pipe << 3) | (ring->queue); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS, tmp); +	tmp |= 0x80; +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regRLC_CP_SCHEDULERS, tmp); +} + +static void gfx_v9_4_3_mqd_set_priority(struct amdgpu_ring *ring, struct v9_mqd *mqd) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { +		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring)) { +			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; +			mqd->cp_hqd_queue_priority = +				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; +		} +	} +} + +static int gfx_v9_4_3_xcc_mqd_init(struct amdgpu_ring *ring, int xcc_id) +{ +	struct amdgpu_device *adev = ring->adev; +	struct v9_mqd *mqd = ring->mqd_ptr; +	uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr; +	uint32_t tmp; + +	mqd->header = 0xC0310800; +	mqd->compute_pipelinestat_enable = 0x00000001; +	mqd->compute_static_thread_mgmt_se0 = 0xffffffff; +	mqd->compute_static_thread_mgmt_se1 = 0xffffffff; +	mqd->compute_static_thread_mgmt_se2 = 0xffffffff; +	mqd->compute_static_thread_mgmt_se3 = 0xffffffff; +	mqd->compute_misc_reserved = 0x00000003; + +	mqd->dynamic_cu_mask_addr_lo = +		lower_32_bits(ring->mqd_gpu_addr +			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask)); +	mqd->dynamic_cu_mask_addr_hi = +		upper_32_bits(ring->mqd_gpu_addr +			      + offsetof(struct v9_mqd_allocation, dynamic_cu_mask)); + +	eop_base_addr = ring->eop_gpu_addr >> 8; +	mqd->cp_hqd_eop_base_addr_lo = eop_base_addr; +	mqd->cp_hqd_eop_base_addr_hi = upper_32_bits(eop_base_addr); + +	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_CONTROL); +	tmp = REG_SET_FIELD(tmp, CP_HQD_EOP_CONTROL, EOP_SIZE, +			(order_base_2(GFX9_MEC_HPD_SIZE / 4) - 1)); + +	mqd->cp_hqd_eop_control = tmp; + +	/* enable doorbell? */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL); + +	if (ring->use_doorbell) { +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, +				    DOORBELL_OFFSET, ring->doorbell_index); +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, +				    DOORBELL_EN, 1); +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, +				    DOORBELL_SOURCE, 0); +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, +				    DOORBELL_HIT, 0); +	} else { +		tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_DOORBELL_CONTROL, +					 DOORBELL_EN, 0); +	} + +	mqd->cp_hqd_pq_doorbell_control = tmp; + +	/* disable the queue if it's active */ +	ring->wptr = 0; +	mqd->cp_hqd_dequeue_request = 0; +	mqd->cp_hqd_pq_rptr = 0; +	mqd->cp_hqd_pq_wptr_lo = 0; +	mqd->cp_hqd_pq_wptr_hi = 0; + +	/* set the pointer to the MQD */ +	mqd->cp_mqd_base_addr_lo = ring->mqd_gpu_addr & 0xfffffffc; +	mqd->cp_mqd_base_addr_hi = upper_32_bits(ring->mqd_gpu_addr); + +	/* set MQD vmid to 0 */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MQD_CONTROL); +	tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0); +	mqd->cp_mqd_control = tmp; + +	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */ +	hqd_gpu_addr = ring->gpu_addr >> 8; +	mqd->cp_hqd_pq_base_lo = hqd_gpu_addr; +	mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr); + +	/* set up the HQD, this is similar to CP_RB0_CNTL */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_CONTROL); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE, +			    (order_base_2(ring->ring_size / 4) - 1)); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE, +			((order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1) << 8)); +#ifdef __BIG_ENDIAN +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ENDIAN_SWAP, 1); +#endif +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 0); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, ROQ_PQ_IB_FLIP, 0); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1); +	mqd->cp_hqd_pq_control = tmp; + +	/* set the wb address whether it's enabled or not */ +	wb_gpu_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4); +	mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc; +	mqd->cp_hqd_pq_rptr_report_addr_hi = +		upper_32_bits(wb_gpu_addr) & 0xffff; + +	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */ +	wb_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); +	mqd->cp_hqd_pq_wptr_poll_addr_lo = wb_gpu_addr & 0xfffffffc; +	mqd->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits(wb_gpu_addr) & 0xffff; + +	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ +	ring->wptr = 0; +	mqd->cp_hqd_pq_rptr = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR); + +	/* set the vmid for the queue */ +	mqd->cp_hqd_vmid = 0; + +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE); +	tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53); +	mqd->cp_hqd_persistent_state = tmp; + +	/* set MIN_IB_AVAIL_SIZE */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_IB_CONTROL); +	tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3); +	mqd->cp_hqd_ib_control = tmp; + +	/* set static priority for a queue/ring */ +	gfx_v9_4_3_mqd_set_priority(ring, mqd); +	mqd->cp_hqd_quantum = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_QUANTUM); + +	/* map_queues packet doesn't need activate the queue, +	 * so only kiq need set this field. +	 */ +	if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) +		mqd->cp_hqd_active = 1; + +	return 0; +} + +static int gfx_v9_4_3_xcc_kiq_init_register(struct amdgpu_ring *ring, +					    int xcc_id) +{ +	struct amdgpu_device *adev = ring->adev; +	struct v9_mqd *mqd = ring->mqd_ptr; +	int j; + +	/* disable wptr polling */ +	WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_WPTR_POLL_CNTL, EN, 0); + +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_BASE_ADDR, +	       mqd->cp_hqd_eop_base_addr_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_BASE_ADDR_HI, +	       mqd->cp_hqd_eop_base_addr_hi); + +	/* set the EOP size, register value is 2^(EOP_SIZE+1) dwords */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_EOP_CONTROL, +	       mqd->cp_hqd_eop_control); + +	/* enable doorbell? */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, +	       mqd->cp_hqd_pq_doorbell_control); + +	/* disable the queue if it's active */ +	if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1) { +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, 1); +		for (j = 0; j < adev->usec_timeout; j++) { +			if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1)) +				break; +			udelay(1); +		} +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, +		       mqd->cp_hqd_dequeue_request); +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR, +		       mqd->cp_hqd_pq_rptr); +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO, +		       mqd->cp_hqd_pq_wptr_lo); +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI, +		       mqd->cp_hqd_pq_wptr_hi); +	} + +	/* set the pointer to the MQD */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_BASE_ADDR, +	       mqd->cp_mqd_base_addr_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_BASE_ADDR_HI, +	       mqd->cp_mqd_base_addr_hi); + +	/* set MQD vmid to 0 */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_MQD_CONTROL, +	       mqd->cp_mqd_control); + +	/* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_BASE, +	       mqd->cp_hqd_pq_base_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_BASE_HI, +	       mqd->cp_hqd_pq_base_hi); + +	/* set up the HQD, this is similar to CP_RB0_CNTL */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_CONTROL, +	       mqd->cp_hqd_pq_control); + +	/* set the wb address whether it's enabled or not */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR_REPORT_ADDR, +				mqd->cp_hqd_pq_rptr_report_addr_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR_REPORT_ADDR_HI, +				mqd->cp_hqd_pq_rptr_report_addr_hi); + +	/* only used if CP_PQ_WPTR_POLL_CNTL.CP_PQ_WPTR_POLL_CNTL__EN_MASK=1 */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_POLL_ADDR, +	       mqd->cp_hqd_pq_wptr_poll_addr_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_POLL_ADDR_HI, +	       mqd->cp_hqd_pq_wptr_poll_addr_hi); + +	/* enable the doorbell if requested */ +	if (ring->use_doorbell) { +		WREG32_SOC15( +			GC, GET_INST(GC, xcc_id), +			regCP_MEC_DOORBELL_RANGE_LOWER, +			((adev->doorbell_index.kiq + +			  xcc_id * adev->doorbell_index.xcc_doorbell_range) * +			 2) << 2); +		WREG32_SOC15( +			GC, GET_INST(GC, xcc_id), +			regCP_MEC_DOORBELL_RANGE_UPPER, +			((adev->doorbell_index.userqueue_end + +			  xcc_id * adev->doorbell_index.xcc_doorbell_range) * +			 2) << 2); +	} + +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, +	       mqd->cp_hqd_pq_doorbell_control); + +	/* reset read and write pointers, similar to CP_RB0_WPTR/_RPTR */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO, +	       mqd->cp_hqd_pq_wptr_lo); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI, +	       mqd->cp_hqd_pq_wptr_hi); + +	/* set the vmid for the queue */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_VMID, mqd->cp_hqd_vmid); + +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE, +	       mqd->cp_hqd_persistent_state); + +	/* activate the queue */ +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE, +	       mqd->cp_hqd_active); + +	if (ring->use_doorbell) +		WREG32_FIELD15_PREREG(GC, GET_INST(GC, xcc_id), CP_PQ_STATUS, DOORBELL_ENABLE, 1); + +	return 0; +} + +static int gfx_v9_4_3_xcc_q_fini_register(struct amdgpu_ring *ring, +					    int xcc_id) +{ +	struct amdgpu_device *adev = ring->adev; +	int j; + +	/* disable the queue if it's active */ +	if (RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1) { + +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, 1); + +		for (j = 0; j < adev->usec_timeout; j++) { +			if (!(RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE) & 1)) +				break; +			udelay(1); +		} + +		if (j == AMDGPU_MAX_USEC_TIMEOUT) { +			DRM_DEBUG("%s dequeue request failed.\n", ring->name); + +			/* Manual disable if dequeue request times out */ +			WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_ACTIVE, 0); +		} + +		WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_DEQUEUE_REQUEST, +		      0); +	} + +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_IQ_TIMER, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_IB_CONTROL, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PERSISTENT_STATE, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, 0x40000000); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_DOORBELL_CONTROL, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_RPTR, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_HI, 0); +	WREG32_SOC15_RLC(GC, GET_INST(GC, xcc_id), regCP_HQD_PQ_WPTR_LO, 0); + +	return 0; +} + +static int gfx_v9_4_3_xcc_kiq_init_queue(struct amdgpu_ring *ring, int xcc_id) +{ +	struct amdgpu_device *adev = ring->adev; +	struct v9_mqd *mqd = ring->mqd_ptr; +	struct v9_mqd *tmp_mqd; + +	gfx_v9_4_3_xcc_kiq_setting(ring, xcc_id); + +	/* GPU could be in bad state during probe, driver trigger the reset +	 * after load the SMU, in this case , the mqd is not be initialized. +	 * driver need to re-init the mqd. +	 * check mqd->cp_hqd_pq_control since this value should not be 0 +	 */ +	tmp_mqd = (struct v9_mqd *)adev->gfx.kiq[xcc_id].mqd_backup; +	if (amdgpu_in_reset(adev) && tmp_mqd->cp_hqd_pq_control) { +		/* for GPU_RESET case , reset MQD to a clean status */ +		if (adev->gfx.kiq[xcc_id].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[xcc_id].mqd_backup, sizeof(struct v9_mqd_allocation)); + +		/* reset ring buffer */ +		ring->wptr = 0; +		amdgpu_ring_clear_ring(ring); +		mutex_lock(&adev->srbm_mutex); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id)); +		gfx_v9_4_3_xcc_kiq_init_register(ring, xcc_id); +		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +		mutex_unlock(&adev->srbm_mutex); +	} else { +		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation)); +		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; +		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; +		mutex_lock(&adev->srbm_mutex); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id)); +		gfx_v9_4_3_xcc_mqd_init(ring, xcc_id); +		gfx_v9_4_3_xcc_kiq_init_register(ring, xcc_id); +		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +		mutex_unlock(&adev->srbm_mutex); -const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = { +		if (adev->gfx.kiq[xcc_id].mqd_backup) +			memcpy(adev->gfx.kiq[xcc_id].mqd_backup, mqd, sizeof(struct v9_mqd_allocation)); +	} + +	return 0; +} + +static int gfx_v9_4_3_xcc_kcq_init_queue(struct amdgpu_ring *ring, int xcc_id) +{ +	struct amdgpu_device *adev = ring->adev; +	struct v9_mqd *mqd = ring->mqd_ptr; +	int mqd_idx = ring - &adev->gfx.compute_ring[0]; +	struct v9_mqd *tmp_mqd; + +	/* Same as above kiq init, driver need to re-init the mqd if mqd->cp_hqd_pq_control +	 * is not be initialized before +	 */ +	tmp_mqd = (struct v9_mqd *)adev->gfx.mec.mqd_backup[mqd_idx]; + +	if (!tmp_mqd->cp_hqd_pq_control || +	    (!amdgpu_in_reset(adev) && !adev->in_suspend)) { +		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation)); +		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF; +		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF; +		mutex_lock(&adev->srbm_mutex); +		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0, GET_INST(GC, xcc_id)); +		gfx_v9_4_3_xcc_mqd_init(ring, xcc_id); +		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +		mutex_unlock(&adev->srbm_mutex); + +		if (adev->gfx.mec.mqd_backup[mqd_idx]) +			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct v9_mqd_allocation)); +	} else { +		/* restore MQD to a clean status */ +		if (adev->gfx.mec.mqd_backup[mqd_idx]) +			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct v9_mqd_allocation)); +		/* reset ring buffer */ +		ring->wptr = 0; +		atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], 0); +		amdgpu_ring_clear_ring(ring); +	} + +	return 0; +} + +static int gfx_v9_4_3_xcc_kcq_fini_register(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_ring *ring; +	int j; + +	for (j = 0; j < adev->gfx.num_compute_rings; j++) { +		ring = &adev->gfx.compute_ring[j +  xcc_id * adev->gfx.num_compute_rings]; +		if (!amdgpu_in_reset(adev) && !adev->in_suspend) { +			mutex_lock(&adev->srbm_mutex); +			soc15_grbm_select(adev, ring->me, +					ring->pipe, +					ring->queue, 0, GET_INST(GC, xcc_id)); +			gfx_v9_4_3_xcc_q_fini_register(ring, xcc_id); +			soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +			mutex_unlock(&adev->srbm_mutex); +		} +	} + +	return 0; +} + +static int gfx_v9_4_3_xcc_kiq_resume(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_ring *ring; +	int r; + +	ring = &adev->gfx.kiq[xcc_id].ring; + +	r = amdgpu_bo_reserve(ring->mqd_obj, false); +	if (unlikely(r != 0)) +		return r; + +	r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr); +	if (unlikely(r != 0)) { +		amdgpu_bo_unreserve(ring->mqd_obj); +		return r; +	} + +	gfx_v9_4_3_xcc_kiq_init_queue(ring, xcc_id); +	amdgpu_bo_kunmap(ring->mqd_obj); +	ring->mqd_ptr = NULL; +	amdgpu_bo_unreserve(ring->mqd_obj); +	return 0; +} + +static int gfx_v9_4_3_xcc_kcq_resume(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_ring *ring = NULL; +	int r = 0, i; + +	gfx_v9_4_3_xcc_cp_compute_enable(adev, true, xcc_id); + +	for (i = 0; i < adev->gfx.num_compute_rings; i++) { +		ring = &adev->gfx.compute_ring[i + xcc_id * adev->gfx.num_compute_rings]; + +		r = amdgpu_bo_reserve(ring->mqd_obj, false); +		if (unlikely(r != 0)) +			goto done; +		r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr); +		if (!r) { +			r = gfx_v9_4_3_xcc_kcq_init_queue(ring, xcc_id); +			amdgpu_bo_kunmap(ring->mqd_obj); +			ring->mqd_ptr = NULL; +		} +		amdgpu_bo_unreserve(ring->mqd_obj); +		if (r) +			goto done; +	} + +	r = amdgpu_gfx_enable_kcq(adev, xcc_id); +done: +	return r; +} + +static int gfx_v9_4_3_xcc_cp_resume(struct amdgpu_device *adev, int xcc_id) +{ +	struct amdgpu_ring *ring; +	int r, j; + +	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, false, xcc_id); + +	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { +		gfx_v9_4_3_xcc_disable_gpa_mode(adev, xcc_id); + +		r = gfx_v9_4_3_xcc_cp_compute_load_microcode(adev, xcc_id); +		if (r) +			return r; +	} + +	/* set the virtual and physical id based on partition_mode */ +	gfx_v9_4_3_xcc_program_xcc_id(adev, xcc_id); + +	r = gfx_v9_4_3_xcc_kiq_resume(adev, xcc_id); +	if (r) +		return r; + +	r = gfx_v9_4_3_xcc_kcq_resume(adev, xcc_id); +	if (r) +		return r; + +	for (j = 0; j < adev->gfx.num_compute_rings; j++) { +		ring = &adev->gfx.compute_ring +				[j + xcc_id * adev->gfx.num_compute_rings]; +		r = amdgpu_ring_test_helper(ring); +		if (r) +			return r; +	} + +	gfx_v9_4_3_xcc_enable_gui_idle_interrupt(adev, true, xcc_id); + +	return 0; +} + +static int gfx_v9_4_3_cp_resume(struct amdgpu_device *adev) +{ +	int r = 0, i, num_xcc; + +	if (amdgpu_xcp_query_partition_mode(adev->xcp_mgr, +					    AMDGPU_XCP_FL_NONE) == +	    AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE) +		r = amdgpu_xcp_switch_partition_mode(adev->xcp_mgr, +						     amdgpu_user_partt_mode); + +	if (r) +		return r; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		r = gfx_v9_4_3_xcc_cp_resume(adev, i); +		if (r) +			return r; +	} + +	return 0; +} + +static void gfx_v9_4_3_xcc_cp_enable(struct amdgpu_device *adev, bool enable, +				     int xcc_id) +{ +	gfx_v9_4_3_xcc_cp_compute_enable(adev, enable, xcc_id); +} + +static void gfx_v9_4_3_xcc_fini(struct amdgpu_device *adev, int xcc_id) +{ +	if (amdgpu_gfx_disable_kcq(adev, xcc_id)) +		DRM_ERROR("XCD %d KCQ disable failed\n", xcc_id); + +	/* Use deinitialize sequence from CAIL when unbinding device +	 * from driver, otherwise KIQ is hanging when binding back +	 */ +	if (!amdgpu_in_reset(adev) && !adev->in_suspend) { +		mutex_lock(&adev->srbm_mutex); +		soc15_grbm_select(adev, adev->gfx.kiq[xcc_id].ring.me, +				  adev->gfx.kiq[xcc_id].ring.pipe, +				  adev->gfx.kiq[xcc_id].ring.queue, 0, +				  GET_INST(GC, xcc_id)); +		gfx_v9_4_3_xcc_q_fini_register(&adev->gfx.kiq[xcc_id].ring, +						 xcc_id); +		soc15_grbm_select(adev, 0, 0, 0, 0, GET_INST(GC, xcc_id)); +		mutex_unlock(&adev->srbm_mutex); +	} + +	gfx_v9_4_3_xcc_kcq_fini_register(adev, xcc_id); +	gfx_v9_4_3_xcc_cp_enable(adev, false, xcc_id); +} + +static int gfx_v9_4_3_hw_init(void *handle) +{ +	int r; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	gfx_v9_4_3_init_golden_registers(adev); + +	gfx_v9_4_3_constants_init(adev); + +	r = adev->gfx.rlc.funcs->resume(adev); +	if (r) +		return r; + +	r = gfx_v9_4_3_cp_resume(adev); +	if (r) +		return r; + +	return r; +} + +static int gfx_v9_4_3_hw_fini(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, num_xcc; + +	amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); +	amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		gfx_v9_4_3_xcc_fini(adev, i); +	} + +	return 0; +} + +static int gfx_v9_4_3_suspend(void *handle) +{ +	return gfx_v9_4_3_hw_fini(handle); +} + +static int gfx_v9_4_3_resume(void *handle) +{ +	return gfx_v9_4_3_hw_init(handle); +} + +static bool gfx_v9_4_3_is_idle(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		if (REG_GET_FIELD(RREG32_SOC15(GC, GET_INST(GC, i), regGRBM_STATUS), +					GRBM_STATUS, GUI_ACTIVE)) +			return false; +	} +	return true; +} + +static int gfx_v9_4_3_wait_for_idle(void *handle) +{ +	unsigned i; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	for (i = 0; i < adev->usec_timeout; i++) { +		if (gfx_v9_4_3_is_idle(handle)) +			return 0; +		udelay(1); +	} +	return -ETIMEDOUT; +} + +static int gfx_v9_4_3_soft_reset(void *handle) +{ +	u32 grbm_soft_reset = 0; +	u32 tmp; +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	/* GRBM_STATUS */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_STATUS); +	if (tmp & (GRBM_STATUS__PA_BUSY_MASK | GRBM_STATUS__SC_BUSY_MASK | +		   GRBM_STATUS__BCI_BUSY_MASK | GRBM_STATUS__SX_BUSY_MASK | +		   GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK | +		   GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK | +		   GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK | +		   GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK)) { +		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, +						GRBM_SOFT_RESET, SOFT_RESET_CP, 1); +		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, +						GRBM_SOFT_RESET, SOFT_RESET_GFX, 1); +	} + +	if (tmp & (GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) { +		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, +						GRBM_SOFT_RESET, SOFT_RESET_CP, 1); +	} + +	/* GRBM_STATUS2 */ +	tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_STATUS2); +	if (REG_GET_FIELD(tmp, GRBM_STATUS2, RLC_BUSY)) +		grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, +						GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); + + +	if (grbm_soft_reset) { +		/* stop the rlc */ +		adev->gfx.rlc.funcs->stop(adev); + +		/* Disable MEC parsing/prefetching */ +		gfx_v9_4_3_xcc_cp_compute_enable(adev, false, 0); + +		if (grbm_soft_reset) { +			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET); +			tmp |= grbm_soft_reset; +			dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp); +			WREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET, tmp); +			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET); + +			udelay(50); + +			tmp &= ~grbm_soft_reset; +			WREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET, tmp); +			tmp = RREG32_SOC15(GC, GET_INST(GC, 0), regGRBM_SOFT_RESET); +		} + +		/* Wait a little for things to settle down */ +		udelay(50); +	} +	return 0; +} + +static void gfx_v9_4_3_ring_emit_gds_switch(struct amdgpu_ring *ring, +					  uint32_t vmid, +					  uint32_t gds_base, uint32_t gds_size, +					  uint32_t gws_base, uint32_t gws_size, +					  uint32_t oa_base, uint32_t oa_size) +{ +	struct amdgpu_device *adev = ring->adev; + +	/* GDS Base */ +	gfx_v9_4_3_write_data_to_reg(ring, 0, false, +				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_VMID0_BASE) + 2 * vmid, +				   gds_base); + +	/* GDS Size */ +	gfx_v9_4_3_write_data_to_reg(ring, 0, false, +				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_VMID0_SIZE) + 2 * vmid, +				   gds_size); + +	/* GWS */ +	gfx_v9_4_3_write_data_to_reg(ring, 0, false, +				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_GWS_VMID0) + vmid, +				   gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base); + +	/* OA */ +	gfx_v9_4_3_write_data_to_reg(ring, 0, false, +				   SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regGDS_OA_VMID0) + vmid, +				   (1 << (oa_size + oa_base)) - (1 << oa_base)); +} + +static int gfx_v9_4_3_early_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev), +					  AMDGPU_MAX_COMPUTE_RINGS); +	gfx_v9_4_3_set_kiq_pm4_funcs(adev); +	gfx_v9_4_3_set_ring_funcs(adev); +	gfx_v9_4_3_set_irq_funcs(adev); +	gfx_v9_4_3_set_gds_init(adev); +	gfx_v9_4_3_set_rlc_funcs(adev); + +	return gfx_v9_4_3_init_microcode(adev); +} + +static int gfx_v9_4_3_late_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = amdgpu_irq_get(adev, &adev->gfx.priv_reg_irq, 0); +	if (r) +		return r; + +	r = amdgpu_irq_get(adev, &adev->gfx.priv_inst_irq, 0); +	if (r) +		return r; + +	return 0; +} + +static void gfx_v9_4_3_xcc_update_sram_fgcg(struct amdgpu_device *adev, +					    bool enable, int xcc_id) +{ +	uint32_t def, data; + +	if (!(adev->cg_flags & AMD_CG_SUPPORT_GFX_FGCG)) +		return; + +	def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), +				  regRLC_CGTT_MGCG_OVERRIDE); + +	if (enable) +		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_FGCG_OVERRIDE_MASK; +	else +		data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_FGCG_OVERRIDE_MASK; + +	if (def != data) +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), +			     regRLC_CGTT_MGCG_OVERRIDE, data); + +	def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CLK_CNTL); + +	if (enable) +		data &= ~RLC_CLK_CNTL__RLC_SRAM_CLK_GATER_OVERRIDE_MASK; +	else +		data |= RLC_CLK_CNTL__RLC_SRAM_CLK_GATER_OVERRIDE_MASK; + +	if (def != data) +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CLK_CNTL, data); +} + +static void gfx_v9_4_3_xcc_update_repeater_fgcg(struct amdgpu_device *adev, +						bool enable, int xcc_id) +{ +	uint32_t def, data; + +	if (!(adev->cg_flags & AMD_CG_SUPPORT_REPEATER_FGCG)) +		return; + +	def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), +				  regRLC_CGTT_MGCG_OVERRIDE); + +	if (enable) +		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_REP_FGCG_OVERRIDE_MASK; +	else +		data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_REP_FGCG_OVERRIDE_MASK; + +	if (def != data) +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), +			     regRLC_CGTT_MGCG_OVERRIDE, data); +} + +static void +gfx_v9_4_3_xcc_update_medium_grain_clock_gating(struct amdgpu_device *adev, +						bool enable, int xcc_id) +{ +	uint32_t data, def; + +	/* It is disabled by HW by default */ +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { +		/* 1 - RLC_CGTT_MGCG_OVERRIDE */ +		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE); + +		data &= ~(RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK | +			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK | +			  RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK | +			  RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK); + +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data); + +		/* MGLS is a global flag to control all MGLS in GFX */ +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) { +			/* 2 - RLC memory Light sleep */ +			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) { +				def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL); +				data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK; +				if (def != data) +					WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL, data); +			} +			/* 3 - CP memory Light sleep */ +			if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) { +				def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL); +				data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK; +				if (def != data) +					WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL, data); +			} +		} +	} else { +		/* 1 - MGCG_OVERRIDE */ +		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE); + +		data |= (RLC_CGTT_MGCG_OVERRIDE__RLC_CGTT_SCLK_OVERRIDE_MASK | +			 RLC_CGTT_MGCG_OVERRIDE__GRBM_CGTT_SCLK_OVERRIDE_MASK | +			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK | +			 RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGLS_OVERRIDE_MASK); + +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data); + +		/* 2 - disable MGLS in RLC */ +		data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL); +		if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) { +			data &= ~RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK; +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_MEM_SLP_CNTL, data); +		} + +		/* 3 - disable MGLS in CP */ +		data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL); +		if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) { +			data &= ~CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK; +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_MEM_SLP_CNTL, data); +		} +	} + +} + +static void +gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(struct amdgpu_device *adev, +						bool enable, int xcc_id) +{ +	uint32_t def, data; + +	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) { + +		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE); +		/* unset CGCG override */ +		data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGCG_OVERRIDE_MASK; +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) +			data &= ~RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK; +		else +			data |= RLC_CGTT_MGCG_OVERRIDE__GFXIP_CGLS_OVERRIDE_MASK; +		/* update CGCG and CGLS override bits */ +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGTT_MGCG_OVERRIDE, data); + +		/* enable cgcg FSM(0x0000363F) */ +		def = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL); + +		data = (0x36 +			<< RLC_CGCG_CGLS_CTRL__CGCG_GFX_IDLE_THRESHOLD__SHIFT) | +		       RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK; +		if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) +			data |= (0x000F << RLC_CGCG_CGLS_CTRL__CGLS_REP_COMPANSAT_DELAY__SHIFT) | +				RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK; +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, data); + +		/* set IDLE_POLL_COUNT(0x00900100) */ +		def = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_RB_WPTR_POLL_CNTL); +		data = (0x0100 << CP_RB_WPTR_POLL_CNTL__POLL_FREQUENCY__SHIFT) | +			(0x0090 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT); +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regCP_RB_WPTR_POLL_CNTL, data); +	} else { +		def = data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL); +		/* reset CGCG/CGLS bits */ +		data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK); +		/* disable cgcg and cgls in FSM */ +		if (def != data) +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regRLC_CGCG_CGLS_CTRL, data); +	} + +} + +static int gfx_v9_4_3_xcc_update_gfx_clock_gating(struct amdgpu_device *adev, +						  bool enable, int xcc_id) +{ +	amdgpu_gfx_rlc_enter_safe_mode(adev, xcc_id); + +	if (enable) { +		/* FGCG */ +		gfx_v9_4_3_xcc_update_sram_fgcg(adev, enable, xcc_id); +		gfx_v9_4_3_xcc_update_repeater_fgcg(adev, enable, xcc_id); + +		/* CGCG/CGLS should be enabled after MGCG/MGLS +		 * ===  MGCG + MGLS === +		 */ +		gfx_v9_4_3_xcc_update_medium_grain_clock_gating(adev, enable, +								xcc_id); +		/* ===  CGCG + CGLS === */ +		gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(adev, enable, +								xcc_id); +	} else { +		/* CGCG/CGLS should be disabled before MGCG/MGLS +		 * ===  CGCG + CGLS === +		 */ +		gfx_v9_4_3_xcc_update_coarse_grain_clock_gating(adev, enable, +								xcc_id); +		/* ===  MGCG + MGLS === */ +		gfx_v9_4_3_xcc_update_medium_grain_clock_gating(adev, enable, +								xcc_id); + +		/* FGCG */ +		gfx_v9_4_3_xcc_update_sram_fgcg(adev, enable, xcc_id); +		gfx_v9_4_3_xcc_update_repeater_fgcg(adev, enable, xcc_id); +	} + +	amdgpu_gfx_rlc_exit_safe_mode(adev, xcc_id); + +	return 0; +} + +static const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = {  	.is_rlc_enabled = gfx_v9_4_3_is_rlc_enabled, -	.set_safe_mode = gfx_v9_4_3_set_safe_mode, -	.unset_safe_mode = gfx_v9_4_3_unset_safe_mode, +	.set_safe_mode = gfx_v9_4_3_xcc_set_safe_mode, +	.unset_safe_mode = gfx_v9_4_3_xcc_unset_safe_mode,  	.init = gfx_v9_4_3_rlc_init,  	.resume = gfx_v9_4_3_rlc_resume,  	.stop = gfx_v9_4_3_rlc_stop, @@ -428,3 +2392,1982 @@ const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs = {  	.update_spm_vmid = gfx_v9_4_3_update_spm_vmid,  	.is_rlcg_access_range = gfx_v9_4_3_is_rlcg_access_range,  }; + +static int gfx_v9_4_3_set_powergating_state(void *handle, +					  enum amd_powergating_state state) +{ +	return 0; +} + +static int gfx_v9_4_3_set_clockgating_state(void *handle, +					  enum amd_clockgating_state state) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, num_xcc; + +	if (amdgpu_sriov_vf(adev)) +		return 0; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(9, 4, 3): +		for (i = 0; i < num_xcc; i++) +			gfx_v9_4_3_xcc_update_gfx_clock_gating( +				adev, state == AMD_CG_STATE_GATE, i); +		break; +	default: +		break; +	} +	return 0; +} + +static void gfx_v9_4_3_get_clockgating_state(void *handle, u64 *flags) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int data; + +	if (amdgpu_sriov_vf(adev)) +		*flags = 0; + +	/* AMD_CG_SUPPORT_GFX_MGCG */ +	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_CGTT_MGCG_OVERRIDE)); +	if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK)) +		*flags |= AMD_CG_SUPPORT_GFX_MGCG; + +	/* AMD_CG_SUPPORT_GFX_CGCG */ +	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_CGCG_CGLS_CTRL)); +	if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK) +		*flags |= AMD_CG_SUPPORT_GFX_CGCG; + +	/* AMD_CG_SUPPORT_GFX_CGLS */ +	if (data & RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK) +		*flags |= AMD_CG_SUPPORT_GFX_CGLS; + +	/* AMD_CG_SUPPORT_GFX_RLC_LS */ +	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regRLC_MEM_SLP_CNTL)); +	if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) +		*flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS; + +	/* AMD_CG_SUPPORT_GFX_CP_LS */ +	data = RREG32_KIQ(SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regCP_MEM_SLP_CNTL)); +	if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) +		*flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS; +} + +static void gfx_v9_4_3_ring_emit_hdp_flush(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; +	u32 ref_and_mask, reg_mem_engine; +	const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio.hdp_flush_reg; + +	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { +		switch (ring->me) { +		case 1: +			ref_and_mask = nbio_hf_reg->ref_and_mask_cp2 << ring->pipe; +			break; +		case 2: +			ref_and_mask = nbio_hf_reg->ref_and_mask_cp6 << ring->pipe; +			break; +		default: +			return; +		} +		reg_mem_engine = 0; +	} else { +		ref_and_mask = nbio_hf_reg->ref_and_mask_cp0; +		reg_mem_engine = 1; /* pfp */ +	} + +	gfx_v9_4_3_wait_reg_mem(ring, reg_mem_engine, 0, 1, +			      adev->nbio.funcs->get_hdp_flush_req_offset(adev), +			      adev->nbio.funcs->get_hdp_flush_done_offset(adev), +			      ref_and_mask, ref_and_mask, 0x20); +} + +static void gfx_v9_4_3_ring_emit_ib_compute(struct amdgpu_ring *ring, +					  struct amdgpu_job *job, +					  struct amdgpu_ib *ib, +					  uint32_t flags) +{ +	unsigned vmid = AMDGPU_JOB_GET_VMID(job); +	u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); + +	/* Currently, there is a high possibility to get wave ID mismatch +	 * between ME and GDS, leading to a hw deadlock, because ME generates +	 * different wave IDs than the GDS expects. This situation happens +	 * randomly when at least 5 compute pipes use GDS ordered append. +	 * The wave IDs generated by ME are also wrong after suspend/resume. +	 * Those are probably bugs somewhere else in the kernel driver. +	 * +	 * Writing GDS_COMPUTE_MAX_WAVE_ID resets wave ID counters in ME and +	 * GDS to 0 for this ring (me/pipe). +	 */ +	if (ib->flags & AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID) { +		amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); +		amdgpu_ring_write(ring, regGDS_COMPUTE_MAX_WAVE_ID); +		amdgpu_ring_write(ring, ring->adev->gds.gds_compute_max_wave_id); +	} + +	amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); +	BUG_ON(ib->gpu_addr & 0x3); /* Dword align */ +	amdgpu_ring_write(ring, +#ifdef __BIG_ENDIAN +				(2 << 0) | +#endif +				lower_32_bits(ib->gpu_addr)); +	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); +	amdgpu_ring_write(ring, control); +} + +static void gfx_v9_4_3_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, +				     u64 seq, unsigned flags) +{ +	bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT; +	bool int_sel = flags & AMDGPU_FENCE_FLAG_INT; +	bool writeback = flags & AMDGPU_FENCE_FLAG_TC_WB_ONLY; + +	/* RELEASE_MEM - flush caches, send int */ +	amdgpu_ring_write(ring, PACKET3(PACKET3_RELEASE_MEM, 6)); +	amdgpu_ring_write(ring, ((writeback ? (EOP_TC_WB_ACTION_EN | +					       EOP_TC_NC_ACTION_EN) : +					      (EOP_TCL1_ACTION_EN | +					       EOP_TC_ACTION_EN | +					       EOP_TC_WB_ACTION_EN | +					       EOP_TC_MD_ACTION_EN)) | +				 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | +				 EVENT_INDEX(5))); +	amdgpu_ring_write(ring, DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); + +	/* +	 * the address should be Qword aligned if 64bit write, Dword +	 * aligned if only send 32bit data low (discard data high) +	 */ +	if (write64bit) +		BUG_ON(addr & 0x7); +	else +		BUG_ON(addr & 0x3); +	amdgpu_ring_write(ring, lower_32_bits(addr)); +	amdgpu_ring_write(ring, upper_32_bits(addr)); +	amdgpu_ring_write(ring, lower_32_bits(seq)); +	amdgpu_ring_write(ring, upper_32_bits(seq)); +	amdgpu_ring_write(ring, 0); +} + +static void gfx_v9_4_3_ring_emit_pipeline_sync(struct amdgpu_ring *ring) +{ +	int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); +	uint32_t seq = ring->fence_drv.sync_seq; +	uint64_t addr = ring->fence_drv.gpu_addr; + +	gfx_v9_4_3_wait_reg_mem(ring, usepfp, 1, 0, +			      lower_32_bits(addr), upper_32_bits(addr), +			      seq, 0xffffffff, 4); +} + +static void gfx_v9_4_3_ring_emit_vm_flush(struct amdgpu_ring *ring, +					unsigned vmid, uint64_t pd_addr) +{ +	amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); +} + +static u64 gfx_v9_4_3_ring_get_rptr_compute(struct amdgpu_ring *ring) +{ +	return ring->adev->wb.wb[ring->rptr_offs]; /* gfx9 hardware is 32bit rptr */ +} + +static u64 gfx_v9_4_3_ring_get_wptr_compute(struct amdgpu_ring *ring) +{ +	u64 wptr; + +	/* XXX check if swapping is necessary on BE */ +	if (ring->use_doorbell) +		wptr = atomic64_read((atomic64_t *)&ring->adev->wb.wb[ring->wptr_offs]); +	else +		BUG(); +	return wptr; +} + +static void gfx_v9_4_3_ring_set_wptr_compute(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	/* XXX check if swapping is necessary on BE */ +	if (ring->use_doorbell) { +		atomic64_set((atomic64_t *)&adev->wb.wb[ring->wptr_offs], ring->wptr); +		WDOORBELL64(ring->doorbell_index, ring->wptr); +	} else { +		BUG(); /* only DOORBELL method supported on gfx9 now */ +	} +} + +static void gfx_v9_4_3_ring_emit_fence_kiq(struct amdgpu_ring *ring, u64 addr, +					 u64 seq, unsigned int flags) +{ +	struct amdgpu_device *adev = ring->adev; + +	/* we only allocate 32bit for each seq wb address */ +	BUG_ON(flags & AMDGPU_FENCE_FLAG_64BIT); + +	/* write fence seq to the "addr" */ +	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +	amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | +				 WRITE_DATA_DST_SEL(5) | WR_CONFIRM)); +	amdgpu_ring_write(ring, lower_32_bits(addr)); +	amdgpu_ring_write(ring, upper_32_bits(addr)); +	amdgpu_ring_write(ring, lower_32_bits(seq)); + +	if (flags & AMDGPU_FENCE_FLAG_INT) { +		/* set register to trigger INT */ +		amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +		amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | +					 WRITE_DATA_DST_SEL(0) | WR_CONFIRM)); +		amdgpu_ring_write(ring, SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regCPC_INT_STATUS)); +		amdgpu_ring_write(ring, 0); +		amdgpu_ring_write(ring, 0x20000000); /* src_id is 178 */ +	} +} + +static void gfx_v9_4_3_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, +				    uint32_t reg_val_offs) +{ +	struct amdgpu_device *adev = ring->adev; + +	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4)); +	amdgpu_ring_write(ring, 0 |	/* src: register*/ +				(5 << 8) |	/* dst: memory */ +				(1 << 20));	/* write confirm */ +	amdgpu_ring_write(ring, reg); +	amdgpu_ring_write(ring, 0); +	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + +				reg_val_offs * 4)); +	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + +				reg_val_offs * 4)); +} + +static void gfx_v9_4_3_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, +				    uint32_t val) +{ +	uint32_t cmd = 0; + +	switch (ring->funcs->type) { +	case AMDGPU_RING_TYPE_GFX: +		cmd = WRITE_DATA_ENGINE_SEL(1) | WR_CONFIRM; +		break; +	case AMDGPU_RING_TYPE_KIQ: +		cmd = (1 << 16); /* no inc addr */ +		break; +	default: +		cmd = WR_CONFIRM; +		break; +	} +	amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); +	amdgpu_ring_write(ring, cmd); +	amdgpu_ring_write(ring, reg); +	amdgpu_ring_write(ring, 0); +	amdgpu_ring_write(ring, val); +} + +static void gfx_v9_4_3_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, +					uint32_t val, uint32_t mask) +{ +	gfx_v9_4_3_wait_reg_mem(ring, 0, 0, 0, reg, 0, val, mask, 0x20); +} + +static void gfx_v9_4_3_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring, +						  uint32_t reg0, uint32_t reg1, +						  uint32_t ref, uint32_t mask) +{ +	amdgpu_ring_emit_reg_write_reg_wait_helper(ring, reg0, reg1, +						   ref, mask); +} + +static void gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +	struct amdgpu_device *adev, int me, int pipe, +	enum amdgpu_interrupt_state state, int xcc_id) +{ +	u32 mec_int_cntl, mec_int_cntl_reg; + +	/* +	 * amdgpu controls only the first MEC. That's why this function only +	 * handles the setting of interrupts for this specific MEC. All other +	 * pipes' interrupts are set by amdkfd. +	 */ + +	if (me == 1) { +		switch (pipe) { +		case 0: +			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE0_INT_CNTL); +			break; +		case 1: +			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE1_INT_CNTL); +			break; +		case 2: +			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE2_INT_CNTL); +			break; +		case 3: +			mec_int_cntl_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, xcc_id), regCP_ME1_PIPE3_INT_CNTL); +			break; +		default: +			DRM_DEBUG("invalid pipe %d\n", pipe); +			return; +		} +	} else { +		DRM_DEBUG("invalid me %d\n", me); +		return; +	} + +	switch (state) { +	case AMDGPU_IRQ_STATE_DISABLE: +		mec_int_cntl = RREG32(mec_int_cntl_reg); +		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL, +					     TIME_STAMP_INT_ENABLE, 0); +		WREG32(mec_int_cntl_reg, mec_int_cntl); +		break; +	case AMDGPU_IRQ_STATE_ENABLE: +		mec_int_cntl = RREG32(mec_int_cntl_reg); +		mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL, +					     TIME_STAMP_INT_ENABLE, 1); +		WREG32(mec_int_cntl_reg, mec_int_cntl); +		break; +	default: +		break; +	} +} + +static int gfx_v9_4_3_set_priv_reg_fault_state(struct amdgpu_device *adev, +					     struct amdgpu_irq_src *source, +					     unsigned type, +					     enum amdgpu_interrupt_state state) +{ +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	switch (state) { +	case AMDGPU_IRQ_STATE_DISABLE: +	case AMDGPU_IRQ_STATE_ENABLE: +		for (i = 0; i < num_xcc; i++) +			WREG32_FIELD15_PREREG(GC, GET_INST(GC, i), CP_INT_CNTL_RING0, +				PRIV_REG_INT_ENABLE, +				state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); +		break; +	default: +		break; +	} + +	return 0; +} + +static int gfx_v9_4_3_set_priv_inst_fault_state(struct amdgpu_device *adev, +					      struct amdgpu_irq_src *source, +					      unsigned type, +					      enum amdgpu_interrupt_state state) +{ +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	switch (state) { +	case AMDGPU_IRQ_STATE_DISABLE: +	case AMDGPU_IRQ_STATE_ENABLE: +		for (i = 0; i < num_xcc; i++) +			WREG32_FIELD15_PREREG(GC, GET_INST(GC, i), CP_INT_CNTL_RING0, +				PRIV_INSTR_INT_ENABLE, +				state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); +		break; +	default: +		break; +	} + +	return 0; +} + +static int gfx_v9_4_3_set_eop_interrupt_state(struct amdgpu_device *adev, +					    struct amdgpu_irq_src *src, +					    unsigned type, +					    enum amdgpu_interrupt_state state) +{ +	int i, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		switch (type) { +		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 1, 0, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 1, 1, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE2_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 1, 2, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE3_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 1, 3, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE0_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 2, 0, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE1_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 2, 1, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE2_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 2, 2, state, i); +			break; +		case AMDGPU_CP_IRQ_COMPUTE_MEC2_PIPE3_EOP: +			gfx_v9_4_3_xcc_set_compute_eop_interrupt_state( +				adev, 2, 3, state, i); +			break; +		default: +			break; +		} +	} + +	return 0; +} + +static int gfx_v9_4_3_eop_irq(struct amdgpu_device *adev, +			    struct amdgpu_irq_src *source, +			    struct amdgpu_iv_entry *entry) +{ +	int i, xcc_id; +	u8 me_id, pipe_id, queue_id; +	struct amdgpu_ring *ring; + +	DRM_DEBUG("IH: CP EOP\n"); +	me_id = (entry->ring_id & 0x0c) >> 2; +	pipe_id = (entry->ring_id & 0x03) >> 0; +	queue_id = (entry->ring_id & 0x70) >> 4; + +	xcc_id = gfx_v9_4_3_ih_to_xcc_inst(adev, entry->node_id); + +	if (xcc_id == -EINVAL) +		return -EINVAL; + +	switch (me_id) { +	case 0: +	case 1: +	case 2: +		for (i = 0; i < adev->gfx.num_compute_rings; i++) { +			ring = &adev->gfx.compute_ring +					[i + +					 xcc_id * adev->gfx.num_compute_rings]; +			/* Per-queue interrupt is supported for MEC starting from VI. +			  * The interrupt can only be enabled/disabled per pipe instead of per queue. +			  */ + +			if ((ring->me == me_id) && (ring->pipe == pipe_id) && (ring->queue == queue_id)) +				amdgpu_fence_process(ring); +		} +		break; +	} +	return 0; +} + +static void gfx_v9_4_3_fault(struct amdgpu_device *adev, +			   struct amdgpu_iv_entry *entry) +{ +	u8 me_id, pipe_id, queue_id; +	struct amdgpu_ring *ring; +	int i, xcc_id; + +	me_id = (entry->ring_id & 0x0c) >> 2; +	pipe_id = (entry->ring_id & 0x03) >> 0; +	queue_id = (entry->ring_id & 0x70) >> 4; + +	xcc_id = gfx_v9_4_3_ih_to_xcc_inst(adev, entry->node_id); + +	if (xcc_id == -EINVAL) +		return; + +	switch (me_id) { +	case 0: +	case 1: +	case 2: +		for (i = 0; i < adev->gfx.num_compute_rings; i++) { +			ring = &adev->gfx.compute_ring +					[i + +					 xcc_id * adev->gfx.num_compute_rings]; +			if (ring->me == me_id && ring->pipe == pipe_id && +			    ring->queue == queue_id) +				drm_sched_fault(&ring->sched); +		} +		break; +	} +} + +static int gfx_v9_4_3_priv_reg_irq(struct amdgpu_device *adev, +				 struct amdgpu_irq_src *source, +				 struct amdgpu_iv_entry *entry) +{ +	DRM_ERROR("Illegal register access in command stream\n"); +	gfx_v9_4_3_fault(adev, entry); +	return 0; +} + +static int gfx_v9_4_3_priv_inst_irq(struct amdgpu_device *adev, +				  struct amdgpu_irq_src *source, +				  struct amdgpu_iv_entry *entry) +{ +	DRM_ERROR("Illegal instruction in command stream\n"); +	gfx_v9_4_3_fault(adev, entry); +	return 0; +} + +static void gfx_v9_4_3_emit_mem_sync(struct amdgpu_ring *ring) +{ +	const unsigned int cp_coher_cntl = +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(1) | +			PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(1); + +	/* ACQUIRE_MEM -make one or more surfaces valid for use by the subsequent operations */ +	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5)); +	amdgpu_ring_write(ring, cp_coher_cntl); /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0xffffff);  /* CP_COHER_SIZE_HI */ +	amdgpu_ring_write(ring, 0); /* CP_COHER_BASE */ +	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE_HI */ +	amdgpu_ring_write(ring, 0x0000000A); /* POLL_INTERVAL */ +} + +static void gfx_v9_4_3_emit_wave_limit_cs(struct amdgpu_ring *ring, +					uint32_t pipe, bool enable) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t val; +	uint32_t wcl_cs_reg; + +	/* regSPI_WCL_PIPE_PERCENT_CS[0-7]_DEFAULT values are same */ +	val = enable ? 0x1 : 0x7f; + +	switch (pipe) { +	case 0: +		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS0); +		break; +	case 1: +		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS1); +		break; +	case 2: +		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS2); +		break; +	case 3: +		wcl_cs_reg = SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_CS3); +		break; +	default: +		DRM_DEBUG("invalid pipe %d\n", pipe); +		return; +	} + +	amdgpu_ring_emit_wreg(ring, wcl_cs_reg, val); + +} +static void gfx_v9_4_3_emit_wave_limit(struct amdgpu_ring *ring, bool enable) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t val; +	int i; + +	/* regSPI_WCL_PIPE_PERCENT_GFX is 7 bit multiplier register to limit +	 * number of gfx waves. Setting 5 bit will make sure gfx only gets +	 * around 25% of gpu resources. +	 */ +	val = enable ? 0x1f : 0x07ffffff; +	amdgpu_ring_emit_wreg(ring, +			      SOC15_REG_OFFSET(GC, GET_INST(GC, 0), regSPI_WCL_PIPE_PERCENT_GFX), +			      val); + +	/* Restrict waves for normal/low priority compute queues as well +	 * to get best QoS for high priority compute jobs. +	 * +	 * amdgpu controls only 1st ME(0-3 CS pipes). +	 */ +	for (i = 0; i < adev->gfx.mec.num_pipe_per_mec; i++) { +		if (i != ring->pipe) +			gfx_v9_4_3_emit_wave_limit_cs(ring, i, enable); + +	} +} + +enum amdgpu_gfx_cp_ras_mem_id { +	AMDGPU_GFX_CP_MEM1 = 1, +	AMDGPU_GFX_CP_MEM2, +	AMDGPU_GFX_CP_MEM3, +	AMDGPU_GFX_CP_MEM4, +	AMDGPU_GFX_CP_MEM5, +}; + +enum amdgpu_gfx_gcea_ras_mem_id { +	AMDGPU_GFX_GCEA_IOWR_CMDMEM = 4, +	AMDGPU_GFX_GCEA_IORD_CMDMEM, +	AMDGPU_GFX_GCEA_GMIWR_CMDMEM, +	AMDGPU_GFX_GCEA_GMIRD_CMDMEM, +	AMDGPU_GFX_GCEA_DRAMWR_CMDMEM, +	AMDGPU_GFX_GCEA_DRAMRD_CMDMEM, +	AMDGPU_GFX_GCEA_MAM_DMEM0, +	AMDGPU_GFX_GCEA_MAM_DMEM1, +	AMDGPU_GFX_GCEA_MAM_DMEM2, +	AMDGPU_GFX_GCEA_MAM_DMEM3, +	AMDGPU_GFX_GCEA_MAM_AMEM0, +	AMDGPU_GFX_GCEA_MAM_AMEM1, +	AMDGPU_GFX_GCEA_MAM_AMEM2, +	AMDGPU_GFX_GCEA_MAM_AMEM3, +	AMDGPU_GFX_GCEA_MAM_AFLUSH_BUFFER, +	AMDGPU_GFX_GCEA_WRET_TAGMEM, +	AMDGPU_GFX_GCEA_RRET_TAGMEM, +	AMDGPU_GFX_GCEA_IOWR_DATAMEM, +	AMDGPU_GFX_GCEA_GMIWR_DATAMEM, +	AMDGPU_GFX_GCEA_DRAM_DATAMEM, +}; + +enum amdgpu_gfx_gc_cane_ras_mem_id { +	AMDGPU_GFX_GC_CANE_MEM0 = 0, +}; + +enum amdgpu_gfx_gcutcl2_ras_mem_id { +	AMDGPU_GFX_GCUTCL2_MEM2P512X95 = 160, +}; + +enum amdgpu_gfx_gds_ras_mem_id { +	AMDGPU_GFX_GDS_MEM0 = 0, +}; + +enum amdgpu_gfx_lds_ras_mem_id { +	AMDGPU_GFX_LDS_BANK0 = 0, +	AMDGPU_GFX_LDS_BANK1, +	AMDGPU_GFX_LDS_BANK2, +	AMDGPU_GFX_LDS_BANK3, +	AMDGPU_GFX_LDS_BANK4, +	AMDGPU_GFX_LDS_BANK5, +	AMDGPU_GFX_LDS_BANK6, +	AMDGPU_GFX_LDS_BANK7, +	AMDGPU_GFX_LDS_BANK8, +	AMDGPU_GFX_LDS_BANK9, +	AMDGPU_GFX_LDS_BANK10, +	AMDGPU_GFX_LDS_BANK11, +	AMDGPU_GFX_LDS_BANK12, +	AMDGPU_GFX_LDS_BANK13, +	AMDGPU_GFX_LDS_BANK14, +	AMDGPU_GFX_LDS_BANK15, +	AMDGPU_GFX_LDS_BANK16, +	AMDGPU_GFX_LDS_BANK17, +	AMDGPU_GFX_LDS_BANK18, +	AMDGPU_GFX_LDS_BANK19, +	AMDGPU_GFX_LDS_BANK20, +	AMDGPU_GFX_LDS_BANK21, +	AMDGPU_GFX_LDS_BANK22, +	AMDGPU_GFX_LDS_BANK23, +	AMDGPU_GFX_LDS_BANK24, +	AMDGPU_GFX_LDS_BANK25, +	AMDGPU_GFX_LDS_BANK26, +	AMDGPU_GFX_LDS_BANK27, +	AMDGPU_GFX_LDS_BANK28, +	AMDGPU_GFX_LDS_BANK29, +	AMDGPU_GFX_LDS_BANK30, +	AMDGPU_GFX_LDS_BANK31, +	AMDGPU_GFX_LDS_SP_BUFFER_A, +	AMDGPU_GFX_LDS_SP_BUFFER_B, +}; + +enum amdgpu_gfx_rlc_ras_mem_id { +	AMDGPU_GFX_RLC_GPMF32 = 1, +	AMDGPU_GFX_RLC_RLCVF32, +	AMDGPU_GFX_RLC_SCRATCH, +	AMDGPU_GFX_RLC_SRM_ARAM, +	AMDGPU_GFX_RLC_SRM_DRAM, +	AMDGPU_GFX_RLC_TCTAG, +	AMDGPU_GFX_RLC_SPM_SE, +	AMDGPU_GFX_RLC_SPM_GRBMT, +}; + +enum amdgpu_gfx_sp_ras_mem_id { +	AMDGPU_GFX_SP_SIMDID0 = 0, +}; + +enum amdgpu_gfx_spi_ras_mem_id { +	AMDGPU_GFX_SPI_MEM0 = 0, +	AMDGPU_GFX_SPI_MEM1, +	AMDGPU_GFX_SPI_MEM2, +	AMDGPU_GFX_SPI_MEM3, +}; + +enum amdgpu_gfx_sqc_ras_mem_id { +	AMDGPU_GFX_SQC_INST_CACHE_A = 100, +	AMDGPU_GFX_SQC_INST_CACHE_B = 101, +	AMDGPU_GFX_SQC_INST_CACHE_TAG_A = 102, +	AMDGPU_GFX_SQC_INST_CACHE_TAG_B = 103, +	AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_A = 104, +	AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_B = 105, +	AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_A = 106, +	AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_B = 107, +	AMDGPU_GFX_SQC_DATA_CACHE_A = 200, +	AMDGPU_GFX_SQC_DATA_CACHE_B = 201, +	AMDGPU_GFX_SQC_DATA_CACHE_TAG_A = 202, +	AMDGPU_GFX_SQC_DATA_CACHE_TAG_B = 203, +	AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_A = 204, +	AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_B = 205, +	AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_A = 206, +	AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_B = 207, +	AMDGPU_GFX_SQC_DIRTY_BIT_A = 208, +	AMDGPU_GFX_SQC_DIRTY_BIT_B = 209, +	AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU0 = 210, +	AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU1 = 211, +	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A = 212, +	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B = 213, +	AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_INST_CACHE = 108, +}; + +enum amdgpu_gfx_sq_ras_mem_id { +	AMDGPU_GFX_SQ_SGPR_MEM0 = 0, +	AMDGPU_GFX_SQ_SGPR_MEM1, +	AMDGPU_GFX_SQ_SGPR_MEM2, +	AMDGPU_GFX_SQ_SGPR_MEM3, +}; + +enum amdgpu_gfx_ta_ras_mem_id { +	AMDGPU_GFX_TA_FS_AFIFO_RAM_LO = 1, +	AMDGPU_GFX_TA_FS_AFIFO_RAM_HI, +	AMDGPU_GFX_TA_FS_CFIFO_RAM, +	AMDGPU_GFX_TA_FSX_LFIFO, +	AMDGPU_GFX_TA_FS_DFIFO_RAM, +}; + +enum amdgpu_gfx_tcc_ras_mem_id { +	AMDGPU_GFX_TCC_MEM1 = 1, +}; + +enum amdgpu_gfx_tca_ras_mem_id { +	AMDGPU_GFX_TCA_MEM1 = 1, +}; + +enum amdgpu_gfx_tci_ras_mem_id { +	AMDGPU_GFX_TCIW_MEM = 1, +}; + +enum amdgpu_gfx_tcp_ras_mem_id { +	AMDGPU_GFX_TCP_LFIFO0 = 1, +	AMDGPU_GFX_TCP_SET0BANK0_RAM, +	AMDGPU_GFX_TCP_SET0BANK1_RAM, +	AMDGPU_GFX_TCP_SET0BANK2_RAM, +	AMDGPU_GFX_TCP_SET0BANK3_RAM, +	AMDGPU_GFX_TCP_SET1BANK0_RAM, +	AMDGPU_GFX_TCP_SET1BANK1_RAM, +	AMDGPU_GFX_TCP_SET1BANK2_RAM, +	AMDGPU_GFX_TCP_SET1BANK3_RAM, +	AMDGPU_GFX_TCP_SET2BANK0_RAM, +	AMDGPU_GFX_TCP_SET2BANK1_RAM, +	AMDGPU_GFX_TCP_SET2BANK2_RAM, +	AMDGPU_GFX_TCP_SET2BANK3_RAM, +	AMDGPU_GFX_TCP_SET3BANK0_RAM, +	AMDGPU_GFX_TCP_SET3BANK1_RAM, +	AMDGPU_GFX_TCP_SET3BANK2_RAM, +	AMDGPU_GFX_TCP_SET3BANK3_RAM, +	AMDGPU_GFX_TCP_VM_FIFO, +	AMDGPU_GFX_TCP_DB_TAGRAM0, +	AMDGPU_GFX_TCP_DB_TAGRAM1, +	AMDGPU_GFX_TCP_DB_TAGRAM2, +	AMDGPU_GFX_TCP_DB_TAGRAM3, +	AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE0, +	AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE1, +	AMDGPU_GFX_TCP_CMD_FIFO, +}; + +enum amdgpu_gfx_td_ras_mem_id { +	AMDGPU_GFX_TD_UTD_CS_FIFO_MEM = 1, +	AMDGPU_GFX_TD_UTD_SS_FIFO_LO_MEM, +	AMDGPU_GFX_TD_UTD_SS_FIFO_HI_MEM, +}; + +enum amdgpu_gfx_tcx_ras_mem_id { +	AMDGPU_GFX_TCX_FIFOD0 = 0, +	AMDGPU_GFX_TCX_FIFOD1, +	AMDGPU_GFX_TCX_FIFOD2, +	AMDGPU_GFX_TCX_FIFOD3, +	AMDGPU_GFX_TCX_FIFOD4, +	AMDGPU_GFX_TCX_FIFOD5, +	AMDGPU_GFX_TCX_FIFOD6, +	AMDGPU_GFX_TCX_FIFOD7, +	AMDGPU_GFX_TCX_FIFOB0, +	AMDGPU_GFX_TCX_FIFOB1, +	AMDGPU_GFX_TCX_FIFOB2, +	AMDGPU_GFX_TCX_FIFOB3, +	AMDGPU_GFX_TCX_FIFOB4, +	AMDGPU_GFX_TCX_FIFOB5, +	AMDGPU_GFX_TCX_FIFOB6, +	AMDGPU_GFX_TCX_FIFOB7, +	AMDGPU_GFX_TCX_FIFOA0, +	AMDGPU_GFX_TCX_FIFOA1, +	AMDGPU_GFX_TCX_FIFOA2, +	AMDGPU_GFX_TCX_FIFOA3, +	AMDGPU_GFX_TCX_FIFOA4, +	AMDGPU_GFX_TCX_FIFOA5, +	AMDGPU_GFX_TCX_FIFOA6, +	AMDGPU_GFX_TCX_FIFOA7, +	AMDGPU_GFX_TCX_CFIFO0, +	AMDGPU_GFX_TCX_CFIFO1, +	AMDGPU_GFX_TCX_CFIFO2, +	AMDGPU_GFX_TCX_CFIFO3, +	AMDGPU_GFX_TCX_CFIFO4, +	AMDGPU_GFX_TCX_CFIFO5, +	AMDGPU_GFX_TCX_CFIFO6, +	AMDGPU_GFX_TCX_CFIFO7, +	AMDGPU_GFX_TCX_FIFO_ACKB0, +	AMDGPU_GFX_TCX_FIFO_ACKB1, +	AMDGPU_GFX_TCX_FIFO_ACKB2, +	AMDGPU_GFX_TCX_FIFO_ACKB3, +	AMDGPU_GFX_TCX_FIFO_ACKB4, +	AMDGPU_GFX_TCX_FIFO_ACKB5, +	AMDGPU_GFX_TCX_FIFO_ACKB6, +	AMDGPU_GFX_TCX_FIFO_ACKB7, +	AMDGPU_GFX_TCX_FIFO_ACKD0, +	AMDGPU_GFX_TCX_FIFO_ACKD1, +	AMDGPU_GFX_TCX_FIFO_ACKD2, +	AMDGPU_GFX_TCX_FIFO_ACKD3, +	AMDGPU_GFX_TCX_FIFO_ACKD4, +	AMDGPU_GFX_TCX_FIFO_ACKD5, +	AMDGPU_GFX_TCX_FIFO_ACKD6, +	AMDGPU_GFX_TCX_FIFO_ACKD7, +	AMDGPU_GFX_TCX_DST_FIFOA0, +	AMDGPU_GFX_TCX_DST_FIFOA1, +	AMDGPU_GFX_TCX_DST_FIFOA2, +	AMDGPU_GFX_TCX_DST_FIFOA3, +	AMDGPU_GFX_TCX_DST_FIFOA4, +	AMDGPU_GFX_TCX_DST_FIFOA5, +	AMDGPU_GFX_TCX_DST_FIFOA6, +	AMDGPU_GFX_TCX_DST_FIFOA7, +	AMDGPU_GFX_TCX_DST_FIFOB0, +	AMDGPU_GFX_TCX_DST_FIFOB1, +	AMDGPU_GFX_TCX_DST_FIFOB2, +	AMDGPU_GFX_TCX_DST_FIFOB3, +	AMDGPU_GFX_TCX_DST_FIFOB4, +	AMDGPU_GFX_TCX_DST_FIFOB5, +	AMDGPU_GFX_TCX_DST_FIFOB6, +	AMDGPU_GFX_TCX_DST_FIFOB7, +	AMDGPU_GFX_TCX_DST_FIFOD0, +	AMDGPU_GFX_TCX_DST_FIFOD1, +	AMDGPU_GFX_TCX_DST_FIFOD2, +	AMDGPU_GFX_TCX_DST_FIFOD3, +	AMDGPU_GFX_TCX_DST_FIFOD4, +	AMDGPU_GFX_TCX_DST_FIFOD5, +	AMDGPU_GFX_TCX_DST_FIFOD6, +	AMDGPU_GFX_TCX_DST_FIFOD7, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB0, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB1, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB2, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB3, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB4, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB5, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB6, +	AMDGPU_GFX_TCX_DST_FIFO_ACKB7, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD0, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD1, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD2, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD3, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD4, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD5, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD6, +	AMDGPU_GFX_TCX_DST_FIFO_ACKD7, +}; + +enum amdgpu_gfx_atc_l2_ras_mem_id { +	AMDGPU_GFX_ATC_L2_MEM0 = 0, +}; + +enum amdgpu_gfx_utcl2_ras_mem_id { +	AMDGPU_GFX_UTCL2_MEM0 = 0, +}; + +enum amdgpu_gfx_vml2_ras_mem_id { +	AMDGPU_GFX_VML2_MEM0 = 0, +}; + +enum amdgpu_gfx_vml2_walker_ras_mem_id { +	AMDGPU_GFX_VML2_WALKER_MEM0 = 0, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_cp_mem_list[] = { +	{AMDGPU_GFX_CP_MEM1, "CP_MEM1"}, +	{AMDGPU_GFX_CP_MEM2, "CP_MEM2"}, +	{AMDGPU_GFX_CP_MEM3, "CP_MEM3"}, +	{AMDGPU_GFX_CP_MEM4, "CP_MEM4"}, +	{AMDGPU_GFX_CP_MEM5, "CP_MEM5"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gcea_mem_list[] = { +	{AMDGPU_GFX_GCEA_IOWR_CMDMEM, "GCEA_IOWR_CMDMEM"}, +	{AMDGPU_GFX_GCEA_IORD_CMDMEM, "GCEA_IORD_CMDMEM"}, +	{AMDGPU_GFX_GCEA_GMIWR_CMDMEM, "GCEA_GMIWR_CMDMEM"}, +	{AMDGPU_GFX_GCEA_GMIRD_CMDMEM, "GCEA_GMIRD_CMDMEM"}, +	{AMDGPU_GFX_GCEA_DRAMWR_CMDMEM, "GCEA_DRAMWR_CMDMEM"}, +	{AMDGPU_GFX_GCEA_DRAMRD_CMDMEM, "GCEA_DRAMRD_CMDMEM"}, +	{AMDGPU_GFX_GCEA_MAM_DMEM0, "GCEA_MAM_DMEM0"}, +	{AMDGPU_GFX_GCEA_MAM_DMEM1, "GCEA_MAM_DMEM1"}, +	{AMDGPU_GFX_GCEA_MAM_DMEM2, "GCEA_MAM_DMEM2"}, +	{AMDGPU_GFX_GCEA_MAM_DMEM3, "GCEA_MAM_DMEM3"}, +	{AMDGPU_GFX_GCEA_MAM_AMEM0, "GCEA_MAM_AMEM0"}, +	{AMDGPU_GFX_GCEA_MAM_AMEM1, "GCEA_MAM_AMEM1"}, +	{AMDGPU_GFX_GCEA_MAM_AMEM2, "GCEA_MAM_AMEM2"}, +	{AMDGPU_GFX_GCEA_MAM_AMEM3, "GCEA_MAM_AMEM3"}, +	{AMDGPU_GFX_GCEA_MAM_AFLUSH_BUFFER, "GCEA_MAM_AFLUSH_BUFFER"}, +	{AMDGPU_GFX_GCEA_WRET_TAGMEM, "GCEA_WRET_TAGMEM"}, +	{AMDGPU_GFX_GCEA_RRET_TAGMEM, "GCEA_RRET_TAGMEM"}, +	{AMDGPU_GFX_GCEA_IOWR_DATAMEM, "GCEA_IOWR_DATAMEM"}, +	{AMDGPU_GFX_GCEA_GMIWR_DATAMEM, "GCEA_GMIWR_DATAMEM"}, +	{AMDGPU_GFX_GCEA_DRAM_DATAMEM, "GCEA_DRAM_DATAMEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gc_cane_mem_list[] = { +	{AMDGPU_GFX_GC_CANE_MEM0, "GC_CANE_MEM0"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gcutcl2_mem_list[] = { +	{AMDGPU_GFX_GCUTCL2_MEM2P512X95, "GCUTCL2_MEM2P512X95"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_gds_mem_list[] = { +	{AMDGPU_GFX_GDS_MEM0, "GDS_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_lds_mem_list[] = { +	{AMDGPU_GFX_LDS_BANK0, "LDS_BANK0"}, +	{AMDGPU_GFX_LDS_BANK1, "LDS_BANK1"}, +	{AMDGPU_GFX_LDS_BANK2, "LDS_BANK2"}, +	{AMDGPU_GFX_LDS_BANK3, "LDS_BANK3"}, +	{AMDGPU_GFX_LDS_BANK4, "LDS_BANK4"}, +	{AMDGPU_GFX_LDS_BANK5, "LDS_BANK5"}, +	{AMDGPU_GFX_LDS_BANK6, "LDS_BANK6"}, +	{AMDGPU_GFX_LDS_BANK7, "LDS_BANK7"}, +	{AMDGPU_GFX_LDS_BANK8, "LDS_BANK8"}, +	{AMDGPU_GFX_LDS_BANK9, "LDS_BANK9"}, +	{AMDGPU_GFX_LDS_BANK10, "LDS_BANK10"}, +	{AMDGPU_GFX_LDS_BANK11, "LDS_BANK11"}, +	{AMDGPU_GFX_LDS_BANK12, "LDS_BANK12"}, +	{AMDGPU_GFX_LDS_BANK13, "LDS_BANK13"}, +	{AMDGPU_GFX_LDS_BANK14, "LDS_BANK14"}, +	{AMDGPU_GFX_LDS_BANK15, "LDS_BANK15"}, +	{AMDGPU_GFX_LDS_BANK16, "LDS_BANK16"}, +	{AMDGPU_GFX_LDS_BANK17, "LDS_BANK17"}, +	{AMDGPU_GFX_LDS_BANK18, "LDS_BANK18"}, +	{AMDGPU_GFX_LDS_BANK19, "LDS_BANK19"}, +	{AMDGPU_GFX_LDS_BANK20, "LDS_BANK20"}, +	{AMDGPU_GFX_LDS_BANK21, "LDS_BANK21"}, +	{AMDGPU_GFX_LDS_BANK22, "LDS_BANK22"}, +	{AMDGPU_GFX_LDS_BANK23, "LDS_BANK23"}, +	{AMDGPU_GFX_LDS_BANK24, "LDS_BANK24"}, +	{AMDGPU_GFX_LDS_BANK25, "LDS_BANK25"}, +	{AMDGPU_GFX_LDS_BANK26, "LDS_BANK26"}, +	{AMDGPU_GFX_LDS_BANK27, "LDS_BANK27"}, +	{AMDGPU_GFX_LDS_BANK28, "LDS_BANK28"}, +	{AMDGPU_GFX_LDS_BANK29, "LDS_BANK29"}, +	{AMDGPU_GFX_LDS_BANK30, "LDS_BANK30"}, +	{AMDGPU_GFX_LDS_BANK31, "LDS_BANK31"}, +	{AMDGPU_GFX_LDS_SP_BUFFER_A, "LDS_SP_BUFFER_A"}, +	{AMDGPU_GFX_LDS_SP_BUFFER_B, "LDS_SP_BUFFER_B"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_rlc_mem_list[] = { +	{AMDGPU_GFX_RLC_GPMF32, "RLC_GPMF32"}, +	{AMDGPU_GFX_RLC_RLCVF32, "RLC_RLCVF32"}, +	{AMDGPU_GFX_RLC_SCRATCH, "RLC_SCRATCH"}, +	{AMDGPU_GFX_RLC_SRM_ARAM, "RLC_SRM_ARAM"}, +	{AMDGPU_GFX_RLC_SRM_DRAM, "RLC_SRM_DRAM"}, +	{AMDGPU_GFX_RLC_TCTAG, "RLC_TCTAG"}, +	{AMDGPU_GFX_RLC_SPM_SE, "RLC_SPM_SE"}, +	{AMDGPU_GFX_RLC_SPM_GRBMT, "RLC_SPM_GRBMT"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sp_mem_list[] = { +	{AMDGPU_GFX_SP_SIMDID0, "SP_SIMDID0"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_spi_mem_list[] = { +	{AMDGPU_GFX_SPI_MEM0, "SPI_MEM0"}, +	{AMDGPU_GFX_SPI_MEM1, "SPI_MEM1"}, +	{AMDGPU_GFX_SPI_MEM2, "SPI_MEM2"}, +	{AMDGPU_GFX_SPI_MEM3, "SPI_MEM3"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sqc_mem_list[] = { +	{AMDGPU_GFX_SQC_INST_CACHE_A, "SQC_INST_CACHE_A"}, +	{AMDGPU_GFX_SQC_INST_CACHE_B, "SQC_INST_CACHE_B"}, +	{AMDGPU_GFX_SQC_INST_CACHE_TAG_A, "SQC_INST_CACHE_TAG_A"}, +	{AMDGPU_GFX_SQC_INST_CACHE_TAG_B, "SQC_INST_CACHE_TAG_B"}, +	{AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_A, "SQC_INST_CACHE_MISS_FIFO_A"}, +	{AMDGPU_GFX_SQC_INST_CACHE_MISS_FIFO_B, "SQC_INST_CACHE_MISS_FIFO_B"}, +	{AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_A, "SQC_INST_CACHE_GATCL1_MISS_FIFO_A"}, +	{AMDGPU_GFX_SQC_INST_CACHE_GATCL1_MISS_FIFO_B, "SQC_INST_CACHE_GATCL1_MISS_FIFO_B"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_A, "SQC_DATA_CACHE_A"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_B, "SQC_DATA_CACHE_B"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_TAG_A, "SQC_DATA_CACHE_TAG_A"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_TAG_B, "SQC_DATA_CACHE_TAG_B"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_A, "SQC_DATA_CACHE_MISS_FIFO_A"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_MISS_FIFO_B, "SQC_DATA_CACHE_MISS_FIFO_B"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_A, "SQC_DATA_CACHE_HIT_FIFO_A"}, +	{AMDGPU_GFX_SQC_DATA_CACHE_HIT_FIFO_B, "SQC_DATA_CACHE_HIT_FIFO_B"}, +	{AMDGPU_GFX_SQC_DIRTY_BIT_A, "SQC_DIRTY_BIT_A"}, +	{AMDGPU_GFX_SQC_DIRTY_BIT_B, "SQC_DIRTY_BIT_B"}, +	{AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU0, "SQC_WRITE_DATA_BUFFER_CU0"}, +	{AMDGPU_GFX_SQC_WRITE_DATA_BUFFER_CU1, "SQC_WRITE_DATA_BUFFER_CU1"}, +	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A, "SQC_UTCL1_MISS_LFIFO_DATA_CACHE_A"}, +	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B, "SQC_UTCL1_MISS_LFIFO_DATA_CACHE_B"}, +	{AMDGPU_GFX_SQC_UTCL1_MISS_LFIFO_INST_CACHE, "SQC_UTCL1_MISS_LFIFO_INST_CACHE"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_sq_mem_list[] = { +	{AMDGPU_GFX_SQ_SGPR_MEM0, "SQ_SGPR_MEM0"}, +	{AMDGPU_GFX_SQ_SGPR_MEM1, "SQ_SGPR_MEM1"}, +	{AMDGPU_GFX_SQ_SGPR_MEM2, "SQ_SGPR_MEM2"}, +	{AMDGPU_GFX_SQ_SGPR_MEM3, "SQ_SGPR_MEM3"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_ta_mem_list[] = { +	{AMDGPU_GFX_TA_FS_AFIFO_RAM_LO, "TA_FS_AFIFO_RAM_LO"}, +	{AMDGPU_GFX_TA_FS_AFIFO_RAM_HI, "TA_FS_AFIFO_RAM_HI"}, +	{AMDGPU_GFX_TA_FS_CFIFO_RAM, "TA_FS_CFIFO_RAM"}, +	{AMDGPU_GFX_TA_FSX_LFIFO, "TA_FSX_LFIFO"}, +	{AMDGPU_GFX_TA_FS_DFIFO_RAM, "TA_FS_DFIFO_RAM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcc_mem_list[] = { +	{AMDGPU_GFX_TCC_MEM1, "TCC_MEM1"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tca_mem_list[] = { +	{AMDGPU_GFX_TCA_MEM1, "TCA_MEM1"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tci_mem_list[] = { +	{AMDGPU_GFX_TCIW_MEM, "TCIW_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcp_mem_list[] = { +	{AMDGPU_GFX_TCP_LFIFO0, "TCP_LFIFO0"}, +	{AMDGPU_GFX_TCP_SET0BANK0_RAM, "TCP_SET0BANK0_RAM"}, +	{AMDGPU_GFX_TCP_SET0BANK1_RAM, "TCP_SET0BANK1_RAM"}, +	{AMDGPU_GFX_TCP_SET0BANK2_RAM, "TCP_SET0BANK2_RAM"}, +	{AMDGPU_GFX_TCP_SET0BANK3_RAM, "TCP_SET0BANK3_RAM"}, +	{AMDGPU_GFX_TCP_SET1BANK0_RAM, "TCP_SET1BANK0_RAM"}, +	{AMDGPU_GFX_TCP_SET1BANK1_RAM, "TCP_SET1BANK1_RAM"}, +	{AMDGPU_GFX_TCP_SET1BANK2_RAM, "TCP_SET1BANK2_RAM"}, +	{AMDGPU_GFX_TCP_SET1BANK3_RAM, "TCP_SET1BANK3_RAM"}, +	{AMDGPU_GFX_TCP_SET2BANK0_RAM, "TCP_SET2BANK0_RAM"}, +	{AMDGPU_GFX_TCP_SET2BANK1_RAM, "TCP_SET2BANK1_RAM"}, +	{AMDGPU_GFX_TCP_SET2BANK2_RAM, "TCP_SET2BANK2_RAM"}, +	{AMDGPU_GFX_TCP_SET2BANK3_RAM, "TCP_SET2BANK3_RAM"}, +	{AMDGPU_GFX_TCP_SET3BANK0_RAM, "TCP_SET3BANK0_RAM"}, +	{AMDGPU_GFX_TCP_SET3BANK1_RAM, "TCP_SET3BANK1_RAM"}, +	{AMDGPU_GFX_TCP_SET3BANK2_RAM, "TCP_SET3BANK2_RAM"}, +	{AMDGPU_GFX_TCP_SET3BANK3_RAM, "TCP_SET3BANK3_RAM"}, +	{AMDGPU_GFX_TCP_VM_FIFO, "TCP_VM_FIFO"}, +	{AMDGPU_GFX_TCP_DB_TAGRAM0, "TCP_DB_TAGRAM0"}, +	{AMDGPU_GFX_TCP_DB_TAGRAM1, "TCP_DB_TAGRAM1"}, +	{AMDGPU_GFX_TCP_DB_TAGRAM2, "TCP_DB_TAGRAM2"}, +	{AMDGPU_GFX_TCP_DB_TAGRAM3, "TCP_DB_TAGRAM3"}, +	{AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE0, "TCP_UTCL1_LFIFO_PROBE0"}, +	{AMDGPU_GFX_TCP_UTCL1_LFIFO_PROBE1, "TCP_UTCL1_LFIFO_PROBE1"}, +	{AMDGPU_GFX_TCP_CMD_FIFO, "TCP_CMD_FIFO"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_td_mem_list[] = { +	{AMDGPU_GFX_TD_UTD_CS_FIFO_MEM, "TD_UTD_CS_FIFO_MEM"}, +	{AMDGPU_GFX_TD_UTD_SS_FIFO_LO_MEM, "TD_UTD_SS_FIFO_LO_MEM"}, +	{AMDGPU_GFX_TD_UTD_SS_FIFO_HI_MEM, "TD_UTD_SS_FIFO_HI_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_tcx_mem_list[] = { +	{AMDGPU_GFX_TCX_FIFOD0, "TCX_FIFOD0"}, +	{AMDGPU_GFX_TCX_FIFOD1, "TCX_FIFOD1"}, +	{AMDGPU_GFX_TCX_FIFOD2, "TCX_FIFOD2"}, +	{AMDGPU_GFX_TCX_FIFOD3, "TCX_FIFOD3"}, +	{AMDGPU_GFX_TCX_FIFOD4, "TCX_FIFOD4"}, +	{AMDGPU_GFX_TCX_FIFOD5, "TCX_FIFOD5"}, +	{AMDGPU_GFX_TCX_FIFOD6, "TCX_FIFOD6"}, +	{AMDGPU_GFX_TCX_FIFOD7, "TCX_FIFOD7"}, +	{AMDGPU_GFX_TCX_FIFOB0, "TCX_FIFOB0"}, +	{AMDGPU_GFX_TCX_FIFOB1, "TCX_FIFOB1"}, +	{AMDGPU_GFX_TCX_FIFOB2, "TCX_FIFOB2"}, +	{AMDGPU_GFX_TCX_FIFOB3, "TCX_FIFOB3"}, +	{AMDGPU_GFX_TCX_FIFOB4, "TCX_FIFOB4"}, +	{AMDGPU_GFX_TCX_FIFOB5, "TCX_FIFOB5"}, +	{AMDGPU_GFX_TCX_FIFOB6, "TCX_FIFOB6"}, +	{AMDGPU_GFX_TCX_FIFOB7, "TCX_FIFOB7"}, +	{AMDGPU_GFX_TCX_FIFOA0, "TCX_FIFOA0"}, +	{AMDGPU_GFX_TCX_FIFOA1, "TCX_FIFOA1"}, +	{AMDGPU_GFX_TCX_FIFOA2, "TCX_FIFOA2"}, +	{AMDGPU_GFX_TCX_FIFOA3, "TCX_FIFOA3"}, +	{AMDGPU_GFX_TCX_FIFOA4, "TCX_FIFOA4"}, +	{AMDGPU_GFX_TCX_FIFOA5, "TCX_FIFOA5"}, +	{AMDGPU_GFX_TCX_FIFOA6, "TCX_FIFOA6"}, +	{AMDGPU_GFX_TCX_FIFOA7, "TCX_FIFOA7"}, +	{AMDGPU_GFX_TCX_CFIFO0, "TCX_CFIFO0"}, +	{AMDGPU_GFX_TCX_CFIFO1, "TCX_CFIFO1"}, +	{AMDGPU_GFX_TCX_CFIFO2, "TCX_CFIFO2"}, +	{AMDGPU_GFX_TCX_CFIFO3, "TCX_CFIFO3"}, +	{AMDGPU_GFX_TCX_CFIFO4, "TCX_CFIFO4"}, +	{AMDGPU_GFX_TCX_CFIFO5, "TCX_CFIFO5"}, +	{AMDGPU_GFX_TCX_CFIFO6, "TCX_CFIFO6"}, +	{AMDGPU_GFX_TCX_CFIFO7, "TCX_CFIFO7"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB0, "TCX_FIFO_ACKB0"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB1, "TCX_FIFO_ACKB1"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB2, "TCX_FIFO_ACKB2"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB3, "TCX_FIFO_ACKB3"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB4, "TCX_FIFO_ACKB4"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB5, "TCX_FIFO_ACKB5"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB6, "TCX_FIFO_ACKB6"}, +	{AMDGPU_GFX_TCX_FIFO_ACKB7, "TCX_FIFO_ACKB7"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD0, "TCX_FIFO_ACKD0"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD1, "TCX_FIFO_ACKD1"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD2, "TCX_FIFO_ACKD2"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD3, "TCX_FIFO_ACKD3"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD4, "TCX_FIFO_ACKD4"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD5, "TCX_FIFO_ACKD5"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD6, "TCX_FIFO_ACKD6"}, +	{AMDGPU_GFX_TCX_FIFO_ACKD7, "TCX_FIFO_ACKD7"}, +	{AMDGPU_GFX_TCX_DST_FIFOA0, "TCX_DST_FIFOA0"}, +	{AMDGPU_GFX_TCX_DST_FIFOA1, "TCX_DST_FIFOA1"}, +	{AMDGPU_GFX_TCX_DST_FIFOA2, "TCX_DST_FIFOA2"}, +	{AMDGPU_GFX_TCX_DST_FIFOA3, "TCX_DST_FIFOA3"}, +	{AMDGPU_GFX_TCX_DST_FIFOA4, "TCX_DST_FIFOA4"}, +	{AMDGPU_GFX_TCX_DST_FIFOA5, "TCX_DST_FIFOA5"}, +	{AMDGPU_GFX_TCX_DST_FIFOA6, "TCX_DST_FIFOA6"}, +	{AMDGPU_GFX_TCX_DST_FIFOA7, "TCX_DST_FIFOA7"}, +	{AMDGPU_GFX_TCX_DST_FIFOB0, "TCX_DST_FIFOB0"}, +	{AMDGPU_GFX_TCX_DST_FIFOB1, "TCX_DST_FIFOB1"}, +	{AMDGPU_GFX_TCX_DST_FIFOB2, "TCX_DST_FIFOB2"}, +	{AMDGPU_GFX_TCX_DST_FIFOB3, "TCX_DST_FIFOB3"}, +	{AMDGPU_GFX_TCX_DST_FIFOB4, "TCX_DST_FIFOB4"}, +	{AMDGPU_GFX_TCX_DST_FIFOB5, "TCX_DST_FIFOB5"}, +	{AMDGPU_GFX_TCX_DST_FIFOB6, "TCX_DST_FIFOB6"}, +	{AMDGPU_GFX_TCX_DST_FIFOB7, "TCX_DST_FIFOB7"}, +	{AMDGPU_GFX_TCX_DST_FIFOD0, "TCX_DST_FIFOD0"}, +	{AMDGPU_GFX_TCX_DST_FIFOD1, "TCX_DST_FIFOD1"}, +	{AMDGPU_GFX_TCX_DST_FIFOD2, "TCX_DST_FIFOD2"}, +	{AMDGPU_GFX_TCX_DST_FIFOD3, "TCX_DST_FIFOD3"}, +	{AMDGPU_GFX_TCX_DST_FIFOD4, "TCX_DST_FIFOD4"}, +	{AMDGPU_GFX_TCX_DST_FIFOD5, "TCX_DST_FIFOD5"}, +	{AMDGPU_GFX_TCX_DST_FIFOD6, "TCX_DST_FIFOD6"}, +	{AMDGPU_GFX_TCX_DST_FIFOD7, "TCX_DST_FIFOD7"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB0, "TCX_DST_FIFO_ACKB0"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB1, "TCX_DST_FIFO_ACKB1"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB2, "TCX_DST_FIFO_ACKB2"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB3, "TCX_DST_FIFO_ACKB3"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB4, "TCX_DST_FIFO_ACKB4"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB5, "TCX_DST_FIFO_ACKB5"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB6, "TCX_DST_FIFO_ACKB6"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKB7, "TCX_DST_FIFO_ACKB7"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD0, "TCX_DST_FIFO_ACKD0"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD1, "TCX_DST_FIFO_ACKD1"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD2, "TCX_DST_FIFO_ACKD2"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD3, "TCX_DST_FIFO_ACKD3"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD4, "TCX_DST_FIFO_ACKD4"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD5, "TCX_DST_FIFO_ACKD5"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD6, "TCX_DST_FIFO_ACKD6"}, +	{AMDGPU_GFX_TCX_DST_FIFO_ACKD7, "TCX_DST_FIFO_ACKD7"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_atc_l2_mem_list[] = { +	{AMDGPU_GFX_ATC_L2_MEM, "ATC_L2_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_utcl2_mem_list[] = { +	{AMDGPU_GFX_UTCL2_MEM, "UTCL2_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_vml2_mem_list[] = { +	{AMDGPU_GFX_VML2_MEM, "VML2_MEM"}, +}; + +static const struct amdgpu_ras_memory_id_entry gfx_v9_4_3_ras_vml2_walker_mem_list[] = { +	{AMDGPU_GFX_VML2_WALKER_MEM, "VML2_WALKER_MEM"}, +}; + +static const struct amdgpu_gfx_ras_mem_id_entry gfx_v9_4_3_ras_mem_list_array[AMDGPU_GFX_MEM_TYPE_NUM] = { +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_cp_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gcea_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gc_cane_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gcutcl2_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_gds_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_lds_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_rlc_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sp_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_spi_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sqc_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_sq_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_ta_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcc_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tca_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tci_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcp_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_td_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_tcx_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_atc_l2_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_utcl2_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_vml2_mem_list) +	AMDGPU_GFX_MEMID_ENT(gfx_v9_4_3_ras_vml2_walker_mem_list) +}; + +static const struct amdgpu_gfx_ras_reg_entry gfx_v9_4_3_ce_reg_list[] = { +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regRLC_CE_ERR_STATUS_LOW, regRLC_CE_ERR_STATUS_HIGH), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "RLC"}, +	    AMDGPU_GFX_RLC_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPC_CE_ERR_STATUS_LO, regCPC_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPC"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPF_CE_ERR_STATUS_LO, regCPF_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPF"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPG_CE_ERR_STATUS_LO, regCPG_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPG"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGDS_CE_ERR_STATUS_LO, regGDS_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GDS"}, +	    AMDGPU_GFX_GDS_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGC_CANE_CE_ERR_STATUS_LO, regGC_CANE_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CANE"}, +	    AMDGPU_GFX_GC_CANE_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSPI_CE_ERR_STATUS_LO, regSPI_CE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SPI"}, +	    AMDGPU_GFX_SPI_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP0_CE_ERR_STATUS_LO, regSP0_CE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP0"}, +	    AMDGPU_GFX_SP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP1_CE_ERR_STATUS_LO, regSP1_CE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP1"}, +	    AMDGPU_GFX_SP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQ_CE_ERR_STATUS_LO, regSQ_CE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQ"}, +	    AMDGPU_GFX_SQ_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQC_CE_EDC_LO, regSQC_CE_EDC_HI), +	    5, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQC"}, +	    AMDGPU_GFX_SQC_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCX_CE_ERR_STATUS_LO, regTCX_CE_ERR_STATUS_HI), +	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCX"}, +	    AMDGPU_GFX_TCX_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCC_CE_ERR_STATUS_LO, regTCC_CE_ERR_STATUS_HI), +	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCC"}, +	    AMDGPU_GFX_TCC_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTA_CE_EDC_LO, regTA_CE_EDC_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TA"}, +	    AMDGPU_GFX_TA_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCI_CE_EDC_LO_REG, regTCI_CE_EDC_HI_REG), +	    31, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCI"}, +	    AMDGPU_GFX_TCI_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCP_CE_EDC_LO_REG, regTCP_CE_EDC_HI_REG), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCP"}, +	    AMDGPU_GFX_TCP_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTD_CE_EDC_LO, regTD_CE_EDC_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TD"}, +	    AMDGPU_GFX_TD_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGCEA_CE_ERR_STATUS_LO, regGCEA_CE_ERR_STATUS_HI), +	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GCEA"}, +	    AMDGPU_GFX_GCEA_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regLDS_CE_ERR_STATUS_LO, regLDS_CE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "LDS"}, +	    AMDGPU_GFX_LDS_MEM, 1}, +}; + +static const struct amdgpu_gfx_ras_reg_entry gfx_v9_4_3_ue_reg_list[] = { +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regRLC_UE_ERR_STATUS_LOW, regRLC_UE_ERR_STATUS_HIGH), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "RLC"}, +	    AMDGPU_GFX_RLC_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPC_UE_ERR_STATUS_LO, regCPC_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPC"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPF_UE_ERR_STATUS_LO, regCPF_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPF"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regCPG_UE_ERR_STATUS_LO, regCPG_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CPG"}, +	    AMDGPU_GFX_CP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGDS_UE_ERR_STATUS_LO, regGDS_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GDS"}, +	    AMDGPU_GFX_GDS_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGC_CANE_UE_ERR_STATUS_LO, regGC_CANE_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "CANE"}, +	    AMDGPU_GFX_GC_CANE_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSPI_UE_ERR_STATUS_LO, regSPI_UE_ERR_STATUS_HI), +	    1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SPI"}, +	    AMDGPU_GFX_SPI_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP0_UE_ERR_STATUS_LO, regSP0_UE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP0"}, +	    AMDGPU_GFX_SP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSP1_UE_ERR_STATUS_LO, regSP1_UE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SP1"}, +	    AMDGPU_GFX_SP_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQ_UE_ERR_STATUS_LO, regSQ_UE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQ"}, +	    AMDGPU_GFX_SQ_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regSQC_UE_EDC_LO, regSQC_UE_EDC_HI), +	    5, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SQC"}, +	    AMDGPU_GFX_SQC_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCX_UE_ERR_STATUS_LO, regTCX_UE_ERR_STATUS_HI), +	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCX"}, +	    AMDGPU_GFX_TCX_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCC_UE_ERR_STATUS_LO, regTCC_UE_ERR_STATUS_HI), +	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCC"}, +	    AMDGPU_GFX_TCC_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTA_UE_EDC_LO, regTA_UE_EDC_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TA"}, +	    AMDGPU_GFX_TA_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCI_UE_EDC_LO_REG, regTCI_UE_EDC_HI_REG), +	    31, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCI"}, +	    AMDGPU_GFX_TCI_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCP_UE_EDC_LO_REG, regTCP_UE_EDC_HI_REG), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCP"}, +	    AMDGPU_GFX_TCP_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTD_UE_EDC_LO, regTD_UE_EDC_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TD"}, +	    AMDGPU_GFX_TD_MEM, 8}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regTCA_UE_ERR_STATUS_LO, regTCA_UE_ERR_STATUS_HI), +	    2, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "TCA"}, +	    AMDGPU_GFX_TCA_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regGCEA_UE_ERR_STATUS_LO, regGCEA_UE_ERR_STATUS_HI), +	    16, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "GCEA"}, +	    AMDGPU_GFX_GCEA_MEM, 1}, +	{{AMDGPU_RAS_REG_ENTRY(GC, 0, regLDS_UE_ERR_STATUS_LO, regLDS_UE_ERR_STATUS_HI), +	    10, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "LDS"}, +	    AMDGPU_GFX_LDS_MEM, 1}, +}; + +static const struct soc15_reg_entry gfx_v9_4_3_ea_err_status_regs = { +	SOC15_REG_ENTRY(GC, 0, regGCEA_ERR_STATUS), 0, 1, 16 +}; + +static void gfx_v9_4_3_inst_query_ras_err_count(struct amdgpu_device *adev, +					void *ras_error_status, int xcc_id) +{ +	struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status; +	unsigned long ce_count = 0, ue_count = 0; +	uint32_t i, j, k; + +	mutex_lock(&adev->grbm_idx_mutex); + +	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_3_ce_reg_list); i++) { +		for (j = 0; j < gfx_v9_4_3_ce_reg_list[i].se_num; j++) { +			for (k = 0; k < gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst; k++) { +				/* no need to select if instance number is 1 */ +				if (gfx_v9_4_3_ce_reg_list[i].se_num > 1 || +				    gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst > 1) +					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id); + +				amdgpu_ras_inst_query_ras_error_count(adev, +					&(gfx_v9_4_3_ce_reg_list[i].reg_entry), +					1, +					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ce_reg_list[i].mem_id_type].mem_id_ent, +					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ce_reg_list[i].mem_id_type].size, +					GET_INST(GC, xcc_id), +					AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, +					&ce_count); + +				amdgpu_ras_inst_query_ras_error_count(adev, +					&(gfx_v9_4_3_ue_reg_list[i].reg_entry), +					1, +					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].mem_id_ent, +					gfx_v9_4_3_ras_mem_list_array[gfx_v9_4_3_ue_reg_list[i].mem_id_type].size, +					GET_INST(GC, xcc_id), +					AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, +					&ue_count); +			} +		} +	} + +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); + +	/* the caller should make sure initialize value of +	 * err_data->ue_count and err_data->ce_count +	 */ +	err_data->ce_count += ce_count; +	err_data->ue_count += ue_count; +} + +static void gfx_v9_4_3_inst_reset_ras_err_count(struct amdgpu_device *adev, +					void *ras_error_status, int xcc_id) +{ +	uint32_t i, j, k; + +	mutex_lock(&adev->grbm_idx_mutex); + +	for (i = 0; i < ARRAY_SIZE(gfx_v9_4_3_ce_reg_list); i++) { +		for (j = 0; j < gfx_v9_4_3_ce_reg_list[i].se_num; j++) { +			for (k = 0; k < gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst; k++) { +				/* no need to select if instance number is 1 */ +				if (gfx_v9_4_3_ce_reg_list[i].se_num > 1 || +				    gfx_v9_4_3_ce_reg_list[i].reg_entry.reg_inst > 1) +					gfx_v9_4_3_xcc_select_se_sh(adev, j, 0, k, xcc_id); + +				amdgpu_ras_inst_reset_ras_error_count(adev, +					&(gfx_v9_4_3_ce_reg_list[i].reg_entry), +					1, +					GET_INST(GC, xcc_id)); + +				amdgpu_ras_inst_reset_ras_error_count(adev, +					&(gfx_v9_4_3_ue_reg_list[i].reg_entry), +					1, +					GET_INST(GC, xcc_id)); +			} +		} +	} + +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); +} + +static void gfx_v9_4_3_inst_query_ea_err_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	uint32_t i, j; +	uint32_t reg_value; + +	mutex_lock(&adev->grbm_idx_mutex); + +	for (i = 0; i < gfx_v9_4_3_ea_err_status_regs.se_num; i++) { +		for (j = 0; j < gfx_v9_4_3_ea_err_status_regs.instance; j++) { +			gfx_v9_4_3_xcc_select_se_sh(adev, i, 0, j, xcc_id); +			reg_value = RREG32_SOC15(GC, GET_INST(GC, xcc_id), +					regGCEA_ERR_STATUS); +			if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) || +			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) || +			    REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) { +				dev_warn(adev->dev, +					"GCEA err detected at instance: %d, status: 0x%x!\n", +					j, reg_value); +			} +			/* clear after read */ +			reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS, +						  CLEAR_ERROR_STATUS, 0x1); +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regGCEA_ERR_STATUS, +					reg_value); +		} +	} + +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); +} + +static void gfx_v9_4_3_inst_query_utc_err_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	uint32_t data; + +	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regUTCL2_MEM_ECC_STATUS); +	if (data) { +		dev_warn(adev->dev, "GFX UTCL2 Mem Ecc Status: 0x%x!\n", data); +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regUTCL2_MEM_ECC_STATUS, 0x3); +	} + +	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regVML2_MEM_ECC_STATUS); +	if (data) { +		dev_warn(adev->dev, "GFX VML2 Mem Ecc Status: 0x%x!\n", data); +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regVML2_MEM_ECC_STATUS, 0x3); +	} + +	data = RREG32_SOC15(GC, GET_INST(GC, xcc_id), +				regVML2_WALKER_MEM_ECC_STATUS); +	if (data) { +		dev_warn(adev->dev, "GFX VML2 Walker Mem Ecc Status: 0x%x!\n", data); +		WREG32_SOC15(GC, GET_INST(GC, xcc_id), regVML2_WALKER_MEM_ECC_STATUS, +				0x3); +	} +} + +static void gfx_v9_4_3_log_cu_timeout_status(struct amdgpu_device *adev, +					uint32_t status, int xcc_id) +{ +	struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; +	uint32_t i, simd, wave; +	uint32_t wave_status; +	uint32_t wave_pc_lo, wave_pc_hi; +	uint32_t wave_exec_lo, wave_exec_hi; +	uint32_t wave_inst_dw0, wave_inst_dw1; +	uint32_t wave_ib_sts; + +	for (i = 0; i < 32; i++) { +		if (!((i << 1) & status)) +			continue; + +		simd = i / cu_info->max_waves_per_simd; +		wave = i % cu_info->max_waves_per_simd; + +		wave_status = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_STATUS); +		wave_pc_lo = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_LO); +		wave_pc_hi = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_PC_HI); +		wave_exec_lo = +			wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_LO); +		wave_exec_hi = +			wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_EXEC_HI); +		wave_inst_dw0 = +			wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW0); +		wave_inst_dw1 = +			wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_INST_DW1); +		wave_ib_sts = wave_read_ind(adev, xcc_id, simd, wave, ixSQ_WAVE_IB_STS); + +		dev_info( +			adev->dev, +			"\t SIMD %d, Wave %d: status 0x%x, pc 0x%llx, exec 0x%llx, inst 0x%llx, ib_sts 0x%x\n", +			simd, wave, wave_status, +			((uint64_t)wave_pc_hi << 32 | wave_pc_lo), +			((uint64_t)wave_exec_hi << 32 | wave_exec_lo), +			((uint64_t)wave_inst_dw1 << 32 | wave_inst_dw0), +			wave_ib_sts); +	} +} + +static void gfx_v9_4_3_inst_query_sq_timeout_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	uint32_t se_idx, sh_idx, cu_idx; +	uint32_t status; + +	mutex_lock(&adev->grbm_idx_mutex); +	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines; se_idx++) { +		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se; sh_idx++) { +			for (cu_idx = 0; cu_idx < adev->gfx.config.max_cu_per_sh; cu_idx++) { +				gfx_v9_4_3_xcc_select_se_sh(adev, se_idx, sh_idx, +							cu_idx, xcc_id); +				status = RREG32_SOC15(GC, GET_INST(GC, xcc_id), +						      regSQ_TIMEOUT_STATUS); +				if (status != 0) { +					dev_info( +						adev->dev, +						"GFX Watchdog Timeout: SE %d, SH %d, CU %d\n", +						se_idx, sh_idx, cu_idx); +					gfx_v9_4_3_log_cu_timeout_status( +						adev, status, xcc_id); +				} +				/* clear old status */ +				WREG32_SOC15(GC, GET_INST(GC, xcc_id), +						regSQ_TIMEOUT_STATUS, 0); +			} +		} +	} +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); +} + +static void gfx_v9_4_3_inst_query_ras_err_status(struct amdgpu_device *adev, +					void *ras_error_status, int xcc_id) +{ +	gfx_v9_4_3_inst_query_ea_err_status(adev, xcc_id); +	gfx_v9_4_3_inst_query_utc_err_status(adev, xcc_id); +	gfx_v9_4_3_inst_query_sq_timeout_status(adev, xcc_id); +} + +static void gfx_v9_4_3_inst_reset_utc_err_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regUTCL2_MEM_ECC_STATUS, 0x3); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regVML2_MEM_ECC_STATUS, 0x3); +	WREG32_SOC15(GC, GET_INST(GC, xcc_id), regVML2_WALKER_MEM_ECC_STATUS, 0x3); +} + +static void gfx_v9_4_3_inst_reset_ea_err_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	uint32_t i, j; +	uint32_t value; + +	mutex_lock(&adev->grbm_idx_mutex); +	for (i = 0; i < gfx_v9_4_3_ea_err_status_regs.se_num; i++) { +		for (j = 0; j < gfx_v9_4_3_ea_err_status_regs.instance; j++) { +			gfx_v9_4_3_xcc_select_se_sh(adev, i, 0, j, xcc_id); +			value = RREG32_SOC15(GC, GET_INST(GC, xcc_id), regGCEA_ERR_STATUS); +			value = REG_SET_FIELD(value, GCEA_ERR_STATUS, +						CLEAR_ERROR_STATUS, 0x1); +			WREG32_SOC15(GC, GET_INST(GC, xcc_id), regGCEA_ERR_STATUS, value); +		} +	} +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); +} + +static void gfx_v9_4_3_inst_reset_sq_timeout_status(struct amdgpu_device *adev, +					int xcc_id) +{ +	uint32_t se_idx, sh_idx, cu_idx; + +	mutex_lock(&adev->grbm_idx_mutex); +	for (se_idx = 0; se_idx < adev->gfx.config.max_shader_engines; se_idx++) { +		for (sh_idx = 0; sh_idx < adev->gfx.config.max_sh_per_se; sh_idx++) { +			for (cu_idx = 0; cu_idx < adev->gfx.config.max_cu_per_sh; cu_idx++) { +				gfx_v9_4_3_xcc_select_se_sh(adev, se_idx, sh_idx, +							cu_idx, xcc_id); +				WREG32_SOC15(GC, GET_INST(GC, xcc_id), +						regSQ_TIMEOUT_STATUS, 0); +			} +		} +	} +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +			xcc_id); +	mutex_unlock(&adev->grbm_idx_mutex); +} + +static void gfx_v9_4_3_inst_reset_ras_err_status(struct amdgpu_device *adev, +					void *ras_error_status, int xcc_id) +{ +	gfx_v9_4_3_inst_reset_utc_err_status(adev, xcc_id); +	gfx_v9_4_3_inst_reset_ea_err_status(adev, xcc_id); +	gfx_v9_4_3_inst_reset_sq_timeout_status(adev, xcc_id); +} + +static void gfx_v9_4_3_query_ras_error_count(struct amdgpu_device *adev, +					void *ras_error_status) +{ +	amdgpu_gfx_ras_error_func(adev, ras_error_status, +			gfx_v9_4_3_inst_query_ras_err_count); +} + +static void gfx_v9_4_3_reset_ras_error_count(struct amdgpu_device *adev) +{ +	amdgpu_gfx_ras_error_func(adev, NULL, gfx_v9_4_3_inst_reset_ras_err_count); +} + +static void gfx_v9_4_3_query_ras_error_status(struct amdgpu_device *adev) +{ +	amdgpu_gfx_ras_error_func(adev, NULL, gfx_v9_4_3_inst_query_ras_err_status); +} + +static void gfx_v9_4_3_reset_ras_error_status(struct amdgpu_device *adev) +{ +	amdgpu_gfx_ras_error_func(adev, NULL, gfx_v9_4_3_inst_reset_ras_err_status); +} + +static const struct amd_ip_funcs gfx_v9_4_3_ip_funcs = { +	.name = "gfx_v9_4_3", +	.early_init = gfx_v9_4_3_early_init, +	.late_init = gfx_v9_4_3_late_init, +	.sw_init = gfx_v9_4_3_sw_init, +	.sw_fini = gfx_v9_4_3_sw_fini, +	.hw_init = gfx_v9_4_3_hw_init, +	.hw_fini = gfx_v9_4_3_hw_fini, +	.suspend = gfx_v9_4_3_suspend, +	.resume = gfx_v9_4_3_resume, +	.is_idle = gfx_v9_4_3_is_idle, +	.wait_for_idle = gfx_v9_4_3_wait_for_idle, +	.soft_reset = gfx_v9_4_3_soft_reset, +	.set_clockgating_state = gfx_v9_4_3_set_clockgating_state, +	.set_powergating_state = gfx_v9_4_3_set_powergating_state, +	.get_clockgating_state = gfx_v9_4_3_get_clockgating_state, +}; + +static const struct amdgpu_ring_funcs gfx_v9_4_3_ring_funcs_compute = { +	.type = AMDGPU_RING_TYPE_COMPUTE, +	.align_mask = 0xff, +	.nop = PACKET3(PACKET3_NOP, 0x3FFF), +	.support_64bit_ptrs = true, +	.get_rptr = gfx_v9_4_3_ring_get_rptr_compute, +	.get_wptr = gfx_v9_4_3_ring_get_wptr_compute, +	.set_wptr = gfx_v9_4_3_ring_set_wptr_compute, +	.emit_frame_size = +		20 + /* gfx_v9_4_3_ring_emit_gds_switch */ +		7 + /* gfx_v9_4_3_ring_emit_hdp_flush */ +		5 + /* hdp invalidate */ +		7 + /* gfx_v9_4_3_ring_emit_pipeline_sync */ +		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 + +		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 + +		2 + /* gfx_v9_4_3_ring_emit_vm_flush */ +		8 + 8 + 8 + /* gfx_v9_4_3_ring_emit_fence x3 for user fence, vm fence */ +		7 + /* gfx_v9_4_3_emit_mem_sync */ +		5 + /* gfx_v9_4_3_emit_wave_limit for updating regSPI_WCL_PIPE_PERCENT_GFX register */ +		15, /* for updating 3 regSPI_WCL_PIPE_PERCENT_CS registers */ +	.emit_ib_size =	7, /* gfx_v9_4_3_ring_emit_ib_compute */ +	.emit_ib = gfx_v9_4_3_ring_emit_ib_compute, +	.emit_fence = gfx_v9_4_3_ring_emit_fence, +	.emit_pipeline_sync = gfx_v9_4_3_ring_emit_pipeline_sync, +	.emit_vm_flush = gfx_v9_4_3_ring_emit_vm_flush, +	.emit_gds_switch = gfx_v9_4_3_ring_emit_gds_switch, +	.emit_hdp_flush = gfx_v9_4_3_ring_emit_hdp_flush, +	.test_ring = gfx_v9_4_3_ring_test_ring, +	.test_ib = gfx_v9_4_3_ring_test_ib, +	.insert_nop = amdgpu_ring_insert_nop, +	.pad_ib = amdgpu_ring_generic_pad_ib, +	.emit_wreg = gfx_v9_4_3_ring_emit_wreg, +	.emit_reg_wait = gfx_v9_4_3_ring_emit_reg_wait, +	.emit_reg_write_reg_wait = gfx_v9_4_3_ring_emit_reg_write_reg_wait, +	.emit_mem_sync = gfx_v9_4_3_emit_mem_sync, +	.emit_wave_limit = gfx_v9_4_3_emit_wave_limit, +}; + +static const struct amdgpu_ring_funcs gfx_v9_4_3_ring_funcs_kiq = { +	.type = AMDGPU_RING_TYPE_KIQ, +	.align_mask = 0xff, +	.nop = PACKET3(PACKET3_NOP, 0x3FFF), +	.support_64bit_ptrs = true, +	.get_rptr = gfx_v9_4_3_ring_get_rptr_compute, +	.get_wptr = gfx_v9_4_3_ring_get_wptr_compute, +	.set_wptr = gfx_v9_4_3_ring_set_wptr_compute, +	.emit_frame_size = +		20 + /* gfx_v9_4_3_ring_emit_gds_switch */ +		7 + /* gfx_v9_4_3_ring_emit_hdp_flush */ +		5 + /* hdp invalidate */ +		7 + /* gfx_v9_4_3_ring_emit_pipeline_sync */ +		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 + +		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 + +		2 + /* gfx_v9_4_3_ring_emit_vm_flush */ +		8 + 8 + 8, /* gfx_v9_4_3_ring_emit_fence_kiq x3 for user fence, vm fence */ +	.emit_ib_size =	7, /* gfx_v9_4_3_ring_emit_ib_compute */ +	.emit_fence = gfx_v9_4_3_ring_emit_fence_kiq, +	.test_ring = gfx_v9_4_3_ring_test_ring, +	.insert_nop = amdgpu_ring_insert_nop, +	.pad_ib = amdgpu_ring_generic_pad_ib, +	.emit_rreg = gfx_v9_4_3_ring_emit_rreg, +	.emit_wreg = gfx_v9_4_3_ring_emit_wreg, +	.emit_reg_wait = gfx_v9_4_3_ring_emit_reg_wait, +	.emit_reg_write_reg_wait = gfx_v9_4_3_ring_emit_reg_write_reg_wait, +}; + +static void gfx_v9_4_3_set_ring_funcs(struct amdgpu_device *adev) +{ +	int i, j, num_xcc; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	for (i = 0; i < num_xcc; i++) { +		adev->gfx.kiq[i].ring.funcs = &gfx_v9_4_3_ring_funcs_kiq; + +		for (j = 0; j < adev->gfx.num_compute_rings; j++) +			adev->gfx.compute_ring[j + i * adev->gfx.num_compute_rings].funcs +					= &gfx_v9_4_3_ring_funcs_compute; +	} +} + +static const struct amdgpu_irq_src_funcs gfx_v9_4_3_eop_irq_funcs = { +	.set = gfx_v9_4_3_set_eop_interrupt_state, +	.process = gfx_v9_4_3_eop_irq, +}; + +static const struct amdgpu_irq_src_funcs gfx_v9_4_3_priv_reg_irq_funcs = { +	.set = gfx_v9_4_3_set_priv_reg_fault_state, +	.process = gfx_v9_4_3_priv_reg_irq, +}; + +static const struct amdgpu_irq_src_funcs gfx_v9_4_3_priv_inst_irq_funcs = { +	.set = gfx_v9_4_3_set_priv_inst_fault_state, +	.process = gfx_v9_4_3_priv_inst_irq, +}; + +static void gfx_v9_4_3_set_irq_funcs(struct amdgpu_device *adev) +{ +	adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST; +	adev->gfx.eop_irq.funcs = &gfx_v9_4_3_eop_irq_funcs; + +	adev->gfx.priv_reg_irq.num_types = 1; +	adev->gfx.priv_reg_irq.funcs = &gfx_v9_4_3_priv_reg_irq_funcs; + +	adev->gfx.priv_inst_irq.num_types = 1; +	adev->gfx.priv_inst_irq.funcs = &gfx_v9_4_3_priv_inst_irq_funcs; +} + +static void gfx_v9_4_3_set_rlc_funcs(struct amdgpu_device *adev) +{ +	adev->gfx.rlc.funcs = &gfx_v9_4_3_rlc_funcs; +} + + +static void gfx_v9_4_3_set_gds_init(struct amdgpu_device *adev) +{ +	/* init asci gds info */ +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(9, 4, 3): +		/* 9.4.3 removed all the GDS internal memory, +		 * only support GWS opcode in kernel, like barrier +		 * semaphore.etc */ +		adev->gds.gds_size = 0; +		break; +	default: +		adev->gds.gds_size = 0x10000; +		break; +	} + +	switch (adev->ip_versions[GC_HWIP][0]) { +	case IP_VERSION(9, 4, 3): +		/* deprecated for 9.4.3, no usage at all */ +		adev->gds.gds_compute_max_wave_id = 0; +		break; +	default: +		/* this really depends on the chip */ +		adev->gds.gds_compute_max_wave_id = 0x7ff; +		break; +	} + +	adev->gds.gws_size = 64; +	adev->gds.oa_size = 16; +} + +static void gfx_v9_4_3_set_user_cu_inactive_bitmap(struct amdgpu_device *adev, +						 u32 bitmap) +{ +	u32 data; + +	if (!bitmap) +		return; + +	data = bitmap << GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; +	data &= GC_USER_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; + +	WREG32_SOC15(GC, GET_INST(GC, 0), regGC_USER_SHADER_ARRAY_CONFIG, data); +} + +static u32 gfx_v9_4_3_get_cu_active_bitmap(struct amdgpu_device *adev) +{ +	u32 data, mask; + +	data = RREG32_SOC15(GC, GET_INST(GC, 0), regCC_GC_SHADER_ARRAY_CONFIG); +	data |= RREG32_SOC15(GC, GET_INST(GC, 0), regGC_USER_SHADER_ARRAY_CONFIG); + +	data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; +	data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; + +	mask = amdgpu_gfx_create_bitmask(adev->gfx.config.max_cu_per_sh); + +	return (~data) & mask; +} + +static int gfx_v9_4_3_get_cu_info(struct amdgpu_device *adev, +				 struct amdgpu_cu_info *cu_info) +{ +	int i, j, k, counter, active_cu_number = 0; +	u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0; +	unsigned disable_masks[4 * 4]; + +	if (!adev || !cu_info) +		return -EINVAL; + +	/* +	 * 16 comes from bitmap array size 4*4, and it can cover all gfx9 ASICs +	 */ +	if (adev->gfx.config.max_shader_engines * +		adev->gfx.config.max_sh_per_se > 16) +		return -EINVAL; + +	amdgpu_gfx_parse_disable_cu(disable_masks, +				    adev->gfx.config.max_shader_engines, +				    adev->gfx.config.max_sh_per_se); + +	mutex_lock(&adev->grbm_idx_mutex); +	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { +		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { +			mask = 1; +			ao_bitmap = 0; +			counter = 0; +			gfx_v9_4_3_xcc_select_se_sh(adev, i, j, 0xffffffff, 0); +			gfx_v9_4_3_set_user_cu_inactive_bitmap( +				adev, disable_masks[i * adev->gfx.config.max_sh_per_se + j]); +			bitmap = gfx_v9_4_3_get_cu_active_bitmap(adev); + +			/* +			 * The bitmap(and ao_cu_bitmap) in cu_info structure is +			 * 4x4 size array, and it's usually suitable for Vega +			 * ASICs which has 4*2 SE/SH layout. +			 * But for Arcturus, SE/SH layout is changed to 8*1. +			 * To mostly reduce the impact, we make it compatible +			 * with current bitmap array as below: +			 *    SE4,SH0 --> bitmap[0][1] +			 *    SE5,SH0 --> bitmap[1][1] +			 *    SE6,SH0 --> bitmap[2][1] +			 *    SE7,SH0 --> bitmap[3][1] +			 */ +			cu_info->bitmap[i % 4][j + i / 4] = bitmap; + +			for (k = 0; k < adev->gfx.config.max_cu_per_sh; k++) { +				if (bitmap & mask) { +					if (counter < adev->gfx.config.max_cu_per_sh) +						ao_bitmap |= mask; +					counter++; +				} +				mask <<= 1; +			} +			active_cu_number += counter; +			if (i < 2 && j < 2) +				ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8)); +			cu_info->ao_cu_bitmap[i % 4][j + i / 4] = ao_bitmap; +		} +	} +	gfx_v9_4_3_xcc_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, +				    0); +	mutex_unlock(&adev->grbm_idx_mutex); + +	cu_info->number = active_cu_number; +	cu_info->ao_cu_mask = ao_cu_mask; +	cu_info->simd_per_cu = NUM_SIMD_PER_CU; + +	return 0; +} + +const struct amdgpu_ip_block_version gfx_v9_4_3_ip_block = { +	.type = AMD_IP_BLOCK_TYPE_GFX, +	.major = 9, +	.minor = 4, +	.rev = 0, +	.funcs = &gfx_v9_4_3_ip_funcs, +}; + +static int gfx_v9_4_3_xcp_resume(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	uint32_t tmp_mask; +	int i, r; + +	/* TODO : Initialize golden regs */ +	/* gfx_v9_4_3_init_golden_registers(adev); */ + +	tmp_mask = inst_mask; +	for_each_inst(i, tmp_mask) +		gfx_v9_4_3_xcc_constants_init(adev, i); + +	if (!amdgpu_sriov_vf(adev)) { +		tmp_mask = inst_mask; +		for_each_inst(i, tmp_mask) { +			r = gfx_v9_4_3_xcc_rlc_resume(adev, i); +			if (r) +				return r; +		} +	} + +	tmp_mask = inst_mask; +	for_each_inst(i, tmp_mask) { +		r = gfx_v9_4_3_xcc_cp_resume(adev, i); +		if (r) +			return r; +	} + +	return 0; +} + +static int gfx_v9_4_3_xcp_suspend(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i; + +	for_each_inst(i, inst_mask) +		gfx_v9_4_3_xcc_fini(adev, i); + +	return 0; +} + +struct amdgpu_xcp_ip_funcs gfx_v9_4_3_xcp_funcs = { +	.suspend = &gfx_v9_4_3_xcp_suspend, +	.resume = &gfx_v9_4_3_xcp_resume +}; + +struct amdgpu_ras_block_hw_ops  gfx_v9_4_3_ras_ops = { +	.query_ras_error_count = &gfx_v9_4_3_query_ras_error_count, +	.reset_ras_error_count = &gfx_v9_4_3_reset_ras_error_count, +	.query_ras_error_status = &gfx_v9_4_3_query_ras_error_status, +	.reset_ras_error_status = &gfx_v9_4_3_reset_ras_error_status, +}; + +struct amdgpu_gfx_ras gfx_v9_4_3_ras = { +	.ras_block = { +		.hw_ops = &gfx_v9_4_3_ras_ops, +	}, +}; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.h b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.h index 84e69701b81a..42d67ee0e7ef 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.h +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.h @@ -24,7 +24,8 @@  #ifndef __GFX_V9_4_3_H__  #define __GFX_V9_4_3_H__ -extern const struct amdgpu_gfx_funcs gfx_v9_4_3_gfx_funcs; -extern const struct amdgpu_rlc_funcs gfx_v9_4_3_rlc_funcs; +extern const struct amdgpu_ip_block_version gfx_v9_4_3_ip_block; + +extern struct amdgpu_xcp_ip_funcs gfx_v9_4_3_xcp_funcs;  #endif /* __GFX_V9_4_3_H__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index ab2325f6c7ac..d94cc1ec7242 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c @@ -40,7 +40,7 @@ static void gfxhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev,  					 uint32_t vmid,  					 uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	WREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -247,7 +247,7 @@ static void gfxhub_v1_0_disable_identity_aperture(struct amdgpu_device *adev)  static void gfxhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned num_level, block_size;  	uint32_t tmp;  	int i; @@ -307,7 +307,7 @@ static void gfxhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)  static void gfxhub_v1_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned i;  	for (i = 0 ; i < 18; ++i) { @@ -338,7 +338,7 @@ static int gfxhub_v1_0_gart_enable(struct amdgpu_device *adev)  static void gfxhub_v1_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	u32 tmp;  	u32 i; @@ -411,7 +411,7 @@ static void gfxhub_v1_0_set_fault_enable_default(struct amdgpu_device *adev,  static void gfxhub_v1_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(GC, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c index c59c6c85fbff..4dabf910334b 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c @@ -21,6 +21,7 @@   *   */  #include "amdgpu.h" +#include "amdgpu_xcp.h"  #include "gfxhub_v1_2.h"  #include "gfxhub_v1_1.h" @@ -35,227 +36,288 @@  static u64 gfxhub_v1_2_get_mc_fb_offset(struct amdgpu_device *adev)  { -	return (u64)RREG32_SOC15(GC, 0, regMC_VM_FB_OFFSET) << 24; +	return (u64)RREG32_SOC15(GC, GET_INST(GC, 0), regMC_VM_FB_OFFSET) << 24; +} + +static void gfxhub_v1_2_xcc_setup_vm_pt_regs(struct amdgpu_device *adev, +					     uint32_t vmid, +					     uint64_t page_table_base, +					     uint32_t xcc_mask) +{ +	struct amdgpu_vmhub *hub; +	int i; + +	for_each_inst(i, xcc_mask) { +		hub = &adev->vmhub[AMDGPU_GFXHUB(i)]; +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, i), +				    regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, +				    hub->ctx_addr_distance * vmid, +				    lower_32_bits(page_table_base)); + +		WREG32_SOC15_OFFSET(GC, GET_INST(GC, i), +				    regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, +				    hub->ctx_addr_distance * vmid, +				    upper_32_bits(page_table_base)); +	}  }  static void gfxhub_v1_2_setup_vm_pt_regs(struct amdgpu_device *adev,  					 uint32_t vmid,  					 uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	uint32_t xcc_mask; -	WREG32_SOC15_OFFSET(GC, 0, regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, -			    hub->ctx_addr_distance * vmid, -			    lower_32_bits(page_table_base)); - -	WREG32_SOC15_OFFSET(GC, 0, regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, -			    hub->ctx_addr_distance * vmid, -			    upper_32_bits(page_table_base)); +	xcc_mask = GENMASK(NUM_XCC(adev->gfx.xcc_mask) - 1, 0); +	gfxhub_v1_2_xcc_setup_vm_pt_regs(adev, vmid, page_table_base, xcc_mask);  } -static void gfxhub_v1_2_init_gart_aperture_regs(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_init_gart_aperture_regs(struct amdgpu_device *adev, +						    uint32_t xcc_mask)  {  	uint64_t pt_base; +	int i;  	if (adev->gmc.pdb0_bo)  		pt_base = amdgpu_gmc_pd_addr(adev->gmc.pdb0_bo);  	else  		pt_base = amdgpu_gmc_pd_addr(adev->gart.bo); -	gfxhub_v1_2_setup_vm_pt_regs(adev, 0, pt_base); +	gfxhub_v1_2_xcc_setup_vm_pt_regs(adev, 0, pt_base, xcc_mask);  	/* If use GART for FB translation, vmid0 page table covers both  	 * vram and system memory (gart)  	 */ -	if (adev->gmc.pdb0_bo) { -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -				(u32)(adev->gmc.fb_start >> 12)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -				(u32)(adev->gmc.fb_start >> 44)); +	for_each_inst(i, xcc_mask) { +		if (adev->gmc.pdb0_bo) { +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, +				     (u32)(adev->gmc.fb_start >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, +				     (u32)(adev->gmc.fb_start >> 44)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -				(u32)(adev->gmc.gart_end >> 12)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -				(u32)(adev->gmc.gart_end >> 44)); -	} else { -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -				(u32)(adev->gmc.gart_start >> 12)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -				(u32)(adev->gmc.gart_start >> 44)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, +				     (u32)(adev->gmc.gart_end >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, +				     (u32)(adev->gmc.gart_end >> 44)); +		} else { +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, +				     (u32)(adev->gmc.gart_start >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, +				     (u32)(adev->gmc.gart_start >> 44)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -				(u32)(adev->gmc.gart_end >> 12)); -		WREG32_SOC15(GC, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -				(u32)(adev->gmc.gart_end >> 44)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, +				     (u32)(adev->gmc.gart_end >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, +				     (u32)(adev->gmc.gart_end >> 44)); +		}  	}  } -static void gfxhub_v1_2_init_system_aperture_regs(struct amdgpu_device *adev) +static void +gfxhub_v1_2_xcc_init_system_aperture_regs(struct amdgpu_device *adev, +					  uint32_t xcc_mask)  {  	uint64_t value;  	uint32_t tmp; +	int i; -	/* Program the AGP BAR */ -	WREG32_SOC15_RLC(GC, 0, regMC_VM_AGP_BASE, 0); -	WREG32_SOC15_RLC(GC, 0, regMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); -	WREG32_SOC15_RLC(GC, 0, regMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); +	for_each_inst(i, xcc_mask) { +		/* Program the AGP BAR */ +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_AGP_BASE, 0); +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); -	if (!amdgpu_sriov_vf(adev) || adev->asic_type <= CHIP_VEGA10) { -		/* Program the system aperture low logical page number. */ -		WREG32_SOC15_RLC(GC, 0, regMC_VM_SYSTEM_APERTURE_LOW_ADDR, -			min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); +		if (!amdgpu_sriov_vf(adev) || adev->asic_type <= CHIP_VEGA10) { +			/* Program the system aperture low logical page number. */ +			WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_SYSTEM_APERTURE_LOW_ADDR, +				min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); -		if (adev->apu_flags & AMD_APU_IS_RAVEN2) -			/* -			* Raven2 has a HW issue that it is unable to use the -			* vram which is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR. -			* So here is the workaround that increase system -			* aperture high address (add 1) to get rid of the VM -			* fault and hardware hang. -			*/ -			WREG32_SOC15_RLC(GC, 0, -					 regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -					 max((adev->gmc.fb_end >> 18) + 0x1, -					     adev->gmc.agp_end >> 18)); -		else -			WREG32_SOC15_RLC(GC, 0, -				regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -				max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); +			if (adev->apu_flags & AMD_APU_IS_RAVEN2) +				/* +				* Raven2 has a HW issue that it is unable to use the +				* vram which is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR. +				* So here is the workaround that increase system +				* aperture high address (add 1) to get rid of the VM +				* fault and hardware hang. +				*/ +				WREG32_SOC15_RLC(GC, GET_INST(GC, i), +						 regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, +						 max((adev->gmc.fb_end >> 18) + 0x1, +						     adev->gmc.agp_end >> 18)); +			else +				WREG32_SOC15_RLC(GC, GET_INST(GC, i), +					regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, +					max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); -		/* Set default page address. */ -		value = amdgpu_gmc_vram_mc2pa(adev, adev->mem_scratch.gpu_addr); -		WREG32_SOC15(GC, 0, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, -			     (u32)(value >> 12)); -		WREG32_SOC15(GC, 0, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, -			     (u32)(value >> 44)); +			/* Set default page address. */ +			value = amdgpu_gmc_vram_mc2pa(adev, adev->mem_scratch.gpu_addr); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, +				     (u32)(value >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, +				     (u32)(value >> 44)); -		/* Program "protection fault". */ -		WREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, -			     (u32)(adev->dummy_page_addr >> 12)); -		WREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, -			     (u32)((u64)adev->dummy_page_addr >> 44)); +			/* Program "protection fault". */ +			WREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, +				     (u32)(adev->dummy_page_addr >> 12)); +			WREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, +				     (u32)((u64)adev->dummy_page_addr >> 44)); -		tmp = RREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL2); -		tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL2, -				    ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1); -		WREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL2, tmp); -	} +			tmp = RREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL2); +			tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL2, +					    ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1); +			WREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL2, tmp); +		} -	/* In the case squeezing vram into GART aperture, we don't use -	 * FB aperture and AGP aperture. Disable them. -	 */ -	if (adev->gmc.pdb0_bo) { -		WREG32_SOC15(GC, 0, regMC_VM_FB_LOCATION_TOP, 0); -		WREG32_SOC15(GC, 0, regMC_VM_FB_LOCATION_BASE, 0x00FFFFFF); -		WREG32_SOC15(GC, 0, regMC_VM_AGP_TOP, 0); -		WREG32_SOC15(GC, 0, regMC_VM_AGP_BOT, 0xFFFFFF); -		WREG32_SOC15(GC, 0, regMC_VM_SYSTEM_APERTURE_LOW_ADDR, 0x3FFFFFFF); -		WREG32_SOC15(GC, 0, regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 0); +		/* In the case squeezing vram into GART aperture, we don't use +		 * FB aperture and AGP aperture. Disable them. +		 */ +		if (adev->gmc.pdb0_bo) { +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_FB_LOCATION_TOP, 0); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_FB_LOCATION_BASE, 0x00FFFFFF); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_AGP_TOP, 0); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_AGP_BOT, 0xFFFFFF); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_SYSTEM_APERTURE_LOW_ADDR, 0x3FFFFFFF); +			WREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 0); +		}  	}  } -static void gfxhub_v1_2_init_tlb_regs(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_init_tlb_regs(struct amdgpu_device *adev, +					  uint32_t xcc_mask)  {  	uint32_t tmp; +	int i; -	/* Setup TLB control */ -	tmp = RREG32_SOC15(GC, 0, regMC_VM_MX_L1_TLB_CNTL); +	for_each_inst(i, xcc_mask) { +		/* Setup TLB control */ +		tmp = RREG32_SOC15(GC, GET_INST(GC, i), regMC_VM_MX_L1_TLB_CNTL); -	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, -			    MTYPE, MTYPE_UC);/* XXX for emulation. */ -	tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); +		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, +				    MTYPE, MTYPE_UC);/* XXX for emulation. */ +		tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); -	WREG32_SOC15_RLC(GC, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_MX_L1_TLB_CNTL, tmp); +	}  } -static void gfxhub_v1_2_init_cache_regs(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_init_cache_regs(struct amdgpu_device *adev, +					    uint32_t xcc_mask)  {  	uint32_t tmp; +	int i; -	/* Setup L2 cache */ -	tmp = RREG32_SOC15(GC, 0, regVM_L2_CNTL); -	tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1); -	tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 1); -	/* 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, 0); -	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); -	WREG32_SOC15_RLC(GC, 0, regVM_L2_CNTL, tmp); +	for_each_inst(i, xcc_mask) { +		/* Setup L2 cache */ +		tmp = RREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_CNTL); +		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1); +		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 1); +		/* 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, 0); +		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); +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regVM_L2_CNTL, tmp); -	tmp = RREG32_SOC15(GC, 0, regVM_L2_CNTL2); -	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); -	WREG32_SOC15_RLC(GC, 0, regVM_L2_CNTL2, tmp); +		tmp = RREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_CNTL2); +		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); +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regVM_L2_CNTL2, tmp); -	tmp = regVM_L2_CNTL3_DEFAULT; -	if (adev->gmc.translate_further) { -		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); -	} -	WREG32_SOC15_RLC(GC, 0, regVM_L2_CNTL3, tmp); +		tmp = regVM_L2_CNTL3_DEFAULT; +		if (adev->gmc.translate_further) { +			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); +		} +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regVM_L2_CNTL3, tmp); -	tmp = regVM_L2_CNTL4_DEFAULT; -	if (adev->gmc.xgmi.connected_to_cpu) { -		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PDE_REQUEST_PHYSICAL, 1); -		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PTE_REQUEST_PHYSICAL, 1); -	} else { -		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); +		tmp = regVM_L2_CNTL4_DEFAULT; +		/* For AMD APP APUs setup WC memory */ +		if (adev->gmc.xgmi.connected_to_cpu || adev->gmc.is_app_apu) { +			tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PDE_REQUEST_PHYSICAL, 1); +			tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PTE_REQUEST_PHYSICAL, 1); +		} else { +			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); +		} +		WREG32_SOC15_RLC(GC, GET_INST(GC, i), regVM_L2_CNTL4, tmp);  	} -	WREG32_SOC15_RLC(GC, 0, regVM_L2_CNTL4, tmp);  } -static void gfxhub_v1_2_enable_system_domain(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_enable_system_domain(struct amdgpu_device *adev, +						 uint32_t xcc_mask)  {  	uint32_t tmp; +	int i; -	tmp = RREG32_SOC15(GC, 0, regVM_CONTEXT0_CNTL); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, -			adev->gmc.vmid0_page_table_depth); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_BLOCK_SIZE, -			adev->gmc.vmid0_page_table_block_size); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, -			    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0); -	WREG32_SOC15(GC, 0, regVM_CONTEXT0_CNTL, tmp); +	for_each_inst(i, xcc_mask) { +		tmp = RREG32_SOC15(GC, GET_INST(GC, i), regVM_CONTEXT0_CNTL); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, +				adev->gmc.vmid0_page_table_depth); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_BLOCK_SIZE, +				adev->gmc.vmid0_page_table_block_size); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, +				    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0); +		WREG32_SOC15(GC, GET_INST(GC, i), regVM_CONTEXT0_CNTL, tmp); +	}  } -static void gfxhub_v1_2_disable_identity_aperture(struct amdgpu_device *adev) +static void +gfxhub_v1_2_xcc_disable_identity_aperture(struct amdgpu_device *adev, +					  uint32_t xcc_mask)  { -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32, -		     0XFFFFFFFF); -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32, -		     0x0000000F); +	int i; -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32, -		     0); -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32, -		     0); +	for_each_inst(i, xcc_mask) { +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32, +			     0XFFFFFFFF); +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32, +			     0x0000000F); -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32, 0); -	WREG32_SOC15(GC, 0, regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32, 0); +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32, +			     0); +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32, +			     0); +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32, 0); +		WREG32_SOC15(GC, GET_INST(GC, i), +			     regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32, 0); +	}  } -static void gfxhub_v1_2_setup_vmid_config(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_setup_vmid_config(struct amdgpu_device *adev, +					      uint32_t xcc_mask)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub;  	unsigned num_level, block_size;  	uint32_t tmp; -	int i; +	int i, j;  	num_level = adev->vm_manager.num_level;  	block_size = adev->vm_manager.block_size; @@ -264,124 +326,205 @@ static void gfxhub_v1_2_setup_vmid_config(struct amdgpu_device *adev)  	else  		block_size -= 9; -	for (i = 0; i <= 14; i++) { -		tmp = RREG32_SOC15_OFFSET(GC, 0, regVM_CONTEXT1_CNTL, i); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, -				    num_level); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, -				    1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    PAGE_TABLE_BLOCK_SIZE, -				    block_size); -		/* Send no-retry XNACK on fault to suppress VM fault storm. -		 * On Aldebaran, XNACK can be enabled in the SQ per-process. -		 * Retry faults need to be enabled for that to work. -		 */ -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, -				    !adev->gmc.noretry || -				    adev->asic_type == CHIP_ALDEBARAN); -		WREG32_SOC15_OFFSET(GC, 0, regVM_CONTEXT1_CNTL, -				    i * hub->ctx_distance, tmp); -		WREG32_SOC15_OFFSET(GC, 0, -				    regVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, -				    i * hub->ctx_addr_distance, 0); -		WREG32_SOC15_OFFSET(GC, 0, -				    regVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, -				    i * hub->ctx_addr_distance, 0); -		WREG32_SOC15_OFFSET(GC, 0, -				    regVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, -				    i * hub->ctx_addr_distance, -				    lower_32_bits(adev->vm_manager.max_pfn - 1)); -		WREG32_SOC15_OFFSET(GC, 0, -				    regVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, -				    i * hub->ctx_addr_distance, -				    upper_32_bits(adev->vm_manager.max_pfn - 1)); +	for_each_inst(j, xcc_mask) { +		hub = &adev->vmhub[AMDGPU_GFXHUB(j)]; +		for (i = 0; i <= 14; i++) { +			tmp = RREG32_SOC15_OFFSET(GC, GET_INST(GC, j), regVM_CONTEXT1_CNTL, i); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, +					    num_level); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, +					    1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    PAGE_TABLE_BLOCK_SIZE, +					    block_size); +			/* Send no-retry XNACK on fault to suppress VM fault storm. +			 * On 9.4.2 and 9.4.3, XNACK can be enabled in +			 * the SQ per-process. +			 * Retry faults need to be enabled for that to work. +			 */ +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, +					    !adev->gmc.noretry || +					    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2) || +					    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), regVM_CONTEXT1_CNTL, +					    i * hub->ctx_distance, tmp); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), +					    regVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, +					    i * hub->ctx_addr_distance, 0); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), +					    regVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, +					    i * hub->ctx_addr_distance, 0); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), +					    regVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, +					    i * hub->ctx_addr_distance, +					    lower_32_bits(adev->vm_manager.max_pfn - 1)); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), +					    regVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, +					    i * hub->ctx_addr_distance, +					    upper_32_bits(adev->vm_manager.max_pfn - 1)); +		}  	}  } -static void gfxhub_v1_2_program_invalidation(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_program_invalidation(struct amdgpu_device *adev, +						 uint32_t xcc_mask)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; -	unsigned i; +	struct amdgpu_vmhub *hub; +	unsigned int i, j; + +	for_each_inst(j, xcc_mask) { +		hub = &adev->vmhub[AMDGPU_GFXHUB(j)]; -	for (i = 0 ; i < 18; ++i) { -		WREG32_SOC15_OFFSET(GC, 0, regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, -				    i * hub->eng_addr_distance, 0xffffffff); -		WREG32_SOC15_OFFSET(GC, 0, regVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, -				    i * hub->eng_addr_distance, 0x1f); +		for (i = 0 ; i < 18; ++i) { +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, +					    i * hub->eng_addr_distance, 0xffffffff); +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), regVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, +					    i * hub->eng_addr_distance, 0x1f); +		}  	}  } -static int gfxhub_v1_2_gart_enable(struct amdgpu_device *adev) +static int gfxhub_v1_2_xcc_gart_enable(struct amdgpu_device *adev, +				       uint32_t xcc_mask)  { -	if (amdgpu_sriov_vf(adev) && adev->asic_type != CHIP_ARCTURUS) { -		/* -		 * 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 -		 */ -		WREG32_SOC15_RLC(GC, 0, regMC_VM_FB_LOCATION_BASE, -			     adev->gmc.vram_start >> 24); -		WREG32_SOC15_RLC(GC, 0, regMC_VM_FB_LOCATION_TOP, -			     adev->gmc.vram_end >> 24); +	uint32_t tmp_mask; +	int i; + +	tmp_mask = xcc_mask; +	/* +	 * MC_VM_FB_LOCATION_BASE/TOP is NULL for VF, because they are +	 * VF copy registers so vbios post doesn't program them, for +	 * SRIOV driver need to program them +	 */ +	if (amdgpu_sriov_vf(adev)) { +		for_each_inst(i, tmp_mask) { +			i = ffs(tmp_mask) - 1; +			WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_FB_LOCATION_BASE, +				     adev->gmc.vram_start >> 24); +			WREG32_SOC15_RLC(GC, GET_INST(GC, i), regMC_VM_FB_LOCATION_TOP, +				     adev->gmc.vram_end >> 24); +		}  	}  	/* GART Enable. */ -	gfxhub_v1_2_init_gart_aperture_regs(adev); -	gfxhub_v1_2_init_system_aperture_regs(adev); -	gfxhub_v1_2_init_tlb_regs(adev); +	gfxhub_v1_2_xcc_init_gart_aperture_regs(adev, xcc_mask); +	gfxhub_v1_2_xcc_init_system_aperture_regs(adev, xcc_mask); +	gfxhub_v1_2_xcc_init_tlb_regs(adev, xcc_mask);  	if (!amdgpu_sriov_vf(adev)) -		gfxhub_v1_2_init_cache_regs(adev); +		gfxhub_v1_2_xcc_init_cache_regs(adev, xcc_mask); -	gfxhub_v1_2_enable_system_domain(adev); +	gfxhub_v1_2_xcc_enable_system_domain(adev, xcc_mask);  	if (!amdgpu_sriov_vf(adev)) -		gfxhub_v1_2_disable_identity_aperture(adev); -	gfxhub_v1_2_setup_vmid_config(adev); -	gfxhub_v1_2_program_invalidation(adev); +		gfxhub_v1_2_xcc_disable_identity_aperture(adev, xcc_mask); +	gfxhub_v1_2_xcc_setup_vmid_config(adev, xcc_mask); +	gfxhub_v1_2_xcc_program_invalidation(adev, xcc_mask);  	return 0;  } -static void gfxhub_v1_2_gart_disable(struct amdgpu_device *adev) +static int gfxhub_v1_2_gart_enable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	uint32_t xcc_mask; + +	xcc_mask = GENMASK(NUM_XCC(adev->gfx.xcc_mask) - 1, 0); +	return gfxhub_v1_2_xcc_gart_enable(adev, xcc_mask); +} + +static void gfxhub_v1_2_xcc_gart_disable(struct amdgpu_device *adev, +					 uint32_t xcc_mask) +{ +	struct amdgpu_vmhub *hub;  	u32 tmp; -	u32 i; +	u32 i, j; + +	for_each_inst(j, xcc_mask) { +		hub = &adev->vmhub[AMDGPU_GFXHUB(j)]; +		/* Disable all tables */ +		for (i = 0; i < 16; i++) +			WREG32_SOC15_OFFSET(GC, GET_INST(GC, j), regVM_CONTEXT0_CNTL, +					    i * hub->ctx_distance, 0); + +		/* Setup TLB control */ +		tmp = RREG32_SOC15(GC, GET_INST(GC, j), regMC_VM_MX_L1_TLB_CNTL); +		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); +		WREG32_SOC15_RLC(GC, GET_INST(GC, j), regMC_VM_MX_L1_TLB_CNTL, tmp); -	/* Disable all tables */ -	for (i = 0; i < 16; i++) -		WREG32_SOC15_OFFSET(GC, 0, regVM_CONTEXT0_CNTL, -				    i * hub->ctx_distance, 0); +		/* Setup L2 cache */ +		tmp = RREG32_SOC15(GC, GET_INST(GC, j), regVM_L2_CNTL); +		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0); +		WREG32_SOC15(GC, GET_INST(GC, j), regVM_L2_CNTL, tmp); +		WREG32_SOC15(GC, GET_INST(GC, j), regVM_L2_CNTL3, 0); +	} +} -	/* Setup TLB control */ -	tmp = RREG32_SOC15(GC, 0, regMC_VM_MX_L1_TLB_CNTL); -	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); -	WREG32_SOC15_RLC(GC, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); +static void gfxhub_v1_2_gart_disable(struct amdgpu_device *adev) +{ +	uint32_t xcc_mask; -	/* Setup L2 cache */ -	tmp = RREG32_SOC15(GC, 0, regVM_L2_CNTL); -	tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0); -	WREG32_SOC15(GC, 0, regVM_L2_CNTL, tmp); -	WREG32_SOC15(GC, 0, regVM_L2_CNTL3, 0); +	xcc_mask = GENMASK(NUM_XCC(adev->gfx.xcc_mask) - 1, 0); +	gfxhub_v1_2_xcc_gart_disable(adev, xcc_mask); +} + +static void gfxhub_v1_2_xcc_set_fault_enable_default(struct amdgpu_device *adev, +						     bool value, +						     uint32_t xcc_mask) +{ +	u32 tmp; +	int i; + +	for_each_inst(i, xcc_mask) { +		tmp = RREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL); +		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); +		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); +		} +		WREG32_SOC15(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL, tmp); +	}  }  /** @@ -393,72 +536,100 @@ static void gfxhub_v1_2_gart_disable(struct amdgpu_device *adev)  static void gfxhub_v1_2_set_fault_enable_default(struct amdgpu_device *adev,  						 bool value)  { -	u32 tmp; -	tmp = RREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL); -	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); -	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); -	} -	WREG32_SOC15(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL, tmp); +	uint32_t xcc_mask; + +	xcc_mask = GENMASK(NUM_XCC(adev->gfx.xcc_mask) - 1, 0); +	gfxhub_v1_2_xcc_set_fault_enable_default(adev, value, xcc_mask);  } -static void gfxhub_v1_2_init(struct amdgpu_device *adev) +static void gfxhub_v1_2_xcc_init(struct amdgpu_device *adev, uint32_t xcc_mask)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub; +	int i; + +	for_each_inst(i, xcc_mask) { +		hub = &adev->vmhub[AMDGPU_GFXHUB(i)]; -	hub->ctx0_ptb_addr_lo32 = -		SOC15_REG_OFFSET(GC, 0, +		hub->ctx0_ptb_addr_lo32 = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i),  				regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32); -	hub->ctx0_ptb_addr_hi32 = -		SOC15_REG_OFFSET(GC, 0, +		hub->ctx0_ptb_addr_hi32 = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i),  				regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); -	hub->vm_inv_eng0_sem = -		SOC15_REG_OFFSET(GC, 0, regVM_INVALIDATE_ENG0_SEM); -	hub->vm_inv_eng0_req = -		SOC15_REG_OFFSET(GC, 0, regVM_INVALIDATE_ENG0_REQ); -	hub->vm_inv_eng0_ack = -		SOC15_REG_OFFSET(GC, 0, regVM_INVALIDATE_ENG0_ACK); -	hub->vm_context0_cntl = -		SOC15_REG_OFFSET(GC, 0, regVM_CONTEXT0_CNTL); -	hub->vm_l2_pro_fault_status = -		SOC15_REG_OFFSET(GC, 0, regVM_L2_PROTECTION_FAULT_STATUS); -	hub->vm_l2_pro_fault_cntl = -		SOC15_REG_OFFSET(GC, 0, regVM_L2_PROTECTION_FAULT_CNTL); +		hub->vm_inv_eng0_sem = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_SEM); +		hub->vm_inv_eng0_req = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_REQ); +		hub->vm_inv_eng0_ack = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_INVALIDATE_ENG0_ACK); +		hub->vm_context0_cntl = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_CONTEXT0_CNTL); +		hub->vm_l2_pro_fault_status = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), +				regVM_L2_PROTECTION_FAULT_STATUS); +		hub->vm_l2_pro_fault_cntl = +			SOC15_REG_OFFSET(GC, GET_INST(GC, i), regVM_L2_PROTECTION_FAULT_CNTL); -	hub->ctx_distance = regVM_CONTEXT1_CNTL - regVM_CONTEXT0_CNTL; -	hub->ctx_addr_distance = regVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 - -		regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; -	hub->eng_distance = regVM_INVALIDATE_ENG1_REQ - regVM_INVALIDATE_ENG0_REQ; -	hub->eng_addr_distance = regVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 - -		regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32; +		hub->ctx_distance = regVM_CONTEXT1_CNTL - +				regVM_CONTEXT0_CNTL; +		hub->ctx_addr_distance = +				regVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 - +				regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; +		hub->eng_distance = regVM_INVALIDATE_ENG1_REQ - +				regVM_INVALIDATE_ENG0_REQ; +		hub->eng_addr_distance = +				regVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 - +				regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32; +	}  } +static void gfxhub_v1_2_init(struct amdgpu_device *adev) +{ +	uint32_t xcc_mask; + +	xcc_mask = GENMASK(NUM_XCC(adev->gfx.xcc_mask) - 1, 0); +	gfxhub_v1_2_xcc_init(adev, xcc_mask); +} + +static int gfxhub_v1_2_get_xgmi_info(struct amdgpu_device *adev) +{ +	u32 max_num_physical_nodes; +	u32 max_physical_node_id; +	u32 xgmi_lfb_cntl; +	u32 max_region; +	u64 seg_size; + +	xgmi_lfb_cntl = RREG32_SOC15(GC, GET_INST(GC, 0), regMC_VM_XGMI_LFB_CNTL); +	seg_size = REG_GET_FIELD( +		RREG32_SOC15(GC, GET_INST(GC, 0), regMC_VM_XGMI_LFB_SIZE), +		MC_VM_XGMI_LFB_SIZE, PF_LFB_SIZE) << 24; +	max_region = +		REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, PF_MAX_REGION); + + + +	max_num_physical_nodes   = 8; +	max_physical_node_id     = 7; + +	/* PF_MAX_REGION=0 means xgmi is disabled */ +	if (max_region || adev->gmc.xgmi.connected_to_cpu) { +		adev->gmc.xgmi.num_physical_nodes = max_region + 1; + +		if (adev->gmc.xgmi.num_physical_nodes > max_num_physical_nodes) +			return -EINVAL; + +		adev->gmc.xgmi.physical_node_id = +			REG_GET_FIELD(xgmi_lfb_cntl, MC_VM_XGMI_LFB_CNTL, +					PF_LFB_REGION); + +		if (adev->gmc.xgmi.physical_node_id > max_physical_node_id) +			return -EINVAL; + +		adev->gmc.xgmi.node_segment_size = seg_size; +	} + +	return 0; +}  const struct amdgpu_gfxhub_funcs gfxhub_v1_2_funcs = {  	.get_mc_fb_offset = gfxhub_v1_2_get_mc_fb_offset, @@ -467,5 +638,38 @@ const struct amdgpu_gfxhub_funcs gfxhub_v1_2_funcs = {  	.gart_disable = gfxhub_v1_2_gart_disable,  	.set_fault_enable_default = gfxhub_v1_2_set_fault_enable_default,  	.init = gfxhub_v1_2_init, -	.get_xgmi_info = gfxhub_v1_1_get_xgmi_info, +	.get_xgmi_info = gfxhub_v1_2_get_xgmi_info, +}; + +static int gfxhub_v1_2_xcp_resume(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	bool value; + +	if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) +		value = false; +	else +		value = true; + +	gfxhub_v1_2_xcc_set_fault_enable_default(adev, value, inst_mask); + +	if (!amdgpu_sriov_vf(adev)) +		return gfxhub_v1_2_xcc_gart_enable(adev, inst_mask); + +	return 0; +} + +static int gfxhub_v1_2_xcp_suspend(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	if (!amdgpu_sriov_vf(adev)) +		gfxhub_v1_2_xcc_gart_disable(adev, inst_mask); + +	return 0; +} + +struct amdgpu_xcp_ip_funcs gfxhub_v1_2_xcp_funcs = { +	.suspend = &gfxhub_v1_2_xcp_suspend, +	.resume = &gfxhub_v1_2_xcp_resume  }; diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.h b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.h index e2d508f5a7ee..997e9f90c990 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.h +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.h @@ -26,4 +26,6 @@  extern const struct amdgpu_gfxhub_funcs gfxhub_v1_2_funcs; +extern struct amdgpu_xcp_ip_funcs gfxhub_v1_2_xcp_funcs; +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c index 9b3a02527318..f173a61c6c15 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c @@ -120,7 +120,7 @@ static u64 gfxhub_v2_0_get_mc_fb_offset(struct amdgpu_device *adev)  static void gfxhub_v2_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	WREG32_SOC15_OFFSET(GC, 0, mmGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -282,7 +282,7 @@ static void gfxhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev)  static void gfxhub_v2_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	int i;  	uint32_t tmp; @@ -331,7 +331,7 @@ static void gfxhub_v2_0_setup_vmid_config(struct amdgpu_device *adev)  static void gfxhub_v2_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned i;  	for (i = 0 ; i < 18; ++i) { @@ -360,7 +360,7 @@ static int gfxhub_v2_0_gart_enable(struct amdgpu_device *adev)  static void gfxhub_v2_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	u32 tmp;  	u32 i; @@ -433,7 +433,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_0_vmhub_funcs = {  static void gfxhub_v2_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(GC, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c index 4aacbbec31e2..d8fc3e8088cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c @@ -123,7 +123,7 @@ static u64 gfxhub_v2_1_get_mc_fb_offset(struct amdgpu_device *adev)  static void gfxhub_v2_1_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	WREG32_SOC15_OFFSET(GC, 0, mmGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -291,7 +291,7 @@ static void gfxhub_v2_1_disable_identity_aperture(struct amdgpu_device *adev)  static void gfxhub_v2_1_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	int i;  	uint32_t tmp; @@ -340,7 +340,7 @@ static void gfxhub_v2_1_setup_vmid_config(struct amdgpu_device *adev)  static void gfxhub_v2_1_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned i;  	for (i = 0 ; i < 18; ++i) { @@ -381,7 +381,7 @@ static int gfxhub_v2_1_gart_enable(struct amdgpu_device *adev)  static void gfxhub_v2_1_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	u32 tmp;  	u32 i; @@ -462,7 +462,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v2_1_vmhub_funcs = {  static void gfxhub_v2_1_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(GC, 0, @@ -651,7 +651,7 @@ static void gfxhub_v2_1_restore_regs(struct amdgpu_device *adev)  static void gfxhub_v2_1_halt(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	int i;  	uint32_t tmp;  	int time = 1000; diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c index 13712640fa46..c53147f9c9fc 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.c @@ -119,7 +119,7 @@ static u64 gfxhub_v3_0_get_mc_fb_offset(struct amdgpu_device *adev)  static void gfxhub_v3_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	WREG32_SOC15_OFFSET(GC, 0, regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -290,7 +290,7 @@ static void gfxhub_v3_0_disable_identity_aperture(struct amdgpu_device *adev)  static void gfxhub_v3_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	int i;  	uint32_t tmp; @@ -339,7 +339,7 @@ static void gfxhub_v3_0_setup_vmid_config(struct amdgpu_device *adev)  static void gfxhub_v3_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned i;  	for (i = 0 ; i < 18; ++i) { @@ -380,7 +380,7 @@ static int gfxhub_v3_0_gart_enable(struct amdgpu_device *adev)  static void gfxhub_v3_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	u32 tmp;  	u32 i; @@ -463,7 +463,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v3_0_vmhub_funcs = {  static void gfxhub_v3_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(GC, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c index 6e0bd628c889..ae777487d72e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.c @@ -122,7 +122,7 @@ static u64 gfxhub_v3_0_3_get_mc_fb_offset(struct amdgpu_device *adev)  static void gfxhub_v3_0_3_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	WREG32_SOC15_OFFSET(GC, 0, regGCVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -295,7 +295,7 @@ static void gfxhub_v3_0_3_disable_identity_aperture(struct amdgpu_device *adev)  static void gfxhub_v3_0_3_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	int i;  	uint32_t tmp; @@ -344,7 +344,7 @@ static void gfxhub_v3_0_3_setup_vmid_config(struct amdgpu_device *adev)  static void gfxhub_v3_0_3_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	unsigned i;  	for (i = 0 ; i < 18; ++i) { @@ -373,7 +373,7 @@ static int gfxhub_v3_0_3_gart_enable(struct amdgpu_device *adev)  static void gfxhub_v3_0_3_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	u32 tmp;  	u32 i; @@ -451,7 +451,7 @@ static const struct amdgpu_vmhub_funcs gfxhub_v3_0_3_vmhub_funcs = {  static void gfxhub_v3_0_3_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(GC, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c index b213dcf8ca06..b2e42f1b0f12 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c @@ -76,7 +76,7 @@ gmc_v10_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  	switch (state) {  	case AMDGPU_IRQ_STATE_DISABLE:  		/* MM HUB */ -		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, false); +		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB0(0), false);  		/* GFX HUB */  		/* This works because this interrupt is only  		 * enabled at init/resume and disabled in @@ -84,11 +84,11 @@ gmc_v10_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  		 * change over the course of suspend/resume.  		 */  		if (!adev->in_s0ix) -			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, false); +			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB(0), false);  		break;  	case AMDGPU_IRQ_STATE_ENABLE:  		/* MM HUB */ -		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, true); +		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB0(0), true);  		/* GFX HUB */  		/* This works because this interrupt is only  		 * enabled at init/resume and disabled in @@ -96,7 +96,7 @@ gmc_v10_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  		 * change over the course of suspend/resume.  		 */  		if (!adev->in_s0ix) -			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, true); +			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB(0), true);  		break;  	default:  		break; @@ -139,7 +139,7 @@ static int gmc_v10_0_process_interrupt(struct amdgpu_device *adev,  		/* Try to handle the recoverable page faults by filling page  		 * tables  		 */ -		if (amdgpu_vm_handle_fault(adev, entry->pasid, addr, write_fault)) +		if (amdgpu_vm_handle_fault(adev, entry->pasid, 0, 0, addr, write_fault))  			return 1;  	} @@ -149,7 +149,7 @@ static int gmc_v10_0_process_interrupt(struct amdgpu_device *adev,  		 * be updated to avoid reading an incorrect value due to  		 * the new fast GRBM interface.  		 */ -		if ((entry->vmid_src == AMDGPU_GFXHUB_0) && +		if ((entry->vmid_src == AMDGPU_GFXHUB(0)) &&  		    (adev->ip_versions[GC_HWIP][0] < IP_VERSION(10, 3, 0)))  			RREG32(hub->vm_l2_pro_fault_status); @@ -212,8 +212,7 @@ static void gmc_v10_0_set_irq_funcs(struct amdgpu_device *adev)  static bool gmc_v10_0_use_invalidate_semaphore(struct amdgpu_device *adev,  				       uint32_t vmhub)  { -	return ((vmhub == AMDGPU_MMHUB_0 || -		 vmhub == AMDGPU_MMHUB_1) && +	return ((vmhub == AMDGPU_MMHUB0(0)) &&  		(!amdgpu_sriov_vf(adev)));  } @@ -249,7 +248,7 @@ static void gmc_v10_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,  	unsigned int i;  	unsigned char hub_ip = 0; -	hub_ip = (vmhub == AMDGPU_GFXHUB_0) ? +	hub_ip = (vmhub == AMDGPU_GFXHUB(0)) ?  		   GC_HWIP : MMHUB_HWIP;  	spin_lock(&adev->gmc.invalidate_lock); @@ -284,7 +283,7 @@ static void gmc_v10_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,  	 * Issue a dummy read to wait for the ACK register to be cleared  	 * to avoid a false ACK due to the new fast GRBM interface.  	 */ -	if ((vmhub == AMDGPU_GFXHUB_0) && +	if ((vmhub == AMDGPU_GFXHUB(0)) &&  	    (adev->ip_versions[GC_HWIP][0] < IP_VERSION(10, 3, 0)))  		RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_req +  				  hub->eng_distance * eng, hub_ip); @@ -343,7 +342,7 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	/* For SRIOV run time, driver shouldn't access the register through MMIO  	 * Directly use kiq to do the vm invalidation instead  	 */ -	if (adev->gfx.kiq.ring.sched.ready && !adev->enable_mes && +	if (adev->gfx.kiq[0].ring.sched.ready && !adev->enable_mes &&  	    (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&  	    down_read_trylock(&adev->reset_domain->sem)) {  		struct amdgpu_vmhub *hub = &adev->vmhub[vmhub]; @@ -361,19 +360,19 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	mutex_lock(&adev->mman.gtt_window_lock); -	if (vmhub == AMDGPU_MMHUB_0) { -		gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_MMHUB_0, 0); +	if (vmhub == AMDGPU_MMHUB0(0)) { +		gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_MMHUB0(0), 0);  		mutex_unlock(&adev->mman.gtt_window_lock);  		return;  	} -	BUG_ON(vmhub != AMDGPU_GFXHUB_0); +	BUG_ON(vmhub != AMDGPU_GFXHUB(0));  	if (!adev->mman.buffer_funcs_enabled ||  	    !adev->ib_pool_ready ||  	    amdgpu_in_reset(adev) ||  	    ring->sched.ready == false) { -		gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_GFXHUB_0, 0); +		gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_GFXHUB(0), 0);  		mutex_unlock(&adev->mman.gtt_window_lock);  		return;  	} @@ -415,12 +414,13 @@ error_alloc:   * @pasid: pasid to be flush   * @flush_type: the flush type   * @all_hub: Used with PACKET3_INVALIDATE_TLBS_ALL_HUB() + * @inst: is used to select which instance of KIQ to use for the invalidation   *   * Flush the TLB for the requested pasid.   */  static int gmc_v10_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  					uint16_t pasid, uint32_t flush_type, -					bool all_hub) +					bool all_hub, uint32_t inst)  {  	int vmid, i;  	signed long r; @@ -428,11 +428,11 @@ static int gmc_v10_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  	uint16_t queried_pasid;  	bool ret;  	u32 usec_timeout = amdgpu_sriov_vf(adev) ? SRIOV_USEC_TIMEOUT : adev->usec_timeout; -	struct amdgpu_ring *ring = &adev->gfx.kiq.ring; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_ring *ring = &adev->gfx.kiq[0].ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	if (amdgpu_emu_mode == 0 && ring->sched.ready) { -		spin_lock(&adev->gfx.kiq.ring_lock); +		spin_lock(&adev->gfx.kiq[0].ring_lock);  		/* 2 dwords flush + 8 dwords fence */  		amdgpu_ring_alloc(ring, kiq->pmf->invalidate_tlbs_size + 8);  		kiq->pmf->kiq_invalidate_tlbs(ring, @@ -440,12 +440,12 @@ static int gmc_v10_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);  		if (r) {  			amdgpu_ring_undo(ring); -			spin_unlock(&adev->gfx.kiq.ring_lock); +			spin_unlock(&adev->gfx.kiq[0].ring_lock);  			return -ETIME;  		}  		amdgpu_ring_commit(ring); -		spin_unlock(&adev->gfx.kiq.ring_lock); +		spin_unlock(&adev->gfx.kiq[0].ring_lock);  		r = amdgpu_fence_wait_polling(ring, seq, usec_timeout);  		if (r < 1) {  			dev_err(adev->dev, "wait for kiq fence error: %ld.\n", r); @@ -461,12 +461,12 @@ static int gmc_v10_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  				&queried_pasid);  		if (ret	&& queried_pasid == pasid) {  			if (all_hub) { -				for (i = 0; i < adev->num_vmhubs; i++) +				for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  					gmc_v10_0_flush_gpu_tlb(adev, vmid,  							i, flush_type);  			} else {  				gmc_v10_0_flush_gpu_tlb(adev, vmid, -						AMDGPU_GFXHUB_0, flush_type); +						AMDGPU_GFXHUB(0), flush_type);  			}  			if (!adev->enable_mes)  				break; @@ -534,7 +534,7 @@ static void gmc_v10_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid  	if (ring->is_mes_queue)  		return; -	if (ring->vm_hub == AMDGPU_GFXHUB_0) +	if (ring->vm_hub == AMDGPU_GFXHUB(0))  		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT) + vmid;  	else  		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT_MM) + vmid; @@ -929,7 +929,8 @@ static int gmc_v10_0_sw_init(void *handle)  	case IP_VERSION(10, 3, 6):  	case IP_VERSION(10, 3, 3):  	case IP_VERSION(10, 3, 7): -		adev->num_vmhubs = 2; +		set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB0(0), adev->vmhubs_mask);  		/*  		 * To fulfill 4-level page support,  		 * vm size is 256TB (48bit), maximum size of Navi10/Navi14/Navi12, @@ -1075,9 +1076,9 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)  	if (!adev->in_s0ix)  		adev->gfxhub.funcs->set_fault_enable_default(adev, value);  	adev->mmhub.funcs->set_fault_enable_default(adev, value); -	gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0); +	gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB0(0), 0);  	if (!adev->in_s0ix) -		gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB_0, 0); +		gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB(0), 0);  	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",  		 (unsigned)(adev->gmc.gart_size >> 20), diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c index d95f9fe8f1c5..c571f0d95994 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c @@ -31,6 +31,8 @@  #include "umc_v8_10.h"  #include "athub/athub_3_0_0_sh_mask.h"  #include "athub/athub_3_0_0_offset.h" +#include "dcn/dcn_3_2_0_offset.h" +#include "dcn/dcn_3_2_0_sh_mask.h"  #include "oss/osssys_6_0_0_offset.h"  #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"  #include "navi10_enum.h" @@ -62,7 +64,7 @@ gmc_v11_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  	switch (state) {  	case AMDGPU_IRQ_STATE_DISABLE:  		/* MM HUB */ -		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, false); +		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB0(0), false);  		/* GFX HUB */  		/* This works because this interrupt is only  		 * enabled at init/resume and disabled in @@ -70,11 +72,11 @@ gmc_v11_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  		 * change over the course of suspend/resume.  		 */  		if (!adev->in_s0ix) -			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, false); +			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB(0), false);  		break;  	case AMDGPU_IRQ_STATE_ENABLE:  		/* MM HUB */ -		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB_0, true); +		amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_MMHUB0(0), true);  		/* GFX HUB */  		/* This works because this interrupt is only  		 * enabled at init/resume and disabled in @@ -82,7 +84,7 @@ gmc_v11_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  		 * change over the course of suspend/resume.  		 */  		if (!adev->in_s0ix) -			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB_0, true); +			amdgpu_gmc_set_vm_fault_masks(adev, AMDGPU_GFXHUB(0), true);  		break;  	default:  		break; @@ -108,7 +110,7 @@ static int gmc_v11_0_process_interrupt(struct amdgpu_device *adev,  		 * be updated to avoid reading an incorrect value due to  		 * the new fast GRBM interface.  		 */ -		if (entry->vmid_src == AMDGPU_GFXHUB_0) +		if (entry->vmid_src == AMDGPU_GFXHUB(0))  			RREG32(hub->vm_l2_pro_fault_status);  		status = RREG32(hub->vm_l2_pro_fault_status); @@ -168,7 +170,7 @@ static void gmc_v11_0_set_irq_funcs(struct amdgpu_device *adev)  static bool gmc_v11_0_use_invalidate_semaphore(struct amdgpu_device *adev,  				       uint32_t vmhub)  { -	return ((vmhub == AMDGPU_MMHUB_0) && +	return ((vmhub == AMDGPU_MMHUB0(0)) &&  		(!amdgpu_sriov_vf(adev)));  } @@ -200,7 +202,7 @@ static void gmc_v11_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,  	unsigned int i;  	unsigned char hub_ip = 0; -	hub_ip = (vmhub == AMDGPU_GFXHUB_0) ? +	hub_ip = (vmhub == AMDGPU_GFXHUB(0)) ?  		   GC_HWIP : MMHUB_HWIP;  	spin_lock(&adev->gmc.invalidate_lock); @@ -249,7 +251,7 @@ static void gmc_v11_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,  			      hub->eng_distance * eng, 0, hub_ip);  	/* Issue additional private vm invalidation to MMHUB */ -	if ((vmhub != AMDGPU_GFXHUB_0) && +	if ((vmhub != AMDGPU_GFXHUB(0)) &&  	    (hub->vm_l2_bank_select_reserved_cid2) &&  		!amdgpu_sriov_vf(adev)) {  		inv_req = RREG32_NO_KIQ(hub->vm_l2_bank_select_reserved_cid2); @@ -282,7 +284,7 @@ static void gmc_v11_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,  static void gmc_v11_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  					uint32_t vmhub, uint32_t flush_type)  { -	if ((vmhub == AMDGPU_GFXHUB_0) && !adev->gfx.is_poweron) +	if ((vmhub == AMDGPU_GFXHUB(0)) && !adev->gfx.is_poweron)  		return;  	/* flush hdp cache */ @@ -291,7 +293,7 @@ static void gmc_v11_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	/* For SRIOV run time, driver shouldn't access the register through MMIO  	 * Directly use kiq to do the vm invalidation instead  	 */ -	if ((adev->gfx.kiq.ring.sched.ready || adev->mes.ring.sched.ready) && +	if ((adev->gfx.kiq[0].ring.sched.ready || adev->mes.ring.sched.ready) &&  	    (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev))) {  		struct amdgpu_vmhub *hub = &adev->vmhub[vmhub];  		const unsigned eng = 17; @@ -317,23 +319,24 @@ static void gmc_v11_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,   * @pasid: pasid to be flush   * @flush_type: the flush type   * @all_hub: flush all hubs + * @inst: is used to select which instance of KIQ to use for the invalidation   *   * Flush the TLB for the requested pasid.   */  static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  					uint16_t pasid, uint32_t flush_type, -					bool all_hub) +					bool all_hub, uint32_t inst)  {  	int vmid, i;  	signed long r;  	uint32_t seq;  	uint16_t queried_pasid;  	bool ret; -	struct amdgpu_ring *ring = &adev->gfx.kiq.ring; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_ring *ring = &adev->gfx.kiq[0].ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];  	if (amdgpu_emu_mode == 0 && ring->sched.ready) { -		spin_lock(&adev->gfx.kiq.ring_lock); +		spin_lock(&adev->gfx.kiq[0].ring_lock);  		/* 2 dwords flush + 8 dwords fence */  		amdgpu_ring_alloc(ring, kiq->pmf->invalidate_tlbs_size + 8);  		kiq->pmf->kiq_invalidate_tlbs(ring, @@ -341,12 +344,12 @@ static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);  		if (r) {  			amdgpu_ring_undo(ring); -			spin_unlock(&adev->gfx.kiq.ring_lock); +			spin_unlock(&adev->gfx.kiq[0].ring_lock);  			return -ETIME;  		}  		amdgpu_ring_commit(ring); -		spin_unlock(&adev->gfx.kiq.ring_lock); +		spin_unlock(&adev->gfx.kiq[0].ring_lock);  		r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout);  		if (r < 1) {  			dev_err(adev->dev, "wait for kiq fence error: %ld.\n", r); @@ -362,12 +365,12 @@ static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  				&queried_pasid);  		if (ret	&& queried_pasid == pasid) {  			if (all_hub) { -				for (i = 0; i < adev->num_vmhubs; i++) +				for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  					gmc_v11_0_flush_gpu_tlb(adev, vmid,  							i, flush_type);  			} else {  				gmc_v11_0_flush_gpu_tlb(adev, vmid, -						AMDGPU_GFXHUB_0, flush_type); +						AMDGPU_GFXHUB(0), flush_type);  			}  		}  	} @@ -433,7 +436,7 @@ static void gmc_v11_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid  	if (ring->is_mes_queue)  		return; -	if (ring->vm_hub == AMDGPU_GFXHUB_0) +	if (ring->vm_hub == AMDGPU_GFXHUB(0))  		reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT) + vmid;  	else  		reg = SOC15_REG_OFFSET(OSSSYS, 0, regIH_VMID_0_LUT_MM) + vmid; @@ -546,7 +549,24 @@ static void gmc_v11_0_get_vm_pte(struct amdgpu_device *adev,  static unsigned gmc_v11_0_get_vbios_fb_size(struct amdgpu_device *adev)  { -	return 0; +	u32 d1vga_control = RREG32_SOC15(DCE, 0, regD1VGA_CONTROL); +	unsigned size; + +	if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) { +		size = AMDGPU_VBIOS_VGA_ALLOCATION; +	} else { +		u32 viewport; +		u32 pitch; + +		viewport = RREG32_SOC15(DCE, 0, regHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION); +		pitch = RREG32_SOC15(DCE, 0, regHUBPREQ0_DCSURF_SURFACE_PITCH); +		size = (REG_GET_FIELD(viewport, +					HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_HEIGHT) * +				REG_GET_FIELD(pitch, HUBPREQ0_DCSURF_SURFACE_PITCH, PITCH) * +				4); +	} + +	return size;  }  static const struct amdgpu_gmc_funcs gmc_v11_0_gmc_funcs = { @@ -760,7 +780,8 @@ static int gmc_v11_0_sw_init(void *handle)  	case IP_VERSION(11, 0, 2):  	case IP_VERSION(11, 0, 3):  	case IP_VERSION(11, 0, 4): -		adev->num_vmhubs = 2; +		set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB0(0), adev->vmhubs_mask);  		/*  		 * To fulfill 4-level page support,  		 * vm size is 256TB (48bit), maximum size, @@ -867,7 +888,7 @@ static int gmc_v11_0_sw_fini(void *handle)  static void gmc_v11_0_init_golden_registers(struct amdgpu_device *adev)  {  	if (amdgpu_sriov_vf(adev)) { -		struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +		struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  		WREG32(hub->vm_contexts_disable, 0);  		return; @@ -902,7 +923,7 @@ static int gmc_v11_0_gart_enable(struct amdgpu_device *adev)  		false : true;  	adev->mmhub.funcs->set_fault_enable_default(adev, value); -	gmc_v11_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0); +	gmc_v11_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB0(0), 0);  	DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",  		 (unsigned)(adev->gmc.gart_size >> 20), diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index b7dad4e67813..aa754c95a0b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c @@ -808,7 +808,7 @@ static int gmc_v6_0_sw_init(void *handle)  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	adev->num_vmhubs = 1; +	set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);  	if (adev->flags & AMD_IS_APU) {  		adev->gmc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 402960b0174e..acd2b407860f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c @@ -419,12 +419,13 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)   * @pasid: pasid to be flush   * @flush_type: type of flush   * @all_hub: flush all hubs + * @inst: is used to select which instance of KIQ to use for the invalidation   *   * Flush the TLB for the requested pasid.   */  static int gmc_v7_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  					uint16_t pasid, uint32_t flush_type, -					bool all_hub) +					bool all_hub, uint32_t inst)  {  	int vmid;  	unsigned int tmp; @@ -977,7 +978,7 @@ static int gmc_v7_0_sw_init(void *handle)  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	adev->num_vmhubs = 1; +	set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);  	if (adev->flags & AMD_IS_APU) {  		adev->gmc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 504c1b34dab7..85dead2a5702 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -617,12 +617,13 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)   * @pasid: pasid to be flush   * @flush_type: type of flush   * @all_hub: flush all hubs + * @inst: is used to select which instance of KIQ to use for the invalidation   *   * Flush the TLB for the requested pasid.   */  static int gmc_v8_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  					uint16_t pasid, uint32_t flush_type, -					bool all_hub) +					bool all_hub, uint32_t inst)  {  	int vmid;  	unsigned int tmp; @@ -1093,7 +1094,7 @@ static int gmc_v8_0_sw_init(void *handle)  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	adev->num_vmhubs = 1; +	set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask);  	if (adev->flags & AMD_IS_APU) {  		adev->gmc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 2fe21cefd772..3ed286b72cae 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -79,6 +79,7 @@  #define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_DCN2                                                          0x05ea  #define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_DCN2_BASE_IDX                                                 2 +#define MAX_MEM_RANGES 8  static const char *gfxhub_client_ids[] = {  	"CB", @@ -481,7 +482,7 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  	switch (state) {  	case AMDGPU_IRQ_STATE_DISABLE: -		for (j = 0; j < adev->num_vmhubs; j++) { +		for_each_set_bit(j, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) {  			hub = &adev->vmhub[j];  			for (i = 0; i < 16; i++) {  				reg = hub->vm_context0_cntl + i; @@ -491,25 +492,25 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  				 * fini/suspend, so the overall state doesn't  				 * change over the course of suspend/resume.  				 */ -				if (adev->in_s0ix && (j == AMDGPU_GFXHUB_0)) +				if (adev->in_s0ix && (j == AMDGPU_GFXHUB(0)))  					continue; -				if (j == AMDGPU_GFXHUB_0) -					tmp = RREG32_SOC15_IP(GC, reg); -				else +				if (j >= AMDGPU_MMHUB0(0))  					tmp = RREG32_SOC15_IP(MMHUB, reg); +				else +					tmp = RREG32_SOC15_IP(GC, reg);  				tmp &= ~bits; -				if (j == AMDGPU_GFXHUB_0) -					WREG32_SOC15_IP(GC, reg, tmp); -				else +				if (j >= AMDGPU_MMHUB0(0))  					WREG32_SOC15_IP(MMHUB, reg, tmp); +				else +					WREG32_SOC15_IP(GC, reg, tmp);  			}  		}  		break;  	case AMDGPU_IRQ_STATE_ENABLE: -		for (j = 0; j < adev->num_vmhubs; j++) { +		for_each_set_bit(j, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) {  			hub = &adev->vmhub[j];  			for (i = 0; i < 16; i++) {  				reg = hub->vm_context0_cntl + i; @@ -519,20 +520,20 @@ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,  				 * fini/suspend, so the overall state doesn't  				 * change over the course of suspend/resume.  				 */ -				if (adev->in_s0ix && (j == AMDGPU_GFXHUB_0)) +				if (adev->in_s0ix && (j == AMDGPU_GFXHUB(0)))  					continue; -				if (j == AMDGPU_GFXHUB_0) -					tmp = RREG32_SOC15_IP(GC, reg); -				else +				if (j >= AMDGPU_MMHUB0(0))  					tmp = RREG32_SOC15_IP(MMHUB, reg); +				else +					tmp = RREG32_SOC15_IP(GC, reg);  				tmp |= bits; -				if (j == AMDGPU_GFXHUB_0) -					WREG32_SOC15_IP(GC, reg, tmp); -				else +				if (j >= AMDGPU_MMHUB0(0))  					WREG32_SOC15_IP(MMHUB, reg, tmp); +				else +					WREG32_SOC15_IP(GC, reg, tmp);  			}  		}  		break; @@ -556,11 +557,31 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  	const char *hub_name;  	u64 addr;  	uint32_t cam_index = 0; -	int ret; +	int ret, xcc_id = 0; +	uint32_t node_id; + +	node_id = entry->node_id;  	addr = (u64)entry->src_data[0] << 12;  	addr |= ((u64)entry->src_data[1] & 0xf) << 44; +	if (entry->client_id == SOC15_IH_CLIENTID_VMC) { +		hub_name = "mmhub0"; +		hub = &adev->vmhub[AMDGPU_MMHUB0(node_id / 4)]; +	} else if (entry->client_id == SOC15_IH_CLIENTID_VMC1) { +		hub_name = "mmhub1"; +		hub = &adev->vmhub[AMDGPU_MMHUB1(0)]; +	} else { +		hub_name = "gfxhub0"; +		if (adev->gfx.funcs->ih_node_to_logical_xcc) { +			xcc_id = adev->gfx.funcs->ih_node_to_logical_xcc(adev, +				node_id); +			if (xcc_id < 0) +				xcc_id = 0; +		} +		hub = &adev->vmhub[xcc_id]; +	} +  	if (retry_fault) {  		if (adev->irq.retry_cam_enabled) {  			/* Delegate it to a different ring if the hardware hasn't @@ -573,7 +594,8 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  			cam_index = entry->src_data[2] & 0x3ff; -			ret = amdgpu_vm_handle_fault(adev, entry->pasid, addr, write_fault); +			ret = amdgpu_vm_handle_fault(adev, entry->pasid, entry->vmid, node_id, +						     addr, write_fault);  			WDOORBELL32(adev->irq.retry_cam_doorbell_index, cam_index);  			if (ret)  				return 1; @@ -595,7 +617,8 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  			/* Try to handle the recoverable page faults by filling page  			 * tables  			 */ -			if (amdgpu_vm_handle_fault(adev, entry->pasid, addr, write_fault)) +			if (amdgpu_vm_handle_fault(adev, entry->pasid, entry->vmid, node_id, +						   addr, write_fault))  				return 1;  		}  	} @@ -603,16 +626,6 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  	if (!printk_ratelimit())  		return 0; -	if (entry->client_id == SOC15_IH_CLIENTID_VMC) { -		hub_name = "mmhub0"; -		hub = &adev->vmhub[AMDGPU_MMHUB_0]; -	} else if (entry->client_id == SOC15_IH_CLIENTID_VMC1) { -		hub_name = "mmhub1"; -		hub = &adev->vmhub[AMDGPU_MMHUB_1]; -	} else { -		hub_name = "gfxhub0"; -		hub = &adev->vmhub[AMDGPU_GFXHUB_0]; -	}  	memset(&task_info, 0, sizeof(struct amdgpu_task_info));  	amdgpu_vm_get_task_info(adev, entry->pasid, &task_info); @@ -628,6 +641,11 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  		addr, entry->client_id,  		soc15_ih_clientid_name[entry->client_id]); +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) +		dev_err(adev->dev, "  cookie node_id %d fault from die %s%d%s\n", +			node_id, node_id % 4 == 3 ? "RSV" : "AID", node_id / 4, +			node_id % 4 == 1 ? ".XCD0" : node_id % 4 == 2 ? ".XCD1" : ""); +  	if (amdgpu_sriov_vf(adev))  		return 0; @@ -636,7 +654,7 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  	 * be updated to avoid reading an incorrect value due to  	 * the new fast GRBM interface.  	 */ -	if ((entry->vmid_src == AMDGPU_GFXHUB_0) && +	if ((entry->vmid_src == AMDGPU_GFXHUB(0)) &&  	    (adev->ip_versions[GC_HWIP][0] < IP_VERSION(9, 4, 2)))  		RREG32(hub->vm_l2_pro_fault_status); @@ -645,11 +663,10 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  	rw = REG_GET_FIELD(status, VM_L2_PROTECTION_FAULT_STATUS, RW);  	WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1); -  	dev_err(adev->dev,  		"VM_L2_PROTECTION_FAULT_STATUS:0x%08X\n",  		status); -	if (hub == &adev->vmhub[AMDGPU_GFXHUB_0]) { +	if (entry->vmid_src == AMDGPU_GFXHUB(0)) {  		dev_err(adev->dev, "\t Faulty UTCL2 client ID: %s (0x%x)\n",  			cid >= ARRAY_SIZE(gfxhub_client_ids) ? "unknown" :  			gfxhub_client_ids[cid], @@ -759,8 +776,8 @@ static bool gmc_v9_0_use_invalidate_semaphore(struct amdgpu_device *adev,  	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3))  		return false; -	return ((vmhub == AMDGPU_MMHUB_0 || -		 vmhub == AMDGPU_MMHUB_1) && +	return ((vmhub == AMDGPU_MMHUB0(0) || +		 vmhub == AMDGPU_MMHUB1(0)) &&  		(!amdgpu_sriov_vf(adev)) &&  		(!(!(adev->apu_flags & AMD_APU_IS_RAVEN2) &&  		   (adev->apu_flags & AMD_APU_IS_PICASSO)))); @@ -803,7 +820,7 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	u32 j, inv_req, inv_req2, tmp;  	struct amdgpu_vmhub *hub; -	BUG_ON(vmhub >= adev->num_vmhubs); +	BUG_ON(vmhub >= AMDGPU_MAX_VMHUBS);  	hub = &adev->vmhub[vmhub];  	if (adev->gmc.xgmi.num_physical_nodes && @@ -816,6 +833,11 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  		 */  		inv_req = gmc_v9_0_get_invalidate_req(vmid, 2);  		inv_req2 = gmc_v9_0_get_invalidate_req(vmid, flush_type); +	} else if (flush_type == 2 && +		   adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) && +		   adev->rev_id == 0) { +		inv_req = gmc_v9_0_get_invalidate_req(vmid, 0); +		inv_req2 = gmc_v9_0_get_invalidate_req(vmid, flush_type);  	} else {  		inv_req = gmc_v9_0_get_invalidate_req(vmid, flush_type);  		inv_req2 = 0; @@ -824,7 +846,7 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	/* This is necessary for a HW workaround under SRIOV as well  	 * as GFXOFF under bare metal  	 */ -	if (adev->gfx.kiq.ring.sched.ready && +	if (adev->gfx.kiq[0].ring.sched.ready &&  	    (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&  	    down_read_trylock(&adev->reset_domain->sem)) {  		uint32_t req = hub->vm_inv_eng0_req + hub->eng_distance * eng; @@ -849,11 +871,10 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	if (use_semaphore) {  		for (j = 0; j < adev->usec_timeout; j++) {  			/* a read return value of 1 means semaphore acquire */ -			if (vmhub == AMDGPU_GFXHUB_0) -				tmp = RREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_sem + hub->eng_distance * eng); -			else +			if (vmhub >= AMDGPU_MMHUB0(0))  				tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, hub->vm_inv_eng0_sem + hub->eng_distance * eng); - +			else +				tmp = RREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_sem + hub->eng_distance * eng);  			if (tmp & 0x1)  				break;  			udelay(1); @@ -864,27 +885,26 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	}  	do { -		if (vmhub == AMDGPU_GFXHUB_0) -			WREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req); -		else +		if (vmhub >= AMDGPU_MMHUB0(0))  			WREG32_SOC15_IP_NO_KIQ(MMHUB, hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req); +		else +			WREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req);  		/*  		 * Issue a dummy read to wait for the ACK register to  		 * be cleared to avoid a false ACK due to the new fast  		 * GRBM interface.  		 */ -		if ((vmhub == AMDGPU_GFXHUB_0) && +		if ((vmhub == AMDGPU_GFXHUB(0)) &&  		    (adev->ip_versions[GC_HWIP][0] < IP_VERSION(9, 4, 2)))  			RREG32_NO_KIQ(hub->vm_inv_eng0_req +  				      hub->eng_distance * eng);  		for (j = 0; j < adev->usec_timeout; j++) { -			if (vmhub == AMDGPU_GFXHUB_0) -				tmp = RREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_ack + hub->eng_distance * eng); -			else +			if (vmhub >= AMDGPU_MMHUB0(0))  				tmp = RREG32_SOC15_IP_NO_KIQ(MMHUB, hub->vm_inv_eng0_ack + hub->eng_distance * eng); - +			else +				tmp = RREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_ack + hub->eng_distance * eng);  			if (tmp & (1 << vmid))  				break;  			udelay(1); @@ -900,10 +920,10 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  		 * add semaphore release after invalidation,  		 * write with 0 means semaphore release  		 */ -		if (vmhub == AMDGPU_GFXHUB_0) -			WREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_sem + hub->eng_distance * eng, 0); -		else +		if (vmhub >= AMDGPU_MMHUB0(0))  			WREG32_SOC15_IP_NO_KIQ(MMHUB, hub->vm_inv_eng0_sem + hub->eng_distance * eng, 0); +		else +			WREG32_SOC15_IP_NO_KIQ(GC, hub->vm_inv_eng0_sem + hub->eng_distance * eng, 0);  	}  	spin_unlock(&adev->gmc.invalidate_lock); @@ -921,12 +941,13 @@ static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,   * @pasid: pasid to be flush   * @flush_type: the flush type   * @all_hub: flush all hubs + * @inst: is used to select which instance of KIQ to use for the invalidation   *   * Flush the TLB for the requested pasid.   */  static int gmc_v9_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  					uint16_t pasid, uint32_t flush_type, -					bool all_hub) +					bool all_hub, uint32_t inst)  {  	int vmid, i;  	signed long r; @@ -934,8 +955,8 @@ static int gmc_v9_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  	uint16_t queried_pasid;  	bool ret;  	u32 usec_timeout = amdgpu_sriov_vf(adev) ? SRIOV_USEC_TIMEOUT : adev->usec_timeout; -	struct amdgpu_ring *ring = &adev->gfx.kiq.ring; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; +	struct amdgpu_ring *ring = &adev->gfx.kiq[inst].ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[inst];  	if (amdgpu_in_reset(adev))  		return -EIO; @@ -955,24 +976,31 @@ static int gmc_v9_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  		if (vega20_xgmi_wa)  			ndw += kiq->pmf->invalidate_tlbs_size; -		spin_lock(&adev->gfx.kiq.ring_lock); +		spin_lock(&adev->gfx.kiq[inst].ring_lock);  		/* 2 dwords flush + 8 dwords fence */  		amdgpu_ring_alloc(ring, ndw);  		if (vega20_xgmi_wa)  			kiq->pmf->kiq_invalidate_tlbs(ring,  						      pasid, 2, all_hub); + +		if (flush_type == 2 && +		    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3) && +		    adev->rev_id == 0) +			kiq->pmf->kiq_invalidate_tlbs(ring, +						pasid, 0, all_hub); +  		kiq->pmf->kiq_invalidate_tlbs(ring,  					pasid, flush_type, all_hub);  		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);  		if (r) {  			amdgpu_ring_undo(ring); -			spin_unlock(&adev->gfx.kiq.ring_lock); +			spin_unlock(&adev->gfx.kiq[inst].ring_lock);  			up_read(&adev->reset_domain->sem);  			return -ETIME;  		}  		amdgpu_ring_commit(ring); -		spin_unlock(&adev->gfx.kiq.ring_lock); +		spin_unlock(&adev->gfx.kiq[inst].ring_lock);  		r = amdgpu_fence_wait_polling(ring, seq, usec_timeout);  		if (r < 1) {  			dev_err(adev->dev, "wait for kiq fence error: %ld.\n", r); @@ -989,12 +1017,12 @@ static int gmc_v9_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  				&queried_pasid);  		if (ret && queried_pasid == pasid) {  			if (all_hub) { -				for (i = 0; i < adev->num_vmhubs; i++) +				for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)  					gmc_v9_0_flush_gpu_tlb(adev, vmid,  							i, flush_type);  			} else {  				gmc_v9_0_flush_gpu_tlb(adev, vmid, -						AMDGPU_GFXHUB_0, flush_type); +						AMDGPU_GFXHUB(0), flush_type);  			}  			break;  		} @@ -1060,10 +1088,10 @@ static void gmc_v9_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,  	uint32_t reg;  	/* Do nothing because there's no lut register for mmhub1. */ -	if (ring->vm_hub == AMDGPU_MMHUB_1) +	if (ring->vm_hub == AMDGPU_MMHUB1(0))  		return; -	if (ring->vm_hub == AMDGPU_GFXHUB_0) +	if (ring->vm_hub == AMDGPU_GFXHUB(0))  		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT) + vmid;  	else  		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT_MM) + vmid; @@ -1159,13 +1187,14 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,  	bool is_vram = bo->tbo.resource->mem_type == TTM_PL_VRAM;  	bool coherent = bo->flags & AMDGPU_GEM_CREATE_COHERENT;  	bool uncached = bo->flags & AMDGPU_GEM_CREATE_UNCACHED; -	unsigned int mtype; +	struct amdgpu_vm *vm = mapping->bo_va->base.vm; +	unsigned int mtype_local, mtype;  	bool snoop = false; +	bool is_local;  	switch (adev->ip_versions[GC_HWIP][0]) {  	case IP_VERSION(9, 4, 1):  	case IP_VERSION(9, 4, 2): -	case IP_VERSION(9, 4, 3):  		if (is_vram) {  			if (bo_adev == adev) {  				if (uncached) @@ -1200,6 +1229,43 @@ static void gmc_v9_0_get_coherence_flags(struct amdgpu_device *adev,  			snoop = true;  		}  		break; +	case IP_VERSION(9, 4, 3): +		/* Only local VRAM BOs or system memory on non-NUMA APUs +		 * can be assumed to be local in their entirety. Choose +		 * MTYPE_NC as safe fallback for all system memory BOs on +		 * NUMA systems. Their MTYPE can be overridden per-page in +		 * gmc_v9_0_override_vm_pte_flags. +		 */ +		mtype_local = MTYPE_RW; +		if (amdgpu_mtype_local == 1) { +			DRM_INFO_ONCE("Using MTYPE_NC for local memory\n"); +			mtype_local = MTYPE_NC; +		} else if (amdgpu_mtype_local == 2) { +			DRM_INFO_ONCE("Using MTYPE_CC for local memory\n"); +			mtype_local = MTYPE_CC; +		} else { +			DRM_INFO_ONCE("Using MTYPE_RW for local memory\n"); +		} +		is_local = (!is_vram && (adev->flags & AMD_IS_APU) && +			    num_possible_nodes() <= 1) || +			   (is_vram && adev == bo_adev && +			    KFD_XCP_MEM_ID(adev, bo->xcp_id) == vm->mem_id); +		snoop = true; +		if (uncached) { +			mtype = MTYPE_UC; +		} else if (adev->flags & AMD_IS_APU) { +			mtype = is_local ? mtype_local : MTYPE_NC; +		} else { +			/* dGPU */ +			if (is_local) +				mtype = mtype_local; +			else if (is_vram) +				mtype = MTYPE_NC; +			else +				mtype = MTYPE_UC; +		} + +		break;  	default:  		if (uncached || coherent)  			mtype = MTYPE_UC; @@ -1241,6 +1307,72 @@ static void gmc_v9_0_get_vm_pte(struct amdgpu_device *adev,  					     mapping, flags);  } +static void gmc_v9_0_override_vm_pte_flags(struct amdgpu_device *adev, +					   struct amdgpu_vm *vm, +					   uint64_t addr, uint64_t *flags) +{ +	int local_node, nid; + +	/* Only GFX 9.4.3 APUs associate GPUs with NUMA nodes. Local system +	 * memory can use more efficient MTYPEs. +	 */ +	if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 3)) +		return; + +	/* Only direct-mapped memory allows us to determine the NUMA node from +	 * the DMA address. +	 */ +	if (!adev->ram_is_direct_mapped) { +		dev_dbg(adev->dev, "RAM is not direct mapped\n"); +		return; +	} + +	/* Only override mappings with MTYPE_NC, which is the safe default for +	 * cacheable memory. +	 */ +	if ((*flags & AMDGPU_PTE_MTYPE_VG10_MASK) != +	    AMDGPU_PTE_MTYPE_VG10(MTYPE_NC)) { +		dev_dbg(adev->dev, "MTYPE is not NC\n"); +		return; +	} + +	/* FIXME: Only supported on native mode for now. For carve-out, the +	 * NUMA affinity of the GPU/VM needs to come from the PCI info because +	 * memory partitions are not associated with different NUMA nodes. +	 */ +	if (adev->gmc.is_app_apu && vm->mem_id >= 0) { +		local_node = adev->gmc.mem_partitions[vm->mem_id].numa.node; +	} else { +		dev_dbg(adev->dev, "Only native mode APU is supported.\n"); +		return; +	} + +	/* Only handle real RAM. Mappings of PCIe resources don't have struct +	 * page or NUMA nodes. +	 */ +	if (!page_is_ram(addr >> PAGE_SHIFT)) { +		dev_dbg(adev->dev, "Page is not RAM.\n"); +		return; +	} +	nid = pfn_to_nid(addr >> PAGE_SHIFT); +	dev_dbg(adev->dev, "vm->mem_id=%d, local_node=%d, nid=%d\n", +		vm->mem_id, local_node, nid); +	if (nid == local_node) { +		uint64_t old_flags = *flags; +		unsigned int mtype_local = MTYPE_RW; + +		if (amdgpu_mtype_local == 1) +			mtype_local = MTYPE_NC; +		else if (amdgpu_mtype_local == 2) +			mtype_local = MTYPE_CC; + +		*flags = (*flags & ~AMDGPU_PTE_MTYPE_VG10_MASK) | +			 AMDGPU_PTE_MTYPE_VG10(mtype_local); +		dev_dbg(adev->dev, "flags updated from %llx to %llx\n", +			old_flags, *flags); +	} +} +  static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)  {  	u32 d1vga_control = RREG32_SOC15(DCE, 0, mmD1VGA_CONTROL); @@ -1283,6 +1415,27 @@ static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)  	return size;  } +static enum amdgpu_memory_partition +gmc_v9_0_get_memory_partition(struct amdgpu_device *adev, u32 *supp_modes) +{ +	enum amdgpu_memory_partition mode = UNKNOWN_MEMORY_PARTITION_MODE; + +	if (adev->nbio.funcs->get_memory_partition_mode) +		mode = adev->nbio.funcs->get_memory_partition_mode(adev, +								   supp_modes); + +	return mode; +} + +static enum amdgpu_memory_partition +gmc_v9_0_query_memory_partition(struct amdgpu_device *adev) +{ +	if (amdgpu_sriov_vf(adev)) +		return AMDGPU_NPS1_PARTITION_MODE; + +	return gmc_v9_0_get_memory_partition(adev, NULL); +} +  static const struct amdgpu_gmc_funcs gmc_v9_0_gmc_funcs = {  	.flush_gpu_tlb = gmc_v9_0_flush_gpu_tlb,  	.flush_gpu_tlb_pasid = gmc_v9_0_flush_gpu_tlb_pasid, @@ -1291,7 +1444,9 @@ static const struct amdgpu_gmc_funcs gmc_v9_0_gmc_funcs = {  	.map_mtype = gmc_v9_0_map_mtype,  	.get_vm_pde = gmc_v9_0_get_vm_pde,  	.get_vm_pte = gmc_v9_0_get_vm_pte, +	.override_vm_pte_flags = gmc_v9_0_override_vm_pte_flags,  	.get_vbios_fb_size = gmc_v9_0_get_vbios_fb_size, +	.query_mem_partition_mode = &gmc_v9_0_query_memory_partition,  };  static void gmc_v9_0_set_gmc_funcs(struct amdgpu_device *adev) @@ -1372,6 +1527,9 @@ static void gmc_v9_0_set_mmhub_ras_funcs(struct amdgpu_device *adev)  	case IP_VERSION(9, 4, 2):  		adev->mmhub.ras = &mmhub_v1_7_ras;  		break; +	case IP_VERSION(1, 8, 0): +		adev->mmhub.ras = &mmhub_v1_8_ras; +		break;  	default:  		/* mmhub ras is not available */  		break; @@ -1419,9 +1577,13 @@ static int gmc_v9_0_early_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	/* ARCT and VEGA20 don't have XGMI defined in their IP discovery tables */ -	if (adev->asic_type == CHIP_VEGA20 || -	    adev->asic_type == CHIP_ARCTURUS) +	/* +	 * 9.4.0, 9.4.1 and 9.4.3 don't have XGMI defined +	 * in their IP discovery tables +	 */ +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 0) || +	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 1) || +	    adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3))  		adev->gmc.xgmi.supported = true;  	if (adev->ip_versions[XGMI_HWIP][0] == IP_VERSION(6, 1, 0)) { @@ -1430,6 +1592,20 @@ static int gmc_v9_0_early_init(void *handle)  			adev->smuio.funcs->is_host_gpu_xgmi_supported(adev);  	} +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) { +		enum amdgpu_pkg_type pkg_type = +			adev->smuio.funcs->get_pkg_type(adev); +		/* On GFXIP 9.4.3. APU, there is no physical VRAM domain present +		 * and the APU, can be in used two possible modes: +		 *  - carveout mode +		 *  - native APU mode +		 * "is_app_apu" can be used to identify the APU in the native +		 * mode. +		 */ +		adev->gmc.is_app_apu = (pkg_type == AMDGPU_PKG_TYPE_APU && +					!pci_resource_len(adev->pdev, 0)); +	} +  	gmc_v9_0_set_gmc_funcs(adev);  	gmc_v9_0_set_irq_funcs(adev);  	gmc_v9_0_set_umc_funcs(adev); @@ -1525,8 +1701,13 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)  	int r;  	/* size in MB on si */ -	adev->gmc.mc_vram_size = -		adev->nbio.funcs->get_memsize(adev) * 1024ULL * 1024ULL; +	if (!adev->gmc.is_app_apu) { +		adev->gmc.mc_vram_size = +			adev->nbio.funcs->get_memsize(adev) * 1024ULL * 1024ULL; +	} else { +		DRM_DEBUG("Set mc_vram_size = 0 for APP APU\n"); +		adev->gmc.mc_vram_size = 0; +	}  	adev->gmc.real_vram_size = adev->gmc.mc_vram_size;  	if (!(adev->flags & AMD_IS_APU) && @@ -1551,7 +1732,8 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)  	 */  	/* check whether both host-gpu and gpu-gpu xgmi links exist */ -	if (((adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) || +	if ((!amdgpu_sriov_vf(adev) && +		(adev->flags & AMD_IS_APU) && !amdgpu_passthrough(adev)) ||  	    (adev->gmc.xgmi.supported &&  	     adev->gmc.xgmi.connected_to_cpu)) {  		adev->gmc.aper_base = @@ -1618,12 +1800,18 @@ static int gmc_v9_0_gart_init(struct amdgpu_device *adev)  	adev->gart.gart_pte_flags = AMDGPU_PTE_MTYPE_VG10(MTYPE_UC) |  				 AMDGPU_PTE_EXECUTABLE; -	r = amdgpu_gart_table_vram_alloc(adev); -	if (r) -		return r; +	if (!adev->gmc.real_vram_size) { +		dev_info(adev->dev, "Put GART in system memory for APU\n"); +		r = amdgpu_gart_table_ram_alloc(adev); +		if (r) +			dev_err(adev->dev, "Failed to allocate GART in system memory\n"); +	} else { +		r = amdgpu_gart_table_vram_alloc(adev); +		if (r) +			return r; -	if (adev->gmc.xgmi.connected_to_cpu) { -		r = amdgpu_gmc_pdb0_alloc(adev); +		if (adev->gmc.xgmi.connected_to_cpu) +			r = amdgpu_gmc_pdb0_alloc(adev);  	}  	return r; @@ -1644,10 +1832,178 @@ static void gmc_v9_0_save_registers(struct amdgpu_device *adev)  		adev->gmc.sdpif_register = RREG32_SOC15(DCE, 0, mmDCHUBBUB_SDPIF_MMIO_CNTRL_0);  } +static bool gmc_v9_0_validate_partition_info(struct amdgpu_device *adev) +{ +	enum amdgpu_memory_partition mode; +	u32 supp_modes; +	bool valid; + +	mode = gmc_v9_0_get_memory_partition(adev, &supp_modes); + +	/* Mode detected by hardware not present in supported modes */ +	if ((mode != UNKNOWN_MEMORY_PARTITION_MODE) && +	    !(BIT(mode - 1) & supp_modes)) +		return false; + +	switch (mode) { +	case UNKNOWN_MEMORY_PARTITION_MODE: +	case AMDGPU_NPS1_PARTITION_MODE: +		valid = (adev->gmc.num_mem_partitions == 1); +		break; +	case AMDGPU_NPS2_PARTITION_MODE: +		valid = (adev->gmc.num_mem_partitions == 2); +		break; +	case AMDGPU_NPS4_PARTITION_MODE: +		valid = (adev->gmc.num_mem_partitions == 3 || +			 adev->gmc.num_mem_partitions == 4); +		break; +	default: +		valid = false; +	} + +	return valid; +} + +static bool gmc_v9_0_is_node_present(int *node_ids, int num_ids, int nid) +{ +	int i; + +	/* Check if node with id 'nid' is present in 'node_ids' array */ +	for (i = 0; i < num_ids; ++i) +		if (node_ids[i] == nid) +			return true; + +	return false; +} + +static void +gmc_v9_0_init_acpi_mem_ranges(struct amdgpu_device *adev, +			      struct amdgpu_mem_partition_info *mem_ranges) +{ +	int num_ranges = 0, ret, mem_groups; +	struct amdgpu_numa_info numa_info; +	int node_ids[MAX_MEM_RANGES]; +	int num_xcc, xcc_id; +	uint32_t xcc_mask; + +	num_xcc = NUM_XCC(adev->gfx.xcc_mask); +	xcc_mask = (1U << num_xcc) - 1; +	mem_groups = hweight32(adev->aid_mask); + +	for_each_inst(xcc_id, xcc_mask)	{ +		ret = amdgpu_acpi_get_mem_info(adev, xcc_id, &numa_info); +		if (ret) +			continue; + +		if (numa_info.nid == NUMA_NO_NODE) { +			mem_ranges[0].size = numa_info.size; +			mem_ranges[0].numa.node = numa_info.nid; +			num_ranges = 1; +			break; +		} + +		if (gmc_v9_0_is_node_present(node_ids, num_ranges, +					     numa_info.nid)) +			continue; + +		node_ids[num_ranges] = numa_info.nid; +		mem_ranges[num_ranges].numa.node = numa_info.nid; +		mem_ranges[num_ranges].size = numa_info.size; +		++num_ranges; +	} + +	adev->gmc.num_mem_partitions = num_ranges; + +	/* If there is only partition, don't use entire size */ +	if (adev->gmc.num_mem_partitions == 1) { +		mem_ranges[0].size = mem_ranges[0].size * (mem_groups - 1); +		do_div(mem_ranges[0].size, mem_groups); +	} +} + +static void +gmc_v9_0_init_sw_mem_ranges(struct amdgpu_device *adev, +			    struct amdgpu_mem_partition_info *mem_ranges) +{ +	enum amdgpu_memory_partition mode; +	u32 start_addr = 0, size; +	int i; + +	mode = gmc_v9_0_query_memory_partition(adev); + +	switch (mode) { +	case UNKNOWN_MEMORY_PARTITION_MODE: +	case AMDGPU_NPS1_PARTITION_MODE: +		adev->gmc.num_mem_partitions = 1; +		break; +	case AMDGPU_NPS2_PARTITION_MODE: +		adev->gmc.num_mem_partitions = 2; +		break; +	case AMDGPU_NPS4_PARTITION_MODE: +		if (adev->flags & AMD_IS_APU) +			adev->gmc.num_mem_partitions = 3; +		else +			adev->gmc.num_mem_partitions = 4; +		break; +	default: +		adev->gmc.num_mem_partitions = 1; +		break; +	} + +	size = adev->gmc.real_vram_size >> AMDGPU_GPU_PAGE_SHIFT; +	size /= adev->gmc.num_mem_partitions; + +	for (i = 0; i < adev->gmc.num_mem_partitions; ++i) { +		mem_ranges[i].range.fpfn = start_addr; +		mem_ranges[i].size = ((u64)size << AMDGPU_GPU_PAGE_SHIFT); +		mem_ranges[i].range.lpfn = start_addr + size - 1; +		start_addr += size; +	} + +	/* Adjust the last one */ +	mem_ranges[adev->gmc.num_mem_partitions - 1].range.lpfn = +		(adev->gmc.real_vram_size >> AMDGPU_GPU_PAGE_SHIFT) - 1; +	mem_ranges[adev->gmc.num_mem_partitions - 1].size = +		adev->gmc.real_vram_size - +		((u64)mem_ranges[adev->gmc.num_mem_partitions - 1].range.fpfn +		 << AMDGPU_GPU_PAGE_SHIFT); +} + +static int gmc_v9_0_init_mem_ranges(struct amdgpu_device *adev) +{ +	bool valid; + +	adev->gmc.mem_partitions = kzalloc( +		MAX_MEM_RANGES * sizeof(struct amdgpu_mem_partition_info), +		GFP_KERNEL); + +	if (!adev->gmc.mem_partitions) +		return -ENOMEM; + +	/* TODO : Get the range from PSP/Discovery for dGPU */ +	if (adev->gmc.is_app_apu) +		gmc_v9_0_init_acpi_mem_ranges(adev, adev->gmc.mem_partitions); +	else +		gmc_v9_0_init_sw_mem_ranges(adev, adev->gmc.mem_partitions); + +	if (amdgpu_sriov_vf(adev)) +		valid = true; +	else +		valid = gmc_v9_0_validate_partition_info(adev); +	if (!valid) { +		/* TODO: handle invalid case */ +		dev_WARN(adev->dev, +			 "Mem ranges not matching with hardware config"); +	} + +	return 0; +} +  static int gmc_v9_0_sw_init(void *handle)  {  	int r, vram_width = 0, vram_type = 0, vram_vendor = 0, dma_addr_bits;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	unsigned long inst_mask = adev->aid_mask;  	adev->gfxhub.funcs->init(adev); @@ -1655,38 +2011,54 @@ static int gmc_v9_0_sw_init(void *handle)  	spin_lock_init(&adev->gmc.invalidate_lock); -	r = amdgpu_atomfirmware_get_vram_info(adev, -		&vram_width, &vram_type, &vram_vendor); -	if (amdgpu_sriov_vf(adev)) -		/* For Vega10 SR-IOV, vram_width can't be read from ATOM as RAVEN, -		 * and DF related registers is not readable, seems hardcord is the -		 * only way to set the correct vram_width -		 */ -		adev->gmc.vram_width = 2048; -	else if (amdgpu_emu_mode != 1) -		adev->gmc.vram_width = vram_width; +	if (!(adev->bios) || adev->gmc.is_app_apu) { +		if (adev->flags & AMD_IS_APU) { +			if (adev->gmc.is_app_apu) { +				adev->gmc.vram_type = AMDGPU_VRAM_TYPE_HBM; +				adev->gmc.vram_width = 128 * 64; +			} else { +				adev->gmc.vram_type = AMDGPU_VRAM_TYPE_DDR4; +				adev->gmc.vram_width = 64 * 64; +			} +		} else { +			adev->gmc.vram_type = AMDGPU_VRAM_TYPE_HBM; +			adev->gmc.vram_width = 128 * 64; +		} +	} else { +		r = amdgpu_atomfirmware_get_vram_info(adev, +			&vram_width, &vram_type, &vram_vendor); +		if (amdgpu_sriov_vf(adev)) +			/* For Vega10 SR-IOV, vram_width can't be read from ATOM as RAVEN, +			 * and DF related registers is not readable, seems hardcord is the +			 * only way to set the correct vram_width +			 */ +			adev->gmc.vram_width = 2048; +		else if (amdgpu_emu_mode != 1) +			adev->gmc.vram_width = vram_width; -	if (!adev->gmc.vram_width) { -		int chansize, numchan; +		if (!adev->gmc.vram_width) { +			int chansize, numchan; -		/* hbm memory channel size */ -		if (adev->flags & AMD_IS_APU) -			chansize = 64; -		else -			chansize = 128; -		if (adev->df.funcs && -		    adev->df.funcs->get_hbm_channel_number) { -			numchan = adev->df.funcs->get_hbm_channel_number(adev); -			adev->gmc.vram_width = numchan * chansize; +			/* hbm memory channel size */ +			if (adev->flags & AMD_IS_APU) +				chansize = 64; +			else +				chansize = 128; +			if (adev->df.funcs && +			    adev->df.funcs->get_hbm_channel_number) { +				numchan = adev->df.funcs->get_hbm_channel_number(adev); +				adev->gmc.vram_width = numchan * chansize; +			}  		} -	} -	adev->gmc.vram_type = vram_type; -	adev->gmc.vram_vendor = vram_vendor; +		adev->gmc.vram_type = vram_type; +		adev->gmc.vram_vendor = vram_vendor; +	}  	switch (adev->ip_versions[GC_HWIP][0]) {  	case IP_VERSION(9, 1, 0):  	case IP_VERSION(9, 2, 2): -		adev->num_vmhubs = 2; +		set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB0(0), adev->vmhubs_mask);  		if (adev->rev_id == 0x0 || adev->rev_id == 0x1) {  			amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48); @@ -1702,9 +2074,8 @@ static int gmc_v9_0_sw_init(void *handle)  	case IP_VERSION(9, 4, 0):  	case IP_VERSION(9, 3, 0):  	case IP_VERSION(9, 4, 2): -	case IP_VERSION(9, 4, 3): -		adev->num_vmhubs = 2; - +		set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB0(0), adev->vmhubs_mask);  		/*  		 * To fulfill 4-level page support, @@ -1720,12 +2091,23 @@ static int gmc_v9_0_sw_init(void *handle)  			adev->gmc.translate_further = adev->vm_manager.num_level > 1;  		break;  	case IP_VERSION(9, 4, 1): -		adev->num_vmhubs = 3; +		set_bit(AMDGPU_GFXHUB(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB0(0), adev->vmhubs_mask); +		set_bit(AMDGPU_MMHUB1(0), adev->vmhubs_mask);  		/* Keep the vm size same with Vega20 */  		amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48);  		adev->gmc.translate_further = adev->vm_manager.num_level > 1;  		break; +	case IP_VERSION(9, 4, 3): +		bitmap_set(adev->vmhubs_mask, AMDGPU_GFXHUB(0), +				  NUM_XCC(adev->gfx.xcc_mask)); + +		inst_mask <<= AMDGPU_MMHUB0(0); +		bitmap_or(adev->vmhubs_mask, adev->vmhubs_mask, &inst_mask, 32); + +		amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48); +		break;  	default:  		break;  	} @@ -1764,7 +2146,7 @@ static int gmc_v9_0_sw_init(void *handle)  	 */  	adev->gmc.mc_mask = 0xffffffffffffULL; /* 48 bit MC */ -	dma_addr_bits = adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 2) ? 48:44; +	dma_addr_bits = adev->ip_versions[GC_HWIP][0] >= IP_VERSION(9, 4, 2) ? 48:44;  	r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(dma_addr_bits));  	if (r) {  		printk(KERN_WARNING "amdgpu: No suitable DMA available.\n"); @@ -1778,6 +2160,12 @@ static int gmc_v9_0_sw_init(void *handle)  	amdgpu_gmc_get_vbios_allocations(adev); +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) { +		r = gmc_v9_0_init_mem_ranges(adev); +		if (r) +			return r; +	} +  	/* Memory manager */  	r = amdgpu_bo_init(adev);  	if (r) @@ -1810,6 +2198,9 @@ static int gmc_v9_0_sw_init(void *handle)  	if (r)  		return r; +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) +		amdgpu_gmc_sysfs_init(adev); +  	return 0;  } @@ -1817,10 +2208,20 @@ static int gmc_v9_0_sw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) +		amdgpu_gmc_sysfs_fini(adev); +	adev->gmc.num_mem_partitions = 0; +	kfree(adev->gmc.mem_partitions); +  	amdgpu_gmc_ras_fini(adev);  	amdgpu_gem_force_release(adev);  	amdgpu_vm_manager_fini(adev); -	amdgpu_gart_table_vram_free(adev); +	if (!adev->gmc.real_vram_size) { +		dev_info(adev->dev, "Put GART in system memory for APU free\n"); +		amdgpu_gart_table_ram_free(adev); +	} else { +		amdgpu_gart_table_vram_free(adev); +	}  	amdgpu_bo_free_kernel(&adev->gmc.pdb0_bo, NULL, &adev->gmc.ptr_pdb0);  	amdgpu_bo_fini(adev); @@ -1946,8 +2347,8 @@ static int gmc_v9_0_hw_init(void *handle)  			adev->gfxhub.funcs->set_fault_enable_default(adev, value);  		adev->mmhub.funcs->set_fault_enable_default(adev, value);  	} -	for (i = 0; i < adev->num_vmhubs; ++i) { -		if (adev->in_s0ix && (i == AMDGPU_GFXHUB_0)) +	for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS) { +		if (adev->in_s0ix && (i == AMDGPU_GFXHUB(0)))  			continue;  		gmc_v9_0_flush_gpu_tlb(adev, 0, i, 0);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c index a3076eb8af6a..77595e9622da 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c @@ -437,7 +437,7 @@ static int jpeg_v1_0_process_interrupt(struct amdgpu_device *adev,  	switch (entry->src_id) {  	case 126: -		amdgpu_fence_process(&adev->jpeg.inst->ring_dec); +		amdgpu_fence_process(adev->jpeg.inst->ring_dec);  		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n", @@ -460,6 +460,7 @@ int jpeg_v1_0_early_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	adev->jpeg.num_jpeg_inst = 1; +	adev->jpeg.num_jpeg_rings = 1;  	jpeg_v1_0_set_dec_ring_funcs(adev);  	jpeg_v1_0_set_irq_funcs(adev); @@ -484,15 +485,15 @@ int jpeg_v1_0_sw_init(void *handle)  	if (r)  		return r; -	ring = &adev->jpeg.inst->ring_dec; -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring = adev->jpeg.inst->ring_dec; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "jpeg_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq,  			     0, AMDGPU_RING_PRIO_DEFAULT, NULL);  	if (r)  		return r; -	adev->jpeg.internal.jpeg_pitch = adev->jpeg.inst->external.jpeg_pitch = +	adev->jpeg.internal.jpeg_pitch[0] = adev->jpeg.inst->external.jpeg_pitch[0] =  		SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH);  	return 0; @@ -509,7 +510,7 @@ void jpeg_v1_0_sw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	amdgpu_ring_fini(&adev->jpeg.inst[0].ring_dec); +	amdgpu_ring_fini(adev->jpeg.inst->ring_dec);  }  /** @@ -522,7 +523,7 @@ void jpeg_v1_0_sw_fini(void *handle)   */  void jpeg_v1_0_start(struct amdgpu_device *adev, int mode)  { -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	if (mode == 0) {  		WREG32_SOC15(JPEG, 0, mmUVD_LMI_JRBC_RB_VMID, 0); @@ -579,7 +580,7 @@ static const struct amdgpu_ring_funcs jpeg_v1_0_decode_ring_vm_funcs = {  static void jpeg_v1_0_set_dec_ring_funcs(struct amdgpu_device *adev)  { -	adev->jpeg.inst->ring_dec.funcs = &jpeg_v1_0_decode_ring_vm_funcs; +	adev->jpeg.inst->ring_dec->funcs = &jpeg_v1_0_decode_ring_vm_funcs;  	DRM_INFO("JPEG decode is enabled in VM mode\n");  } diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c index 0eddf7c824a7..c25d4a07350b 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c @@ -49,6 +49,7 @@ static int jpeg_v2_0_early_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	adev->jpeg.num_jpeg_inst = 1; +	adev->jpeg.num_jpeg_rings = 1;  	jpeg_v2_0_set_dec_ring_funcs(adev);  	jpeg_v2_0_set_irq_funcs(adev); @@ -83,18 +84,18 @@ static int jpeg_v2_0_sw_init(void *handle)  	if (r)  		return r; -	ring = &adev->jpeg.inst->ring_dec; +	ring = adev->jpeg.inst->ring_dec;  	ring->use_doorbell = true;  	ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1; -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "jpeg_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq,  			     0, AMDGPU_RING_PRIO_DEFAULT, NULL);  	if (r)  		return r; -	adev->jpeg.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; -	adev->jpeg.inst->external.jpeg_pitch = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH); +	adev->jpeg.internal.jpeg_pitch[0] = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; +	adev->jpeg.inst->external.jpeg_pitch[0] = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH);  	return 0;  } @@ -129,7 +130,7 @@ static int jpeg_v2_0_sw_fini(void *handle)  static int jpeg_v2_0_hw_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell, @@ -312,7 +313,7 @@ static void jpeg_v2_0_enable_clock_gating(struct amdgpu_device *adev)   */  static int jpeg_v2_0_start(struct amdgpu_device *adev)  { -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	if (adev->pm.dpm_enabled) @@ -729,7 +730,7 @@ static int jpeg_v2_0_process_interrupt(struct amdgpu_device *adev,  	switch (entry->src_id) {  	case VCN_2_0__SRCID__JPEG_DECODE: -		amdgpu_fence_process(&adev->jpeg.inst->ring_dec); +		amdgpu_fence_process(adev->jpeg.inst->ring_dec);  		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n", @@ -791,7 +792,7 @@ static const struct amdgpu_ring_funcs jpeg_v2_0_dec_ring_vm_funcs = {  static void jpeg_v2_0_set_dec_ring_funcs(struct amdgpu_device *adev)  { -	adev->jpeg.inst->ring_dec.funcs = &jpeg_v2_0_dec_ring_vm_funcs; +	adev->jpeg.inst->ring_dec->funcs = &jpeg_v2_0_dec_ring_vm_funcs;  	DRM_INFO("JPEG decode is enabled in VM mode\n");  } diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c index b040f51d9aa9..aadb74de52bc 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c @@ -60,6 +60,7 @@ static int jpeg_v2_5_early_init(void *handle)  	u32 harvest;  	int i; +	adev->jpeg.num_jpeg_rings = 1;  	adev->jpeg.num_jpeg_inst = JPEG25_MAX_HW_INSTANCES_ARCTURUS;  	for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) {  		harvest = RREG32_SOC15(JPEG, i, mmCC_UVD_HARVESTING); @@ -102,13 +103,13 @@ static int jpeg_v2_5_sw_init(void *handle)  		/* JPEG DJPEG POISON EVENT */  		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_jpeg[i], -			VCN_2_6__SRCID_DJPEG0_POISON, &adev->jpeg.inst[i].irq); +			VCN_2_6__SRCID_DJPEG0_POISON, &adev->jpeg.inst[i].ras_poison_irq);  		if (r)  			return r;  		/* JPEG EJPEG POISON EVENT */  		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_jpeg[i], -			VCN_2_6__SRCID_EJPEG0_POISON, &adev->jpeg.inst[i].irq); +			VCN_2_6__SRCID_EJPEG0_POISON, &adev->jpeg.inst[i].ras_poison_irq);  		if (r)  			return r;  	} @@ -125,12 +126,12 @@ static int jpeg_v2_5_sw_init(void *handle)  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		ring = &adev->jpeg.inst[i].ring_dec; +		ring = adev->jpeg.inst[i].ring_dec;  		ring->use_doorbell = true;  		if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(2, 5, 0)) -			ring->vm_hub = AMDGPU_MMHUB_1; +			ring->vm_hub = AMDGPU_MMHUB1(0);  		else -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  		ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1 + 8 * i;  		sprintf(ring->name, "jpeg_dec_%d", i);  		r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst[i].irq, @@ -138,8 +139,8 @@ static int jpeg_v2_5_sw_init(void *handle)  		if (r)  			return r; -		adev->jpeg.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; -		adev->jpeg.inst[i].external.jpeg_pitch = SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_PITCH); +		adev->jpeg.internal.jpeg_pitch[0] = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; +		adev->jpeg.inst[i].external.jpeg_pitch[0] = SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_PITCH);  	}  	r = amdgpu_jpeg_ras_sw_init(adev); @@ -186,7 +187,7 @@ static int jpeg_v2_5_hw_init(void *handle)  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		ring = &adev->jpeg.inst[i].ring_dec; +		ring = adev->jpeg.inst[i].ring_dec;  		adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell,  			(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8 * i, i); @@ -221,6 +222,9 @@ static int jpeg_v2_5_hw_fini(void *handle)  		if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&  		      RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS))  			jpeg_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE); + +		if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__JPEG)) +			amdgpu_irq_put(adev, &adev->jpeg.inst[i].ras_poison_irq, 0);  	}  	return 0; @@ -326,7 +330,7 @@ static int jpeg_v2_5_start(struct amdgpu_device *adev)  		if (adev->jpeg.harvest_config & (1 << i))  			continue; -		ring = &adev->jpeg.inst[i].ring_dec; +		ring = adev->jpeg.inst[i].ring_dec;  		/* disable anti hang mechanism */  		WREG32_P(SOC15_REG_OFFSET(JPEG, i, mmUVD_JPEG_POWER_STATUS), 0,  			~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); @@ -569,6 +573,14 @@ static int jpeg_v2_5_set_interrupt_state(struct amdgpu_device *adev,  	return 0;  } +static int jpeg_v2_6_set_ras_interrupt_state(struct amdgpu_device *adev, +					struct amdgpu_irq_src *source, +					unsigned int type, +					enum amdgpu_interrupt_state state) +{ +	return 0; +} +  static int jpeg_v2_5_process_interrupt(struct amdgpu_device *adev,  				      struct amdgpu_irq_src *source,  				      struct amdgpu_iv_entry *entry) @@ -591,11 +603,7 @@ static int jpeg_v2_5_process_interrupt(struct amdgpu_device *adev,  	switch (entry->src_id) {  	case VCN_2_0__SRCID__JPEG_DECODE: -		amdgpu_fence_process(&adev->jpeg.inst[ip_instance].ring_dec); -		break; -	case VCN_2_6__SRCID_DJPEG0_POISON: -	case VCN_2_6__SRCID_EJPEG0_POISON: -		amdgpu_jpeg_process_poison_irq(adev, source, entry); +		amdgpu_fence_process(adev->jpeg.inst[ip_instance].ring_dec);  		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n", @@ -712,10 +720,10 @@ static void jpeg_v2_5_set_dec_ring_funcs(struct amdgpu_device *adev)  		if (adev->jpeg.harvest_config & (1 << i))  			continue;  		if (adev->asic_type == CHIP_ARCTURUS) -			adev->jpeg.inst[i].ring_dec.funcs = &jpeg_v2_5_dec_ring_vm_funcs; +			adev->jpeg.inst[i].ring_dec->funcs = &jpeg_v2_5_dec_ring_vm_funcs;  		else  /* CHIP_ALDEBARAN */ -			adev->jpeg.inst[i].ring_dec.funcs = &jpeg_v2_6_dec_ring_vm_funcs; -		adev->jpeg.inst[i].ring_dec.me = i; +			adev->jpeg.inst[i].ring_dec->funcs = &jpeg_v2_6_dec_ring_vm_funcs; +		adev->jpeg.inst[i].ring_dec->me = i;  		DRM_INFO("JPEG(%d) JPEG decode is enabled in VM mode\n", i);  	}  } @@ -725,6 +733,11 @@ static const struct amdgpu_irq_src_funcs jpeg_v2_5_irq_funcs = {  	.process = jpeg_v2_5_process_interrupt,  }; +static const struct amdgpu_irq_src_funcs jpeg_v2_6_ras_irq_funcs = { +	.set = jpeg_v2_6_set_ras_interrupt_state, +	.process = amdgpu_jpeg_process_poison_irq, +}; +  static void jpeg_v2_5_set_irq_funcs(struct amdgpu_device *adev)  {  	int i; @@ -735,6 +748,9 @@ static void jpeg_v2_5_set_irq_funcs(struct amdgpu_device *adev)  		adev->jpeg.inst[i].irq.num_types = 1;  		adev->jpeg.inst[i].irq.funcs = &jpeg_v2_5_irq_funcs; + +		adev->jpeg.inst[i].ras_poison_irq.num_types = 1; +		adev->jpeg.inst[i].ras_poison_irq.funcs = &jpeg_v2_6_ras_irq_funcs;  	}  } @@ -800,6 +816,7 @@ const struct amdgpu_ras_block_hw_ops jpeg_v2_6_ras_hw_ops = {  static struct amdgpu_jpeg_ras jpeg_v2_6_ras = {  	.ras_block = {  		.hw_ops = &jpeg_v2_6_ras_hw_ops, +		.ras_late_init = amdgpu_jpeg_ras_late_init,  	},  }; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c index 1c2292cc5f2c..79791379fc2b 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c @@ -64,6 +64,7 @@ static int jpeg_v3_0_early_init(void *handle)  	}  	adev->jpeg.num_jpeg_inst = 1; +	adev->jpeg.num_jpeg_rings = 1;  	jpeg_v3_0_set_dec_ring_funcs(adev);  	jpeg_v3_0_set_irq_funcs(adev); @@ -98,18 +99,18 @@ static int jpeg_v3_0_sw_init(void *handle)  	if (r)  		return r; -	ring = &adev->jpeg.inst->ring_dec; +	ring = adev->jpeg.inst->ring_dec;  	ring->use_doorbell = true;  	ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1; -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "jpeg_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0,  			     AMDGPU_RING_PRIO_DEFAULT, NULL);  	if (r)  		return r; -	adev->jpeg.internal.jpeg_pitch = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; -	adev->jpeg.inst->external.jpeg_pitch = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH); +	adev->jpeg.internal.jpeg_pitch[0] = mmUVD_JPEG_PITCH_INTERNAL_OFFSET; +	adev->jpeg.inst->external.jpeg_pitch[0] = SOC15_REG_OFFSET(JPEG, 0, mmUVD_JPEG_PITCH);  	return 0;  } @@ -144,7 +145,7 @@ static int jpeg_v3_0_sw_fini(void *handle)  static int jpeg_v3_0_hw_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	adev->nbio.funcs->vcn_doorbell_range(adev, ring->use_doorbell, @@ -330,7 +331,7 @@ static int jpeg_v3_0_enable_static_power_gating(struct amdgpu_device *adev)   */  static int jpeg_v3_0_start(struct amdgpu_device *adev)  { -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	if (adev->pm.dpm_enabled) @@ -527,7 +528,7 @@ static int jpeg_v3_0_process_interrupt(struct amdgpu_device *adev,  	switch (entry->src_id) {  	case VCN_2_0__SRCID__JPEG_DECODE: -		amdgpu_fence_process(&adev->jpeg.inst->ring_dec); +		amdgpu_fence_process(adev->jpeg.inst->ring_dec);  		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n", @@ -589,7 +590,7 @@ static const struct amdgpu_ring_funcs jpeg_v3_0_dec_ring_vm_funcs = {  static void jpeg_v3_0_set_dec_ring_funcs(struct amdgpu_device *adev)  { -	adev->jpeg.inst->ring_dec.funcs = &jpeg_v3_0_dec_ring_vm_funcs; +	adev->jpeg.inst->ring_dec->funcs = &jpeg_v3_0_dec_ring_vm_funcs;  	DRM_INFO("JPEG decode is enabled in VM mode\n");  } diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c index 77e1e64aa1d1..a707d407fbd0 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c @@ -58,6 +58,7 @@ static int jpeg_v4_0_early_init(void *handle)  	adev->jpeg.num_jpeg_inst = 1; +	adev->jpeg.num_jpeg_rings = 1;  	jpeg_v4_0_set_dec_ring_funcs(adev);  	jpeg_v4_0_set_irq_funcs(adev); @@ -87,13 +88,13 @@ static int jpeg_v4_0_sw_init(void *handle)  	/* JPEG DJPEG POISON EVENT */  	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, -			VCN_4_0__SRCID_DJPEG0_POISON, &adev->jpeg.inst->irq); +			VCN_4_0__SRCID_DJPEG0_POISON, &adev->jpeg.inst->ras_poison_irq);  	if (r)  		return r;  	/* JPEG EJPEG POISON EVENT */  	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, -			VCN_4_0__SRCID_EJPEG0_POISON, &adev->jpeg.inst->irq); +			VCN_4_0__SRCID_EJPEG0_POISON, &adev->jpeg.inst->ras_poison_irq);  	if (r)  		return r; @@ -105,10 +106,10 @@ static int jpeg_v4_0_sw_init(void *handle)  	if (r)  		return r; -	ring = &adev->jpeg.inst->ring_dec; +	ring = adev->jpeg.inst->ring_dec;  	ring->use_doorbell = true;  	ring->doorbell_index = amdgpu_sriov_vf(adev) ? (((adev->doorbell_index.vcn.vcn_ring0_1) << 1) + 4) : ((adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1); -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "jpeg_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0, @@ -116,8 +117,8 @@ static int jpeg_v4_0_sw_init(void *handle)  	if (r)  		return r; -	adev->jpeg.internal.jpeg_pitch = regUVD_JPEG_PITCH_INTERNAL_OFFSET; -	adev->jpeg.inst->external.jpeg_pitch = SOC15_REG_OFFSET(JPEG, 0, regUVD_JPEG_PITCH); +	adev->jpeg.internal.jpeg_pitch[0] = regUVD_JPEG_PITCH_INTERNAL_OFFSET; +	adev->jpeg.inst->external.jpeg_pitch[0] = SOC15_REG_OFFSET(JPEG, 0, regUVD_JPEG_PITCH);  	r = amdgpu_jpeg_ras_sw_init(adev);  	if (r) @@ -156,7 +157,7 @@ static int jpeg_v4_0_sw_fini(void *handle)  static int jpeg_v4_0_hw_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	if (amdgpu_sriov_vf(adev)) { @@ -202,7 +203,8 @@ static int jpeg_v4_0_hw_fini(void *handle)  			RREG32_SOC15(JPEG, 0, regUVD_JRBC_STATUS))  			jpeg_v4_0_set_powergating_state(adev, AMD_PG_STATE_GATE);  	} -	amdgpu_irq_put(adev, &adev->jpeg.inst->irq, 0); +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__JPEG)) +		amdgpu_irq_put(adev, &adev->jpeg.inst->ras_poison_irq, 0);  	return 0;  } @@ -363,7 +365,7 @@ static int jpeg_v4_0_enable_static_power_gating(struct amdgpu_device *adev)   */  static int jpeg_v4_0_start(struct amdgpu_device *adev)  { -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec; +	struct amdgpu_ring *ring = adev->jpeg.inst->ring_dec;  	int r;  	if (adev->pm.dpm_enabled) @@ -441,7 +443,7 @@ static int jpeg_v4_0_start_sriov(struct amdgpu_device *adev)  	table_size = 0; -	ring = &adev->jpeg.inst->ring_dec; +	ring = adev->jpeg.inst->ring_dec;  	MMSCH_V4_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(JPEG, 0,  		regUVD_LMI_JRBC_RB_64BIT_BAR_LOW), @@ -670,6 +672,14 @@ static int jpeg_v4_0_set_interrupt_state(struct amdgpu_device *adev,  	return 0;  } +static int jpeg_v4_0_set_ras_interrupt_state(struct amdgpu_device *adev, +					struct amdgpu_irq_src *source, +					unsigned int type, +					enum amdgpu_interrupt_state state) +{ +	return 0; +} +  static int jpeg_v4_0_process_interrupt(struct amdgpu_device *adev,  				      struct amdgpu_irq_src *source,  				      struct amdgpu_iv_entry *entry) @@ -678,11 +688,7 @@ static int jpeg_v4_0_process_interrupt(struct amdgpu_device *adev,  	switch (entry->src_id) {  	case VCN_4_0__SRCID__JPEG_DECODE: -		amdgpu_fence_process(&adev->jpeg.inst->ring_dec); -		break; -	case VCN_4_0__SRCID_DJPEG0_POISON: -	case VCN_4_0__SRCID_EJPEG0_POISON: -		amdgpu_jpeg_process_poison_irq(adev, source, entry); +		amdgpu_fence_process(adev->jpeg.inst->ring_dec);  		break;  	default:  		DRM_DEV_ERROR(adev->dev, "Unhandled interrupt: %d %d\n", @@ -744,7 +750,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_dec_ring_vm_funcs = {  static void jpeg_v4_0_set_dec_ring_funcs(struct amdgpu_device *adev)  { -	adev->jpeg.inst->ring_dec.funcs = &jpeg_v4_0_dec_ring_vm_funcs; +	adev->jpeg.inst->ring_dec->funcs = &jpeg_v4_0_dec_ring_vm_funcs;  	DRM_DEV_INFO(adev->dev, "JPEG decode is enabled in VM mode\n");  } @@ -753,10 +759,18 @@ static const struct amdgpu_irq_src_funcs jpeg_v4_0_irq_funcs = {  	.process = jpeg_v4_0_process_interrupt,  }; +static const struct amdgpu_irq_src_funcs jpeg_v4_0_ras_irq_funcs = { +	.set = jpeg_v4_0_set_ras_interrupt_state, +	.process = amdgpu_jpeg_process_poison_irq, +}; +  static void jpeg_v4_0_set_irq_funcs(struct amdgpu_device *adev)  {  	adev->jpeg.inst->irq.num_types = 1;  	adev->jpeg.inst->irq.funcs = &jpeg_v4_0_irq_funcs; + +	adev->jpeg.inst->ras_poison_irq.num_types = 1; +	adev->jpeg.inst->ras_poison_irq.funcs = &jpeg_v4_0_ras_irq_funcs;  }  const struct amdgpu_ip_block_version jpeg_v4_0_ip_block = { @@ -811,6 +825,7 @@ const struct amdgpu_ras_block_hw_ops jpeg_v4_0_ras_hw_ops = {  static struct amdgpu_jpeg_ras jpeg_v4_0_ras = {  	.ras_block = {  		.hw_ops = &jpeg_v4_0_ras_hw_ops, +		.ras_late_init = amdgpu_jpeg_ras_late_init,  	},  }; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c new file mode 100644 index 000000000000..ce2b22f7e4e4 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c @@ -0,0 +1,1074 @@ +/* + * Copyright 2022 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 "amdgpu_jpeg.h" +#include "soc15.h" +#include "soc15d.h" +#include "jpeg_v4_0_3.h" + +#include "vcn/vcn_4_0_3_offset.h" +#include "vcn/vcn_4_0_3_sh_mask.h" +#include "ivsrcid/vcn/irqsrcs_vcn_4_0.h" + +enum jpeg_engin_status { +	UVD_PGFSM_STATUS__UVDJ_PWR_ON  = 0, +	UVD_PGFSM_STATUS__UVDJ_PWR_OFF = 2, +}; + +static void jpeg_v4_0_3_set_dec_ring_funcs(struct amdgpu_device *adev); +static void jpeg_v4_0_3_set_irq_funcs(struct amdgpu_device *adev); +static int jpeg_v4_0_3_set_powergating_state(void *handle, +				enum amd_powergating_state state); +static void jpeg_v4_0_3_set_ras_funcs(struct amdgpu_device *adev); + +static int amdgpu_ih_srcid_jpeg[] = { +	VCN_4_0__SRCID__JPEG_DECODE, +	VCN_4_0__SRCID__JPEG1_DECODE, +	VCN_4_0__SRCID__JPEG2_DECODE, +	VCN_4_0__SRCID__JPEG3_DECODE, +	VCN_4_0__SRCID__JPEG4_DECODE, +	VCN_4_0__SRCID__JPEG5_DECODE, +	VCN_4_0__SRCID__JPEG6_DECODE, +	VCN_4_0__SRCID__JPEG7_DECODE +}; + +/** + * jpeg_v4_0_3_early_init - set function pointers + * + * @handle: amdgpu_device pointer + * + * Set ring and irq function pointers + */ +static int jpeg_v4_0_3_early_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	adev->jpeg.num_jpeg_rings = AMDGPU_MAX_JPEG_RINGS; + +	jpeg_v4_0_3_set_dec_ring_funcs(adev); +	jpeg_v4_0_3_set_irq_funcs(adev); +	jpeg_v4_0_3_set_ras_funcs(adev); + +	return 0; +} + +/** + * jpeg_v4_0_3_sw_init - sw init for JPEG block + * + * @handle: amdgpu_device pointer + * + * Load firmware and sw initialization + */ +static int jpeg_v4_0_3_sw_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	struct amdgpu_ring *ring; +	int i, j, r, jpeg_inst; + +	for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +		/* JPEG TRAP */ +		r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, +				amdgpu_ih_srcid_jpeg[j], &adev->jpeg.inst->irq); +		if (r) +			return r; +	} + +	r = amdgpu_jpeg_sw_init(adev); +	if (r) +		return r; + +	r = amdgpu_jpeg_resume(adev); +	if (r) +		return r; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		jpeg_inst = GET_INST(JPEG, i); + +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			ring = &adev->jpeg.inst[i].ring_dec[j]; +			ring->use_doorbell = true; +			ring->vm_hub = AMDGPU_MMHUB0(adev->jpeg.inst[i].aid_id); +			ring->doorbell_index = +				(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + +				1 + j + 9 * jpeg_inst; +			sprintf(ring->name, "jpeg_dec_%d.%d", adev->jpeg.inst[i].aid_id, j); +			r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0, +						AMDGPU_RING_PRIO_DEFAULT, NULL); +			if (r) +				return r; + +			adev->jpeg.internal.jpeg_pitch[j] = +				regUVD_JRBC0_UVD_JRBC_SCRATCH0_INTERNAL_OFFSET; +			adev->jpeg.inst[i].external.jpeg_pitch[j] = +				SOC15_REG_OFFSET1( +					JPEG, jpeg_inst, +					regUVD_JRBC0_UVD_JRBC_SCRATCH0, +					(j ? (0x40 * j - 0xc80) : 0)); +		} +	} + +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__JPEG)) { +		r = amdgpu_jpeg_ras_sw_init(adev); +		if (r) { +			dev_err(adev->dev, "Failed to initialize jpeg ras block!\n"); +			return r; +		} +	} + +	return 0; +} + +/** + * jpeg_v4_0_3_sw_fini - sw fini for JPEG block + * + * @handle: amdgpu_device pointer + * + * JPEG suspend and free up sw allocation + */ +static int jpeg_v4_0_3_sw_fini(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = amdgpu_jpeg_suspend(adev); +	if (r) +		return r; + +	r = amdgpu_jpeg_sw_fini(adev); + +	return r; +} + +/** + * jpeg_v4_0_3_hw_init - start and test JPEG block + * + * @handle: amdgpu_device pointer + * + */ +static int jpeg_v4_0_3_hw_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	struct amdgpu_ring *ring; +	int i, j, r, jpeg_inst; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		jpeg_inst = GET_INST(JPEG, i); + +		ring = adev->jpeg.inst[i].ring_dec; + +		if (ring->use_doorbell) +			adev->nbio.funcs->vcn_doorbell_range( +				adev, ring->use_doorbell, +				(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + +					9 * jpeg_inst, +				adev->jpeg.inst[i].aid_id); + +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			ring = &adev->jpeg.inst[i].ring_dec[j]; +			if (ring->use_doorbell) +				WREG32_SOC15_OFFSET( +					VCN, GET_INST(VCN, i), +					regVCN_JPEG_DB_CTRL, +					(ring->pipe ? (ring->pipe - 0x15) : 0), +					ring->doorbell_index +							<< VCN_JPEG_DB_CTRL__OFFSET__SHIFT | +						VCN_JPEG_DB_CTRL__EN_MASK); +			r = amdgpu_ring_test_helper(ring); +			if (r) +				return r; +		} +	} +	DRM_DEV_INFO(adev->dev, "JPEG decode initialized successfully.\n"); + +	return 0; +} + +/** + * jpeg_v4_0_3_hw_fini - stop the hardware block + * + * @handle: amdgpu_device pointer + * + * Stop the JPEG block, mark ring as not ready any more + */ +static int jpeg_v4_0_3_hw_fini(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int ret = 0; + +	cancel_delayed_work_sync(&adev->jpeg.idle_work); + +	if (adev->jpeg.cur_state != AMD_PG_STATE_GATE) +		ret = jpeg_v4_0_3_set_powergating_state(adev, AMD_PG_STATE_GATE); + +	return ret; +} + +/** + * jpeg_v4_0_3_suspend - suspend JPEG block + * + * @handle: amdgpu_device pointer + * + * HW fini and suspend JPEG block + */ +static int jpeg_v4_0_3_suspend(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = jpeg_v4_0_3_hw_fini(adev); +	if (r) +		return r; + +	r = amdgpu_jpeg_suspend(adev); + +	return r; +} + +/** + * jpeg_v4_0_3_resume - resume JPEG block + * + * @handle: amdgpu_device pointer + * + * Resume firmware and hw init JPEG block + */ +static int jpeg_v4_0_3_resume(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = amdgpu_jpeg_resume(adev); +	if (r) +		return r; + +	r = jpeg_v4_0_3_hw_init(adev); + +	return r; +} + +static void jpeg_v4_0_3_disable_clock_gating(struct amdgpu_device *adev, int inst_idx) +{ +	int i, jpeg_inst; +	uint32_t data; + +	jpeg_inst = GET_INST(JPEG, inst_idx); +	data = RREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_CTRL); +	if (adev->cg_flags & AMD_CG_SUPPORT_JPEG_MGCG) { +		data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +		data &= (~(JPEG_CGC_CTRL__JPEG0_DEC_MODE_MASK << 1)); +	} else { +		data &= ~JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +	} + +	data |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; +	data |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT; +	WREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_CTRL, data); + +	data = RREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_GATE); +	data &= ~(JPEG_CGC_GATE__JMCIF_MASK | JPEG_CGC_GATE__JRBBM_MASK); +	for (i = 0; i < adev->jpeg.num_jpeg_rings; ++i) +		data &= ~(JPEG_CGC_GATE__JPEG0_DEC_MASK << i); +	WREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_GATE, data); +} + +static void jpeg_v4_0_3_enable_clock_gating(struct amdgpu_device *adev, int inst_idx) +{ +	int i, jpeg_inst; +	uint32_t data; + +	jpeg_inst = GET_INST(JPEG, inst_idx); +	data = RREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_CTRL); +	if (adev->cg_flags & AMD_CG_SUPPORT_JPEG_MGCG) { +		data |= 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +		data |= (JPEG_CGC_CTRL__JPEG0_DEC_MODE_MASK << 1); +	} else { +		data &= ~JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +	} + +	data |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; +	data |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT; +	WREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_CTRL, data); + +	data = RREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_GATE); +	data |= (JPEG_CGC_GATE__JMCIF_MASK | JPEG_CGC_GATE__JRBBM_MASK); +	for (i = 0; i < adev->jpeg.num_jpeg_rings; ++i) +		data |= (JPEG_CGC_GATE__JPEG0_DEC_MASK << i); +	WREG32_SOC15(JPEG, jpeg_inst, regJPEG_CGC_GATE, data); +} + +/** + * jpeg_v4_0_3_start - start JPEG block + * + * @adev: amdgpu_device pointer + * + * Setup and start the JPEG block + */ +static int jpeg_v4_0_3_start(struct amdgpu_device *adev) +{ +	struct amdgpu_ring *ring; +	int i, j, jpeg_inst; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		jpeg_inst = GET_INST(JPEG, i); + +		WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, +			     1 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); +		SOC15_WAIT_ON_RREG( +			JPEG, jpeg_inst, regUVD_PGFSM_STATUS, +			UVD_PGFSM_STATUS__UVDJ_PWR_ON +				<< UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, +			UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); + +		/* disable anti hang mechanism */ +		WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, +					  regUVD_JPEG_POWER_STATUS), +			 0, ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); + +		/* JPEG disable CGC */ +		jpeg_v4_0_3_disable_clock_gating(adev, i); + +		/* MJPEG global tiling registers */ +		WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX8_ADDR_CONFIG, +			     adev->gfx.config.gb_addr_config); +		WREG32_SOC15(JPEG, jpeg_inst, regJPEG_DEC_GFX10_ADDR_CONFIG, +			     adev->gfx.config.gb_addr_config); + +		/* enable JMI channel */ +		WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), 0, +			 ~UVD_JMI_CNTL__SOFT_RESET_MASK); + +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			unsigned int reg_offset = (j?(0x40 * j - 0xc80):0); + +			ring = &adev->jpeg.inst[i].ring_dec[j]; + +			/* enable System Interrupt for JRBC */ +			WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, +						  regJPEG_SYS_INT_EN), +				 JPEG_SYS_INT_EN__DJRBC0_MASK << j, +				 ~(JPEG_SYS_INT_EN__DJRBC0_MASK << j)); + +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JMI0_UVD_LMI_JRBC_RB_VMID, +					    reg_offset, 0); +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JRBC0_UVD_JRBC_RB_CNTL, +					    reg_offset, +					    (0x00000001L | 0x00000002L)); +			WREG32_SOC15_OFFSET( +				JPEG, jpeg_inst, +				regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW, +				reg_offset, lower_32_bits(ring->gpu_addr)); +			WREG32_SOC15_OFFSET( +				JPEG, jpeg_inst, +				regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH, +				reg_offset, upper_32_bits(ring->gpu_addr)); +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JRBC0_UVD_JRBC_RB_RPTR, +					    reg_offset, 0); +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JRBC0_UVD_JRBC_RB_WPTR, +					    reg_offset, 0); +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JRBC0_UVD_JRBC_RB_CNTL, +					    reg_offset, 0x00000002L); +			WREG32_SOC15_OFFSET(JPEG, jpeg_inst, +					    regUVD_JRBC0_UVD_JRBC_RB_SIZE, +					    reg_offset, ring->ring_size / 4); +			ring->wptr = RREG32_SOC15_OFFSET( +				JPEG, jpeg_inst, regUVD_JRBC0_UVD_JRBC_RB_WPTR, +				reg_offset); +		} +	} + +	return 0; +} + +/** + * jpeg_v4_0_3_stop - stop JPEG block + * + * @adev: amdgpu_device pointer + * + * stop the JPEG block + */ +static int jpeg_v4_0_3_stop(struct amdgpu_device *adev) +{ +	int i, jpeg_inst; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		jpeg_inst = GET_INST(JPEG, i); +		/* reset JMI */ +		WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL), +			 UVD_JMI_CNTL__SOFT_RESET_MASK, +			 ~UVD_JMI_CNTL__SOFT_RESET_MASK); + +		jpeg_v4_0_3_enable_clock_gating(adev, i); + +		/* enable anti hang mechanism */ +		WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, +					  regUVD_JPEG_POWER_STATUS), +			 UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK, +			 ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK); + +		WREG32_SOC15(JPEG, jpeg_inst, regUVD_PGFSM_CONFIG, +			     2 << UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT); +		SOC15_WAIT_ON_RREG( +			JPEG, jpeg_inst, regUVD_PGFSM_STATUS, +			UVD_PGFSM_STATUS__UVDJ_PWR_OFF +				<< UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT, +			UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK); +	} + +	return 0; +} + +/** + * jpeg_v4_0_3_dec_ring_get_rptr - get read pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware read pointer + */ +static uint64_t jpeg_v4_0_3_dec_ring_get_rptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	return RREG32_SOC15_OFFSET( +		JPEG, GET_INST(JPEG, ring->me), regUVD_JRBC0_UVD_JRBC_RB_RPTR, +		ring->pipe ? (0x40 * ring->pipe - 0xc80) : 0); +} + +/** + * jpeg_v4_0_3_dec_ring_get_wptr - get write pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware write pointer + */ +static uint64_t jpeg_v4_0_3_dec_ring_get_wptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring->use_doorbell) +		return adev->wb.wb[ring->wptr_offs]; +	else +		return RREG32_SOC15_OFFSET( +			JPEG, GET_INST(JPEG, ring->me), +			regUVD_JRBC0_UVD_JRBC_RB_WPTR, +			ring->pipe ? (0x40 * ring->pipe - 0xc80) : 0); +} + +/** + * jpeg_v4_0_3_dec_ring_set_wptr - set write pointer + * + * @ring: amdgpu_ring pointer + * + * Commits the write pointer to the hardware + */ +static void jpeg_v4_0_3_dec_ring_set_wptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring->use_doorbell) { +		adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr); +		WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); +	} else { +		WREG32_SOC15_OFFSET(JPEG, GET_INST(JPEG, ring->me), +				    regUVD_JRBC0_UVD_JRBC_RB_WPTR, +				    (ring->pipe ? (0x40 * ring->pipe - 0xc80) : +						  0), +				    lower_32_bits(ring->wptr)); +	} +} + +/** + * jpeg_v4_0_3_dec_ring_insert_start - insert a start command + * + * @ring: amdgpu_ring pointer + * + * Write a start command to the ring. + */ +static void jpeg_v4_0_3_dec_ring_insert_start(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x62a04); /* PCTL0_MMHUB_DEEPSLEEP_IB */ + +	amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x80004000); +} + +/** + * jpeg_v4_0_3_dec_ring_insert_end - insert a end command + * + * @ring: amdgpu_ring pointer + * + * Write a end command to the ring. + */ +static void jpeg_v4_0_3_dec_ring_insert_end(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x62a04); + +	amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x00004000); +} + +/** + * jpeg_v4_0_3_dec_ring_emit_fence - emit an fence & trap command + * + * @ring: amdgpu_ring pointer + * @addr: address + * @seq: sequence number + * @flags: fence related flags + * + * Write a fence and a trap command to the ring. + */ +static void jpeg_v4_0_3_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, +				unsigned int flags) +{ +	WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_JPEG_GPCOM_DATA0_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, seq); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JPEG_GPCOM_DATA1_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, seq); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, lower_32_bits(addr)); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, upper_32_bits(addr)); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x8); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET, +		0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE4)); +	amdgpu_ring_write(ring, 0); + +	if (ring->adev->jpeg.inst[ring->me].aid_id) { +		amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_MCM_ADDR_INTERNAL_OFFSET, +			0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE0)); +		amdgpu_ring_write(ring, 0x4); +	} else { +		amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); +		amdgpu_ring_write(ring, 0); +	} + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x3fbc); + +	if (ring->adev->jpeg.inst[ring->me].aid_id) { +		amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_MCM_ADDR_INTERNAL_OFFSET, +			0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE0)); +		amdgpu_ring_write(ring, 0x0); +	} else { +		amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); +		amdgpu_ring_write(ring, 0); +	} + +	amdgpu_ring_write(ring, PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x1); + +	amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE7)); +	amdgpu_ring_write(ring, 0); +} + +/** + * jpeg_v4_0_3_dec_ring_emit_ib - execute indirect buffer + * + * @ring: amdgpu_ring pointer + * @job: job to retrieve vmid from + * @ib: indirect buffer to execute + * @flags: unused + * + * Write ring commands to execute the indirect buffer. + */ +static void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring, +				struct amdgpu_job *job, +				struct amdgpu_ib *ib, +				uint32_t flags) +{ +	unsigned int vmid = AMDGPU_JOB_GET_VMID(job); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, (vmid | (vmid << 4))); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JPEG_VMID_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, (vmid | (vmid << 4))); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_IB_SIZE_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, ib->length_dw); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, lower_32_bits(ring->gpu_addr)); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, upper_32_bits(ring->gpu_addr)); + +	amdgpu_ring_write(ring,	PACKETJ(0, 0, PACKETJ_CONDITION_CHECK0, PACKETJ_TYPE2)); +	amdgpu_ring_write(ring, 0); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x01400200); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x2); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_STATUS_INTERNAL_OFFSET, +		0, PACKETJ_CONDITION_CHECK3, PACKETJ_TYPE3)); +	amdgpu_ring_write(ring, 0x2); +} + +static void jpeg_v4_0_3_dec_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, +				uint32_t val, uint32_t mask) +{ +	uint32_t reg_offset = (reg << 2); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, 0x01400200); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	amdgpu_ring_write(ring, val); + +	amdgpu_ring_write(ring, PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	if (reg_offset >= 0x10000 && reg_offset <= 0x105ff) { +		amdgpu_ring_write(ring, 0); +		amdgpu_ring_write(ring, +			PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE3)); +	} else { +		amdgpu_ring_write(ring, reg_offset); +		amdgpu_ring_write(ring,	PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, +			0, 0, PACKETJ_TYPE3)); +	} +	amdgpu_ring_write(ring, mask); +} + +static void jpeg_v4_0_3_dec_ring_emit_vm_flush(struct amdgpu_ring *ring, +				unsigned int vmid, uint64_t pd_addr) +{ +	struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->vm_hub]; +	uint32_t data0, data1, mask; + +	pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); + +	/* wait for register write */ +	data0 = hub->ctx0_ptb_addr_lo32 + vmid * hub->ctx_addr_distance; +	data1 = lower_32_bits(pd_addr); +	mask = 0xffffffff; +	jpeg_v4_0_3_dec_ring_emit_reg_wait(ring, data0, data1, mask); +} + +static void jpeg_v4_0_3_dec_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val) +{ +	uint32_t reg_offset = (reg << 2); + +	amdgpu_ring_write(ring,	PACKETJ(regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET, +		0, 0, PACKETJ_TYPE0)); +	if (reg_offset >= 0x10000 && reg_offset <= 0x105ff) { +		amdgpu_ring_write(ring, 0); +		amdgpu_ring_write(ring, +			PACKETJ((reg_offset >> 2), 0, 0, PACKETJ_TYPE0)); +	} else { +		amdgpu_ring_write(ring, reg_offset); +		amdgpu_ring_write(ring,	PACKETJ(JRBC_DEC_EXTERNAL_REG_WRITE_ADDR, +			0, 0, PACKETJ_TYPE0)); +	} +	amdgpu_ring_write(ring, val); +} + +static void jpeg_v4_0_3_dec_ring_nop(struct amdgpu_ring *ring, uint32_t count) +{ +	int i; + +	WARN_ON(ring->wptr % 2 || count % 2); + +	for (i = 0; i < count / 2; i++) { +		amdgpu_ring_write(ring, PACKETJ(0, 0, 0, PACKETJ_TYPE6)); +		amdgpu_ring_write(ring, 0); +	} +} + +static bool jpeg_v4_0_3_is_idle(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	bool ret = false; +	int i, j; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			unsigned int reg_offset = (j?(0x40 * j - 0xc80):0); + +			ret &= ((RREG32_SOC15_OFFSET( +					 JPEG, GET_INST(JPEG, i), +					 regUVD_JRBC0_UVD_JRBC_STATUS, +					 reg_offset) & +				 UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE_MASK) == +				UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE_MASK); +		} +	} + +	return ret; +} + +static int jpeg_v4_0_3_wait_for_idle(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int ret = 0; +	int i, j; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			unsigned int reg_offset = (j?(0x40 * j - 0xc80):0); + +			ret &= SOC15_WAIT_ON_RREG_OFFSET( +				JPEG, GET_INST(JPEG, i), +				regUVD_JRBC0_UVD_JRBC_STATUS, reg_offset, +				UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE_MASK, +				UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE_MASK); +		} +	} +	return ret; +} + +static int jpeg_v4_0_3_set_clockgating_state(void *handle, +					  enum amd_clockgating_state state) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	bool enable = (state == AMD_CG_STATE_GATE) ? true : false; +	int i; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		if (enable) { +			if (!jpeg_v4_0_3_is_idle(handle)) +				return -EBUSY; +			jpeg_v4_0_3_enable_clock_gating(adev, i); +		} else { +			jpeg_v4_0_3_disable_clock_gating(adev, i); +		} +	} +	return 0; +} + +static int jpeg_v4_0_3_set_powergating_state(void *handle, +					  enum amd_powergating_state state) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int ret; + +	if (state == adev->jpeg.cur_state) +		return 0; + +	if (state == AMD_PG_STATE_GATE) +		ret = jpeg_v4_0_3_stop(adev); +	else +		ret = jpeg_v4_0_3_start(adev); + +	if (!ret) +		adev->jpeg.cur_state = state; + +	return ret; +} + +static int jpeg_v4_0_3_set_interrupt_state(struct amdgpu_device *adev, +					struct amdgpu_irq_src *source, +					unsigned int type, +					enum amdgpu_interrupt_state state) +{ +	return 0; +} + +static int jpeg_v4_0_3_process_interrupt(struct amdgpu_device *adev, +				      struct amdgpu_irq_src *source, +				      struct amdgpu_iv_entry *entry) +{ +	uint32_t i, inst; + +	i = node_id_to_phys_map[entry->node_id]; +	DRM_DEV_DEBUG(adev->dev, "IH: JPEG TRAP\n"); + +	for (inst = 0; inst < adev->jpeg.num_jpeg_inst; ++inst) +		if (adev->jpeg.inst[inst].aid_id == i) +			break; + +	if (inst >= adev->jpeg.num_jpeg_inst) { +		dev_WARN_ONCE(adev->dev, 1, +			      "Interrupt received for unknown JPEG instance %d", +			      entry->node_id); +		return 0; +	} + +	switch (entry->src_id) { +	case VCN_4_0__SRCID__JPEG_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[0]); +		break; +	case VCN_4_0__SRCID__JPEG1_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[1]); +		break; +	case VCN_4_0__SRCID__JPEG2_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[2]); +		break; +	case VCN_4_0__SRCID__JPEG3_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[3]); +		break; +	case VCN_4_0__SRCID__JPEG4_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[4]); +		break; +	case VCN_4_0__SRCID__JPEG5_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[5]); +		break; +	case VCN_4_0__SRCID__JPEG6_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[6]); +		break; +	case VCN_4_0__SRCID__JPEG7_DECODE: +		amdgpu_fence_process(&adev->jpeg.inst[inst].ring_dec[7]); +		break; +	default: +		DRM_DEV_ERROR(adev->dev, "Unhandled interrupt: %d %d\n", +			  entry->src_id, entry->src_data[0]); +		break; +	} + +	return 0; +} + +static const struct amd_ip_funcs jpeg_v4_0_3_ip_funcs = { +	.name = "jpeg_v4_0_3", +	.early_init = jpeg_v4_0_3_early_init, +	.late_init = NULL, +	.sw_init = jpeg_v4_0_3_sw_init, +	.sw_fini = jpeg_v4_0_3_sw_fini, +	.hw_init = jpeg_v4_0_3_hw_init, +	.hw_fini = jpeg_v4_0_3_hw_fini, +	.suspend = jpeg_v4_0_3_suspend, +	.resume = jpeg_v4_0_3_resume, +	.is_idle = jpeg_v4_0_3_is_idle, +	.wait_for_idle = jpeg_v4_0_3_wait_for_idle, +	.check_soft_reset = NULL, +	.pre_soft_reset = NULL, +	.soft_reset = NULL, +	.post_soft_reset = NULL, +	.set_clockgating_state = jpeg_v4_0_3_set_clockgating_state, +	.set_powergating_state = jpeg_v4_0_3_set_powergating_state, +}; + +static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = { +	.type = AMDGPU_RING_TYPE_VCN_JPEG, +	.align_mask = 0xf, +	.get_rptr = jpeg_v4_0_3_dec_ring_get_rptr, +	.get_wptr = jpeg_v4_0_3_dec_ring_get_wptr, +	.set_wptr = jpeg_v4_0_3_dec_ring_set_wptr, +	.emit_frame_size = +		SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + +		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + +		8 + /* jpeg_v4_0_3_dec_ring_emit_vm_flush */ +		22 + 22 + /* jpeg_v4_0_3_dec_ring_emit_fence x2 vm fence */ +		8 + 16, +	.emit_ib_size = 22, /* jpeg_v4_0_3_dec_ring_emit_ib */ +	.emit_ib = jpeg_v4_0_3_dec_ring_emit_ib, +	.emit_fence = jpeg_v4_0_3_dec_ring_emit_fence, +	.emit_vm_flush = jpeg_v4_0_3_dec_ring_emit_vm_flush, +	.test_ring = amdgpu_jpeg_dec_ring_test_ring, +	.test_ib = amdgpu_jpeg_dec_ring_test_ib, +	.insert_nop = jpeg_v4_0_3_dec_ring_nop, +	.insert_start = jpeg_v4_0_3_dec_ring_insert_start, +	.insert_end = jpeg_v4_0_3_dec_ring_insert_end, +	.pad_ib = amdgpu_ring_generic_pad_ib, +	.begin_use = amdgpu_jpeg_ring_begin_use, +	.end_use = amdgpu_jpeg_ring_end_use, +	.emit_wreg = jpeg_v4_0_3_dec_ring_emit_wreg, +	.emit_reg_wait = jpeg_v4_0_3_dec_ring_emit_reg_wait, +	.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, +}; + +static void jpeg_v4_0_3_set_dec_ring_funcs(struct amdgpu_device *adev) +{ +	int i, j, jpeg_inst; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			adev->jpeg.inst[i].ring_dec[j].funcs = &jpeg_v4_0_3_dec_ring_vm_funcs; +			adev->jpeg.inst[i].ring_dec[j].me = i; +			adev->jpeg.inst[i].ring_dec[j].pipe = j; +		} +		jpeg_inst = GET_INST(JPEG, i); +		adev->jpeg.inst[i].aid_id = +			jpeg_inst / adev->jpeg.num_inst_per_aid; +	} +	DRM_DEV_INFO(adev->dev, "JPEG decode is enabled in VM mode\n"); +} + +static const struct amdgpu_irq_src_funcs jpeg_v4_0_3_irq_funcs = { +	.set = jpeg_v4_0_3_set_interrupt_state, +	.process = jpeg_v4_0_3_process_interrupt, +}; + +static void jpeg_v4_0_3_set_irq_funcs(struct amdgpu_device *adev) +{ +	int i; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		adev->jpeg.inst->irq.num_types += adev->jpeg.num_jpeg_rings; +	} +	adev->jpeg.inst->irq.funcs = &jpeg_v4_0_3_irq_funcs; +} + +const struct amdgpu_ip_block_version jpeg_v4_0_3_ip_block = { +	.type = AMD_IP_BLOCK_TYPE_JPEG, +	.major = 4, +	.minor = 0, +	.rev = 3, +	.funcs = &jpeg_v4_0_3_ip_funcs, +}; + +static const struct amdgpu_ras_err_status_reg_entry jpeg_v4_0_3_ue_reg_list[] = { +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG0S, regVCN_UE_ERR_STATUS_HI_JPEG0S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG0S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG0D, regVCN_UE_ERR_STATUS_HI_JPEG0D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG0D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG1S, regVCN_UE_ERR_STATUS_HI_JPEG1S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG1S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG1D, regVCN_UE_ERR_STATUS_HI_JPEG1D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG1D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG2S, regVCN_UE_ERR_STATUS_HI_JPEG2S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG2S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG2D, regVCN_UE_ERR_STATUS_HI_JPEG2D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG2D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG3S, regVCN_UE_ERR_STATUS_HI_JPEG3S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG3S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG3D, regVCN_UE_ERR_STATUS_HI_JPEG3D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG3D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG4S, regVCN_UE_ERR_STATUS_HI_JPEG4S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG4S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG4D, regVCN_UE_ERR_STATUS_HI_JPEG4D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG4D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG5S, regVCN_UE_ERR_STATUS_HI_JPEG5S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG5S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG5D, regVCN_UE_ERR_STATUS_HI_JPEG5D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG5D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG6S, regVCN_UE_ERR_STATUS_HI_JPEG6S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG6S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG6D, regVCN_UE_ERR_STATUS_HI_JPEG6D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG6D"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG7S, regVCN_UE_ERR_STATUS_HI_JPEG7S), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG7S"}, +	{AMDGPU_RAS_REG_ENTRY(JPEG, 0, regVCN_UE_ERR_STATUS_LO_JPEG7D, regVCN_UE_ERR_STATUS_HI_JPEG7D), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "JPEG7D"}, +}; + +static void jpeg_v4_0_3_inst_query_ras_error_count(struct amdgpu_device *adev, +						   uint32_t jpeg_inst, +						   void *ras_err_status) +{ +	struct ras_err_data *err_data = (struct ras_err_data *)ras_err_status; + +	/* jpeg v4_0_3 only support uncorrectable errors */ +	amdgpu_ras_inst_query_ras_error_count(adev, +			jpeg_v4_0_3_ue_reg_list, +			ARRAY_SIZE(jpeg_v4_0_3_ue_reg_list), +			NULL, 0, GET_INST(VCN, jpeg_inst), +			AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, +			&err_data->ue_count); +} + +static void jpeg_v4_0_3_query_ras_error_count(struct amdgpu_device *adev, +					      void *ras_err_status) +{ +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__JPEG)) { +		dev_warn(adev->dev, "JPEG RAS is not supported\n"); +		return; +	} + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) +		jpeg_v4_0_3_inst_query_ras_error_count(adev, i, ras_err_status); +} + +static void jpeg_v4_0_3_inst_reset_ras_error_count(struct amdgpu_device *adev, +						   uint32_t jpeg_inst) +{ +	amdgpu_ras_inst_reset_ras_error_count(adev, +			jpeg_v4_0_3_ue_reg_list, +			ARRAY_SIZE(jpeg_v4_0_3_ue_reg_list), +			GET_INST(VCN, jpeg_inst)); +} + +static void jpeg_v4_0_3_reset_ras_error_count(struct amdgpu_device *adev) +{ +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__JPEG)) { +		dev_warn(adev->dev, "JPEG RAS is not supported\n"); +		return; +	} + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) +		jpeg_v4_0_3_inst_reset_ras_error_count(adev, i); +} + +static const struct amdgpu_ras_block_hw_ops jpeg_v4_0_3_ras_hw_ops = { +	.query_ras_error_count = jpeg_v4_0_3_query_ras_error_count, +	.reset_ras_error_count = jpeg_v4_0_3_reset_ras_error_count, +}; + +static struct amdgpu_jpeg_ras jpeg_v4_0_3_ras = { +	.ras_block = { +		.hw_ops = &jpeg_v4_0_3_ras_hw_ops, +	}, +}; + +static void jpeg_v4_0_3_set_ras_funcs(struct amdgpu_device *adev) +{ +	adev->jpeg.ras = &jpeg_v4_0_3_ras; +} diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h new file mode 100644 index 000000000000..22483dc66351 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h @@ -0,0 +1,51 @@ +/* + * Copyright 2022 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. + * + */ + +#ifndef __JPEG_V4_0_3_H__ +#define __JPEG_V4_0_3_H__ + +#define regUVD_JRBC_EXTERNAL_REG_INTERNAL_OFFSET			0x1bfff +#define regUVD_JPEG_GPCOM_CMD_INTERNAL_OFFSET				0x404d +#define regUVD_JPEG_GPCOM_DATA0_INTERNAL_OFFSET				0x404e +#define regUVD_JPEG_GPCOM_DATA1_INTERNAL_OFFSET				0x404f +#define regUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_INTERNAL_OFFSET		0x40ab +#define regUVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_INTERNAL_OFFSET	0x40ac +#define regUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET				0x40a4 +#define regUVD_LMI_JPEG_VMID_INTERNAL_OFFSET				0x40a6 +#define regUVD_LMI_JRBC_IB_64BIT_BAR_LOW_INTERNAL_OFFSET		0x40b6 +#define regUVD_LMI_JRBC_IB_64BIT_BAR_HIGH_INTERNAL_OFFSET		0x40b7 +#define regUVD_JRBC_IB_SIZE_INTERNAL_OFFSET				0x4082 +#define regUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_LOW_INTERNAL_OFFSET		0x42d4 +#define regUVD_LMI_JRBC_RB_MEM_RD_64BIT_BAR_HIGH_INTERNAL_OFFSET	0x42d5 +#define regUVD_JRBC_RB_COND_RD_TIMER_INTERNAL_OFFSET			0x4085 +#define regUVD_JRBC_RB_REF_DATA_INTERNAL_OFFSET				0x4084 +#define regUVD_JRBC_STATUS_INTERNAL_OFFSET				0x4089 +#define regUVD_JPEG_PITCH_INTERNAL_OFFSET				0x4043 +#define regUVD_JRBC0_UVD_JRBC_SCRATCH0_INTERNAL_OFFSET			0x4094 +#define regUVD_JRBC_EXTERNAL_MCM_ADDR_INTERNAL_OFFSET			0x1bffe + +#define JRBC_DEC_EXTERNAL_REG_WRITE_ADDR				0x18000 + +extern const struct amdgpu_ip_block_version jpeg_v4_0_3_ip_block; + +#endif /* __JPEG_V4_0_3_H__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v10_1.c b/drivers/gpu/drm/amd/amdgpu/mes_v10_1.c index 2e2062636d5f..36a123e6c8ee 100644 --- a/drivers/gpu/drm/amd/amdgpu/mes_v10_1.c +++ b/drivers/gpu/drm/amd/amdgpu/mes_v10_1.c @@ -149,7 +149,7 @@ static int mes_v10_1_add_hw_queue(struct amdgpu_mes *mes,  {  	struct amdgpu_device *adev = mes->adev;  	union MESAPI__ADD_QUEUE mes_add_queue_pkt; -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	uint32_t vm_cntx_cntl = hub->vm_cntx_cntl;  	memset(&mes_add_queue_pkt, 0, sizeof(mes_add_queue_pkt)); @@ -632,6 +632,8 @@ static int mes_v10_1_mqd_init(struct amdgpu_ring *ring)  	uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;  	uint32_t tmp; +	memset(mqd, 0, sizeof(*mqd)); +  	mqd->header = 0xC0310800;  	mqd->compute_pipelinestat_enable = 0x00000001;  	mqd->compute_static_thread_mgmt_se0 = 0xffffffff; @@ -728,6 +730,7 @@ static int mes_v10_1_mqd_init(struct amdgpu_ring *ring)  	/* offset: 184 - this is used for CP_HQD_GFX_CONTROL */  	mqd->cp_hqd_suspend_cntl_stack_offset = tmp; +	amdgpu_device_flush_hdp(ring->adev, NULL);  	return 0;  } @@ -797,8 +800,8 @@ static void mes_v10_1_queue_init_register(struct amdgpu_ring *ring)  static int mes_v10_1_kiq_enable_queue(struct amdgpu_device *adev)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0]; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	int r;  	if (!kiq->pmf || !kiq->pmf->kiq_map_queues) @@ -812,13 +815,7 @@ static int mes_v10_1_kiq_enable_queue(struct amdgpu_device *adev)  	kiq->pmf->kiq_map_queues(kiq_ring, &adev->mes.ring); -	r = amdgpu_ring_test_ring(kiq_ring); -	if (r) { -		DRM_ERROR("kfq enable failed\n"); -		kiq_ring->sched.ready = false; -	} - -	return r; +	return amdgpu_ring_test_helper(kiq_ring);  }  static int mes_v10_1_queue_init(struct amdgpu_device *adev) @@ -863,9 +860,9 @@ static int mes_v10_1_kiq_ring_init(struct amdgpu_device *adev)  {  	struct amdgpu_ring *ring; -	spin_lock_init(&adev->gfx.kiq.ring_lock); +	spin_lock_init(&adev->gfx.kiq[0].ring_lock); -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	ring->me = 3;  	ring->pipe = 1; @@ -891,7 +888,7 @@ static int mes_v10_1_mqd_sw_init(struct amdgpu_device *adev,  	struct amdgpu_ring *ring;  	if (pipe == AMDGPU_MES_KIQ_PIPE) -		ring = &adev->gfx.kiq.ring; +		ring = &adev->gfx.kiq[0].ring;  	else if (pipe == AMDGPU_MES_SCHED_PIPE)  		ring = &adev->mes.ring;  	else @@ -901,6 +898,7 @@ static int mes_v10_1_mqd_sw_init(struct amdgpu_device *adev,  		return 0;  	r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE, +				    AMDGPU_GEM_DOMAIN_VRAM |  				    AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj,  				    &ring->mqd_gpu_addr, &ring->mqd_ptr);  	if (r) { @@ -974,15 +972,15 @@ static int mes_v10_1_sw_fini(void *handle)  		amdgpu_ucode_release(&adev->mes.fw[pipe]);  	} -	amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj, -			      &adev->gfx.kiq.ring.mqd_gpu_addr, -			      &adev->gfx.kiq.ring.mqd_ptr); +	amdgpu_bo_free_kernel(&adev->gfx.kiq[0].ring.mqd_obj, +			      &adev->gfx.kiq[0].ring.mqd_gpu_addr, +			      &adev->gfx.kiq[0].ring.mqd_ptr);  	amdgpu_bo_free_kernel(&adev->mes.ring.mqd_obj,  			      &adev->mes.ring.mqd_gpu_addr,  			      &adev->mes.ring.mqd_ptr); -	amdgpu_ring_fini(&adev->gfx.kiq.ring); +	amdgpu_ring_fini(&adev->gfx.kiq[0].ring);  	amdgpu_ring_fini(&adev->mes.ring);  	amdgpu_mes_fini(adev); @@ -1038,7 +1036,7 @@ static int mes_v10_1_kiq_hw_init(struct amdgpu_device *adev)  	mes_v10_1_enable(adev, true); -	mes_v10_1_kiq_setting(&adev->gfx.kiq.ring); +	mes_v10_1_kiq_setting(&adev->gfx.kiq[0].ring);  	r = mes_v10_1_queue_init(adev);  	if (r) @@ -1090,7 +1088,7 @@ static int mes_v10_1_hw_init(void *handle)  	 * MES uses KIQ ring exclusively so driver cannot access KIQ ring  	 * with MES enabled.  	 */ -	adev->gfx.kiq.ring.sched.ready = false; +	adev->gfx.kiq[0].ring.sched.ready = false;  	adev->mes.ring.sched.ready = true;  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c index 45280f047180..1bdaa00c0b46 100644 --- a/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mes_v11_0.c @@ -164,7 +164,7 @@ static int mes_v11_0_add_hw_queue(struct amdgpu_mes *mes,  {  	struct amdgpu_device *adev = mes->adev;  	union MESAPI__ADD_QUEUE mes_add_queue_pkt; -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_GFXHUB(0)];  	uint32_t vm_cntx_cntl = hub->vm_cntx_cntl;  	memset(&mes_add_queue_pkt, 0, sizeof(mes_add_queue_pkt)); @@ -202,17 +202,14 @@ static int mes_v11_0_add_hw_queue(struct amdgpu_mes *mes,  	mes_add_queue_pkt.gws_size = input->gws_size;  	mes_add_queue_pkt.trap_handler_addr = input->tba_addr;  	mes_add_queue_pkt.tma_addr = input->tma_addr; +	mes_add_queue_pkt.trap_en = input->trap_en; +	mes_add_queue_pkt.skip_process_ctx_clear = input->skip_process_ctx_clear;  	mes_add_queue_pkt.is_kfd_process = input->is_kfd_process;  	/* For KFD, gds_size is re-used for queue size (needed in MES for AQL queues) */  	mes_add_queue_pkt.is_aql_queue = input->is_aql_queue;  	mes_add_queue_pkt.gds_size = input->queue_size; -	if (!(((adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) >= 4) && -		  (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(11, 0, 0)) && -		  (adev->ip_versions[GC_HWIP][0] <= IP_VERSION(11, 0, 3)))) -		mes_add_queue_pkt.trap_en = 1; -  	/* For KFD, gds_size is re-used for queue size (needed in MES for AQL queues) */  	mes_add_queue_pkt.is_aql_queue = input->is_aql_queue;  	mes_add_queue_pkt.gds_size = input->queue_size; @@ -339,6 +336,19 @@ static int mes_v11_0_misc_op(struct amdgpu_mes *mes,  		misc_pkt.wait_reg_mem.reg_offset1 = input->wrm_reg.reg0;  		misc_pkt.wait_reg_mem.reg_offset2 = input->wrm_reg.reg1;  		break; +	case MES_MISC_OP_SET_SHADER_DEBUGGER: +		misc_pkt.opcode = MESAPI_MISC__SET_SHADER_DEBUGGER; +		misc_pkt.set_shader_debugger.process_context_addr = +				input->set_shader_debugger.process_context_addr; +		misc_pkt.set_shader_debugger.flags.u32all = +				input->set_shader_debugger.flags.u32all; +		misc_pkt.set_shader_debugger.spi_gdbg_per_vmid_cntl = +				input->set_shader_debugger.spi_gdbg_per_vmid_cntl; +		memcpy(misc_pkt.set_shader_debugger.tcp_watch_cntl, +				input->set_shader_debugger.tcp_watch_cntl, +				sizeof(misc_pkt.set_shader_debugger.tcp_watch_cntl)); +		misc_pkt.set_shader_debugger.trap_en = input->set_shader_debugger.trap_en; +		break;  	default:  		DRM_ERROR("unsupported misc op (%d) \n", input->op);  		return -EINVAL; @@ -704,6 +714,8 @@ static int mes_v11_0_mqd_init(struct amdgpu_ring *ring)  	uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;  	uint32_t tmp; +	memset(mqd, 0, sizeof(*mqd)); +  	mqd->header = 0xC0310800;  	mqd->compute_pipelinestat_enable = 0x00000001;  	mqd->compute_static_thread_mgmt_se0 = 0xffffffff; @@ -797,6 +809,7 @@ static int mes_v11_0_mqd_init(struct amdgpu_ring *ring)  	mqd->cp_hqd_iq_timer = regCP_HQD_IQ_TIMER_DEFAULT;  	mqd->cp_hqd_quantum = regCP_HQD_QUANTUM_DEFAULT; +	amdgpu_device_flush_hdp(ring->adev, NULL);  	return 0;  } @@ -864,8 +877,8 @@ static void mes_v11_0_queue_init_register(struct amdgpu_ring *ring)  static int mes_v11_0_kiq_enable_queue(struct amdgpu_device *adev)  { -	struct amdgpu_kiq *kiq = &adev->gfx.kiq; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0]; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	int r;  	if (!kiq->pmf || !kiq->pmf->kiq_map_queues) @@ -879,12 +892,7 @@ static int mes_v11_0_kiq_enable_queue(struct amdgpu_device *adev)  	kiq->pmf->kiq_map_queues(kiq_ring, &adev->mes.ring); -	r = amdgpu_ring_test_ring(kiq_ring); -	if (r) { -		DRM_ERROR("kfq enable failed\n"); -		kiq_ring->sched.ready = false; -	} -	return r; +	return amdgpu_ring_test_helper(kiq_ring);  }  static int mes_v11_0_queue_init(struct amdgpu_device *adev, @@ -894,7 +902,7 @@ static int mes_v11_0_queue_init(struct amdgpu_device *adev,  	int r;  	if (pipe == AMDGPU_MES_KIQ_PIPE) -		ring = &adev->gfx.kiq.ring; +		ring = &adev->gfx.kiq[0].ring;  	else if (pipe == AMDGPU_MES_SCHED_PIPE)  		ring = &adev->mes.ring;  	else @@ -961,9 +969,9 @@ static int mes_v11_0_kiq_ring_init(struct amdgpu_device *adev)  {  	struct amdgpu_ring *ring; -	spin_lock_init(&adev->gfx.kiq.ring_lock); +	spin_lock_init(&adev->gfx.kiq[0].ring_lock); -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	ring->me = 3;  	ring->pipe = 1; @@ -989,7 +997,7 @@ static int mes_v11_0_mqd_sw_init(struct amdgpu_device *adev,  	struct amdgpu_ring *ring;  	if (pipe == AMDGPU_MES_KIQ_PIPE) -		ring = &adev->gfx.kiq.ring; +		ring = &adev->gfx.kiq[0].ring;  	else if (pipe == AMDGPU_MES_SCHED_PIPE)  		ring = &adev->mes.ring;  	else @@ -999,6 +1007,7 @@ static int mes_v11_0_mqd_sw_init(struct amdgpu_device *adev,  		return 0;  	r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE, +				    AMDGPU_GEM_DOMAIN_VRAM |  				    AMDGPU_GEM_DOMAIN_GTT, &ring->mqd_obj,  				    &ring->mqd_gpu_addr, &ring->mqd_ptr);  	if (r) { @@ -1074,15 +1083,15 @@ static int mes_v11_0_sw_fini(void *handle)  		amdgpu_ucode_release(&adev->mes.fw[pipe]);  	} -	amdgpu_bo_free_kernel(&adev->gfx.kiq.ring.mqd_obj, -			      &adev->gfx.kiq.ring.mqd_gpu_addr, -			      &adev->gfx.kiq.ring.mqd_ptr); +	amdgpu_bo_free_kernel(&adev->gfx.kiq[0].ring.mqd_obj, +			      &adev->gfx.kiq[0].ring.mqd_gpu_addr, +			      &adev->gfx.kiq[0].ring.mqd_ptr);  	amdgpu_bo_free_kernel(&adev->mes.ring.mqd_obj,  			      &adev->mes.ring.mqd_gpu_addr,  			      &adev->mes.ring.mqd_ptr); -	amdgpu_ring_fini(&adev->gfx.kiq.ring); +	amdgpu_ring_fini(&adev->gfx.kiq[0].ring);  	amdgpu_ring_fini(&adev->mes.ring);  	if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) { @@ -1175,7 +1184,7 @@ static int mes_v11_0_kiq_hw_init(struct amdgpu_device *adev)  	mes_v11_0_enable(adev, true); -	mes_v11_0_kiq_setting(&adev->gfx.kiq.ring); +	mes_v11_0_kiq_setting(&adev->gfx.kiq[0].ring);  	r = mes_v11_0_queue_init(adev, AMDGPU_MES_KIQ_PIPE);  	if (r) @@ -1196,7 +1205,7 @@ static int mes_v11_0_kiq_hw_fini(struct amdgpu_device *adev)  	}  	if (amdgpu_sriov_vf(adev)) { -		mes_v11_0_kiq_dequeue(&adev->gfx.kiq.ring); +		mes_v11_0_kiq_dequeue(&adev->gfx.kiq[0].ring);  		mes_v11_0_kiq_clear(adev);  	} @@ -1244,7 +1253,7 @@ static int mes_v11_0_hw_init(void *handle)  	 * MES uses KIQ ring exclusively so driver cannot access KIQ ring  	 * with MES enabled.  	 */ -	adev->gfx.kiq.ring.sched.ready = false; +	adev->gfx.kiq[0].ring.sched.ready = false;  	adev->mes.ring.sched.ready = true;  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index 15e7cbeae75b..fb91b31056ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c @@ -54,7 +54,7 @@ static u64 mmhub_v1_0_get_fb_location(struct amdgpu_device *adev)  static void mmhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -229,7 +229,7 @@ static void mmhub_v1_0_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned num_level, block_size;  	uint32_t tmp;  	int i; @@ -285,7 +285,7 @@ static void mmhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v1_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -338,7 +338,7 @@ static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)  static void mmhub_v1_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -415,7 +415,7 @@ static void mmhub_v1_0_set_fault_enable_default(struct amdgpu_device *adev, bool  static void mmhub_v1_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c index 73afbf2facc9..9086f2fdfaf4 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c @@ -54,7 +54,7 @@ static u64 mmhub_v1_7_get_fb_location(struct amdgpu_device *adev)  static void mmhub_v1_7_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			hub->ctx_addr_distance * vmid, lower_32_bits(page_table_base)); @@ -261,7 +261,7 @@ static void mmhub_v1_7_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v1_7_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned num_level, block_size;  	uint32_t tmp;  	int i; @@ -319,7 +319,7 @@ static void mmhub_v1_7_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v1_7_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -348,7 +348,7 @@ static int mmhub_v1_7_gart_enable(struct amdgpu_device *adev)  static void mmhub_v1_7_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -425,7 +425,7 @@ static void mmhub_v1_7_set_fault_enable_default(struct amdgpu_device *adev, bool  static void mmhub_v1_7_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c index 342d1702104c..5e8b493f8699 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c @@ -29,6 +29,7 @@  #include "soc15_common.h"  #include "soc15.h" +#include "amdgpu_ras.h"  #define regVM_L2_CNTL3_DEFAULT	0x80100007  #define regVM_L2_CNTL4_DEFAULT	0x000000c1 @@ -53,18 +54,30 @@ static u64 mmhub_v1_8_get_fb_location(struct amdgpu_device *adev)  static void mmhub_v1_8_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub; +	u32 inst_mask; +	int i; -	WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, -			    hub->ctx_addr_distance * vmid, lower_32_bits(page_table_base)); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		hub = &adev->vmhub[AMDGPU_MMHUB0(i)]; +		WREG32_SOC15_OFFSET(MMHUB, i, +				    regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, +				    hub->ctx_addr_distance * vmid, +				    lower_32_bits(page_table_base)); -	WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, -			    hub->ctx_addr_distance * vmid, upper_32_bits(page_table_base)); +		WREG32_SOC15_OFFSET(MMHUB, i, +				    regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, +				    hub->ctx_addr_distance * vmid, +				    upper_32_bits(page_table_base)); +	}  }  static void mmhub_v1_8_init_gart_aperture_regs(struct amdgpu_device *adev)  {  	uint64_t pt_base; +	u32 inst_mask; +	int i;  	if (adev->gmc.pdb0_bo)  		pt_base = amdgpu_gmc_pd_addr(adev->gmc.pdb0_bo); @@ -76,187 +89,248 @@ static void mmhub_v1_8_init_gart_aperture_regs(struct amdgpu_device *adev)  	/* If use GART for FB translation, vmid0 page table covers both  	 * vram and system memory (gart)  	 */ -	if (adev->gmc.pdb0_bo) { -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -			     (u32)(adev->gmc.fb_start >> 12)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -			     (u32)(adev->gmc.fb_start >> 44)); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		if (adev->gmc.pdb0_bo) { +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, +				     (u32)(adev->gmc.fb_start >> 12)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, +				     (u32)(adev->gmc.fb_start >> 44)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -			     (u32)(adev->gmc.gart_end >> 12)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -			     (u32)(adev->gmc.gart_end >> 44)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, +				     (u32)(adev->gmc.gart_end >> 12)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, +				     (u32)(adev->gmc.gart_end >> 44)); -	} else { -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, -			     (u32)(adev->gmc.gart_start >> 12)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, -			     (u32)(adev->gmc.gart_start >> 44)); +		} else { +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, +				     (u32)(adev->gmc.gart_start >> 12)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, +				     (u32)(adev->gmc.gart_start >> 44)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, -			     (u32)(adev->gmc.gart_end >> 12)); -		WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, -			     (u32)(adev->gmc.gart_end >> 44)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, +				     (u32)(adev->gmc.gart_end >> 12)); +			WREG32_SOC15(MMHUB, i, +				     regVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, +				     (u32)(adev->gmc.gart_end >> 44)); +		}  	}  }  static void mmhub_v1_8_init_system_aperture_regs(struct amdgpu_device *adev)  { +	uint32_t tmp, inst_mask;  	uint64_t value; -	uint32_t tmp; +	int i; -	/* Program the AGP BAR */ -	WREG32_SOC15(MMHUB, 0, regMC_VM_AGP_BASE, 0); -	WREG32_SOC15(MMHUB, 0, regMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); -	WREG32_SOC15(MMHUB, 0, regMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		/* Program the AGP BAR */ +		WREG32_SOC15(MMHUB, i, regMC_VM_AGP_BASE, 0); +		WREG32_SOC15(MMHUB, i, regMC_VM_AGP_BOT, +			     adev->gmc.agp_start >> 24); +		WREG32_SOC15(MMHUB, i, regMC_VM_AGP_TOP, +			     adev->gmc.agp_end >> 24); -	/* Program the system aperture low logical page number. */ -	WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_LOW_ADDR, -		     min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); +		if (amdgpu_sriov_vf(adev)) +			return; -	WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, -		     max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); +		/* Program the system aperture low logical page number. */ +		WREG32_SOC15(MMHUB, i, regMC_VM_SYSTEM_APERTURE_LOW_ADDR, +			min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); -	/* In the case squeezing vram into GART aperture, we don't use -	 * FB aperture and AGP aperture. Disable them. -	 */ -	if (adev->gmc.pdb0_bo) { -		WREG32_SOC15(MMHUB, 0, regMC_VM_AGP_BOT, 0xFFFFFF); -		WREG32_SOC15(MMHUB, 0, regMC_VM_AGP_TOP, 0); -		WREG32_SOC15(MMHUB, 0, regMC_VM_FB_LOCATION_TOP, 0); -		WREG32_SOC15(MMHUB, 0, regMC_VM_FB_LOCATION_BASE, 0x00FFFFFF); -		WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_LOW_ADDR, 0x3FFFFFFF); -		WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 0); -	} -	if (amdgpu_sriov_vf(adev)) -		return; +		WREG32_SOC15(MMHUB, i, regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, +			max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18); + +		/* In the case squeezing vram into GART aperture, we don't use +		 * FB aperture and AGP aperture. Disable them. +		 */ +		if (adev->gmc.pdb0_bo) { +			WREG32_SOC15(MMHUB, i, regMC_VM_AGP_BOT, 0xFFFFFF); +			WREG32_SOC15(MMHUB, i, regMC_VM_AGP_TOP, 0); +			WREG32_SOC15(MMHUB, i, regMC_VM_FB_LOCATION_TOP, 0); +			WREG32_SOC15(MMHUB, i, regMC_VM_FB_LOCATION_BASE, +				     0x00FFFFFF); +			WREG32_SOC15(MMHUB, i, +				     regMC_VM_SYSTEM_APERTURE_LOW_ADDR, +				     0x3FFFFFFF); +			WREG32_SOC15(MMHUB, i, +				     regMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 0); +		} -	/* Set default page address. */ -	value = amdgpu_gmc_vram_mc2pa(adev, adev->mem_scratch.gpu_addr); -	WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, -		     (u32)(value >> 12)); -	WREG32_SOC15(MMHUB, 0, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, -		     (u32)(value >> 44)); +		/* Set default page address. */ +		value = amdgpu_gmc_vram_mc2pa(adev, adev->mem_scratch.gpu_addr); +		WREG32_SOC15(MMHUB, i, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_LSB, +			     (u32)(value >> 12)); +		WREG32_SOC15(MMHUB, i, regMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB, +			     (u32)(value >> 44)); -	/* Program "protection fault". */ -	WREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, -		     (u32)(adev->dummy_page_addr >> 12)); -	WREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, -		     (u32)((u64)adev->dummy_page_addr >> 44)); +		/* Program "protection fault". */ +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_LO32, +			     (u32)(adev->dummy_page_addr >> 12)); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_PROTECTION_FAULT_DEFAULT_ADDR_HI32, +			     (u32)((u64)adev->dummy_page_addr >> 44)); -	tmp = RREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_CNTL2); -	tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL2, -			    ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1); -	WREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_CNTL2, tmp); +		tmp = RREG32_SOC15(MMHUB, i, regVM_L2_PROTECTION_FAULT_CNTL2); +		tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL2, +				    ACTIVE_PAGE_MIGRATION_PTE_READ_RETRY, 1); +		WREG32_SOC15(MMHUB, i, regVM_L2_PROTECTION_FAULT_CNTL2, tmp); +	}  }  static void mmhub_v1_8_init_tlb_regs(struct amdgpu_device *adev)  { -	uint32_t tmp; +	uint32_t tmp, inst_mask; +	int i;  	/* Setup TLB control */ -	tmp = RREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		tmp = RREG32_SOC15(MMHUB, i, regMC_VM_MX_L1_TLB_CNTL); -	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, -			    MTYPE, MTYPE_UC);/* XXX for emulation. */ -	tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); +		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, +				    MTYPE, MTYPE_UC);/* XXX for emulation. */ +		tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); -	WREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); +		WREG32_SOC15(MMHUB, i, regMC_VM_MX_L1_TLB_CNTL, tmp); +	}  }  static void mmhub_v1_8_init_cache_regs(struct amdgpu_device *adev)  { -	uint32_t tmp; +	uint32_t tmp, inst_mask; +	int i;  	if (amdgpu_sriov_vf(adev))  		return;  	/* Setup L2 cache */ -	tmp = RREG32_SOC15(MMHUB, 0, regVM_L2_CNTL); -	tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1); -	tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_FRAGMENT_PROCESSING, 1); -	/* 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, 0); -	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); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL, tmp); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		tmp = RREG32_SOC15(MMHUB, i, regVM_L2_CNTL); +		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 1); +		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, +				    ENABLE_L2_FRAGMENT_PROCESSING, 1); +		/* 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, +				    0); +		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); +		WREG32_SOC15(MMHUB, i, regVM_L2_CNTL, tmp); -	tmp = RREG32_SOC15(MMHUB, 0, regVM_L2_CNTL2); -	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); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL2, tmp); +		tmp = RREG32_SOC15(MMHUB, i, regVM_L2_CNTL2); +		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); +		WREG32_SOC15(MMHUB, i, regVM_L2_CNTL2, tmp); -	tmp = regVM_L2_CNTL3_DEFAULT; -	if (adev->gmc.translate_further) { -		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); -	} -	WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL3, tmp); +		tmp = regVM_L2_CNTL3_DEFAULT; +		if (adev->gmc.translate_further) { +			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); +		} +		WREG32_SOC15(MMHUB, i, regVM_L2_CNTL3, tmp); -	tmp = regVM_L2_CNTL4_DEFAULT; -	if (adev->gmc.xgmi.connected_to_cpu) { -		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, -				    VMC_TAP_PDE_REQUEST_PHYSICAL, 1); -		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, -				    VMC_TAP_PTE_REQUEST_PHYSICAL, 1); -	} else { -		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); +		tmp = regVM_L2_CNTL4_DEFAULT; +		/* For AMD APP APUs setup WC memory */ +		if (adev->gmc.xgmi.connected_to_cpu || adev->gmc.is_app_apu) { +			tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, +					    VMC_TAP_PDE_REQUEST_PHYSICAL, 1); +			tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, +					    VMC_TAP_PTE_REQUEST_PHYSICAL, 1); +		} else { +			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); +		} +		WREG32_SOC15(MMHUB, i, regVM_L2_CNTL4, tmp);  	} -	WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL4, tmp);  }  static void mmhub_v1_8_enable_system_domain(struct amdgpu_device *adev)  { -	uint32_t tmp; +	uint32_t tmp, inst_mask; +	int i; -	tmp = RREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_CNTL); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, -			adev->gmc.vmid0_page_table_depth); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_BLOCK_SIZE, -			adev->gmc.vmid0_page_table_block_size); -	tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, -			    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0); -	WREG32_SOC15(MMHUB, 0, regVM_CONTEXT0_CNTL, tmp); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		tmp = RREG32_SOC15(MMHUB, i, regVM_CONTEXT0_CNTL); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, ENABLE_CONTEXT, 1); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, +				adev->gmc.vmid0_page_table_depth); +		tmp = REG_SET_FIELD(tmp, +				    VM_CONTEXT0_CNTL, PAGE_TABLE_BLOCK_SIZE, +				    adev->gmc.vmid0_page_table_block_size); +		tmp = REG_SET_FIELD(tmp, VM_CONTEXT0_CNTL, +				    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0); +		WREG32_SOC15(MMHUB, i, regVM_CONTEXT0_CNTL, tmp); +	}  }  static void mmhub_v1_8_disable_identity_aperture(struct amdgpu_device *adev)  { +	u32 inst_mask; +	int i; +  	if (amdgpu_sriov_vf(adev))  		return; -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32, 0xFFFFFFFF); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32, 0x0000000F); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_LO32, +			     0XFFFFFFFF); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR_HI32, +			     0x0000000F); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32, 0); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32, 0); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_LO32, +			     0); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR_HI32, +			     0); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32, 0); -	WREG32_SOC15(MMHUB, 0, regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32, 0); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_LO32, 0); +		WREG32_SOC15(MMHUB, i, +			     regVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET_HI32, 0); +	}  }  static void mmhub_v1_8_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; -	unsigned num_level, block_size; -	uint32_t tmp; -	int i; +	struct amdgpu_vmhub *hub; +	unsigned int num_level, block_size; +	uint32_t tmp, inst_mask; +	int i, j;  	num_level = adev->vm_manager.num_level;  	block_size = adev->vm_manager.block_size; @@ -265,60 +339,75 @@ static void mmhub_v1_8_setup_vmid_config(struct amdgpu_device *adev)  	else  		block_size -= 9; -	for (i = 0; i <= 14; i++) { -		tmp = RREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_CNTL, i); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH, -				    num_level); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, -				    1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    PAGE_TABLE_BLOCK_SIZE, -				    block_size); -		/* On Aldebaran, XNACK can be enabled in the SQ per-process. -		 * Retry faults need to be enabled for that to work. -		 */ -		tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, -				    RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, -				    1); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_CNTL, -				    i * hub->ctx_distance, tmp); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, -				    i * hub->ctx_addr_distance, 0); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, -				    i * hub->ctx_addr_distance, 0); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, -				    i * hub->ctx_addr_distance, -				    lower_32_bits(adev->vm_manager.max_pfn - 1)); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, -				    i * hub->ctx_addr_distance, -				    upper_32_bits(adev->vm_manager.max_pfn - 1)); +	inst_mask = adev->aid_mask; +	for_each_inst(j, inst_mask) { +		hub = &adev->vmhub[AMDGPU_MMHUB0(j)]; +		for (i = 0; i <= 14; i++) { +			tmp = RREG32_SOC15_OFFSET(MMHUB, j, regVM_CONTEXT1_CNTL, +						  i); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    ENABLE_CONTEXT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    PAGE_TABLE_DEPTH, num_level); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1); +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +					    PAGE_TABLE_BLOCK_SIZE, +					    block_size); +			/* On 9.4.3, XNACK can be enabled in the SQ +			 * per-process. Retry faults need to be enabled for +			 * that to work. +			 */ +			tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, +				RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 1); +			WREG32_SOC15_OFFSET(MMHUB, j, regVM_CONTEXT1_CNTL, +					    i * hub->ctx_distance, tmp); +			WREG32_SOC15_OFFSET(MMHUB, j, +				regVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, +				i * hub->ctx_addr_distance, 0); +			WREG32_SOC15_OFFSET(MMHUB, j, +				regVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, +				i * hub->ctx_addr_distance, 0); +			WREG32_SOC15_OFFSET(MMHUB, j, +				regVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, +				i * hub->ctx_addr_distance, +				lower_32_bits(adev->vm_manager.max_pfn - 1)); +			WREG32_SOC15_OFFSET(MMHUB, j, +				regVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, +				i * hub->ctx_addr_distance, +				upper_32_bits(adev->vm_manager.max_pfn - 1)); +		}  	}  }  static void mmhub_v1_8_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; -	unsigned i; +	struct amdgpu_vmhub *hub; +	u32 i, j, inst_mask; -	for (i = 0; i < 18; ++i) { -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, -				    i * hub->eng_addr_distance, 0xffffffff); -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, -				    i * hub->eng_addr_distance, 0x1f); +	inst_mask = adev->aid_mask; +	for_each_inst(j, inst_mask) { +		hub = &adev->vmhub[AMDGPU_MMHUB0(j)]; +		for (i = 0; i < 18; ++i) { +			WREG32_SOC15_OFFSET(MMHUB, j, +					regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, +					i * hub->eng_addr_distance, 0xffffffff); +			WREG32_SOC15_OFFSET(MMHUB, j, +					regVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, +					i * hub->eng_addr_distance, 0x1f); +		}  	}  } @@ -352,28 +441,34 @@ static int mmhub_v1_8_gart_enable(struct amdgpu_device *adev)  static void mmhub_v1_8_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub;  	u32 tmp; -	u32 i; +	u32 i, j, inst_mask;  	/* Disable all tables */ -	for (i = 0; i < 16; i++) -		WREG32_SOC15_OFFSET(MMHUB, 0, regVM_CONTEXT0_CNTL, -				    i * hub->ctx_distance, 0); +	inst_mask = adev->aid_mask; +	for_each_inst(j, inst_mask) { +		hub = &adev->vmhub[AMDGPU_MMHUB0(j)]; +		for (i = 0; i < 16; i++) +			WREG32_SOC15_OFFSET(MMHUB, j, regVM_CONTEXT0_CNTL, +					    i * hub->ctx_distance, 0); -	/* Setup TLB control */ -	tmp = RREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL); -	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); -	WREG32_SOC15(MMHUB, 0, regMC_VM_MX_L1_TLB_CNTL, tmp); +		/* Setup TLB control */ +		tmp = RREG32_SOC15(MMHUB, j, regMC_VM_MX_L1_TLB_CNTL); +		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); +		WREG32_SOC15(MMHUB, j, regMC_VM_MX_L1_TLB_CNTL, tmp); -	if (!amdgpu_sriov_vf(adev)) { -		/* Setup L2 cache */ -		tmp = RREG32_SOC15(MMHUB, 0, regVM_L2_CNTL); -		tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, 0); -		WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL, tmp); -		WREG32_SOC15(MMHUB, 0, regVM_L2_CNTL3, 0); +		if (!amdgpu_sriov_vf(adev)) { +			/* Setup L2 cache */ +			tmp = RREG32_SOC15(MMHUB, j, regVM_L2_CNTL); +			tmp = REG_SET_FIELD(tmp, VM_L2_CNTL, ENABLE_L2_CACHE, +					    0); +			WREG32_SOC15(MMHUB, j, regVM_L2_CNTL, tmp); +			WREG32_SOC15(MMHUB, j, regVM_L2_CNTL3, 0); +		}  	}  } @@ -385,73 +480,83 @@ static void mmhub_v1_8_gart_disable(struct amdgpu_device *adev)   */  static void mmhub_v1_8_set_fault_enable_default(struct amdgpu_device *adev, bool value)  { -	u32 tmp; +	u32 tmp, inst_mask; +	int i;  	if (amdgpu_sriov_vf(adev))  		return; -	tmp = RREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_CNTL); -	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); -	if (!value) { +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		tmp = RREG32_SOC15(MMHUB, i, regVM_L2_PROTECTION_FAULT_CNTL);  		tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL, -				    CRASH_ON_NO_RETRY_FAULT, 1); +				RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);  		tmp = REG_SET_FIELD(tmp, VM_L2_PROTECTION_FAULT_CNTL, -				    CRASH_ON_RETRY_FAULT, 1); -	} +				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); +		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); +		} -	WREG32_SOC15(MMHUB, 0, regVM_L2_PROTECTION_FAULT_CNTL, tmp); +		WREG32_SOC15(MMHUB, i, regVM_L2_PROTECTION_FAULT_CNTL, tmp); +	}  }  static void mmhub_v1_8_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub; +	u32 inst_mask; +	int i; -	hub->ctx0_ptb_addr_lo32 = -		SOC15_REG_OFFSET(MMHUB, 0, -				 regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32); -	hub->ctx0_ptb_addr_hi32 = -		SOC15_REG_OFFSET(MMHUB, 0, -				 regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); -	hub->vm_inv_eng0_req = -		SOC15_REG_OFFSET(MMHUB, 0, regVM_INVALIDATE_ENG0_REQ); -	hub->vm_inv_eng0_ack = -		SOC15_REG_OFFSET(MMHUB, 0, regVM_INVALIDATE_ENG0_ACK); -	hub->vm_context0_cntl = -		SOC15_REG_OFFSET(MMHUB, 0, regVM_CONTEXT0_CNTL); -	hub->vm_l2_pro_fault_status = -		SOC15_REG_OFFSET(MMHUB, 0, regVM_L2_PROTECTION_FAULT_STATUS); -	hub->vm_l2_pro_fault_cntl = -		SOC15_REG_OFFSET(MMHUB, 0, regVM_L2_PROTECTION_FAULT_CNTL); +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) { +		hub = &adev->vmhub[AMDGPU_MMHUB0(i)]; -	hub->ctx_distance = regVM_CONTEXT1_CNTL - regVM_CONTEXT0_CNTL; -	hub->ctx_addr_distance = regVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 - -		regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; -	hub->eng_distance = regVM_INVALIDATE_ENG1_REQ - regVM_INVALIDATE_ENG0_REQ; -	hub->eng_addr_distance = regVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 - -		regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32; +		hub->ctx0_ptb_addr_lo32 = SOC15_REG_OFFSET(MMHUB, i, +			regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32); +		hub->ctx0_ptb_addr_hi32 = SOC15_REG_OFFSET(MMHUB, i, +			regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32); +		hub->vm_inv_eng0_req = +			SOC15_REG_OFFSET(MMHUB, i, regVM_INVALIDATE_ENG0_REQ); +		hub->vm_inv_eng0_ack = +			SOC15_REG_OFFSET(MMHUB, i, regVM_INVALIDATE_ENG0_ACK); +		hub->vm_context0_cntl = +			SOC15_REG_OFFSET(MMHUB, i, regVM_CONTEXT0_CNTL); +		hub->vm_l2_pro_fault_status = SOC15_REG_OFFSET(MMHUB, i, +			regVM_L2_PROTECTION_FAULT_STATUS); +		hub->vm_l2_pro_fault_cntl = SOC15_REG_OFFSET(MMHUB, i, +			regVM_L2_PROTECTION_FAULT_CNTL); +		hub->ctx_distance = regVM_CONTEXT1_CNTL - regVM_CONTEXT0_CNTL; +		hub->ctx_addr_distance = +			regVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32 - +			regVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32; +		hub->eng_distance = regVM_INVALIDATE_ENG1_REQ - +			regVM_INVALIDATE_ENG0_REQ; +		hub->eng_addr_distance = regVM_INVALIDATE_ENG1_ADDR_RANGE_LO32 - +			regVM_INVALIDATE_ENG0_ADDR_RANGE_LO32; +	}  }  static int mmhub_v1_8_set_clockgating(struct amdgpu_device *adev, @@ -475,3 +580,277 @@ const struct amdgpu_mmhub_funcs mmhub_v1_8_funcs = {  	.set_clockgating = mmhub_v1_8_set_clockgating,  	.get_clockgating = mmhub_v1_8_get_clockgating,  }; + +static const struct amdgpu_ras_err_status_reg_entry mmhub_v1_8_ce_reg_list[] = { +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA0_CE_ERR_STATUS_LO, regMMEA0_CE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA0"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA1_CE_ERR_STATUS_LO, regMMEA1_CE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA1"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA2_CE_ERR_STATUS_LO, regMMEA2_CE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA2"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA3_CE_ERR_STATUS_LO, regMMEA3_CE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA3"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA4_CE_ERR_STATUS_LO, regMMEA4_CE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA4"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMM_CANE_CE_ERR_STATUS_LO, regMM_CANE_CE_ERR_STATUS_HI), +	1, 0, "MM_CANE"}, +}; + +static const struct amdgpu_ras_err_status_reg_entry mmhub_v1_8_ue_reg_list[] = { +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA0_UE_ERR_STATUS_LO, regMMEA0_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA0"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA1_UE_ERR_STATUS_LO, regMMEA1_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA1"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA2_UE_ERR_STATUS_LO, regMMEA2_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA2"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA3_UE_ERR_STATUS_LO, regMMEA3_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA3"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMMEA4_UE_ERR_STATUS_LO, regMMEA4_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "MMEA4"}, +	{AMDGPU_RAS_REG_ENTRY(MMHUB, 0, regMM_CANE_UE_ERR_STATUS_LO, regMM_CANE_UE_ERR_STATUS_HI), +	1, 0, "MM_CANE"}, +}; + +static const struct amdgpu_ras_memory_id_entry mmhub_v1_8_ras_memory_list[] = { +	{AMDGPU_MMHUB_WGMI_PAGEMEM, "MMEA_WGMI_PAGEMEM"}, +	{AMDGPU_MMHUB_RGMI_PAGEMEM, "MMEA_RGMI_PAGEMEM"}, +	{AMDGPU_MMHUB_WDRAM_PAGEMEM, "MMEA_WDRAM_PAGEMEM"}, +	{AMDGPU_MMHUB_RDRAM_PAGEMEM, "MMEA_RDRAM_PAGEMEM"}, +	{AMDGPU_MMHUB_WIO_CMDMEM, "MMEA_WIO_CMDMEM"}, +	{AMDGPU_MMHUB_RIO_CMDMEM, "MMEA_RIO_CMDMEM"}, +	{AMDGPU_MMHUB_WGMI_CMDMEM, "MMEA_WGMI_CMDMEM"}, +	{AMDGPU_MMHUB_RGMI_CMDMEM, "MMEA_RGMI_CMDMEM"}, +	{AMDGPU_MMHUB_WDRAM_CMDMEM, "MMEA_WDRAM_CMDMEM"}, +	{AMDGPU_MMHUB_RDRAM_CMDMEM, "MMEA_RDRAM_CMDMEM"}, +	{AMDGPU_MMHUB_MAM_DMEM0, "MMEA_MAM_DMEM0"}, +	{AMDGPU_MMHUB_MAM_DMEM1, "MMEA_MAM_DMEM1"}, +	{AMDGPU_MMHUB_MAM_DMEM2, "MMEA_MAM_DMEM2"}, +	{AMDGPU_MMHUB_MAM_DMEM3, "MMEA_MAM_DMEM3"}, +	{AMDGPU_MMHUB_WRET_TAGMEM, "MMEA_WRET_TAGMEM"}, +	{AMDGPU_MMHUB_RRET_TAGMEM, "MMEA_RRET_TAGMEM"}, +	{AMDGPU_MMHUB_WIO_DATAMEM, "MMEA_WIO_DATAMEM"}, +	{AMDGPU_MMHUB_WGMI_DATAMEM, "MMEA_WGMI_DATAMEM"}, +	{AMDGPU_MMHUB_WDRAM_DATAMEM, "MMEA_WDRAM_DATAMEM"}, +}; + +static void mmhub_v1_8_inst_query_ras_error_count(struct amdgpu_device *adev, +						  uint32_t mmhub_inst, +						  void *ras_err_status) +{ +	struct ras_err_data *err_data = (struct ras_err_data *)ras_err_status; + +	amdgpu_ras_inst_query_ras_error_count(adev, +					mmhub_v1_8_ce_reg_list, +					ARRAY_SIZE(mmhub_v1_8_ce_reg_list), +					mmhub_v1_8_ras_memory_list, +					ARRAY_SIZE(mmhub_v1_8_ras_memory_list), +					mmhub_inst, +					AMDGPU_RAS_ERROR__SINGLE_CORRECTABLE, +					&err_data->ce_count); +	amdgpu_ras_inst_query_ras_error_count(adev, +					mmhub_v1_8_ue_reg_list, +					ARRAY_SIZE(mmhub_v1_8_ue_reg_list), +					mmhub_v1_8_ras_memory_list, +					ARRAY_SIZE(mmhub_v1_8_ras_memory_list), +					mmhub_inst, +					AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, +					&err_data->ue_count); +} + +static void mmhub_v1_8_query_ras_error_count(struct amdgpu_device *adev, +					     void *ras_err_status) +{ +	uint32_t inst_mask; +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) { +		dev_warn(adev->dev, "MMHUB RAS is not supported\n"); +		return; +	} + +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) +		mmhub_v1_8_inst_query_ras_error_count(adev, i, ras_err_status); +} + +static void mmhub_v1_8_inst_reset_ras_error_count(struct amdgpu_device *adev, +						  uint32_t mmhub_inst) +{ +	amdgpu_ras_inst_reset_ras_error_count(adev, +					mmhub_v1_8_ce_reg_list, +					ARRAY_SIZE(mmhub_v1_8_ce_reg_list), +					mmhub_inst); +	amdgpu_ras_inst_reset_ras_error_count(adev, +					mmhub_v1_8_ue_reg_list, +					ARRAY_SIZE(mmhub_v1_8_ue_reg_list), +					mmhub_inst); +} + +static void mmhub_v1_8_reset_ras_error_count(struct amdgpu_device *adev) +{ +	uint32_t inst_mask; +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) { +		dev_warn(adev->dev, "MMHUB RAS is not supported\n"); +		return; +	} + +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) +		mmhub_v1_8_inst_reset_ras_error_count(adev, i); +} + +static const u32 mmhub_v1_8_mmea_err_status_reg[] __maybe_unused = { +	regMMEA0_ERR_STATUS, +	regMMEA1_ERR_STATUS, +	regMMEA2_ERR_STATUS, +	regMMEA3_ERR_STATUS, +	regMMEA4_ERR_STATUS, +}; + +static void mmhub_v1_8_inst_query_ras_err_status(struct amdgpu_device *adev, +						 uint32_t mmhub_inst) +{ +	uint32_t reg_value; +	uint32_t mmea_err_status_addr_dist; +	uint32_t i; + +	/* query mmea ras err status */ +	mmea_err_status_addr_dist = regMMEA1_ERR_STATUS - regMMEA0_ERR_STATUS; +	for (i = 0; i < ARRAY_SIZE(mmhub_v1_8_mmea_err_status_reg); i++) { +		reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +						regMMEA0_ERR_STATUS, +						i * mmea_err_status_addr_dist); +		if (REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_RDRSP_STATUS) || +		    REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_WRRSP_STATUS) || +		    REG_GET_FIELD(reg_value, MMEA0_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) { +			dev_warn(adev->dev, +				 "Detected MMEA%d err in MMHUB%d, status: 0x%x\n", +				 i, mmhub_inst, reg_value); +		} +	} + +	/* query mm_cane ras err status */ +	reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS); +	if (REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_RDRSP_STATUS) || +	    REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_WRRSP_STATUS) || +	    REG_GET_FIELD(reg_value, MM_CANE_ERR_STATUS, SDPM_RDRSP_DATAPARITY_ERROR)) { +		dev_warn(adev->dev, +			 "Detected MM CANE err in MMHUB%d, status: 0x%x\n", +			 mmhub_inst, reg_value); +	} +} + +static void mmhub_v1_8_query_ras_error_status(struct amdgpu_device *adev) +{ +	uint32_t inst_mask; +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) { +		dev_warn(adev->dev, "MMHUB RAS is not supported\n"); +		return; +	} + +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) +		mmhub_v1_8_inst_query_ras_err_status(adev, i); +} + +static void mmhub_v1_8_inst_reset_ras_err_status(struct amdgpu_device *adev, +						 uint32_t mmhub_inst) +{ +	uint32_t mmea_cgtt_clk_cntl_addr_dist; +	uint32_t mmea_err_status_addr_dist; +	uint32_t reg_value; +	uint32_t i; + +	/* reset mmea ras err status */ +	mmea_cgtt_clk_cntl_addr_dist = regMMEA1_CGTT_CLK_CTRL - regMMEA0_CGTT_CLK_CTRL; +	mmea_err_status_addr_dist = regMMEA1_ERR_STATUS - regMMEA0_ERR_STATUS; +	for (i = 0; i < ARRAY_SIZE(mmhub_v1_8_mmea_err_status_reg); i++) { +		/* force clk branch on for response path +		 * set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 1 +		 */ +		reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +						regMMEA0_CGTT_CLK_CTRL, +						i * mmea_cgtt_clk_cntl_addr_dist); +		reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL, +					  SOFT_OVERRIDE_RETURN, 1); +		WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +				    regMMEA0_CGTT_CLK_CTRL, +				    i * mmea_cgtt_clk_cntl_addr_dist, +				    reg_value); + +		/* set MMEA0_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */ +		reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +						regMMEA0_ERR_STATUS, +						i * mmea_err_status_addr_dist); +		reg_value = REG_SET_FIELD(reg_value, MMEA0_ERR_STATUS, +					  CLEAR_ERROR_STATUS, 1); +		WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +				    regMMEA0_ERR_STATUS, +				    i * mmea_err_status_addr_dist, +				    reg_value); + +		/* set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 0 */ +		reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +						regMMEA0_CGTT_CLK_CTRL, +						i * mmea_cgtt_clk_cntl_addr_dist); +		reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL, +					  SOFT_OVERRIDE_RETURN, 0); +		WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, +				    regMMEA0_CGTT_CLK_CTRL, +				    i * mmea_cgtt_clk_cntl_addr_dist, +				    reg_value); +	} + +	/* reset mm_cane ras err status +	 * force clk branch on for response path +	 * set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 1 +	 */ +	reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL); +	reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL, +				  SOFT_OVERRIDE_ATRET, 1); +	WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value); + +	/* set MM_CANE_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */ +	reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS); +	reg_value = REG_SET_FIELD(reg_value, MM_CANE_ERR_STATUS, +				  CLEAR_ERROR_STATUS, 1); +	WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS, reg_value); + +	/* set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 0 */ +	reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL); +	reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL, +				  SOFT_OVERRIDE_ATRET, 0); +	WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value); +} + +static void mmhub_v1_8_reset_ras_error_status(struct amdgpu_device *adev) +{ +	uint32_t inst_mask; +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) { +		dev_warn(adev->dev, "MMHUB RAS is not supported\n"); +		return; +	} + +	inst_mask = adev->aid_mask; +	for_each_inst(i, inst_mask) +		mmhub_v1_8_inst_reset_ras_err_status(adev, i); +} + +static const struct amdgpu_ras_block_hw_ops mmhub_v1_8_ras_hw_ops = { +	.query_ras_error_count = mmhub_v1_8_query_ras_error_count, +	.reset_ras_error_count = mmhub_v1_8_reset_ras_error_count, +	.query_ras_error_status = mmhub_v1_8_query_ras_error_status, +	.reset_ras_error_status = mmhub_v1_8_reset_ras_error_status, +}; + +struct amdgpu_mmhub_ras mmhub_v1_8_ras = { +	.ras_block = { +		.hw_ops = &mmhub_v1_8_ras_hw_ops, +	}, +}; diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.h b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.h index 0bb36200e4e5..126f0075ac50 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.h +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.h @@ -24,5 +24,6 @@  #define __MMHUB_V1_8_H__  extern const struct amdgpu_mmhub_funcs mmhub_v1_8_funcs; +extern struct amdgpu_mmhub_ras mmhub_v1_8_ras;  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c index 278e32db878d..8f76c6ecf50a 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c @@ -187,7 +187,7 @@ mmhub_v2_0_print_l2_protection_fault_status(struct amdgpu_device *adev,  static void mmhub_v2_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -362,7 +362,7 @@ static void mmhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v2_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	int i;  	uint32_t tmp; @@ -412,7 +412,7 @@ static void mmhub_v2_0_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v2_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -441,7 +441,7 @@ static int mmhub_v2_0_gart_enable(struct amdgpu_device *adev)  static void mmhub_v2_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -520,7 +520,7 @@ static const struct amdgpu_vmhub_funcs mmhub_v2_0_vmhub_funcs = {  static void mmhub_v2_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c index fcf2813e70db..8bd0fc8d9d25 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c @@ -121,7 +121,7 @@ static void mmhub_v2_3_setup_vm_pt_regs(struct amdgpu_device *adev,  					uint32_t vmid,  					uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, lower_32_bits(page_table_base)); @@ -280,7 +280,7 @@ static void mmhub_v2_3_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v2_3_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	int i;  	uint32_t tmp; @@ -330,7 +330,7 @@ static void mmhub_v2_3_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v2_3_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -373,7 +373,7 @@ static int mmhub_v2_3_gart_enable(struct amdgpu_device *adev)  static void mmhub_v2_3_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -446,7 +446,7 @@ static const struct amdgpu_vmhub_funcs mmhub_v2_3_vmhub_funcs = {  static void mmhub_v2_3_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c index 17a792616979..441379e91cfa 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.c @@ -136,7 +136,7 @@ mmhub_v3_0_print_l2_protection_fault_status(struct amdgpu_device *adev,  static void mmhub_v3_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -319,7 +319,7 @@ static void mmhub_v3_0_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v3_0_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	int i;  	uint32_t tmp; @@ -369,7 +369,7 @@ static void mmhub_v3_0_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v3_0_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -398,7 +398,7 @@ static int mmhub_v3_0_gart_enable(struct amdgpu_device *adev)  static void mmhub_v3_0_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -477,7 +477,7 @@ static const struct amdgpu_vmhub_funcs mmhub_v3_0_vmhub_funcs = {  static void mmhub_v3_0_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c index 26509b6b8c24..12c7f4b46ea9 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.c @@ -138,7 +138,7 @@ static void mmhub_v3_0_1_setup_vm_pt_regs(struct amdgpu_device *adev,  					  uint32_t vmid,  					  uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -306,7 +306,7 @@ static void mmhub_v3_0_1_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v3_0_1_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	int i;  	uint32_t tmp; @@ -356,7 +356,7 @@ static void mmhub_v3_0_1_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v3_0_1_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -385,7 +385,7 @@ static int mmhub_v3_0_1_gart_enable(struct amdgpu_device *adev)  static void mmhub_v3_0_1_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -459,7 +459,7 @@ static const struct amdgpu_vmhub_funcs mmhub_v3_0_1_vmhub_funcs = {  static void mmhub_v3_0_1_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c index 26abbc6a47ab..5dadc85abf7e 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.c @@ -129,7 +129,7 @@ mmhub_v3_0_2_print_l2_protection_fault_status(struct amdgpu_device *adev,  static void mmhub_v3_0_2_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,  				uint64_t page_table_base)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0, regMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,  			    hub->ctx_addr_distance * vmid, @@ -311,7 +311,7 @@ static void mmhub_v3_0_2_disable_identity_aperture(struct amdgpu_device *adev)  static void mmhub_v3_0_2_setup_vmid_config(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	int i;  	uint32_t tmp; @@ -361,7 +361,7 @@ static void mmhub_v3_0_2_setup_vmid_config(struct amdgpu_device *adev)  static void mmhub_v3_0_2_program_invalidation(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -390,7 +390,7 @@ static int mmhub_v3_0_2_gart_enable(struct amdgpu_device *adev)  static void mmhub_v3_0_2_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i; @@ -469,7 +469,7 @@ static const struct amdgpu_vmhub_funcs mmhub_v3_0_2_vmhub_funcs = {  static void mmhub_v3_0_2_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	hub->ctx0_ptb_addr_lo32 =  		SOC15_REG_OFFSET(MMHUB, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c index 72083e96222f..e790f890aec6 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c @@ -57,7 +57,7 @@ static u64 mmhub_v9_4_get_fb_location(struct amdgpu_device *adev)  static void mmhub_v9_4_setup_hubid_vm_pt_regs(struct amdgpu_device *adev, int hubid,  				uint32_t vmid, uint64_t value)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	WREG32_SOC15_OFFSET(MMHUB, 0,  			    mmVML2VC0_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, @@ -294,7 +294,7 @@ static void mmhub_v9_4_disable_identity_aperture(struct amdgpu_device *adev,  static void mmhub_v9_4_setup_vmid_config(struct amdgpu_device *adev, int hubid)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned int num_level, block_size;  	uint32_t tmp;  	int i; @@ -363,7 +363,7 @@ static void mmhub_v9_4_setup_vmid_config(struct amdgpu_device *adev, int hubid)  static void mmhub_v9_4_program_invalidation(struct amdgpu_device *adev,  					    int hubid)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	unsigned i;  	for (i = 0; i < 18; ++i) { @@ -404,7 +404,7 @@ static int mmhub_v9_4_gart_enable(struct amdgpu_device *adev)  static void mmhub_v9_4_gart_disable(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; +	struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB0(0)];  	u32 tmp;  	u32 i, j; @@ -507,8 +507,8 @@ static void mmhub_v9_4_set_fault_enable_default(struct amdgpu_device *adev, bool  static void mmhub_v9_4_init(struct amdgpu_device *adev)  { -	struct amdgpu_vmhub *hub[MMHUB_NUM_INSTANCES] = -		{&adev->vmhub[AMDGPU_MMHUB_0], &adev->vmhub[AMDGPU_MMHUB_1]}; +	struct amdgpu_vmhub *hub[MMHUB_NUM_INSTANCES] = { +		&adev->vmhub[AMDGPU_MMHUB0(0)], &adev->vmhub[AMDGPU_MMHUB1(0)]};  	int i;  	for (i = 0; i < MMHUB_NUM_INSTANCES; i++) { diff --git a/drivers/gpu/drm/amd/amdgpu/mmsch_v3_0.h b/drivers/gpu/drm/amd/amdgpu/mmsch_v3_0.h index 3e4e858a6965..a773ef61b78c 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmsch_v3_0.h +++ b/drivers/gpu/drm/amd/amdgpu/mmsch_v3_0.h @@ -30,6 +30,8 @@  #define MMSCH_VERSION_MINOR	0  #define MMSCH_VERSION	(MMSCH_VERSION_MAJOR << 16 | MMSCH_VERSION_MINOR) +#define MMSCH_V3_0_VCN_INSTANCES 0x2 +  enum mmsch_v3_0_command_type {  	MMSCH_COMMAND__DIRECT_REG_WRITE = 0,  	MMSCH_COMMAND__DIRECT_REG_POLLING = 2, @@ -47,7 +49,7 @@ struct mmsch_v3_0_table_info {  struct mmsch_v3_0_init_header {  	uint32_t version;  	uint32_t total_size; -	struct mmsch_v3_0_table_info inst[AMDGPU_MAX_VCN_INSTANCES]; +	struct mmsch_v3_0_table_info inst[MMSCH_V3_0_VCN_INSTANCES];  };  struct mmsch_v3_0_cmd_direct_reg_header { diff --git a/drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h b/drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h index 83653a50a1a2..796d4f8791e5 100644 --- a/drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h +++ b/drivers/gpu/drm/amd/amdgpu/mmsch_v4_0.h @@ -43,6 +43,8 @@  #define MMSCH_VF_MAILBOX_RESP__OK 0x1  #define MMSCH_VF_MAILBOX_RESP__INCOMPLETE 0x2 +#define MMSCH_V4_0_VCN_INSTANCES 0x2 +  enum mmsch_v4_0_command_type {  	MMSCH_COMMAND__DIRECT_REG_WRITE = 0,  	MMSCH_COMMAND__DIRECT_REG_POLLING = 2, @@ -60,7 +62,7 @@ struct mmsch_v4_0_table_info {  struct mmsch_v4_0_init_header {  	uint32_t version;  	uint32_t total_size; -	struct mmsch_v4_0_table_info inst[AMDGPU_MAX_VCN_INSTANCES]; +	struct mmsch_v4_0_table_info inst[MMSCH_V4_0_VCN_INSTANCES];  	struct mmsch_v4_0_table_info jpegdec;  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c index 24d12075ca3a..d19325476752 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c @@ -30,6 +30,8 @@  #include "ivsrcid/nbio/irqsrcs_nbif_7_4.h"  #include <uapi/linux/kfd_ioctl.h> +#define NPS_MODE_MASK 0x000000FFL +  static void nbio_v7_9_remap_hdp_registers(struct amdgpu_device *adev)  {  	WREG32_SOC15(NBIO, 0, regBIF_BX0_REMAP_HDP_MEM_FLUSH_CNTL, @@ -66,6 +68,13 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  			bool use_doorbell, int doorbell_index, int doorbell_size)  {  	u32 doorbell_range = 0, doorbell_ctrl = 0; +	int aid_id, dev_inst; + +	dev_inst = GET_INST(SDMA0, instance); +	aid_id = adev->sdma.instance[instance].aid_id; + +	if (use_doorbell == false) +		return;  	doorbell_range =  		REG_SET_FIELD(doorbell_range, DOORBELL0_CTRL_ENTRY_0, @@ -80,9 +89,10 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  		REG_SET_FIELD(doorbell_ctrl, S2A_DOORBELL_ENTRY_1_CTRL,  			S2A_DOORBELL_PORT1_RANGE_SIZE, doorbell_size); -	switch (instance) { +	switch (dev_inst % adev->sdma.num_inst_per_aid) {  	case 0: -		WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_1, doorbell_range); +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_1, +			4 * aid_id, doorbell_range);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  					S2A_DOORBELL_ENTRY_1_CTRL, @@ -94,10 +104,12 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  					S2A_DOORBELL_ENTRY_1_CTRL,  					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,  					0x1); -		WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_1_CTRL, doorbell_ctrl); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_1_CTRL, +			aid_id, doorbell_ctrl);  		break;  	case 1: -		WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_2, doorbell_range); +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_2, +			4 * aid_id, doorbell_range);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  					S2A_DOORBELL_ENTRY_1_CTRL, @@ -109,10 +121,12 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  					S2A_DOORBELL_ENTRY_1_CTRL,  					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,  					0x2); -		WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_2_CTRL, doorbell_ctrl); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_2_CTRL, +			aid_id, doorbell_ctrl);  		break;  	case 2: -		WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_3, doorbell_range); +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_3, +			4 * aid_id, doorbell_range);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  					S2A_DOORBELL_ENTRY_1_CTRL, @@ -124,10 +138,12 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  					S2A_DOORBELL_ENTRY_1_CTRL,  					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,  					0x8); -		WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_5_CTRL, doorbell_ctrl); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_5_CTRL, +			aid_id, doorbell_ctrl);  		break;  	case 3: -		WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_4, doorbell_range); +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_4, +			4 * aid_id, doorbell_range);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  					S2A_DOORBELL_ENTRY_1_CTRL, @@ -139,11 +155,12 @@ static void nbio_v7_9_sdma_doorbell_range(struct amdgpu_device *adev, int instan  					S2A_DOORBELL_ENTRY_1_CTRL,  					S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE,  					0x9); -		WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_6_CTRL, doorbell_ctrl); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_6_CTRL, +			aid_id, doorbell_ctrl);  		break;  	default:  		break; -	}; +	}  	return;  } @@ -152,6 +169,7 @@ static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_do  					 int doorbell_index, int instance)  {  	u32 doorbell_range = 0, doorbell_ctrl = 0; +	u32 aid_id = instance;  	if (use_doorbell) {  		doorbell_range = REG_SET_FIELD(doorbell_range, @@ -161,7 +179,12 @@ static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_do  		doorbell_range = REG_SET_FIELD(doorbell_range,  				DOORBELL0_CTRL_ENTRY_0,  				BIF_DOORBELL0_RANGE_SIZE_ENTRY, -				0x8); +				0x9); +		if (aid_id) +			doorbell_range = REG_SET_FIELD(doorbell_range, +					DOORBELL0_CTRL_ENTRY_0, +					DOORBELL0_FENCE_ENABLE_ENTRY, +					0x4);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL, @@ -174,10 +197,15 @@ static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_do  				S2A_DOORBELL_PORT1_RANGE_OFFSET, 0x4);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL, -				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x8); +				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x9);  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL,  				S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0x4); + +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17, +					aid_id, doorbell_range); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL, +				aid_id, doorbell_ctrl);  	} else {  		doorbell_range = REG_SET_FIELD(doorbell_range,  				DOORBELL0_CTRL_ENTRY_0, @@ -185,10 +213,12 @@ static void nbio_v7_9_vcn_doorbell_range(struct amdgpu_device *adev, bool use_do  		doorbell_ctrl = REG_SET_FIELD(doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL,  				S2A_DOORBELL_PORT1_RANGE_SIZE, 0); -	} -	WREG32_SOC15(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17, doorbell_range); -	WREG32_SOC15(NBIO, 0, regS2A_DOORBELL_ENTRY_4_CTRL, doorbell_ctrl); +		WREG32_SOC15_OFFSET(NBIO, 0, regDOORBELL0_CTRL_ENTRY_17, +					aid_id, doorbell_range); +		WREG32_SOC15_EXT(NBIO, aid_id, regS2A_DOORBELL_ENTRY_4_CTRL, +				aid_id, doorbell_ctrl); +	}  }  static void nbio_v7_9_enable_doorbell_aperture(struct amdgpu_device *adev, @@ -235,7 +265,7 @@ static void nbio_v7_9_ih_doorbell_range(struct amdgpu_device *adev,  		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range,  				DOORBELL0_CTRL_ENTRY_0,  				BIF_DOORBELL0_RANGE_SIZE_ENTRY, -				0x4); +				0x8);  		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL, @@ -248,7 +278,7 @@ static void nbio_v7_9_ih_doorbell_range(struct amdgpu_device *adev,  				S2A_DOORBELL_PORT1_RANGE_OFFSET, 0);  		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL, -				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x4); +				S2A_DOORBELL_PORT1_RANGE_SIZE, 0x8);  		ih_doorbell_ctrl = REG_SET_FIELD(ih_doorbell_ctrl,  				S2A_DOORBELL_ENTRY_1_CTRL,  				S2A_DOORBELL_PORT1_AWADDR_31_28_VALUE, 0); @@ -319,6 +349,11 @@ static u32 nbio_v7_9_get_pcie_data_offset(struct amdgpu_device *adev)  	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_DATA2);  } +static u32 nbio_v7_9_get_pcie_index_hi_offset(struct amdgpu_device *adev) +{ +	return SOC15_REG_OFFSET(NBIO, 0, regBIF_BX0_PCIE_INDEX2_HI); +} +  const struct nbio_hdp_flush_reg nbio_v7_9_hdp_flush_reg = {  	.ref_and_mask_cp0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP0_MASK,  	.ref_and_mask_cp1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP1_MASK, @@ -347,11 +382,72 @@ static void nbio_v7_9_enable_doorbell_interrupt(struct amdgpu_device *adev,  			      DOORBELL_INTERRUPT_DISABLE, enable ? 0 : 1);  } +static int nbio_v7_9_get_compute_partition_mode(struct amdgpu_device *adev) +{ +	u32 tmp, px; + +	tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_COMPUTE_STATUS); +	px = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_COMPUTE_STATUS, +			   PARTITION_MODE); + +	return ffs(px); +} + +static void nbio_v7_9_set_compute_partition_mode(struct amdgpu_device *adev, +					enum amdgpu_gfx_partition mode) +{ +	u32 tmp; + +	/* Each bit represents DPX,TPX,QPX,CPX mode. No bit set means default +	 * SPX mode. +	 */ +	tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_COMPUTE_STATUS); +	tmp = REG_SET_FIELD(tmp, BIF_BX_PF0_PARTITION_COMPUTE_STATUS, +			    PARTITION_MODE, mode ? BIT(mode - 1) : mode); + +	WREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_COMPUTE_STATUS, tmp); +} + +static u32 nbio_v7_9_get_memory_partition_mode(struct amdgpu_device *adev, +					       u32 *supp_modes) +{ +	u32 tmp; + +	tmp = RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_STATUS); +	tmp = REG_GET_FIELD(tmp, BIF_BX_PF0_PARTITION_MEM_STATUS, NPS_MODE); + +	if (supp_modes) { +		*supp_modes = +			RREG32_SOC15(NBIO, 0, regBIF_BX_PF0_PARTITION_MEM_CAP); +	} + +	return ffs(tmp); +} + +static void nbio_v7_9_init_registers(struct amdgpu_device *adev) +{ +	u32 inst_mask; +	int i; + +	WREG32_SOC15(NBIO, 0, regXCC_DOORBELL_FENCE, +		0xff & ~(adev->gfx.xcc_mask)); + +	WREG32_SOC15(NBIO, 0, regBIFC_GFX_INT_MONITOR_MASK, 0x7ff); + +	inst_mask = adev->aid_mask & ~1U; +	for_each_inst(i, inst_mask) { +		WREG32_SOC15_EXT(NBIO, i, regXCC_DOORBELL_FENCE, i, +			XCC_DOORBELL_FENCE__SHUB_SLV_MODE_MASK); + +	} +} +  const struct amdgpu_nbio_funcs nbio_v7_9_funcs = {  	.get_hdp_flush_req_offset = nbio_v7_9_get_hdp_flush_req_offset,  	.get_hdp_flush_done_offset = nbio_v7_9_get_hdp_flush_done_offset,  	.get_pcie_index_offset = nbio_v7_9_get_pcie_index_offset,  	.get_pcie_data_offset = nbio_v7_9_get_pcie_data_offset, +	.get_pcie_index_hi_offset = nbio_v7_9_get_pcie_index_hi_offset,  	.get_rev_id = nbio_v7_9_get_rev_id,  	.mc_access_enable = nbio_v7_9_mc_access_enable,  	.get_memsize = nbio_v7_9_get_memsize, @@ -366,4 +462,8 @@ const struct amdgpu_nbio_funcs nbio_v7_9_funcs = {  	.get_clockgating_state = nbio_v7_9_get_clockgating_state,  	.ih_control = nbio_v7_9_ih_control,  	.remap_hdp_registers = nbio_v7_9_remap_hdp_registers, +	.get_compute_partition_mode = nbio_v7_9_get_compute_partition_mode, +	.set_compute_partition_mode = nbio_v7_9_set_compute_partition_mode, +	.get_memory_partition_mode = nbio_v7_9_get_memory_partition_mode, +	.init_registers = nbio_v7_9_init_registers,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 0fb6013441f0..51523b27a186 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -341,11 +341,6 @@ void nv_grbm_select(struct amdgpu_device *adev,  	WREG32_SOC15(GC, 0, mmGRBM_GFX_CNTL, grbm_gfx_cntl);  } -static void nv_vga_set_state(struct amdgpu_device *adev, bool state) -{ -	/* todo */ -} -  static bool nv_read_disabled_bios(struct amdgpu_device *adev)  {  	/* todo */ @@ -381,12 +376,12 @@ static uint32_t nv_read_indexed_register(struct amdgpu_device *adev, u32 se_num,  	mutex_lock(&adev->grbm_idx_mutex);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  	val = RREG32(reg_offset);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	return val;  } @@ -632,9 +627,9 @@ static int nv_update_umd_stable_pstate(struct amdgpu_device *adev,  				       bool enter)  {  	if (enter) -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	else -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	if (adev->gfx.funcs->update_perfmon_mgcg)  		adev->gfx.funcs->update_perfmon_mgcg(adev, !enter); @@ -654,7 +649,6 @@ static const struct amdgpu_asic_funcs nv_asic_funcs =  	.read_register = &nv_read_register,  	.reset = &nv_asic_reset,  	.reset_method = &nv_asic_reset_method, -	.set_vga_state = &nv_vga_set_state,  	.get_xclk = &nv_get_xclk,  	.set_uvd_clocks = &nv_set_uvd_clocks,  	.set_vce_clocks = &nv_set_vce_clocks, diff --git a/drivers/gpu/drm/amd/amdgpu/nvd.h b/drivers/gpu/drm/amd/amdgpu/nvd.h index fd6b58243b03..631dafb92299 100644 --- a/drivers/gpu/drm/amd/amdgpu/nvd.h +++ b/drivers/gpu/drm/amd/amdgpu/nvd.h @@ -462,6 +462,9 @@  #              define PACKET3_QUERY_STATUS_ENG_SEL(x)          ((x) << 25)  #define	PACKET3_RUN_LIST				0xA5  #define	PACKET3_MAP_PROCESS_VM				0xA6 - +/* GFX11 */ +#define	PACKET3_SET_Q_PREEMPTION_MODE			0xF0 +#              define PACKET3_SET_Q_PREEMPTION_MODE_IB_VMID(x)  ((x) << 0) +#              define PACKET3_SET_Q_PREEMPTION_MODE_INIT_SHADOW_MEM    (1 << 0)  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h b/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h index 22c775f39119..18917df785ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h +++ b/drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h @@ -102,6 +102,7 @@ enum psp_gfx_cmd_id      GFX_CMD_ID_LOAD_TOC           = 0x00000020,   /* Load TOC and obtain TMR size */      GFX_CMD_ID_AUTOLOAD_RLC       = 0x00000021,   /* Indicates all graphics fw loaded, start RLC autoload */      GFX_CMD_ID_BOOT_CFG           = 0x00000022,   /* Boot Config */ +    GFX_CMD_ID_SRIOV_SPATIAL_PART = 0x00000027,   /* Configure spatial partitioning mode */  };  /* PSP boot config sub-commands */ @@ -338,6 +339,13 @@ struct psp_gfx_cmd_boot_cfg      uint32_t                        boot_config_valid;    /* dynamic boot configuration valid bits bitmask */  }; +struct psp_gfx_cmd_sriov_spatial_part { +	uint32_t mode; +	uint32_t override_ips; +	uint32_t override_xcds_avail; +	uint32_t override_this_aid; +}; +  /* All GFX ring buffer commands. */  union psp_gfx_commands  { @@ -351,6 +359,7 @@ union psp_gfx_commands      struct psp_gfx_cmd_setup_tmr        cmd_setup_vmr;      struct psp_gfx_cmd_load_toc         cmd_load_toc;      struct psp_gfx_cmd_boot_cfg         boot_cfg; +    struct psp_gfx_cmd_sriov_spatial_part cmd_spatial_part;  };  struct psp_gfx_uresp_reserved diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c index e1b7fca09666..5f10883da6a2 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c @@ -57,7 +57,13 @@ static int psp_v10_0_init_microcode(struct psp_context *psp)  	if (err)  		return err; -	return psp_init_ta_microcode(psp, ucode_prefix); +	err = psp_init_ta_microcode(psp, ucode_prefix); +	if ((adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 1, 0)) && +		(adev->pdev->revision == 0xa1) && +		(psp->securedisplay_context.context.bin_desc.fw_version >= 0x27000008)) { +		adev->psp.securedisplay_context.context.bin_desc.size_bytes = 0; +	} +	return err;  }  static int psp_v10_0_ring_create(struct psp_context *psp, diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index fd2a7b66ac56..51afc92994a8 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c @@ -466,8 +466,6 @@ static int sdma_v2_4_gfx_resume(struct amdgpu_device *adev)  #endif  		/* enable DMA IBs */  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); - -		ring->sched.ready = true;  	}  	sdma_v2_4_enable(adev, true); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index e572389089d2..344202870aeb 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c @@ -734,8 +734,6 @@ static int sdma_v3_0_gfx_resume(struct amdgpu_device *adev)  #endif  		/* enable DMA IBs */  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); - -		ring->sched.ready = true;  	}  	/* unhalt the MEs */ diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 9295ac7edd56..1f83eebfc8a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c @@ -1114,8 +1114,6 @@ static void sdma_v4_0_gfx_resume(struct amdgpu_device *adev, unsigned int i)  #endif  	/* enable DMA IBs */  	WREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL, ib_cntl); - -	ring->sched.ready = true;  }  /** @@ -1202,8 +1200,6 @@ static void sdma_v4_0_page_resume(struct amdgpu_device *adev, unsigned int i)  #endif  	/* enable DMA IBs */  	WREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL, ib_cntl); - -	ring->sched.ready = true;  }  static void @@ -1825,12 +1821,12 @@ static int sdma_v4_0_sw_init(void *handle)  		/*  		 * On Arcturus, SDMA instance 5~7 has a different vmhub -		 * type(AMDGPU_MMHUB_1). +		 * type(AMDGPU_MMHUB1).  		 */  		if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 2, 2) && i >= 5) -			ring->vm_hub = AMDGPU_MMHUB_1; +			ring->vm_hub = AMDGPU_MMHUB1(0);  		else -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, @@ -1847,13 +1843,23 @@ static int sdma_v4_0_sw_init(void *handle)  			/* paging queue use same doorbell index/routing as gfx queue  			 * with 0x400 (4096 dwords) offset on second doorbell page  			 */ -			ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1; -			ring->doorbell_index += 0x400; +			if (adev->ip_versions[SDMA0_HWIP][0] >= IP_VERSION(4, 0, 0) && +			    adev->ip_versions[SDMA0_HWIP][0] < IP_VERSION(4, 2, 0)) { +				ring->doorbell_index = +					adev->doorbell_index.sdma_engine[i] << 1; +				ring->doorbell_index += 0x400; +			} else { +				/* From vega20, the sdma_doorbell_range in 1st +				 * doorbell page is reserved for page queue. +				 */ +				ring->doorbell_index = +					(adev->doorbell_index.sdma_engine[i] + 1) << 1; +			}  			if (adev->ip_versions[SDMA0_HWIP][0] == IP_VERSION(4, 2, 2) && i >= 5) -				ring->vm_hub = AMDGPU_MMHUB_1; +				ring->vm_hub = AMDGPU_MMHUB1(0);  			else -				ring->vm_hub = AMDGPU_MMHUB_0; +				ring->vm_hub = AMDGPU_MMHUB0(0);  			sprintf(ring->name, "page%d", i);  			r = amdgpu_ring_init(adev, ring, 1024, diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4.c index 6f9895cdddb1..0ddb6955a6d3 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4.c @@ -141,6 +141,10 @@ static const struct soc15_ras_field_entry sdma_v4_4_ras_fields[] = {  	SOC15_REG_FIELD(SDMA0_EDC_COUNTER2, SDMA_UTCL1_RDBST_FIFO_SED),  	0, 0,  	}, +	{ "SDMA_UTCL1_WR_FIFO_SED", SOC15_REG_ENTRY(SDMA0, 0, regSDMA0_EDC_COUNTER2), +	SOC15_REG_FIELD(SDMA0_EDC_COUNTER2, SDMA_UTCL1_WR_FIFO_SED), +	0, 0, +	},  	{ "SDMA_DATA_LUT_FIFO_SED", SOC15_REG_ENTRY(SDMA0, 0, regSDMA0_EDC_COUNTER2),  	SOC15_REG_FIELD(SDMA0_EDC_COUNTER2, SDMA_DATA_LUT_FIFO_SED),  	0, 0, diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c index 64dcaa2670dd..8eebf9c2bbcd 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c @@ -27,6 +27,7 @@  #include <linux/pci.h>  #include "amdgpu.h" +#include "amdgpu_xcp.h"  #include "amdgpu_ucode.h"  #include "amdgpu_trace.h" @@ -53,11 +54,14 @@ static void sdma_v4_4_2_set_ring_funcs(struct amdgpu_device *adev);  static void sdma_v4_4_2_set_buffer_funcs(struct amdgpu_device *adev);  static void sdma_v4_4_2_set_vm_pte_funcs(struct amdgpu_device *adev);  static void sdma_v4_4_2_set_irq_funcs(struct amdgpu_device *adev); +static void sdma_v4_4_2_set_ras_funcs(struct amdgpu_device *adev);  static u32 sdma_v4_4_2_get_reg_offset(struct amdgpu_device *adev,  		u32 instance, u32 offset)  { -	return (adev->reg_offset[SDMA0_HWIP][instance][0] + offset); +	u32 dev_inst = GET_INST(SDMA0, instance); + +	return (adev->reg_offset[SDMA0_HWIP][dev_inst][0] + offset);  }  static unsigned sdma_v4_4_2_seq_to_irq_id(int seq_num) @@ -92,13 +96,25 @@ static int sdma_v4_4_2_irq_id_to_seq(unsigned client_id)  	}  } -static void sdma_v4_4_2_init_golden_registers(struct amdgpu_device *adev) +static void sdma_v4_4_2_inst_init_golden_registers(struct amdgpu_device *adev, +						   uint32_t inst_mask)  { -	switch (adev->ip_versions[SDMA0_HWIP][0]) { -	case IP_VERSION(4, 4, 2): -		break; -	default: -		break; +	u32 val; +	int i; + +	for (i = 0; i < adev->sdma.num_instances; i++) { +		val = RREG32_SDMA(i, regSDMA_GB_ADDR_CONFIG); +		val = REG_SET_FIELD(val, SDMA_GB_ADDR_CONFIG, NUM_BANKS, 4); +		val = REG_SET_FIELD(val, SDMA_GB_ADDR_CONFIG, +				    PIPE_INTERLEAVE_SIZE, 0); +		WREG32_SDMA(i, regSDMA_GB_ADDR_CONFIG, val); + +		val = RREG32_SDMA(i, regSDMA_GB_ADDR_CONFIG_READ); +		val = REG_SET_FIELD(val, SDMA_GB_ADDR_CONFIG_READ, NUM_BANKS, +				    4); +		val = REG_SET_FIELD(val, SDMA_GB_ADDR_CONFIG_READ, +				    PIPE_INTERLEAVE_SIZE, 0); +		WREG32_SDMA(i, regSDMA_GB_ADDR_CONFIG_READ, val);  	}  } @@ -399,19 +415,21 @@ static void sdma_v4_4_2_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64  /** - * sdma_v4_4_2_gfx_stop - stop the gfx async dma engines + * sdma_v4_4_2_inst_gfx_stop - stop the gfx async dma engines   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be disabled   *   * Stop the gfx async dma ring buffers.   */ -static void sdma_v4_4_2_gfx_stop(struct amdgpu_device *adev) +static void sdma_v4_4_2_inst_gfx_stop(struct amdgpu_device *adev, +				      uint32_t inst_mask)  {  	struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES];  	u32 rb_cntl, ib_cntl;  	int i, unset = 0; -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for_each_inst(i, inst_mask) {  		sdma[i] = &adev->sdma.instance[i].ring;  		if ((adev->mman.buffer_funcs_ring == sdma[i]) && unset != 1) { @@ -429,32 +447,36 @@ static void sdma_v4_4_2_gfx_stop(struct amdgpu_device *adev)  }  /** - * sdma_v4_4_2_rlc_stop - stop the compute async dma engines + * sdma_v4_4_2_inst_rlc_stop - stop the compute async dma engines   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be disabled   *   * Stop the compute async dma queues.   */ -static void sdma_v4_4_2_rlc_stop(struct amdgpu_device *adev) +static void sdma_v4_4_2_inst_rlc_stop(struct amdgpu_device *adev, +				      uint32_t inst_mask)  {  	/* XXX todo */  }  /** - * sdma_v4_4_2_page_stop - stop the page async dma engines + * sdma_v4_4_2_inst_page_stop - stop the page async dma engines   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be disabled   *   * Stop the page async dma ring buffers.   */ -static void sdma_v4_4_2_page_stop(struct amdgpu_device *adev) +static void sdma_v4_4_2_inst_page_stop(struct amdgpu_device *adev, +				       uint32_t inst_mask)  {  	struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES];  	u32 rb_cntl, ib_cntl;  	int i;  	bool unset = false; -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for_each_inst(i, inst_mask) {  		sdma[i] = &adev->sdma.instance[i].page;  		if ((adev->mman.buffer_funcs_ring == sdma[i]) && @@ -475,14 +497,16 @@ static void sdma_v4_4_2_page_stop(struct amdgpu_device *adev)  }  /** - * sdma_v4_4_2_ctx_switch_enable - stop the async dma engines context switch + * sdma_v4_4_2_inst_ctx_switch_enable - stop the async dma engines context switch   *   * @adev: amdgpu_device pointer   * @enable: enable/disable the DMA MEs context switch. + * @inst_mask: mask of dma engine instances to be enabled   *   * Halt or unhalt the async dma engines context switch.   */ -static void sdma_v4_4_2_ctx_switch_enable(struct amdgpu_device *adev, bool enable) +static void sdma_v4_4_2_inst_ctx_switch_enable(struct amdgpu_device *adev, +					       bool enable, uint32_t inst_mask)  {  	u32 f32_cntl, phase_quantum = 0;  	int i; @@ -511,7 +535,7 @@ static void sdma_v4_4_2_ctx_switch_enable(struct amdgpu_device *adev, bool enabl  			unit  << SDMA_PHASE0_QUANTUM__UNIT__SHIFT;  	} -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for_each_inst(i, inst_mask) {  		f32_cntl = RREG32_SDMA(i, regSDMA_CNTL);  		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA_CNTL,  				AUTO_CTXSW_ENABLE, enable ? 1 : 0); @@ -525,30 +549,36 @@ static void sdma_v4_4_2_ctx_switch_enable(struct amdgpu_device *adev, bool enabl  		/* Extend page fault timeout to avoid interrupt storm */  		WREG32_SDMA(i, regSDMA_UTCL1_TIMEOUT, 0x00800080);  	} -  }  /** - * sdma_v4_4_2_enable - stop the async dma engines + * sdma_v4_4_2_inst_enable - stop the async dma engines   *   * @adev: amdgpu_device pointer   * @enable: enable/disable the DMA MEs. + * @inst_mask: mask of dma engine instances to be enabled   *   * Halt or unhalt the async dma engines.   */ -static void sdma_v4_4_2_enable(struct amdgpu_device *adev, bool enable) +static void sdma_v4_4_2_inst_enable(struct amdgpu_device *adev, bool enable, +				    uint32_t inst_mask)  {  	u32 f32_cntl;  	int i;  	if (!enable) { -		sdma_v4_4_2_gfx_stop(adev); -		sdma_v4_4_2_rlc_stop(adev); +		sdma_v4_4_2_inst_gfx_stop(adev, inst_mask); +		sdma_v4_4_2_inst_rlc_stop(adev, inst_mask);  		if (adev->sdma.has_page_queue) -			sdma_v4_4_2_page_stop(adev); +			sdma_v4_4_2_inst_page_stop(adev, inst_mask); + +		/* SDMA FW needs to respond to FREEZE requests during reset. +		 * Keep it running during reset */ +		if (!amdgpu_sriov_vf(adev) && amdgpu_in_reset(adev)) +			return;  	} -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for_each_inst(i, inst_mask) {  		f32_cntl = RREG32_SDMA(i, regSDMA_F32_CNTL);  		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA_F32_CNTL, HALT, enable ? 0 : 1);  		WREG32_SDMA(i, regSDMA_F32_CNTL, f32_cntl); @@ -659,8 +689,6 @@ static void sdma_v4_4_2_gfx_resume(struct amdgpu_device *adev, unsigned int i)  #endif  	/* enable DMA IBs */  	WREG32_SDMA(i, regSDMA_GFX_IB_CNTL, ib_cntl); - -	ring->sched.ready = true;  }  /** @@ -750,8 +778,6 @@ static void sdma_v4_4_2_page_resume(struct amdgpu_device *adev, unsigned int i)  #endif  	/* enable DMA IBs */  	WREG32_SDMA(i, regSDMA_PAGE_IB_CNTL, ib_cntl); - -	ring->sched.ready = true;  }  static void sdma_v4_4_2_init_pg(struct amdgpu_device *adev) @@ -760,14 +786,16 @@ static void sdma_v4_4_2_init_pg(struct amdgpu_device *adev)  }  /** - * sdma_v4_4_2_rlc_resume - setup and start the async dma engines + * sdma_v4_4_2_inst_rlc_resume - setup and start the async dma engines   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be enabled   *   * Set up the compute DMA queues and enable them.   * Returns 0 for success, error for failure.   */ -static int sdma_v4_4_2_rlc_resume(struct amdgpu_device *adev) +static int sdma_v4_4_2_inst_rlc_resume(struct amdgpu_device *adev, +				       uint32_t inst_mask)  {  	sdma_v4_4_2_init_pg(adev); @@ -775,14 +803,16 @@ static int sdma_v4_4_2_rlc_resume(struct amdgpu_device *adev)  }  /** - * sdma_v4_4_2_load_microcode - load the sDMA ME ucode + * sdma_v4_4_2_inst_load_microcode - load the sDMA ME ucode   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be enabled   *   * Loads the sDMA0/1 ucode.   * Returns 0 for success, -EINVAL if the ucode is not available.   */ -static int sdma_v4_4_2_load_microcode(struct amdgpu_device *adev) +static int sdma_v4_4_2_inst_load_microcode(struct amdgpu_device *adev, +					   uint32_t inst_mask)  {  	const struct sdma_firmware_header_v1_0 *hdr;  	const __le32 *fw_data; @@ -790,9 +820,9 @@ static int sdma_v4_4_2_load_microcode(struct amdgpu_device *adev)  	int i, j;  	/* halt the MEs */ -	sdma_v4_4_2_enable(adev, false); +	sdma_v4_4_2_inst_enable(adev, false, inst_mask); -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for_each_inst(i, inst_mask) {  		if (!adev->sdma.instance[i].fw)  			return -EINVAL; @@ -818,38 +848,42 @@ static int sdma_v4_4_2_load_microcode(struct amdgpu_device *adev)  }  /** - * sdma_v4_4_2_start - setup and start the async dma engines + * sdma_v4_4_2_inst_start - setup and start the async dma engines   *   * @adev: amdgpu_device pointer + * @inst_mask: mask of dma engine instances to be enabled   *   * Set up the DMA engines and enable them.   * Returns 0 for success, error for failure.   */ -static int sdma_v4_4_2_start(struct amdgpu_device *adev) +static int sdma_v4_4_2_inst_start(struct amdgpu_device *adev, +				  uint32_t inst_mask)  {  	struct amdgpu_ring *ring; +	uint32_t tmp_mask;  	int i, r = 0;  	if (amdgpu_sriov_vf(adev)) { -		sdma_v4_4_2_ctx_switch_enable(adev, false); -		sdma_v4_4_2_enable(adev, false); +		sdma_v4_4_2_inst_ctx_switch_enable(adev, false, inst_mask); +		sdma_v4_4_2_inst_enable(adev, false, inst_mask);  	} else {  		/* bypass sdma microcode loading on Gopher */  		if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP && -		    !(adev->pdev->device == 0x49) && !(adev->pdev->device == 0x50)) { -			r = sdma_v4_4_2_load_microcode(adev); +		    adev->sdma.instance[0].fw) { +			r = sdma_v4_4_2_inst_load_microcode(adev, inst_mask);  			if (r)  				return r;  		}  		/* unhalt the MEs */ -		sdma_v4_4_2_enable(adev, true); +		sdma_v4_4_2_inst_enable(adev, true, inst_mask);  		/* enable sdma ring preemption */ -		sdma_v4_4_2_ctx_switch_enable(adev, true); +		sdma_v4_4_2_inst_ctx_switch_enable(adev, true, inst_mask);  	}  	/* start the gfx rings and rlc compute queues */ -	for (i = 0; i < adev->sdma.num_instances; i++) { +	tmp_mask = inst_mask; +	for_each_inst(i, tmp_mask) {  		uint32_t temp;  		WREG32_SDMA(i, regSDMA_SEM_WAIT_FAIL_TIMER_CNTL, 0); @@ -860,6 +894,8 @@ static int sdma_v4_4_2_start(struct amdgpu_device *adev)  		/* set utc l1 enable flag always to 1 */  		temp = RREG32_SDMA(i, regSDMA_CNTL);  		temp = REG_SET_FIELD(temp, SDMA_CNTL, UTC_L1_ENABLE, 1); +		/* enable context empty interrupt during initialization */ +		temp = REG_SET_FIELD(temp, SDMA_CNTL, CTXEMPTY_INT_ENABLE, 1);  		WREG32_SDMA(i, regSDMA_CNTL, temp);  		if (!amdgpu_sriov_vf(adev)) { @@ -876,15 +912,16 @@ static int sdma_v4_4_2_start(struct amdgpu_device *adev)  	}  	if (amdgpu_sriov_vf(adev)) { -		sdma_v4_4_2_ctx_switch_enable(adev, true); -		sdma_v4_4_2_enable(adev, true); +		sdma_v4_4_2_inst_ctx_switch_enable(adev, true, inst_mask); +		sdma_v4_4_2_inst_enable(adev, true, inst_mask);  	} else { -		r = sdma_v4_4_2_rlc_resume(adev); +		r = sdma_v4_4_2_inst_rlc_resume(adev, inst_mask);  		if (r)  			return r;  	} -	for (i = 0; i < adev->sdma.num_instances; i++) { +	tmp_mask = inst_mask; +	for_each_inst(i, tmp_mask) {  		ring = &adev->sdma.instance[i].ring;  		r = amdgpu_ring_test_helper(ring); @@ -1221,6 +1258,7 @@ static int sdma_v4_4_2_early_init(void *handle)  	sdma_v4_4_2_set_buffer_funcs(adev);  	sdma_v4_4_2_set_vm_pte_funcs(adev);  	sdma_v4_4_2_set_irq_funcs(adev); +	sdma_v4_4_2_set_ras_funcs(adev);  	return 0;  } @@ -1253,9 +1291,10 @@ static int sdma_v4_4_2_sw_init(void *handle)  	struct amdgpu_ring *ring;  	int r, i;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	u32 aid_id;  	/* SDMA trap event */ -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for (i = 0; i < adev->sdma.num_inst_per_aid; i++) {  		r = amdgpu_irq_add_id(adev, sdma_v4_4_2_seq_to_irq_id(i),  				      SDMA0_4_0__SRCID__SDMA_TRAP,  				      &adev->sdma.trap_irq); @@ -1264,7 +1303,7 @@ static int sdma_v4_4_2_sw_init(void *handle)  	}  	/* SDMA SRAM ECC event */ -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for (i = 0; i < adev->sdma.num_inst_per_aid; i++) {  		r = amdgpu_irq_add_id(adev, sdma_v4_4_2_seq_to_irq_id(i),  				      SDMA0_4_0__SRCID__SDMA_SRAM_ECC,  				      &adev->sdma.ecc_irq); @@ -1273,7 +1312,7 @@ static int sdma_v4_4_2_sw_init(void *handle)  	}  	/* SDMA VM_HOLE/DOORBELL_INV/POLL_TIMEOUT/SRBM_WRITE_PROTECTION event*/ -	for (i = 0; i < adev->sdma.num_instances; i++) { +	for (i = 0; i < adev->sdma.num_inst_per_aid; i++) {  		r = amdgpu_irq_add_id(adev, sdma_v4_4_2_seq_to_irq_id(i),  				      SDMA0_4_0__SRCID__SDMA_VM_HOLE,  				      &adev->sdma.vm_hole_irq); @@ -1303,15 +1342,17 @@ static int sdma_v4_4_2_sw_init(void *handle)  		ring = &adev->sdma.instance[i].ring;  		ring->ring_obj = NULL;  		ring->use_doorbell = true; +		aid_id = adev->sdma.instance[i].aid_id;  		DRM_DEBUG("SDMA %d use_doorbell being set to: [%s]\n", i,  				ring->use_doorbell?"true":"false");  		/* doorbell size is 2 dwords, get DWORD offset */  		ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1; -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(aid_id); -		sprintf(ring->name, "sdma%d", i); +		sprintf(ring->name, "sdma%d.%d", aid_id, +				i % adev->sdma.num_inst_per_aid);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,  				     AMDGPU_SDMA_IRQ_INSTANCE0 + i,  				     AMDGPU_RING_PRIO_DEFAULT, NULL); @@ -1323,14 +1364,15 @@ static int sdma_v4_4_2_sw_init(void *handle)  			ring->ring_obj = NULL;  			ring->use_doorbell = true; -			/* paging queue use same doorbell index/routing as gfx queue -			 * with 0x400 (4096 dwords) offset on second doorbell page +			/* doorbell index of page queue is assigned right after +			 * gfx queue on the same instance  			 */ -			ring->doorbell_index = adev->doorbell_index.sdma_engine[i] << 1; -			ring->doorbell_index += 0x400; -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->doorbell_index = +				(adev->doorbell_index.sdma_engine[i] + 1) << 1; +			ring->vm_hub = AMDGPU_MMHUB0(aid_id); -			sprintf(ring->name, "page%d", i); +			sprintf(ring->name, "page%d.%d", aid_id, +					i % adev->sdma.num_inst_per_aid);  			r = amdgpu_ring_init(adev, ring, 1024,  					     &adev->sdma.trap_irq,  					     AMDGPU_SDMA_IRQ_INSTANCE0 + i, @@ -1340,6 +1382,11 @@ static int sdma_v4_4_2_sw_init(void *handle)  		}  	} +	if (amdgpu_sdma_ras_sw_init(adev)) { +		dev_err(adev->dev, "fail to initialize sdma ras block\n"); +		return -EINVAL; +	} +  	return r;  } @@ -1366,14 +1413,13 @@ static int sdma_v4_4_2_hw_init(void *handle)  {  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	uint32_t inst_mask; -	if (adev->flags & AMD_IS_APU) -		amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_SDMA, false); - +	inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);  	if (!amdgpu_sriov_vf(adev)) -		sdma_v4_4_2_init_golden_registers(adev); +		sdma_v4_4_2_inst_init_golden_registers(adev, inst_mask); -	r = sdma_v4_4_2_start(adev); +	r = sdma_v4_4_2_inst_start(adev, inst_mask);  	return r;  } @@ -1381,26 +1427,34 @@ static int sdma_v4_4_2_hw_init(void *handle)  static int sdma_v4_4_2_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	uint32_t inst_mask;  	int i;  	if (amdgpu_sriov_vf(adev))  		return 0; +	inst_mask = GENMASK(adev->sdma.num_instances - 1, 0);  	for (i = 0; i < adev->sdma.num_instances; i++) {  		amdgpu_irq_put(adev, &adev->sdma.ecc_irq,  			       AMDGPU_SDMA_IRQ_INSTANCE0 + i);  	} -	sdma_v4_4_2_ctx_switch_enable(adev, false); -	sdma_v4_4_2_enable(adev, false); +	sdma_v4_4_2_inst_ctx_switch_enable(adev, false, inst_mask); +	sdma_v4_4_2_inst_enable(adev, false, inst_mask);  	return 0;  } +static int sdma_v4_4_2_set_clockgating_state(void *handle, +					     enum amd_clockgating_state state); +  static int sdma_v4_4_2_suspend(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (amdgpu_in_reset(adev)) +		sdma_v4_4_2_set_clockgating_state(adev, AMD_CG_STATE_UNGATE); +  	return sdma_v4_4_2_hw_fini(adev);  } @@ -1471,13 +1525,31 @@ static int sdma_v4_4_2_process_trap_irq(struct amdgpu_device *adev,  				      struct amdgpu_irq_src *source,  				      struct amdgpu_iv_entry *entry)  { -	uint32_t instance; +	uint32_t instance, i;  	DRM_DEBUG("IH: SDMA trap\n");  	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id); + +	/* Client id gives the SDMA instance in AID. To know the exact SDMA +	 * instance, interrupt entry gives the node id which corresponds to the AID instance. +	 * Match node id with the AID id associated with the SDMA instance. */ +	for (i = instance; i < adev->sdma.num_instances; +	     i += adev->sdma.num_inst_per_aid) { +		if (adev->sdma.instance[i].aid_id == +		    node_id_to_phys_map[entry->node_id]) +			break; +	} + +	if (i >= adev->sdma.num_instances) { +		dev_WARN_ONCE( +			adev->dev, 1, +			"Couldn't find the right sdma instance in trap handler"); +		return 0; +	} +  	switch (entry->ring_id) {  	case 0: -		amdgpu_fence_process(&adev->sdma.instance[instance].ring); +		amdgpu_fence_process(&adev->sdma.instance[i].ring);  		break;  	default:  		break; @@ -1496,7 +1568,7 @@ static int sdma_v4_4_2_process_ras_data_cb(struct amdgpu_device *adev,  	 * be disabled and the driver should only look for the aggregated  	 * interrupt via sync flood  	 */ -	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA))  		goto out;  	instance = sdma_v4_4_2_irq_id_to_seq(entry->client_id); @@ -1535,15 +1607,22 @@ static int sdma_v4_4_2_set_ecc_irq_state(struct amdgpu_device *adev,  					unsigned type,  					enum amdgpu_interrupt_state state)  { -	u32 sdma_edc_config; +	u32 sdma_cntl; -	sdma_edc_config = RREG32_SDMA(type, regCC_SDMA_EDC_CONFIG); -	/* -	 * FIXME: This was inherited from Aldebaran, but no this field -	 * definition in the regspec of both Aldebaran and SDMA 4.4.2 -	 */ -	sdma_edc_config |= (state == AMDGPU_IRQ_STATE_ENABLE) ? (1 << 2) : 0; -	WREG32_SDMA(type, regCC_SDMA_EDC_CONFIG, sdma_edc_config); +	sdma_cntl = RREG32_SDMA(type, regSDMA_CNTL); +	switch (state) { +	case AMDGPU_IRQ_STATE_DISABLE: +		sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA_CNTL, +					  DRAM_ECC_INT_ENABLE, 0); +		WREG32_SDMA(type, regSDMA_CNTL, sdma_cntl); +		break; +	/* sdma ecc interrupt is enabled by default +	 * driver doesn't need to do anything to +	 * enable the interrupt */ +	case AMDGPU_IRQ_STATE_ENABLE: +	default: +		break; +	}  	return 0;  } @@ -1615,19 +1694,49 @@ static int sdma_v4_4_2_process_srbm_write_irq(struct amdgpu_device *adev,  	return 0;  } -static void sdma_v4_4_2_update_medium_grain_clock_gating( -		struct amdgpu_device *adev, -		bool enable) +static void sdma_v4_4_2_inst_update_medium_grain_light_sleep( +	struct amdgpu_device *adev, bool enable, uint32_t inst_mask) +{ +	uint32_t data, def; +	int i; + +	/* leave as default if it is not driver controlled */ +	if (!(adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS)) +		return; + +	if (enable) { +		for_each_inst(i, inst_mask) { +			/* 1-not override: enable sdma mem light sleep */ +			def = data = RREG32_SDMA(i, regSDMA_POWER_CNTL); +			data |= SDMA_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; +			if (def != data) +				WREG32_SDMA(i, regSDMA_POWER_CNTL, data); +		} +	} else { +		for_each_inst(i, inst_mask) { +			/* 0-override:disable sdma mem light sleep */ +			def = data = RREG32_SDMA(i, regSDMA_POWER_CNTL); +			data &= ~SDMA_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; +			if (def != data) +				WREG32_SDMA(i, regSDMA_POWER_CNTL, data); +		} +	} +} + +static void sdma_v4_4_2_inst_update_medium_grain_clock_gating( +	struct amdgpu_device *adev, bool enable, uint32_t inst_mask)  {  	uint32_t data, def;  	int i; -	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) { -		for (i = 0; i < adev->sdma.num_instances; i++) { +	/* leave as default if it is not driver controlled */ +	if (!(adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) +		return; + +	if (enable) { +		for_each_inst(i, inst_mask) {  			def = data = RREG32_SDMA(i, regSDMA_CLK_CTRL); -			data &= ~(SDMA_CLK_CTRL__SOFT_OVERRIDE7_MASK | -				  SDMA_CLK_CTRL__SOFT_OVERRIDE6_MASK | -				  SDMA_CLK_CTRL__SOFT_OVERRIDE5_MASK | +			data &= ~(SDMA_CLK_CTRL__SOFT_OVERRIDE5_MASK |  				  SDMA_CLK_CTRL__SOFT_OVERRIDE4_MASK |  				  SDMA_CLK_CTRL__SOFT_OVERRIDE3_MASK |  				  SDMA_CLK_CTRL__SOFT_OVERRIDE2_MASK | @@ -1637,11 +1746,9 @@ static void sdma_v4_4_2_update_medium_grain_clock_gating(  				WREG32_SDMA(i, regSDMA_CLK_CTRL, data);  		}  	} else { -		for (i = 0; i < adev->sdma.num_instances; i++) { +		for_each_inst(i, inst_mask) {  			def = data = RREG32_SDMA(i, regSDMA_CLK_CTRL); -			data |= (SDMA_CLK_CTRL__SOFT_OVERRIDE7_MASK | -				 SDMA_CLK_CTRL__SOFT_OVERRIDE6_MASK | -				 SDMA_CLK_CTRL__SOFT_OVERRIDE5_MASK | +			data |= (SDMA_CLK_CTRL__SOFT_OVERRIDE5_MASK |  				 SDMA_CLK_CTRL__SOFT_OVERRIDE4_MASK |  				 SDMA_CLK_CTRL__SOFT_OVERRIDE3_MASK |  				 SDMA_CLK_CTRL__SOFT_OVERRIDE2_MASK | @@ -1653,45 +1760,21 @@ static void sdma_v4_4_2_update_medium_grain_clock_gating(  	}  } - -static void sdma_v4_4_2_update_medium_grain_light_sleep( -		struct amdgpu_device *adev, -		bool enable) -{ -	uint32_t data, def; -	int i; - -	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS)) { -		for (i = 0; i < adev->sdma.num_instances; i++) { -			/* 1-not override: enable sdma mem light sleep */ -			def = data = RREG32_SDMA(0, regSDMA_POWER_CNTL); -			data |= SDMA_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; -			if (def != data) -				WREG32_SDMA(0, regSDMA_POWER_CNTL, data); -		} -	} else { -		for (i = 0; i < adev->sdma.num_instances; i++) { -		/* 0-override:disable sdma mem light sleep */ -			def = data = RREG32_SDMA(0, regSDMA_POWER_CNTL); -			data &= ~SDMA_POWER_CNTL__MEM_POWER_OVERRIDE_MASK; -			if (def != data) -				WREG32_SDMA(0, regSDMA_POWER_CNTL, data); -		} -	} -} -  static int sdma_v4_4_2_set_clockgating_state(void *handle,  					  enum amd_clockgating_state state)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	uint32_t inst_mask;  	if (amdgpu_sriov_vf(adev))  		return 0; -	sdma_v4_4_2_update_medium_grain_clock_gating(adev, -			state == AMD_CG_STATE_GATE); -	sdma_v4_4_2_update_medium_grain_light_sleep(adev, -			state == AMD_CG_STATE_GATE); +	inst_mask = GENMASK(adev->sdma.num_instances - 1, 0); + +	sdma_v4_4_2_inst_update_medium_grain_clock_gating( +		adev, state == AMD_CG_STATE_GATE, inst_mask); +	sdma_v4_4_2_inst_update_medium_grain_light_sleep( +		adev, state == AMD_CG_STATE_GATE, inst_mask);  	return 0;  } @@ -1710,12 +1793,12 @@ static void sdma_v4_4_2_get_clockgating_state(void *handle, u64 *flags)  		*flags = 0;  	/* AMD_CG_SUPPORT_SDMA_MGCG */ -	data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, regSDMA_CLK_CTRL)); -	if (!(data & SDMA_CLK_CTRL__SOFT_OVERRIDE7_MASK)) +	data = RREG32(SOC15_REG_OFFSET(SDMA0, GET_INST(SDMA0, 0), regSDMA_CLK_CTRL)); +	if (!(data & SDMA_CLK_CTRL__SOFT_OVERRIDE5_MASK))  		*flags |= AMD_CG_SUPPORT_SDMA_MGCG;  	/* AMD_CG_SUPPORT_SDMA_LS */ -	data = RREG32(SOC15_REG_OFFSET(SDMA0, 0, regSDMA_POWER_CNTL)); +	data = RREG32(SOC15_REG_OFFSET(SDMA0, GET_INST(SDMA0, 0), regSDMA_POWER_CNTL));  	if (data & SDMA_POWER_CNTL__MEM_POWER_OVERRIDE_MASK)  		*flags |= AMD_CG_SUPPORT_SDMA_LS;  } @@ -1802,7 +1885,7 @@ static const struct amdgpu_ring_funcs sdma_v4_4_2_page_ring_funcs = {  static void sdma_v4_4_2_set_ring_funcs(struct amdgpu_device *adev)  { -	int i; +	int i, dev_inst;  	for (i = 0; i < adev->sdma.num_instances; i++) {  		adev->sdma.instance[i].ring.funcs = &sdma_v4_4_2_ring_funcs; @@ -1812,6 +1895,11 @@ static void sdma_v4_4_2_set_ring_funcs(struct amdgpu_device *adev)  				&sdma_v4_4_2_page_ring_funcs;  			adev->sdma.instance[i].page.me = i;  		} + +		dev_inst = GET_INST(SDMA0, i); +		/* AID to which SDMA belongs depends on physical instance */ +		adev->sdma.instance[i].aid_id = +			dev_inst / adev->sdma.num_inst_per_aid;  	}  } @@ -1965,3 +2053,144 @@ const struct amdgpu_ip_block_version sdma_v4_4_2_ip_block = {  	.rev = 0,  	.funcs = &sdma_v4_4_2_ip_funcs,  }; + +static int sdma_v4_4_2_xcp_resume(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	if (!amdgpu_sriov_vf(adev)) +		sdma_v4_4_2_inst_init_golden_registers(adev, inst_mask); + +	r = sdma_v4_4_2_inst_start(adev, inst_mask); + +	return r; +} + +static int sdma_v4_4_2_xcp_suspend(void *handle, uint32_t inst_mask) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	uint32_t tmp_mask = inst_mask; +	int i; + +	for_each_inst(i, tmp_mask) { +		amdgpu_irq_put(adev, &adev->sdma.ecc_irq, +			       AMDGPU_SDMA_IRQ_INSTANCE0 + i); +	} + +	sdma_v4_4_2_inst_ctx_switch_enable(adev, false, inst_mask); +	sdma_v4_4_2_inst_enable(adev, false, inst_mask); + +	return 0; +} + +struct amdgpu_xcp_ip_funcs sdma_v4_4_2_xcp_funcs = { +	.suspend = &sdma_v4_4_2_xcp_suspend, +	.resume = &sdma_v4_4_2_xcp_resume +}; + +static const struct amdgpu_ras_err_status_reg_entry sdma_v4_2_2_ue_reg_list[] = { +	{AMDGPU_RAS_REG_ENTRY(SDMA0, 0, regSDMA_UE_ERR_STATUS_LO, regSDMA_UE_ERR_STATUS_HI), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "SDMA"}, +}; + +static const struct amdgpu_ras_memory_id_entry sdma_v4_4_2_ras_memory_list[] = { +	{AMDGPU_SDMA_MBANK_DATA_BUF0, "SDMA_MBANK_DATA_BUF0"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF1, "SDMA_MBANK_DATA_BUF1"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF2, "SDMA_MBANK_DATA_BUF2"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF3, "SDMA_MBANK_DATA_BUF3"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF4, "SDMA_MBANK_DATA_BUF4"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF5, "SDMA_MBANK_DATA_BUF5"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF6, "SDMA_MBANK_DATA_BUF6"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF7, "SDMA_MBANK_DATA_BUF7"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF8, "SDMA_MBANK_DATA_BUF8"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF9, "SDMA_MBANK_DATA_BUF9"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF10, "SDMA_MBANK_DATA_BUF10"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF11, "SDMA_MBANK_DATA_BUF11"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF12, "SDMA_MBANK_DATA_BUF12"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF13, "SDMA_MBANK_DATA_BUF13"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF14, "SDMA_MBANK_DATA_BUF14"}, +	{AMDGPU_SDMA_MBANK_DATA_BUF15, "SDMA_MBANK_DATA_BUF15"}, +	{AMDGPU_SDMA_UCODE_BUF, "SDMA_UCODE_BUF"}, +	{AMDGPU_SDMA_RB_CMD_BUF, "SDMA_RB_CMD_BUF"}, +	{AMDGPU_SDMA_IB_CMD_BUF, "SDMA_IB_CMD_BUF"}, +	{AMDGPU_SDMA_UTCL1_RD_FIFO, "SDMA_UTCL1_RD_FIFO"}, +	{AMDGPU_SDMA_UTCL1_RDBST_FIFO, "SDMA_UTCL1_RDBST_FIFO"}, +	{AMDGPU_SDMA_UTCL1_WR_FIFO, "SDMA_UTCL1_WR_FIFO"}, +	{AMDGPU_SDMA_DATA_LUT_FIFO, "SDMA_DATA_LUT_FIFO"}, +	{AMDGPU_SDMA_SPLIT_DAT_BUF, "SDMA_SPLIT_DAT_BUF"}, +}; + +static void sdma_v4_4_2_inst_query_ras_error_count(struct amdgpu_device *adev, +						   uint32_t sdma_inst, +						   void *ras_err_status) +{ +	struct ras_err_data *err_data = (struct ras_err_data *)ras_err_status; +	uint32_t sdma_dev_inst = GET_INST(SDMA0, sdma_inst); + +	/* sdma v4_4_2 doesn't support query ce counts */ +	amdgpu_ras_inst_query_ras_error_count(adev, +					sdma_v4_2_2_ue_reg_list, +					ARRAY_SIZE(sdma_v4_2_2_ue_reg_list), +					sdma_v4_4_2_ras_memory_list, +					ARRAY_SIZE(sdma_v4_4_2_ras_memory_list), +					sdma_dev_inst, +					AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, +					&err_data->ue_count); +} + +static void sdma_v4_4_2_query_ras_error_count(struct amdgpu_device *adev, +					      void *ras_err_status) +{ +	uint32_t inst_mask; +	int i = 0; + +	inst_mask = GENMASK(adev->sdma.num_instances - 1, 0); +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA)) { +		for_each_inst(i, inst_mask) +			sdma_v4_4_2_inst_query_ras_error_count(adev, i, ras_err_status); +	} else { +		dev_warn(adev->dev, "SDMA RAS is not supported\n"); +	} +} + +static void sdma_v4_4_2_inst_reset_ras_error_count(struct amdgpu_device *adev, +						   uint32_t sdma_inst) +{ +	uint32_t sdma_dev_inst = GET_INST(SDMA0, sdma_inst); + +	amdgpu_ras_inst_reset_ras_error_count(adev, +					sdma_v4_2_2_ue_reg_list, +					ARRAY_SIZE(sdma_v4_2_2_ue_reg_list), +					sdma_dev_inst); +} + +static void sdma_v4_4_2_reset_ras_error_count(struct amdgpu_device *adev) +{ +	uint32_t inst_mask; +	int i = 0; + +	inst_mask = GENMASK(adev->sdma.num_instances - 1, 0); +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA)) { +		for_each_inst(i, inst_mask) +			sdma_v4_4_2_inst_reset_ras_error_count(adev, i); +	} else { +		dev_warn(adev->dev, "SDMA RAS is not supported\n"); +	} +} + +static const struct amdgpu_ras_block_hw_ops sdma_v4_4_2_ras_hw_ops = { +	.query_ras_error_count = sdma_v4_4_2_query_ras_error_count, +	.reset_ras_error_count = sdma_v4_4_2_reset_ras_error_count, +}; + +static struct amdgpu_sdma_ras sdma_v4_4_2_ras = { +	.ras_block = { +		.hw_ops = &sdma_v4_4_2_ras_hw_ops, +	}, +}; + +static void sdma_v4_4_2_set_ras_funcs(struct amdgpu_device *adev) +{ +	adev->sdma.ras = &sdma_v4_4_2_ras; +} diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.h b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.h index 4814e8a074d6..d516145529bb 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.h +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.h @@ -27,4 +27,6 @@  extern const struct amd_ip_funcs sdma_v4_4_2_ip_funcs;  extern const struct amdgpu_ip_block_version sdma_v4_4_2_ip_block; +extern struct amdgpu_xcp_ip_funcs sdma_v4_4_2_xcp_funcs; +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index 92e1299be021..5c4d4df9cf94 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c @@ -819,8 +819,6 @@ static int sdma_v5_0_gfx_resume(struct amdgpu_device *adev)  		/* enable DMA IBs */  		WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); -		ring->sched.ready = true; -  		if (amdgpu_sriov_vf(adev)) { /* bare-metal sequence doesn't need below to lines */  			sdma_v5_0_ctx_switch_enable(adev, true);  			sdma_v5_0_enable(adev, true); @@ -1389,7 +1387,7 @@ static int sdma_v5_0_sw_init(void *handle)  			(adev->doorbell_index.sdma_engine[0] << 1) //get DWORD offset  			: (adev->doorbell_index.sdma_engine[1] << 1); // get DWORD offset -		ring->vm_hub = AMDGPU_GFXHUB_0; +		ring->vm_hub = AMDGPU_GFXHUB(0);  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,  				     (i == 0) ? AMDGPU_SDMA_IRQ_INSTANCE0 : diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index ca7e8757d78e..a7b230e5a26d 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c @@ -617,18 +617,14 @@ static int sdma_v5_2_gfx_resume(struct amdgpu_device *adev)  		/* enable DMA IBs */  		WREG32_SOC15_IP(GC, sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); -		ring->sched.ready = true; -  		if (amdgpu_sriov_vf(adev)) { /* bare-metal sequence doesn't need below to lines */  			sdma_v5_2_ctx_switch_enable(adev, true);  			sdma_v5_2_enable(adev, true);  		} -		r = amdgpu_ring_test_ring(ring); -		if (r) { -			ring->sched.ready = false; +		r = amdgpu_ring_test_helper(ring); +		if (r)  			return r; -		}  		if (adev->mman.buffer_funcs_ring == ring)  			amdgpu_ttm_set_buffer_funcs_status(adev, true); @@ -1253,7 +1249,7 @@ static int sdma_v5_2_sw_init(void *handle)  		ring->doorbell_index =  			(adev->doorbell_index.sdma_engine[i] << 1); //get DWORD offset -		ring->vm_hub = AMDGPU_GFXHUB_0; +		ring->vm_hub = AMDGPU_GFXHUB(0);  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,  				     AMDGPU_SDMA_IRQ_INSTANCE0 + i, diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c index 3d9a80511a45..3b03dda854fd 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c @@ -238,6 +238,8 @@ static void sdma_v6_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)   *   * @ring: amdgpu ring pointer   * @ib: IB object to schedule + * @flags: unused + * @job: job to retrieve vmid from   *   * Schedule an IB in the DMA ring.   */ @@ -585,16 +587,12 @@ static int sdma_v6_0_gfx_resume(struct amdgpu_device *adev)  		/* enable DMA IBs */  		WREG32_SOC15_IP(GC, sdma_v6_0_get_reg_offset(adev, i, regSDMA0_QUEUE0_IB_CNTL), ib_cntl); -		ring->sched.ready = true; -  		if (amdgpu_sriov_vf(adev))  			sdma_v6_0_enable(adev, true);  		r = amdgpu_ring_test_helper(ring); -		if (r) { -			ring->sched.ready = false; +		if (r)  			return r; -		}  		if (adev->mman.buffer_funcs_ring == ring)  			amdgpu_ttm_set_buffer_funcs_status(adev, true); @@ -942,6 +940,7 @@ static int sdma_v6_0_ring_test_ring(struct amdgpu_ring *ring)   * sdma_v6_0_ring_test_ib - test an IB on the DMA engine   *   * @ring: amdgpu_ring structure holding ring information + * @timeout: timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT   *   * Test a simple IB in the DMA ring.   * Returns 0 on success, error on failure. @@ -1122,6 +1121,7 @@ static void sdma_v6_0_vm_set_pte_pde(struct amdgpu_ib *ib,  /**   * sdma_v6_0_ring_pad_ib - pad the IB   * @ib: indirect buffer to fill with padding + * @ring: amdgpu ring pointer   *   * Pad the IB with NOPs to a boundary multiple of 8.   */ @@ -1171,6 +1171,8 @@ static void sdma_v6_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)   * sdma_v6_0_ring_emit_vm_flush - vm flush using sDMA   *   * @ring: amdgpu_ring pointer + * @vmid: vmid number to use + * @pd_addr: address   *   * Update the page table base and flush the VM TLB   * using sDMA. @@ -1298,7 +1300,7 @@ static int sdma_v6_0_sw_init(void *handle)  		ring->doorbell_index =  			(adev->doorbell_index.sdma_engine[i] << 1); // get DWORD offset -		ring->vm_hub = AMDGPU_GFXHUB_0; +		ring->vm_hub = AMDGPU_GFXHUB(0);  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024,  				     &adev->sdma.trap_irq, diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index 7f99e130acd0..f64b87b11b1b 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c @@ -1181,12 +1181,12 @@ static uint32_t si_get_register_value(struct amdgpu_device *adev,  		mutex_lock(&adev->grbm_idx_mutex);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  		val = RREG32(reg_offset);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		mutex_unlock(&adev->grbm_idx_mutex);  		return val;  	} else { diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.c b/drivers/gpu/drm/amd/amdgpu/si_dma.c index abca8b529721..42c4547f32ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dma.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dma.c @@ -174,8 +174,6 @@ static int si_dma_start(struct amdgpu_device *adev)  		WREG32(DMA_RB_WPTR + sdma_offsets[i], ring->wptr << 2);  		WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl | DMA_RB_ENABLE); -		ring->sched.ready = true; -  		r = amdgpu_ring_test_helper(ring);  		if (r)  			return r; diff --git a/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.c b/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.c new file mode 100644 index 000000000000..4368a5891eeb --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.c @@ -0,0 +1,103 @@ +/* + * Copyright 2022 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 "smuio_v13_0_3.h" +#include "soc15_common.h" +#include "smuio/smuio_13_0_3_offset.h" +#include "smuio/smuio_13_0_3_sh_mask.h" + +#define PKG_TYPE_MASK		0x00000003L + +/** + * smuio_v13_0_3_get_die_id - query die id from FCH. + * + * @adev: amdgpu device pointer + * + * Returns die id + */ +static u32 smuio_v13_0_3_get_die_id(struct amdgpu_device *adev) +{ +	u32 data, die_id; + +	data = RREG32_SOC15(SMUIO, 0, regSMUIO_MCM_CONFIG); +	die_id = REG_GET_FIELD(data, SMUIO_MCM_CONFIG, DIE_ID); + +	return die_id; +} + +/** + * smuio_v13_0_3_get_socket_id - query socket id from FCH + * + * @adev: amdgpu device pointer + * + * Returns socket id + */ +static u32 smuio_v13_0_3_get_socket_id(struct amdgpu_device *adev) +{ +	u32 data, socket_id; + +	data = RREG32_SOC15(SMUIO, 0, regSMUIO_MCM_CONFIG); +	socket_id = REG_GET_FIELD(data, SMUIO_MCM_CONFIG, SOCKET_ID); + +	return socket_id; +} + +/** + * smuio_v13_0_3_get_pkg_type - query package type set by MP1/bootcode + * + * @adev: amdgpu device pointer + * + * Returns package type + */ + +static enum amdgpu_pkg_type smuio_v13_0_3_get_pkg_type(struct amdgpu_device *adev) +{ +	enum amdgpu_pkg_type pkg_type; +	u32 data; + +	data = RREG32_SOC15(SMUIO, 0, regSMUIO_MCM_CONFIG); +	data = REG_GET_FIELD(data, SMUIO_MCM_CONFIG, PKG_TYPE); +	/* pkg_type[4:0] +	 * +	 * bit 1 == 1 APU form factor +	 * +	 * b0100 - b1111 - Reserved +	 */ +	switch (data & PKG_TYPE_MASK) { +	case 0x2: +		pkg_type = AMDGPU_PKG_TYPE_APU; +		break; +	default: +		pkg_type = AMDGPU_PKG_TYPE_UNKNOWN; +		break; +	} + +	return pkg_type; +} + + +const struct amdgpu_smuio_funcs smuio_v13_0_3_funcs = { +	.get_die_id = smuio_v13_0_3_get_die_id, +	.get_socket_id = smuio_v13_0_3_get_socket_id, +	.get_pkg_type = smuio_v13_0_3_get_pkg_type, +}; diff --git a/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.h b/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.h new file mode 100644 index 000000000000..795f66c5a58b --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.h @@ -0,0 +1,30 @@ +/* + * Copyright 2022 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. + * + */ +#ifndef __SMUIO_V13_0_3_H__ +#define __SMUIO_V13_0_3_H__ + +#include "soc15_common.h" + +extern const struct amdgpu_smuio_funcs smuio_v13_0_3_funcs; + +#endif /* __SMUIO_V13_0_3_H__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index 6d15d5cd9e07..afcaeadda4c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -153,6 +153,24 @@ static const struct amdgpu_video_codecs rn_video_codecs_decode =  	.codec_array = rn_video_codecs_decode_array,  }; +static const struct amdgpu_video_codec_info vcn_4_0_3_video_codecs_decode_array[] = { +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 4096, 52)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 8192, 4352, 186)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_JPEG, 4096, 4096, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_VP9, 8192, 4352, 0)}, +	{codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_AV1, 8192, 4352, 0)}, +}; + +static const struct amdgpu_video_codecs vcn_4_0_3_video_codecs_decode = { +	.codec_count = ARRAY_SIZE(vcn_4_0_3_video_codecs_decode_array), +	.codec_array = vcn_4_0_3_video_codecs_decode_array, +}; + +static const struct amdgpu_video_codecs vcn_4_0_3_video_codecs_encode = { +	.codec_count = 0, +	.codec_array = NULL, +}; +  static int soc15_query_video_codecs(struct amdgpu_device *adev, bool encode,  				    const struct amdgpu_video_codecs **codecs)  { @@ -185,6 +203,12 @@ static int soc15_query_video_codecs(struct amdgpu_device *adev, bool encode,  			else  				*codecs = &rn_video_codecs_decode;  			return 0; +		case IP_VERSION(4, 0, 3): +			if (encode) +				*codecs = &vcn_4_0_3_video_codecs_encode; +			else +				*codecs = &vcn_4_0_3_video_codecs_decode; +			return 0;  		default:  			return -EINVAL;  		} @@ -301,17 +325,18 @@ static u32 soc15_get_xclk(struct amdgpu_device *adev)  	u32 reference_clock = adev->clock.spll.reference_freq;  	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 0) || -	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 1) || -	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(10, 0, 0) || -	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(10, 0, 1)) +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 1))  		return 10000; +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(10, 0, 0) || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(10, 0, 1)) +		return reference_clock / 4;  	return reference_clock;  }  void soc15_grbm_select(struct amdgpu_device *adev, -		     u32 me, u32 pipe, u32 queue, u32 vmid) +		     u32 me, u32 pipe, u32 queue, u32 vmid, int xcc_id)  {  	u32 grbm_gfx_cntl = 0;  	grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, PIPEID, pipe); @@ -319,12 +344,7 @@ void soc15_grbm_select(struct amdgpu_device *adev,  	grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, VMID, vmid);  	grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, QUEUEID, queue); -	WREG32_SOC15_RLC_SHADOW(GC, 0, mmGRBM_GFX_CNTL, grbm_gfx_cntl); -} - -static void soc15_vga_set_state(struct amdgpu_device *adev, bool state) -{ -	/* todo */ +	WREG32_SOC15_RLC_SHADOW(GC, xcc_id, mmGRBM_GFX_CNTL, grbm_gfx_cntl);  }  static bool soc15_read_disabled_bios(struct amdgpu_device *adev) @@ -363,12 +383,12 @@ static uint32_t soc15_read_indexed_register(struct amdgpu_device *adev, u32 se_n  	mutex_lock(&adev->grbm_idx_mutex);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  	val = RREG32(reg_offset);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	return val;  } @@ -532,6 +552,15 @@ soc15_asic_reset_method(struct amdgpu_device *adev)  		if (connected_to_cpu)  			return AMD_RESET_METHOD_MODE2;  		break; +	case IP_VERSION(13, 0, 6): +		/* Use gpu_recovery param to target a reset method. +		 * Enable triggering of GPU reset only if specified +		 * by module parameter. +		 */ +		if (amdgpu_gpu_recovery == 4 || amdgpu_gpu_recovery == 5) +			return AMD_RESET_METHOD_MODE2; +		else +			return AMD_RESET_METHOD_NONE;  	default:  		break;  	} @@ -816,7 +845,6 @@ static const struct amdgpu_asic_funcs soc15_asic_funcs =  	.read_register = &soc15_read_register,  	.reset = &soc15_asic_reset,  	.reset_method = &soc15_asic_reset_method, -	.set_vga_state = &soc15_vga_set_state,  	.get_xclk = &soc15_get_xclk,  	.set_uvd_clocks = &soc15_set_uvd_clocks,  	.set_vce_clocks = &soc15_set_vce_clocks, @@ -838,7 +866,6 @@ static const struct amdgpu_asic_funcs vega20_asic_funcs =  	.read_register = &soc15_read_register,  	.reset = &soc15_asic_reset,  	.reset_method = &soc15_asic_reset_method, -	.set_vga_state = &soc15_vga_set_state,  	.get_xclk = &soc15_get_xclk,  	.set_uvd_clocks = &soc15_set_uvd_clocks,  	.set_vce_clocks = &soc15_set_vce_clocks, @@ -853,6 +880,28 @@ static const struct amdgpu_asic_funcs vega20_asic_funcs =  	.query_video_codecs = &soc15_query_video_codecs,  }; +static const struct amdgpu_asic_funcs aqua_vanjaram_asic_funcs = +{ +	.read_disabled_bios = &soc15_read_disabled_bios, +	.read_bios_from_rom = &amdgpu_soc15_read_bios_from_rom, +	.read_register = &soc15_read_register, +	.reset = &soc15_asic_reset, +	.reset_method = &soc15_asic_reset_method, +	.get_xclk = &soc15_get_xclk, +	.set_uvd_clocks = &soc15_set_uvd_clocks, +	.set_vce_clocks = &soc15_set_vce_clocks, +	.get_config_memsize = &soc15_get_config_memsize, +	.need_full_reset = &soc15_need_full_reset, +	.init_doorbell_index = &aqua_vanjaram_doorbell_index_init, +	.get_pcie_usage = &vega20_get_pcie_usage, +	.need_reset_on_init = &soc15_need_reset_on_init, +	.get_pcie_replay_count = &soc15_get_pcie_replay_count, +	.supports_baco = &soc15_supports_baco, +	.pre_asic_init = &soc15_pre_asic_init, +	.query_video_codecs = &soc15_query_video_codecs, +	.encode_ext_smn_addressing = &aqua_vanjaram_encode_ext_smn_addressing, +}; +  static int soc15_common_early_init(void *handle)  {  #define MMIO_REG_HOLE_OFFSET (0x80000 - PAGE_SIZE) @@ -866,6 +915,8 @@ static int soc15_common_early_init(void *handle)  	adev->smc_wreg = NULL;  	adev->pcie_rreg = &amdgpu_device_indirect_rreg;  	adev->pcie_wreg = &amdgpu_device_indirect_wreg; +	adev->pcie_rreg_ext = &amdgpu_device_indirect_rreg_ext; +	adev->pcie_wreg_ext = &amdgpu_device_indirect_wreg_ext;  	adev->pcie_rreg64 = &amdgpu_device_indirect_rreg64;  	adev->pcie_wreg64 = &amdgpu_device_indirect_wreg64;  	adev->uvd_ctx_rreg = &soc15_uvd_ctx_rreg; @@ -1094,9 +1145,18 @@ static int soc15_common_early_init(void *handle)  		adev->external_rev_id = adev->rev_id + 0x3c;  		break;  	case IP_VERSION(9, 4, 3): -		adev->asic_funcs = &vega20_asic_funcs; -		adev->cg_flags = 0; -		adev->pg_flags = 0; +		adev->asic_funcs = &aqua_vanjaram_asic_funcs; +		adev->cg_flags = +			AMD_CG_SUPPORT_GFX_MGCG | AMD_CG_SUPPORT_GFX_CGCG | +			AMD_CG_SUPPORT_GFX_CGLS | AMD_CG_SUPPORT_SDMA_MGCG | +			AMD_CG_SUPPORT_GFX_FGCG | AMD_CG_SUPPORT_REPEATER_FGCG | +			AMD_CG_SUPPORT_VCN_MGCG | AMD_CG_SUPPORT_JPEG_MGCG | +			AMD_CG_SUPPORT_IH_CG; +		adev->pg_flags = +			AMD_PG_SUPPORT_VCN | +			AMD_PG_SUPPORT_VCN_DPG | +			AMD_PG_SUPPORT_JPEG; +		adev->external_rev_id = adev->rev_id + 0x46;  		break;  	default:  		/* FIXME: not supported yet */ diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.h b/drivers/gpu/drm/amd/amdgpu/soc15.h index efc2a253e8db..eac54042c6c0 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.h +++ b/drivers/gpu/drm/amd/amdgpu/soc15.h @@ -100,7 +100,7 @@ struct soc15_ras_field_entry {  #define SOC15_RAS_REG_FIELD_VAL(val, entry, field) SOC15_REG_FIELD_VAL((val), (entry).field##_count_mask, (entry).field##_count_shift)  void soc15_grbm_select(struct amdgpu_device *adev, -		    u32 me, u32 pipe, u32 queue, u32 vmid); +		    u32 me, u32 pipe, u32 queue, u32 vmid, int xcc_id);  void soc15_set_virt_ops(struct amdgpu_device *adev);  void soc15_program_register_sequence(struct amdgpu_device *adev, @@ -111,7 +111,11 @@ int vega10_reg_base_init(struct amdgpu_device *adev);  int vega20_reg_base_init(struct amdgpu_device *adev);  int arct_reg_base_init(struct amdgpu_device *adev);  int aldebaran_reg_base_init(struct amdgpu_device *adev); +void aqua_vanjaram_ip_map_init(struct amdgpu_device *adev); +u64 aqua_vanjaram_encode_ext_smn_addressing(int ext_id); +int aqua_vanjaram_init_soc_config(struct amdgpu_device *adev);  void vega10_doorbell_index_init(struct amdgpu_device *adev);  void vega20_doorbell_index_init(struct amdgpu_device *adev); +void aqua_vanjaram_doorbell_index_init(struct amdgpu_device *adev);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/soc15_common.h b/drivers/gpu/drm/amd/amdgpu/soc15_common.h index 9fefd403e14f..96948a59f8dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15_common.h +++ b/drivers/gpu/drm/amd/amdgpu/soc15_common.h @@ -24,8 +24,18 @@  #ifndef __SOC15_COMMON_H__  #define __SOC15_COMMON_H__ +/* GET_INST returns the physical instance corresponding to a logical instance */ +#define GET_INST(ip, inst) \ +	(adev->ip_map.logical_to_dev_inst ? \ +	adev->ip_map.logical_to_dev_inst(adev, ip##_HWIP, inst) : inst) +#define GET_MASK(ip, mask) \ +	(adev->ip_map.logical_to_dev_mask ? \ +	adev->ip_map.logical_to_dev_mask(adev, ip##_HWIP, mask) : mask) +  /* Register Access Macros */  #define SOC15_REG_OFFSET(ip, inst, reg)	(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) +#define SOC15_REG_OFFSET1(ip, inst, reg, offset) \ +	(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + (reg)+(offset))  #define __WREG32_SOC15_RLC__(reg, value, flag, hwip) \  	((amdgpu_sriov_vf(adev) && adev->gfx.rlc.funcs && adev->gfx.rlc.rlcg_reg_access_supported) ? \ @@ -66,7 +76,8 @@  			 AMDGPU_REGS_NO_KIQ, ip##_HWIP)  #define RREG32_SOC15_OFFSET(ip, inst, reg, offset) \ -	 __RREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, 0, ip##_HWIP) +	 __RREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + (reg)) + \ +			 (offset), 0, ip##_HWIP)  #define WREG32_SOC15(ip, inst, reg, value) \  	 __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), \ @@ -86,31 +97,15 @@  	 __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, \  			  value, 0, ip##_HWIP) -#define SOC15_WAIT_ON_RREG(ip, inst, reg, expected_value, mask) \ -({	int ret = 0;						\ -	do {							\ -		uint32_t old_ = 0;				\ -		uint32_t tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ -		uint32_t loop = adev->usec_timeout;		\ -		ret = 0;					\ -		while ((tmp_ & (mask)) != (expected_value)) {	\ -			if (old_ != tmp_) {			\ -				loop = adev->usec_timeout;	\ -				old_ = tmp_;			\ -			} else					\ -				udelay(1);			\ -			tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ -			loop--;					\ -			if (!loop) {				\ -				DRM_WARN("Register(%d) [%s] failed to reach value 0x%08x != 0x%08x\n", \ -					  inst, #reg, (unsigned)expected_value, (unsigned)(tmp_ & (mask))); \ -				ret = -ETIMEDOUT;		\ -				break;				\ -			}					\ -		}						\ -	} while (0);						\ -	ret;							\ -}) +#define SOC15_WAIT_ON_RREG(ip, inst, reg, expected_value, mask)      \ +	amdgpu_device_wait_on_rreg(adev, inst,                       \ +	(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + (reg)), \ +	#reg, expected_value, mask) + +#define SOC15_WAIT_ON_RREG_OFFSET(ip, inst, reg, offset, expected_value, mask)  \ +	amdgpu_device_wait_on_rreg(adev, inst,                                  \ +	(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + (reg) + (offset)), \ +	#reg, expected_value, mask)  #define WREG32_RLC(reg, value) \  	__WREG32_SOC15_RLC__(reg, value, AMDGPU_REGS_RLC, GC_HWIP) @@ -157,10 +152,10 @@  	do {							\  		uint32_t target_reg = adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg;\  		if (amdgpu_sriov_fullaccess(adev)) {    \ -			uint32_t r2 = adev->reg_offset[GC_HWIP][0][prefix##SCRATCH_REG1_BASE_IDX] + prefix##SCRATCH_REG2;	\ -			uint32_t r3 = adev->reg_offset[GC_HWIP][0][prefix##SCRATCH_REG1_BASE_IDX] + prefix##SCRATCH_REG3;	\ -			uint32_t grbm_cntl = adev->reg_offset[GC_HWIP][0][prefix##GRBM_GFX_CNTL_BASE_IDX] + prefix##GRBM_GFX_CNTL;   \ -			uint32_t grbm_idx = adev->reg_offset[GC_HWIP][0][prefix##GRBM_GFX_INDEX_BASE_IDX] + prefix##GRBM_GFX_INDEX;   \ +			uint32_t r2 = adev->reg_offset[GC_HWIP][inst][prefix##SCRATCH_REG1_BASE_IDX] + prefix##SCRATCH_REG2;	\ +			uint32_t r3 = adev->reg_offset[GC_HWIP][inst][prefix##SCRATCH_REG1_BASE_IDX] + prefix##SCRATCH_REG3;	\ +			uint32_t grbm_cntl = adev->reg_offset[GC_HWIP][inst][prefix##GRBM_GFX_CNTL_BASE_IDX] + prefix##GRBM_GFX_CNTL;   \ +			uint32_t grbm_idx = adev->reg_offset[GC_HWIP][inst][prefix##GRBM_GFX_INDEX_BASE_IDX] + prefix##GRBM_GFX_INDEX;   \  			if (target_reg == grbm_cntl) \  				WREG32(r2, value);	\  			else if (target_reg == grbm_idx) \ @@ -176,13 +171,13 @@  #define WREG32_SOC15_RLC(ip, inst, reg, value) \  	do {							\ -		uint32_t target_reg = adev->reg_offset[ip##_HWIP][0][reg##_BASE_IDX] + reg;\ +		uint32_t target_reg = adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg;\  		__WREG32_SOC15_RLC__(target_reg, value, AMDGPU_REGS_RLC, ip##_HWIP); \  	} while (0)  #define WREG32_SOC15_RLC_EX(prefix, ip, inst, reg, value) \  	do {							\ -			uint32_t target_reg = adev->reg_offset[GC_HWIP][0][reg##_BASE_IDX] + reg;\ +			uint32_t target_reg = adev->reg_offset[GC_HWIP][inst][reg##_BASE_IDX] + reg;\  			WREG32_RLC_EX(prefix, target_reg, value); \  	} while (0) @@ -199,4 +194,14 @@  #define RREG32_SOC15_OFFSET_RLC(ip, inst, reg, offset) \  	__RREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, AMDGPU_REGS_RLC, ip##_HWIP) +/* inst equals to ext for some IPs */ +#define RREG32_SOC15_EXT(ip, inst, reg, ext) \ +	RREG32_PCIE_EXT((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) * 4 \ +			+ adev->asic_funcs->encode_ext_smn_addressing(ext)) \ + +#define WREG32_SOC15_EXT(ip, inst, reg, ext, value) \ +	WREG32_PCIE_EXT((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) * 4 \ +			+ adev->asic_funcs->encode_ext_smn_addressing(ext), \ +			value) \ +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/soc21.c b/drivers/gpu/drm/amd/amdgpu/soc21.c index d77162536514..e5e5d68a4d70 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc21.c +++ b/drivers/gpu/drm/amd/amdgpu/soc21.c @@ -248,11 +248,6 @@ void soc21_grbm_select(struct amdgpu_device *adev,  	WREG32_SOC15(GC, 0, regGRBM_GFX_CNTL, grbm_gfx_cntl);  } -static void soc21_vga_set_state(struct amdgpu_device *adev, bool state) -{ -	/* todo */ -} -  static bool soc21_read_disabled_bios(struct amdgpu_device *adev)  {  	/* todo */ @@ -288,12 +283,12 @@ static uint32_t soc21_read_indexed_register(struct amdgpu_device *adev, u32 se_n  	mutex_lock(&adev->grbm_idx_mutex);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  	val = RREG32(reg_offset);  	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	return val;  } @@ -542,9 +537,9 @@ static int soc21_update_umd_stable_pstate(struct amdgpu_device *adev,  					  bool enter)  {  	if (enter) -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	else -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	if (adev->gfx.funcs->update_perfmon_mgcg)  		adev->gfx.funcs->update_perfmon_mgcg(adev, !enter); @@ -559,7 +554,6 @@ static const struct amdgpu_asic_funcs soc21_asic_funcs =  	.read_register = &soc21_read_register,  	.reset = &soc21_asic_reset,  	.reset_method = &soc21_asic_reset_method, -	.set_vga_state = &soc21_vga_set_state,  	.get_xclk = &soc21_get_xclk,  	.set_uvd_clocks = &soc21_set_uvd_clocks,  	.set_vce_clocks = &soc21_set_vce_clocks, diff --git a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h index 30d0482ac466..be2984ac00a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h +++ b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h @@ -129,6 +129,7 @@ struct ta_ras_trigger_error_input {  struct ta_ras_init_flags {  	uint8_t poison_mode_en;  	uint8_t dgpu_mode; +	uint16_t xcc_mask;  };  struct ta_ras_output_flags { diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v8_10.c b/drivers/gpu/drm/amd/amdgpu/umc_v8_10.c index d51ae0bc36f7..46bfdee79bfd 100644 --- a/drivers/gpu/drm/amd/amdgpu/umc_v8_10.c +++ b/drivers/gpu/drm/amd/amdgpu/umc_v8_10.c @@ -444,6 +444,11 @@ static void umc_v8_10_ecc_info_query_ras_error_address(struct amdgpu_device *ade  		umc_v8_10_ecc_info_query_error_address, ras_error_status);  } +static void umc_v8_10_set_eeprom_table_version(struct amdgpu_ras_eeprom_table_header *hdr) +{ +	hdr->version = RAS_TABLE_VER_V2_1; +} +  const struct amdgpu_ras_block_hw_ops umc_v8_10_ras_hw_ops = {  	.query_ras_error_count = umc_v8_10_query_ras_error_count,  	.query_ras_error_address = umc_v8_10_query_ras_error_address, @@ -457,4 +462,5 @@ struct amdgpu_umc_ras umc_v8_10_ras = {  	.query_ras_poison_mode = umc_v8_10_query_ras_poison_mode,  	.ecc_info_query_ras_error_count = umc_v8_10_ecc_info_query_ras_error_count,  	.ecc_info_query_ras_error_address = umc_v8_10_ecc_info_query_ras_error_address, +	.set_eeprom_table_version = umc_v8_10_set_eeprom_table_version,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c index e32b656b3dab..abaa4463e906 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c @@ -444,7 +444,7 @@ static int uvd_v7_0_sw_init(void *handle)  			continue;  		if (!amdgpu_sriov_vf(adev)) {  			ring = &adev->uvd.inst[j].ring; -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  			sprintf(ring->name, "uvd_%d", ring->me);  			r = amdgpu_ring_init(adev, ring, 512,  					     &adev->uvd.inst[j].irq, 0, @@ -455,7 +455,7 @@ static int uvd_v7_0_sw_init(void *handle)  		for (i = 0; i < adev->uvd.num_enc_rings; ++i) {  			ring = &adev->uvd.inst[j].ring_enc[i]; -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  			sprintf(ring->name, "uvd_enc_%d.%d", ring->me, i);  			if (amdgpu_sriov_vf(adev)) {  				ring->use_doorbell = true; diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c index 57b85bb6a1e4..e0b70cd3b697 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c @@ -466,7 +466,7 @@ static int vce_v4_0_sw_init(void *handle)  		enum amdgpu_ring_priority_level hw_prio = amdgpu_vce_get_ring_prio(i);  		ring = &adev->vce.ring[i]; -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "vce%d", i);  		if (amdgpu_sriov_vf(adev)) {  			/* DOORBELL only works under SRIOV */ diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 761c28fa6ec1..16feb491adf5 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -120,7 +120,7 @@ static int vcn_v1_0_sw_init(void *handle)  		return r;  	ring = &adev->vcn.inst->ring_dec; -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "vcn_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0,  			     AMDGPU_RING_PRIO_DEFAULT, NULL); @@ -142,7 +142,7 @@ static int vcn_v1_0_sw_init(void *handle)  		enum amdgpu_ring_priority_level hw_prio = amdgpu_vcn_get_enc_ring_prio(i);  		ring = &adev->vcn.inst->ring_enc[i]; -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "vcn_enc%d", i);  		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0,  				     hw_prio, NULL); @@ -211,7 +211,7 @@ static int vcn_v1_0_hw_init(void *handle)  			goto done;  	} -	ring = &adev->jpeg.inst->ring_dec; +	ring = adev->jpeg.inst->ring_dec;  	r = amdgpu_ring_test_helper(ring);  	if (r)  		goto done; @@ -1304,7 +1304,7 @@ static int vcn_v1_0_pause_dpg_mode(struct amdgpu_device *adev,  							UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK);  				/* Restore */ -				ring = &adev->jpeg.inst->ring_dec; +				ring = adev->jpeg.inst->ring_dec;  				WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0);  				WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL,  							UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK | @@ -1802,7 +1802,7 @@ static void vcn_v1_0_idle_work_handler(struct work_struct *work)  		else  			new_state.fw_based = VCN_DPG_STATE__UNPAUSE; -		if (amdgpu_fence_count_emitted(&adev->jpeg.inst->ring_dec)) +		if (amdgpu_fence_count_emitted(adev->jpeg.inst->ring_dec))  			new_state.jpeg = VCN_DPG_STATE__PAUSE;  		else  			new_state.jpeg = VCN_DPG_STATE__UNPAUSE; @@ -1810,7 +1810,7 @@ static void vcn_v1_0_idle_work_handler(struct work_struct *work)  		adev->vcn.pause_dpg_mode(adev, 0, &new_state);  	} -	fences += amdgpu_fence_count_emitted(&adev->jpeg.inst->ring_dec); +	fences += amdgpu_fence_count_emitted(adev->jpeg.inst->ring_dec);  	fences += amdgpu_fence_count_emitted(&adev->vcn.inst->ring_dec);  	if (fences == 0) { @@ -1832,7 +1832,7 @@ static void vcn_v1_0_ring_begin_use(struct amdgpu_ring *ring)  	mutex_lock(&adev->vcn.vcn1_jpeg1_workaround); -	if (amdgpu_fence_wait_empty(&ring->adev->jpeg.inst->ring_dec)) +	if (amdgpu_fence_wait_empty(ring->adev->jpeg.inst->ring_dec))  		DRM_ERROR("VCN dec: jpeg dec ring may not be empty\n");  	vcn_v1_0_set_pg_for_begin_use(ring, set_clocks); @@ -1864,7 +1864,7 @@ void vcn_v1_0_set_pg_for_begin_use(struct amdgpu_ring *ring, bool set_clocks)  		else  			new_state.fw_based = VCN_DPG_STATE__UNPAUSE; -		if (amdgpu_fence_count_emitted(&adev->jpeg.inst->ring_dec)) +		if (amdgpu_fence_count_emitted(adev->jpeg.inst->ring_dec))  			new_state.jpeg = VCN_DPG_STATE__PAUSE;  		else  			new_state.jpeg = VCN_DPG_STATE__UNPAUSE; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index 7c2b3aa48083..c975aed2f6c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c @@ -129,7 +129,7 @@ static int vcn_v2_0_sw_init(void *handle)  	ring->use_doorbell = true;  	ring->doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1 << 1; -	ring->vm_hub = AMDGPU_MMHUB_0; +	ring->vm_hub = AMDGPU_MMHUB0(0);  	sprintf(ring->name, "vcn_dec");  	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, @@ -160,7 +160,7 @@ static int vcn_v2_0_sw_init(void *handle)  		ring = &adev->vcn.inst->ring_enc[i];  		ring->use_doorbell = true; -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(0);  		if (!amdgpu_sriov_vf(adev))  			ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + i;  		else diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index ab0b45d0ead1..bb1875f926f1 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c @@ -143,7 +143,7 @@ static int vcn_v2_5_sw_init(void *handle)  		/* VCN POISON TRAP */  		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_vcns[j], -			VCN_2_6__SRCID_UVD_POISON, &adev->vcn.inst[j].irq); +			VCN_2_6__SRCID_UVD_POISON, &adev->vcn.inst[j].ras_poison_irq);  		if (r)  			return r;  	} @@ -188,9 +188,9 @@ static int vcn_v2_5_sw_init(void *handle)  				(amdgpu_sriov_vf(adev) ? 2*j : 8*j);  		if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(2, 5, 0)) -			ring->vm_hub = AMDGPU_MMHUB_1; +			ring->vm_hub = AMDGPU_MMHUB1(0);  		else -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "vcn_dec_%d", j);  		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[j].irq, @@ -208,9 +208,9 @@ static int vcn_v2_5_sw_init(void *handle)  					(amdgpu_sriov_vf(adev) ? (1 + i + 2*j) : (2 + i + 8*j));  			if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(2, 5, 0)) -				ring->vm_hub = AMDGPU_MMHUB_1; +				ring->vm_hub = AMDGPU_MMHUB1(0);  			else -				ring->vm_hub = AMDGPU_MMHUB_0; +				ring->vm_hub = AMDGPU_MMHUB0(0);  			sprintf(ring->name, "vcn_enc_%d.%d", j, i);  			r = amdgpu_ring_init(adev, ring, 512, @@ -354,6 +354,9 @@ static int vcn_v2_5_hw_fini(void *handle)  		    (adev->vcn.cur_state != AMD_PG_STATE_GATE &&  		     RREG32_SOC15(VCN, i, mmUVD_STATUS)))  			vcn_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE); + +		if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) +			amdgpu_irq_put(adev, &adev->vcn.inst[i].ras_poison_irq, 0);  	}  	return 0; @@ -1807,6 +1810,14 @@ static int vcn_v2_5_set_interrupt_state(struct amdgpu_device *adev,  	return 0;  } +static int vcn_v2_6_set_ras_interrupt_state(struct amdgpu_device *adev, +					struct amdgpu_irq_src *source, +					unsigned int type, +					enum amdgpu_interrupt_state state) +{ +	return 0; +} +  static int vcn_v2_5_process_interrupt(struct amdgpu_device *adev,  				      struct amdgpu_irq_src *source,  				      struct amdgpu_iv_entry *entry) @@ -1837,9 +1848,6 @@ static int vcn_v2_5_process_interrupt(struct amdgpu_device *adev,  	case VCN_2_0__SRCID__UVD_ENC_LOW_LATENCY:  		amdgpu_fence_process(&adev->vcn.inst[ip_instance].ring_enc[1]);  		break; -	case VCN_2_6__SRCID_UVD_POISON: -		amdgpu_vcn_process_poison_irq(adev, source, entry); -		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n",  			  entry->src_id, entry->src_data[0]); @@ -1854,6 +1862,11 @@ static const struct amdgpu_irq_src_funcs vcn_v2_5_irq_funcs = {  	.process = vcn_v2_5_process_interrupt,  }; +static const struct amdgpu_irq_src_funcs vcn_v2_6_ras_irq_funcs = { +	.set = vcn_v2_6_set_ras_interrupt_state, +	.process = amdgpu_vcn_process_poison_irq, +}; +  static void vcn_v2_5_set_irq_funcs(struct amdgpu_device *adev)  {  	int i; @@ -1863,6 +1876,9 @@ static void vcn_v2_5_set_irq_funcs(struct amdgpu_device *adev)  			continue;  		adev->vcn.inst[i].irq.num_types = adev->vcn.num_enc_rings + 1;  		adev->vcn.inst[i].irq.funcs = &vcn_v2_5_irq_funcs; + +		adev->vcn.inst[i].ras_poison_irq.num_types = adev->vcn.num_enc_rings + 1; +		adev->vcn.inst[i].ras_poison_irq.funcs = &vcn_v2_6_ras_irq_funcs;  	}  } @@ -1965,6 +1981,7 @@ const struct amdgpu_ras_block_hw_ops vcn_v2_6_ras_hw_ops = {  static struct amdgpu_vcn_ras vcn_v2_6_ras = {  	.ras_block = {  		.hw_ops = &vcn_v2_6_ras_hw_ops, +		.ras_late_init = amdgpu_vcn_ras_late_init,  	},  }; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c index 3eab186261aa..c8f63b3c6f69 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c @@ -189,7 +189,7 @@ static int vcn_v3_0_sw_init(void *handle)  		} else {  			ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8 * i;  		} -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "vcn_dec_%d", i);  		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[i].irq, 0,  				     AMDGPU_RING_PRIO_DEFAULT, @@ -213,7 +213,7 @@ static int vcn_v3_0_sw_init(void *handle)  			} else {  				ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + j + 8 * i;  			} -			ring->vm_hub = AMDGPU_MMHUB_0; +			ring->vm_hub = AMDGPU_MMHUB0(0);  			sprintf(ring->name, "vcn_enc_%d.%d", i, j);  			r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[i].irq, 0,  					     hw_prio, &adev->vcn.inst[i].sched_score); @@ -1313,7 +1313,7 @@ static int vcn_v3_0_start_sriov(struct amdgpu_device *adev)  	header.version = MMSCH_VERSION;  	header.total_size = sizeof(struct mmsch_v3_0_init_header) >> 2; -	for (i = 0; i < AMDGPU_MAX_VCN_INSTANCES; i++) { +	for (i = 0; i < MMSCH_V3_0_VCN_INSTANCES; i++) {  		header.inst[i].init_status = 0;  		header.inst[i].table_offset = 0;  		header.inst[i].table_size = 0; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c index bf0674039598..8d371faaa2b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c @@ -139,7 +139,7 @@ static int vcn_v4_0_sw_init(void *handle)  		/* VCN POISON TRAP */  		r = amdgpu_irq_add_id(adev, amdgpu_ih_clientid_vcns[i], -				VCN_4_0__SRCID_UVD_POISON, &adev->vcn.inst[i].irq); +				VCN_4_0__SRCID_UVD_POISON, &adev->vcn.inst[i].ras_poison_irq);  		if (r)  			return r; @@ -149,7 +149,7 @@ static int vcn_v4_0_sw_init(void *handle)  			ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + i * (adev->vcn.num_enc_rings + 1) + 1;  		else  			ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + 8 * i; -		ring->vm_hub = AMDGPU_MMHUB_0; +		ring->vm_hub = AMDGPU_MMHUB0(0);  		sprintf(ring->name, "vcn_unified_%d", i);  		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[i].irq, 0, @@ -305,8 +305,8 @@ static int vcn_v4_0_hw_fini(void *handle)                          vcn_v4_0_set_powergating_state(adev, AMD_PG_STATE_GATE);  			}  		} - -		amdgpu_irq_put(adev, &adev->vcn.inst[i].irq, 0); +		if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) +			amdgpu_irq_put(adev, &adev->vcn.inst[i].ras_poison_irq, 0);  	}  	return 0; @@ -1239,7 +1239,7 @@ static int vcn_v4_0_start_sriov(struct amdgpu_device *adev)  	header.version = MMSCH_VERSION;  	header.total_size = sizeof(struct mmsch_v4_0_init_header) >> 2; -	for (i = 0; i < AMDGPU_MAX_VCN_INSTANCES; i++) { +	for (i = 0; i < MMSCH_V4_0_VCN_INSTANCES; i++) {  		header.inst[i].init_status = 0;  		header.inst[i].table_offset = 0;  		header.inst[i].table_size = 0; @@ -1976,6 +1976,24 @@ static int vcn_v4_0_set_interrupt_state(struct amdgpu_device *adev, struct amdgp  }  /** + * vcn_v4_0_set_ras_interrupt_state - set VCN block RAS interrupt state + * + * @adev: amdgpu_device pointer + * @source: interrupt sources + * @type: interrupt types + * @state: interrupt states + * + * Set VCN block RAS interrupt state + */ +static int vcn_v4_0_set_ras_interrupt_state(struct amdgpu_device *adev, +	struct amdgpu_irq_src *source, +	unsigned int type, +	enum amdgpu_interrupt_state state) +{ +	return 0; +} + +/**   * vcn_v4_0_process_interrupt - process VCN block interrupt   *   * @adev: amdgpu_device pointer @@ -2007,9 +2025,6 @@ static int vcn_v4_0_process_interrupt(struct amdgpu_device *adev, struct amdgpu_  	case VCN_4_0__SRCID__UVD_ENC_GENERAL_PURPOSE:  		amdgpu_fence_process(&adev->vcn.inst[ip_instance].ring_enc[0]);  		break; -	case VCN_4_0__SRCID_UVD_POISON: -		amdgpu_vcn_process_poison_irq(adev, source, entry); -		break;  	default:  		DRM_ERROR("Unhandled interrupt: %d %d\n",  			  entry->src_id, entry->src_data[0]); @@ -2024,6 +2039,11 @@ static const struct amdgpu_irq_src_funcs vcn_v4_0_irq_funcs = {  	.process = vcn_v4_0_process_interrupt,  }; +static const struct amdgpu_irq_src_funcs vcn_v4_0_ras_irq_funcs = { +	.set = vcn_v4_0_set_ras_interrupt_state, +	.process = amdgpu_vcn_process_poison_irq, +}; +  /**   * vcn_v4_0_set_irq_funcs - set VCN block interrupt irq functions   * @@ -2041,6 +2061,9 @@ static void vcn_v4_0_set_irq_funcs(struct amdgpu_device *adev)  		adev->vcn.inst[i].irq.num_types = adev->vcn.num_enc_rings + 1;  		adev->vcn.inst[i].irq.funcs = &vcn_v4_0_irq_funcs; + +		adev->vcn.inst[i].ras_poison_irq.num_types = adev->vcn.num_enc_rings + 1; +		adev->vcn.inst[i].ras_poison_irq.funcs = &vcn_v4_0_ras_irq_funcs;  	}  } @@ -2114,6 +2137,7 @@ const struct amdgpu_ras_block_hw_ops vcn_v4_0_ras_hw_ops = {  static struct amdgpu_vcn_ras vcn_v4_0_ras = {  	.ras_block = {  		.hw_ops = &vcn_v4_0_ras_hw_ops, +		.ras_late_init = amdgpu_vcn_ras_late_init,  	},  }; diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c new file mode 100644 index 000000000000..5d67b8b8a3d6 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c @@ -0,0 +1,1541 @@ +/* + * Copyright 2022 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 <linux/firmware.h> +#include <drm/drm_drv.h> + +#include "amdgpu.h" +#include "amdgpu_vcn.h" +#include "amdgpu_pm.h" +#include "soc15.h" +#include "soc15d.h" +#include "soc15_hw_ip.h" +#include "vcn_v2_0.h" + +#include "vcn/vcn_4_0_3_offset.h" +#include "vcn/vcn_4_0_3_sh_mask.h" +#include "ivsrcid/vcn/irqsrcs_vcn_4_0.h" + +#define mmUVD_DPG_LMA_CTL		regUVD_DPG_LMA_CTL +#define mmUVD_DPG_LMA_CTL_BASE_IDX	regUVD_DPG_LMA_CTL_BASE_IDX +#define mmUVD_DPG_LMA_DATA		regUVD_DPG_LMA_DATA +#define mmUVD_DPG_LMA_DATA_BASE_IDX	regUVD_DPG_LMA_DATA_BASE_IDX + +#define VCN_VID_SOC_ADDRESS_2_0		0x1fb00 +#define VCN1_VID_SOC_ADDRESS_3_0	0x48300 + +static void vcn_v4_0_3_set_unified_ring_funcs(struct amdgpu_device *adev); +static void vcn_v4_0_3_set_irq_funcs(struct amdgpu_device *adev); +static int vcn_v4_0_3_set_powergating_state(void *handle, +		enum amd_powergating_state state); +static int vcn_v4_0_3_pause_dpg_mode(struct amdgpu_device *adev, +		int inst_idx, struct dpg_pause_state *new_state); +static void vcn_v4_0_3_unified_ring_set_wptr(struct amdgpu_ring *ring); +static void vcn_v4_0_3_set_ras_funcs(struct amdgpu_device *adev); +static void vcn_v4_0_3_enable_ras(struct amdgpu_device *adev, +				  int inst_idx, bool indirect); +/** + * vcn_v4_0_3_early_init - set function pointers + * + * @handle: amdgpu_device pointer + * + * Set ring and irq function pointers + */ +static int vcn_v4_0_3_early_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	/* re-use enc ring as unified ring */ +	adev->vcn.num_enc_rings = 1; + +	vcn_v4_0_3_set_unified_ring_funcs(adev); +	vcn_v4_0_3_set_irq_funcs(adev); +	vcn_v4_0_3_set_ras_funcs(adev); + +	return amdgpu_vcn_early_init(adev); +} + +/** + * vcn_v4_0_3_sw_init - sw init for VCN block + * + * @handle: amdgpu_device pointer + * + * Load firmware and sw initialization + */ +static int vcn_v4_0_3_sw_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	struct amdgpu_ring *ring; +	int i, r, vcn_inst; + +	r = amdgpu_vcn_sw_init(adev); +	if (r) +		return r; + +	amdgpu_vcn_setup_ucode(adev); + +	r = amdgpu_vcn_resume(adev); +	if (r) +		return r; + +	/* VCN DEC TRAP */ +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, +		VCN_4_0__SRCID__UVD_ENC_GENERAL_PURPOSE, &adev->vcn.inst->irq); +	if (r) +		return r; + +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +		volatile struct amdgpu_vcn4_fw_shared *fw_shared; + +		vcn_inst = GET_INST(VCN, i); + +		ring = &adev->vcn.inst[i].ring_enc[0]; +		ring->use_doorbell = true; +		ring->doorbell_index = +			(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + +			9 * vcn_inst; +		ring->vm_hub = AMDGPU_MMHUB0(adev->vcn.inst[i].aid_id); +		sprintf(ring->name, "vcn_unified_%d", adev->vcn.inst[i].aid_id); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT, +				     &adev->vcn.inst[i].sched_score); +		if (r) +			return r; + +		fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; +		fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); +		fw_shared->sq.is_enabled = true; + +		if (amdgpu_vcnfw_log) +			amdgpu_vcn_fwlog_init(&adev->vcn.inst[i]); +	} + +	if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) +		adev->vcn.pause_dpg_mode = vcn_v4_0_3_pause_dpg_mode; + +	if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) { +		r = amdgpu_vcn_ras_sw_init(adev); +		if (r) { +			dev_err(adev->dev, "Failed to initialize vcn ras block!\n"); +			return r; +		} +	} + +	return 0; +} + +/** + * vcn_v4_0_3_sw_fini - sw fini for VCN block + * + * @handle: amdgpu_device pointer + * + * VCN suspend and free up sw allocation + */ +static int vcn_v4_0_3_sw_fini(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, r, idx; + +	if (drm_dev_enter(&adev->ddev, &idx)) { +		for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +			volatile struct amdgpu_vcn4_fw_shared *fw_shared; + +			fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; +			fw_shared->present_flag_0 = 0; +			fw_shared->sq.is_enabled = cpu_to_le32(false); +		} +		drm_dev_exit(idx); +	} + +	r = amdgpu_vcn_suspend(adev); +	if (r) +		return r; + +	r = amdgpu_vcn_sw_fini(adev); + +	return r; +} + +/** + * vcn_v4_0_3_hw_init - start and test VCN block + * + * @handle: amdgpu_device pointer + * + * Initialize the hardware, boot up the VCPU and do some testing + */ +static int vcn_v4_0_3_hw_init(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	struct amdgpu_ring *ring; +	int i, r, vcn_inst; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		vcn_inst = GET_INST(VCN, i); +		ring = &adev->vcn.inst[i].ring_enc[0]; + +		if (ring->use_doorbell) { +			adev->nbio.funcs->vcn_doorbell_range( +				adev, ring->use_doorbell, +				(adev->doorbell_index.vcn.vcn_ring0_1 << 1) + +					9 * vcn_inst, +				adev->vcn.inst[i].aid_id); + +			WREG32_SOC15( +				VCN, GET_INST(VCN, ring->me), +				regVCN_RB1_DB_CTRL, +				ring->doorbell_index +						<< VCN_RB1_DB_CTRL__OFFSET__SHIFT | +					VCN_RB1_DB_CTRL__EN_MASK); + +			/* Read DB_CTRL to flush the write DB_CTRL command. */ +			RREG32_SOC15( +				VCN, GET_INST(VCN, ring->me), +				regVCN_RB1_DB_CTRL); +		} + +		r = amdgpu_ring_test_helper(ring); +		if (r) +			goto done; +	} + +done: +	if (!r) +		DRM_DEV_INFO(adev->dev, "VCN decode initialized successfully(under %s).\n", +			(adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)?"DPG Mode":"SPG Mode"); + +	return r; +} + +/** + * vcn_v4_0_3_hw_fini - stop the hardware block + * + * @handle: amdgpu_device pointer + * + * Stop the VCN block, mark ring as not ready any more + */ +static int vcn_v4_0_3_hw_fini(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; + +	cancel_delayed_work_sync(&adev->vcn.idle_work); + +	if (adev->vcn.cur_state != AMD_PG_STATE_GATE) +		vcn_v4_0_3_set_powergating_state(adev, AMD_PG_STATE_GATE); + +	return 0; +} + +/** + * vcn_v4_0_3_suspend - suspend VCN block + * + * @handle: amdgpu_device pointer + * + * HW fini and suspend VCN block + */ +static int vcn_v4_0_3_suspend(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = vcn_v4_0_3_hw_fini(adev); +	if (r) +		return r; + +	r = amdgpu_vcn_suspend(adev); + +	return r; +} + +/** + * vcn_v4_0_3_resume - resume VCN block + * + * @handle: amdgpu_device pointer + * + * Resume firmware and hw init VCN block + */ +static int vcn_v4_0_3_resume(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int r; + +	r = amdgpu_vcn_resume(adev); +	if (r) +		return r; + +	r = vcn_v4_0_3_hw_init(adev); + +	return r; +} + +/** + * vcn_v4_0_3_mc_resume - memory controller programming + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number + * + * Let the VCN memory controller know it's offsets + */ +static void vcn_v4_0_3_mc_resume(struct amdgpu_device *adev, int inst_idx) +{ +	uint32_t offset, size, vcn_inst; +	const struct common_firmware_header *hdr; + +	hdr = (const struct common_firmware_header *)adev->vcn.fw->data; +	size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); + +	vcn_inst = GET_INST(VCN, inst_idx); +	/* cache window 0: fw */ +	if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { +		WREG32_SOC15( +			VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, +			(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst_idx] +				 .tmr_mc_addr_lo)); +		WREG32_SOC15( +			VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, +			(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + inst_idx] +				 .tmr_mc_addr_hi)); +		WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET0, 0); +		offset = 0; +	} else { +		WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, +			     lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr)); +		WREG32_SOC15(VCN, vcn_inst, +			     regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, +			     upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr)); +		offset = size; +		WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET0, +			     AMDGPU_UVD_FIRMWARE_OFFSET >> 3); +	} +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE0, size); + +	/* cache window 1: stack */ +	WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, +		     lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, +		     upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET1, 0); +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE1, +		     AMDGPU_VCN_STACK_SIZE); + +	/* cache window 2: context */ +	WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, +		     lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + +				   AMDGPU_VCN_STACK_SIZE)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, +		     upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + +				   AMDGPU_VCN_STACK_SIZE)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_OFFSET2, 0); +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_CACHE_SIZE2, +		     AMDGPU_VCN_CONTEXT_SIZE); + +	/* non-cache window */ +	WREG32_SOC15( +		VCN, vcn_inst, regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW, +		lower_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr)); +	WREG32_SOC15( +		VCN, vcn_inst, regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH, +		upper_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_VCPU_NONCACHE_OFFSET0, 0); +	WREG32_SOC15( +		VCN, vcn_inst, regUVD_VCPU_NONCACHE_SIZE0, +		AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn4_fw_shared))); +} + +/** + * vcn_v4_0_3_mc_resume_dpg_mode - memory controller programming for dpg mode + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number index + * @indirect: indirectly write sram + * + * Let the VCN memory controller know it's offsets with dpg mode + */ +static void vcn_v4_0_3_mc_resume_dpg_mode(struct amdgpu_device *adev, int inst_idx, bool indirect) +{ +	uint32_t offset, size; +	const struct common_firmware_header *hdr; + +	hdr = (const struct common_firmware_header *)adev->vcn.fw->data; +	size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8); + +	/* cache window 0: fw */ +	if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { +		if (!indirect) { +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), +				(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + +					inst_idx].tmr_mc_addr_lo), 0, indirect); +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), +				(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + +					inst_idx].tmr_mc_addr_hi), 0, indirect); +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); +		} else { +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect); +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect); +			WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +				VCN, 0, regUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); +		} +		offset = 0; +	} else { +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), +			lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect); +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), +			upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect); +		offset = size; +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_OFFSET0), +			AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0, indirect); +	} + +	if (!indirect) +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_SIZE0), size, 0, indirect); +	else +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_SIZE0), 0, 0, indirect); + +	/* cache window 1: stack */ +	if (!indirect) { +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), +			lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect); +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), +			upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect); +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); +	} else { +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect); +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect); +		WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); +	} +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect); + +	/* cache window 2: context */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW), +			lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + +				AMDGPU_VCN_STACK_SIZE), 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH), +			upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset + +				AMDGPU_VCN_STACK_SIZE), 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect); + +	/* non-cache window */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), +			lower_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr), 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), +			upper_32_bits(adev->vcn.inst[inst_idx].fw_shared.gpu_addr), 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +			VCN, 0, regUVD_VCPU_NONCACHE_SIZE0), +			AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_vcn4_fw_shared)), 0, indirect); + +	/* VCN global tiling registers */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_GFX8_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_GFX10_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect); +} + +/** + * vcn_v4_0_3_disable_clock_gating - disable VCN clock gating + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number + * + * Disable clock gating for VCN block + */ +static void vcn_v4_0_3_disable_clock_gating(struct amdgpu_device *adev, int inst_idx) +{ +	uint32_t data; +	int vcn_inst; + +	if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG) +		return; + +	vcn_inst = GET_INST(VCN, inst_idx); + +	/* VCN disable CGC */ +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL); +	data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK; +	data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; +	data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT; +	WREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL, data); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_CGC_GATE); +	data &= ~(UVD_CGC_GATE__SYS_MASK +		| UVD_CGC_GATE__MPEG2_MASK +		| UVD_CGC_GATE__REGS_MASK +		| UVD_CGC_GATE__RBC_MASK +		| UVD_CGC_GATE__LMI_MC_MASK +		| UVD_CGC_GATE__LMI_UMC_MASK +		| UVD_CGC_GATE__MPC_MASK +		| UVD_CGC_GATE__LBSI_MASK +		| UVD_CGC_GATE__LRBBM_MASK +		| UVD_CGC_GATE__WCB_MASK +		| UVD_CGC_GATE__VCPU_MASK +		| UVD_CGC_GATE__MMSCH_MASK); + +	WREG32_SOC15(VCN, vcn_inst, regUVD_CGC_GATE, data); +	SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_CGC_GATE, 0, 0xFFFFFFFF); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL); +	data &= ~(UVD_CGC_CTRL__SYS_MODE_MASK +		| UVD_CGC_CTRL__MPEG2_MODE_MASK +		| UVD_CGC_CTRL__REGS_MODE_MASK +		| UVD_CGC_CTRL__RBC_MODE_MASK +		| UVD_CGC_CTRL__LMI_MC_MODE_MASK +		| UVD_CGC_CTRL__LMI_UMC_MODE_MASK +		| UVD_CGC_CTRL__MPC_MODE_MASK +		| UVD_CGC_CTRL__LBSI_MODE_MASK +		| UVD_CGC_CTRL__LRBBM_MODE_MASK +		| UVD_CGC_CTRL__WCB_MODE_MASK +		| UVD_CGC_CTRL__VCPU_MODE_MASK +		| UVD_CGC_CTRL__MMSCH_MODE_MASK); +	WREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL, data); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_GATE); +	data |= (UVD_SUVD_CGC_GATE__SRE_MASK +		| UVD_SUVD_CGC_GATE__SIT_MASK +		| UVD_SUVD_CGC_GATE__SMP_MASK +		| UVD_SUVD_CGC_GATE__SCM_MASK +		| UVD_SUVD_CGC_GATE__SDB_MASK +		| UVD_SUVD_CGC_GATE__SRE_H264_MASK +		| UVD_SUVD_CGC_GATE__SRE_HEVC_MASK +		| UVD_SUVD_CGC_GATE__SIT_H264_MASK +		| UVD_SUVD_CGC_GATE__SIT_HEVC_MASK +		| UVD_SUVD_CGC_GATE__SCM_H264_MASK +		| UVD_SUVD_CGC_GATE__SCM_HEVC_MASK +		| UVD_SUVD_CGC_GATE__SDB_H264_MASK +		| UVD_SUVD_CGC_GATE__SDB_HEVC_MASK +		| UVD_SUVD_CGC_GATE__ENT_MASK +		| UVD_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK +		| UVD_SUVD_CGC_GATE__SITE_MASK +		| UVD_SUVD_CGC_GATE__SRE_VP9_MASK +		| UVD_SUVD_CGC_GATE__SCM_VP9_MASK +		| UVD_SUVD_CGC_GATE__SIT_VP9_DEC_MASK +		| UVD_SUVD_CGC_GATE__SDB_VP9_MASK +		| UVD_SUVD_CGC_GATE__IME_HEVC_MASK); +	WREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_GATE, data); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_CTRL); +	data &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SIT_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SMP_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SCM_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SDB_MODE_MASK +		| UVD_SUVD_CGC_CTRL__ENT_MODE_MASK +		| UVD_SUVD_CGC_CTRL__IME_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SITE_MODE_MASK); +	WREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_CTRL, data); +} + +/** + * vcn_v4_0_3_disable_clock_gating_dpg_mode - disable VCN clock gating dpg mode + * + * @adev: amdgpu_device pointer + * @sram_sel: sram select + * @inst_idx: instance number index + * @indirect: indirectly write sram + * + * Disable clock gating for VCN block with dpg mode + */ +static void vcn_v4_0_3_disable_clock_gating_dpg_mode(struct amdgpu_device *adev, uint8_t sram_sel, +				int inst_idx, uint8_t indirect) +{ +	uint32_t reg_data = 0; + +	if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG) +		return; + +	/* enable sw clock gating control */ +	reg_data = 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +	reg_data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; +	reg_data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT; +	reg_data &= ~(UVD_CGC_CTRL__SYS_MODE_MASK | +		 UVD_CGC_CTRL__MPEG2_MODE_MASK | +		 UVD_CGC_CTRL__REGS_MODE_MASK | +		 UVD_CGC_CTRL__RBC_MODE_MASK | +		 UVD_CGC_CTRL__LMI_MC_MODE_MASK | +		 UVD_CGC_CTRL__LMI_UMC_MODE_MASK | +		 UVD_CGC_CTRL__IDCT_MODE_MASK | +		 UVD_CGC_CTRL__MPRD_MODE_MASK | +		 UVD_CGC_CTRL__MPC_MODE_MASK | +		 UVD_CGC_CTRL__LBSI_MODE_MASK | +		 UVD_CGC_CTRL__LRBBM_MODE_MASK | +		 UVD_CGC_CTRL__WCB_MODE_MASK | +		 UVD_CGC_CTRL__VCPU_MODE_MASK); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_CGC_CTRL), reg_data, sram_sel, indirect); + +	/* turn off clock gating */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_CGC_GATE), 0, sram_sel, indirect); + +	/* turn on SUVD clock gating */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_SUVD_CGC_GATE), 1, sram_sel, indirect); + +	/* turn on sw mode in UVD_SUVD_CGC_CTRL */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect); +} + +/** + * vcn_v4_0_3_enable_clock_gating - enable VCN clock gating + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number + * + * Enable clock gating for VCN block + */ +static void vcn_v4_0_3_enable_clock_gating(struct amdgpu_device *adev, int inst_idx) +{ +	uint32_t data; +	int vcn_inst; + +	if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG) +		return; + +	vcn_inst = GET_INST(VCN, inst_idx); + +	/* enable VCN CGC */ +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL); +	data |= 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; +	data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; +	data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT; +	WREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL, data); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL); +	data |= (UVD_CGC_CTRL__SYS_MODE_MASK +		| UVD_CGC_CTRL__MPEG2_MODE_MASK +		| UVD_CGC_CTRL__REGS_MODE_MASK +		| UVD_CGC_CTRL__RBC_MODE_MASK +		| UVD_CGC_CTRL__LMI_MC_MODE_MASK +		| UVD_CGC_CTRL__LMI_UMC_MODE_MASK +		| UVD_CGC_CTRL__MPC_MODE_MASK +		| UVD_CGC_CTRL__LBSI_MODE_MASK +		| UVD_CGC_CTRL__LRBBM_MODE_MASK +		| UVD_CGC_CTRL__WCB_MODE_MASK +		| UVD_CGC_CTRL__VCPU_MODE_MASK); +	WREG32_SOC15(VCN, vcn_inst, regUVD_CGC_CTRL, data); + +	data = RREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_CTRL); +	data |= (UVD_SUVD_CGC_CTRL__SRE_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SIT_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SMP_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SCM_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SDB_MODE_MASK +		| UVD_SUVD_CGC_CTRL__ENT_MODE_MASK +		| UVD_SUVD_CGC_CTRL__IME_MODE_MASK +		| UVD_SUVD_CGC_CTRL__SITE_MODE_MASK); +	WREG32_SOC15(VCN, vcn_inst, regUVD_SUVD_CGC_CTRL, data); +} + +/** + * vcn_v4_0_3_start_dpg_mode - VCN start with dpg mode + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number index + * @indirect: indirectly write sram + * + * Start VCN block with dpg mode + */ +static int vcn_v4_0_3_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, bool indirect) +{ +	volatile struct amdgpu_vcn4_fw_shared *fw_shared = +						adev->vcn.inst[inst_idx].fw_shared.cpu_addr; +	struct amdgpu_ring *ring; +	int vcn_inst; +	uint32_t tmp; + +	vcn_inst = GET_INST(VCN, inst_idx); +	/* disable register anti-hang mechanism */ +	WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_POWER_STATUS), 1, +		 ~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK); +	/* enable dynamic power gating mode */ +	tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_POWER_STATUS); +	tmp |= UVD_POWER_STATUS__UVD_PG_MODE_MASK; +	tmp |= UVD_POWER_STATUS__UVD_PG_EN_MASK; +	WREG32_SOC15(VCN, vcn_inst, regUVD_POWER_STATUS, tmp); + +	if (indirect) { +		DRM_DEV_DEBUG(adev->dev, "VCN %d start: on AID %d", +			inst_idx, adev->vcn.inst[inst_idx].aid_id); +		adev->vcn.inst[inst_idx].dpg_sram_curr_addr = +				(uint32_t *)adev->vcn.inst[inst_idx].dpg_sram_cpu_addr; +		/* Use dummy register 0xDEADBEEF passing AID selection to PSP FW */ +		WREG32_SOC15_DPG_MODE(inst_idx, 0xDEADBEEF, +			adev->vcn.inst[inst_idx].aid_id, 0, true); +	} + +	/* enable clock gating */ +	vcn_v4_0_3_disable_clock_gating_dpg_mode(adev, 0, inst_idx, indirect); + +	/* enable VCPU clock */ +	tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); +	tmp |= UVD_VCPU_CNTL__CLK_EN_MASK; +	tmp |= UVD_VCPU_CNTL__BLK_RST_MASK; + +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_VCPU_CNTL), tmp, 0, indirect); + +	/* disable master interrupt */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MASTINT_EN), 0, 0, indirect); + +	/* setup regUVD_LMI_CTRL */ +	tmp = (UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | +		UVD_LMI_CTRL__REQ_MODE_MASK | +		UVD_LMI_CTRL__CRC_RESET_MASK | +		UVD_LMI_CTRL__MASK_MC_URGENT_MASK | +		UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | +		UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | +		(8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | +		0x00100000L); +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_LMI_CTRL), tmp, 0, indirect); + +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MPC_CNTL), +		0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT, 0, indirect); + +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MPC_SET_MUXA0), +		((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) | +		 (0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) | +		 (0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) | +		 (0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT)), 0, indirect); + +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MPC_SET_MUXB0), +		 ((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) | +		 (0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) | +		 (0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) | +		 (0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT)), 0, indirect); + +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MPC_SET_MUX), +		((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) | +		 (0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) | +		 (0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT)), 0, indirect); + +	vcn_v4_0_3_mc_resume_dpg_mode(adev, inst_idx, indirect); + +	tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); +	tmp |= UVD_VCPU_CNTL__CLK_EN_MASK; +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_VCPU_CNTL), tmp, 0, indirect); + +	/* enable LMI MC and UMC channels */ +	tmp = 0x1f << UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM__SHIFT; +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_LMI_CTRL2), tmp, 0, indirect); + +	vcn_v4_0_3_enable_ras(adev, inst_idx, indirect); + +	/* enable master interrupt */ +	WREG32_SOC15_DPG_MODE(inst_idx, SOC15_DPG_MODE_OFFSET( +		VCN, 0, regUVD_MASTINT_EN), +		UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect); + +	if (indirect) +		psp_update_vcn_sram(adev, 0, adev->vcn.inst[inst_idx].dpg_sram_gpu_addr, +			(uint32_t)((uintptr_t)adev->vcn.inst[inst_idx].dpg_sram_curr_addr - +				(uintptr_t)adev->vcn.inst[inst_idx].dpg_sram_cpu_addr)); + +	ring = &adev->vcn.inst[inst_idx].ring_enc[0]; + +	/* program the RB_BASE for ring buffer */ +	WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_LO, +		     lower_32_bits(ring->gpu_addr)); +	WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_HI, +		     upper_32_bits(ring->gpu_addr)); + +	WREG32_SOC15(VCN, vcn_inst, regUVD_RB_SIZE, +		     ring->ring_size / sizeof(uint32_t)); + +	/* resetting ring, fw should not check RB ring */ +	tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); +	tmp &= ~(VCN_RB_ENABLE__RB_EN_MASK); +	WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); +	fw_shared->sq.queue_mode |= FW_QUEUE_RING_RESET; + +	/* Initialize the ring buffer's read and write pointers */ +	WREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR, 0); +	WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, 0); +	ring->wptr = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); + +	tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); +	tmp |= VCN_RB_ENABLE__RB_EN_MASK; +	WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); +	fw_shared->sq.queue_mode &= ~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF); + +	/*resetting done, fw can check RB ring */ +	fw_shared->sq.queue_mode &= cpu_to_le32(~FW_QUEUE_RING_RESET); + +	return 0; +} + +/** + * vcn_v4_0_3_start - VCN start + * + * @adev: amdgpu_device pointer + * + * Start VCN block + */ +static int vcn_v4_0_3_start(struct amdgpu_device *adev) +{ +	volatile struct amdgpu_vcn4_fw_shared *fw_shared; +	struct amdgpu_ring *ring; +	int i, j, k, r, vcn_inst; +	uint32_t tmp; + +	if (adev->pm.dpm_enabled) +		amdgpu_dpm_enable_uvd(adev, true); + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { +			r = vcn_v4_0_3_start_dpg_mode(adev, i, adev->vcn.indirect_sram); +			continue; +		} + +		vcn_inst = GET_INST(VCN, i); +		/* set VCN status busy */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_STATUS) | +		      UVD_STATUS__UVD_BUSY; +		WREG32_SOC15(VCN, vcn_inst, regUVD_STATUS, tmp); + +		/*SW clock gating */ +		vcn_v4_0_3_disable_clock_gating(adev, i); + +		/* enable VCPU clock */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), +			 UVD_VCPU_CNTL__CLK_EN_MASK, +			 ~UVD_VCPU_CNTL__CLK_EN_MASK); + +		/* disable master interrupt */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_MASTINT_EN), 0, +			 ~UVD_MASTINT_EN__VCPU_EN_MASK); + +		/* enable LMI MC and UMC channels */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_LMI_CTRL2), 0, +			 ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); + +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); +		tmp &= ~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK; +		tmp &= ~UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK; +		WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + +		/* setup regUVD_LMI_CTRL */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL); +		WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL, +			     tmp | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | +				     UVD_LMI_CTRL__MASK_MC_URGENT_MASK | +				     UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | +				     UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK); + +		/* setup regUVD_MPC_CNTL */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_MPC_CNTL); +		tmp &= ~UVD_MPC_CNTL__REPLACEMENT_MODE_MASK; +		tmp |= 0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT; +		WREG32_SOC15(VCN, vcn_inst, regUVD_MPC_CNTL, tmp); + +		/* setup UVD_MPC_SET_MUXA0 */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_MPC_SET_MUXA0, +			     ((0x1 << UVD_MPC_SET_MUXA0__VARA_1__SHIFT) | +			      (0x2 << UVD_MPC_SET_MUXA0__VARA_2__SHIFT) | +			      (0x3 << UVD_MPC_SET_MUXA0__VARA_3__SHIFT) | +			      (0x4 << UVD_MPC_SET_MUXA0__VARA_4__SHIFT))); + +		/* setup UVD_MPC_SET_MUXB0 */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_MPC_SET_MUXB0, +			     ((0x1 << UVD_MPC_SET_MUXB0__VARB_1__SHIFT) | +			      (0x2 << UVD_MPC_SET_MUXB0__VARB_2__SHIFT) | +			      (0x3 << UVD_MPC_SET_MUXB0__VARB_3__SHIFT) | +			      (0x4 << UVD_MPC_SET_MUXB0__VARB_4__SHIFT))); + +		/* setup UVD_MPC_SET_MUX */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_MPC_SET_MUX, +			     ((0x0 << UVD_MPC_SET_MUX__SET_0__SHIFT) | +			      (0x1 << UVD_MPC_SET_MUX__SET_1__SHIFT) | +			      (0x2 << UVD_MPC_SET_MUX__SET_2__SHIFT))); + +		vcn_v4_0_3_mc_resume(adev, i); + +		/* VCN global tiling registers */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_GFX8_ADDR_CONFIG, +			     adev->gfx.config.gb_addr_config); +		WREG32_SOC15(VCN, vcn_inst, regUVD_GFX10_ADDR_CONFIG, +			     adev->gfx.config.gb_addr_config); + +		/* unblock VCPU register access */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_RB_ARB_CTRL), 0, +			 ~UVD_RB_ARB_CTRL__VCPU_DIS_MASK); + +		/* release VCPU reset to boot */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), 0, +			 ~UVD_VCPU_CNTL__BLK_RST_MASK); + +		for (j = 0; j < 10; ++j) { +			uint32_t status; + +			for (k = 0; k < 100; ++k) { +				status = RREG32_SOC15(VCN, vcn_inst, +						      regUVD_STATUS); +				if (status & 2) +					break; +				mdelay(10); +			} +			r = 0; +			if (status & 2) +				break; + +			DRM_DEV_ERROR(adev->dev, +				"VCN decode not responding, trying to reset the VCPU!!!\n"); +			WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, +						  regUVD_VCPU_CNTL), +				 UVD_VCPU_CNTL__BLK_RST_MASK, +				 ~UVD_VCPU_CNTL__BLK_RST_MASK); +			mdelay(10); +			WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, +						  regUVD_VCPU_CNTL), +				 0, ~UVD_VCPU_CNTL__BLK_RST_MASK); + +			mdelay(10); +			r = -1; +		} + +		if (r) { +			DRM_DEV_ERROR(adev->dev, "VCN decode not responding, giving up!!!\n"); +			return r; +		} + +		/* enable master interrupt */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_MASTINT_EN), +			 UVD_MASTINT_EN__VCPU_EN_MASK, +			 ~UVD_MASTINT_EN__VCPU_EN_MASK); + +		/* clear the busy bit of VCN_STATUS */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_STATUS), 0, +			 ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); + +		ring = &adev->vcn.inst[i].ring_enc[0]; +		fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; + +		/* program the RB_BASE for ring buffer */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_LO, +			     lower_32_bits(ring->gpu_addr)); +		WREG32_SOC15(VCN, vcn_inst, regUVD_RB_BASE_HI, +			     upper_32_bits(ring->gpu_addr)); + +		WREG32_SOC15(VCN, vcn_inst, regUVD_RB_SIZE, +			     ring->ring_size / sizeof(uint32_t)); + +		/* resetting ring, fw should not check RB ring */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); +		tmp &= ~(VCN_RB_ENABLE__RB_EN_MASK); +		WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + +		/* Initialize the ring buffer's read and write pointers */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_RB_RPTR, 0); +		WREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR, 0); + +		tmp = RREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE); +		tmp |= VCN_RB_ENABLE__RB_EN_MASK; +		WREG32_SOC15(VCN, vcn_inst, regVCN_RB_ENABLE, tmp); + +		ring->wptr = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); +		fw_shared->sq.queue_mode &= +			cpu_to_le32(~(FW_QUEUE_RING_RESET | FW_QUEUE_DPG_HOLD_OFF)); + +	} +	return 0; +} + +/** + * vcn_v4_0_3_stop_dpg_mode - VCN stop with dpg mode + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number index + * + * Stop VCN block with dpg mode + */ +static int vcn_v4_0_3_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx) +{ +	uint32_t tmp; +	int vcn_inst; + +	vcn_inst = GET_INST(VCN, inst_idx); + +	/* Wait for power status to be 1 */ +	SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_POWER_STATUS, 1, +			   UVD_POWER_STATUS__UVD_POWER_STATUS_MASK); + +	/* wait for read ptr to be equal to write ptr */ +	tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_RB_WPTR); +	SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_RB_RPTR, tmp, 0xFFFFFFFF); + +	SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_POWER_STATUS, 1, +			   UVD_POWER_STATUS__UVD_POWER_STATUS_MASK); + +	/* disable dynamic power gating mode */ +	WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_POWER_STATUS), 0, +		 ~UVD_POWER_STATUS__UVD_PG_MODE_MASK); +	return 0; +} + +/** + * vcn_v4_0_3_stop - VCN stop + * + * @adev: amdgpu_device pointer + * + * Stop VCN block + */ +static int vcn_v4_0_3_stop(struct amdgpu_device *adev) +{ +	volatile struct amdgpu_vcn4_fw_shared *fw_shared; +	int i, r = 0, vcn_inst; +	uint32_t tmp; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		vcn_inst = GET_INST(VCN, i); + +		fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; +		fw_shared->sq.queue_mode |= FW_QUEUE_DPG_HOLD_OFF; + +		if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { +			vcn_v4_0_3_stop_dpg_mode(adev, i); +			continue; +		} + +		/* wait for vcn idle */ +		r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_STATUS, +				       UVD_STATUS__IDLE, 0x7); +		if (r) +			goto Done; + +		tmp = UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN_MASK | +			UVD_LMI_STATUS__READ_CLEAN_MASK | +			UVD_LMI_STATUS__WRITE_CLEAN_MASK | +			UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK; +		r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_LMI_STATUS, tmp, +				       tmp); +		if (r) +			goto Done; + +		/* stall UMC channel */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL2); +		tmp |= UVD_LMI_CTRL2__STALL_ARB_UMC_MASK; +		WREG32_SOC15(VCN, vcn_inst, regUVD_LMI_CTRL2, tmp); +		tmp = UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK | +			UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK; +		r = SOC15_WAIT_ON_RREG(VCN, vcn_inst, regUVD_LMI_STATUS, tmp, +				       tmp); +		if (r) +			goto Done; + +		/* Unblock VCPU Register access */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_RB_ARB_CTRL), +			 UVD_RB_ARB_CTRL__VCPU_DIS_MASK, +			 ~UVD_RB_ARB_CTRL__VCPU_DIS_MASK); + +		/* release VCPU reset to boot */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), +			 UVD_VCPU_CNTL__BLK_RST_MASK, +			 ~UVD_VCPU_CNTL__BLK_RST_MASK); + +		/* disable VCPU clock */ +		WREG32_P(SOC15_REG_OFFSET(VCN, vcn_inst, regUVD_VCPU_CNTL), 0, +			 ~(UVD_VCPU_CNTL__CLK_EN_MASK)); + +		/* reset LMI UMC/LMI/VCPU */ +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); +		tmp |= UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK; +		WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + +		tmp = RREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET); +		tmp |= UVD_SOFT_RESET__LMI_SOFT_RESET_MASK; +		WREG32_SOC15(VCN, vcn_inst, regUVD_SOFT_RESET, tmp); + +		/* clear VCN status */ +		WREG32_SOC15(VCN, vcn_inst, regUVD_STATUS, 0); + +		/* apply HW clock gating */ +		vcn_v4_0_3_enable_clock_gating(adev, i); +	} +Done: +	if (adev->pm.dpm_enabled) +		amdgpu_dpm_enable_uvd(adev, false); + +	return 0; +} + +/** + * vcn_v4_0_3_pause_dpg_mode - VCN pause with dpg mode + * + * @adev: amdgpu_device pointer + * @inst_idx: instance number index + * @new_state: pause state + * + * Pause dpg mode for VCN block + */ +static int vcn_v4_0_3_pause_dpg_mode(struct amdgpu_device *adev, int inst_idx, +				struct dpg_pause_state *new_state) +{ + +	return 0; +} + +/** + * vcn_v4_0_3_unified_ring_get_rptr - get unified read pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware unified read pointer + */ +static uint64_t vcn_v4_0_3_unified_ring_get_rptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) +		DRM_ERROR("wrong ring id is identified in %s", __func__); + +	return RREG32_SOC15(VCN, GET_INST(VCN, ring->me), regUVD_RB_RPTR); +} + +/** + * vcn_v4_0_3_unified_ring_get_wptr - get unified write pointer + * + * @ring: amdgpu_ring pointer + * + * Returns the current hardware unified write pointer + */ +static uint64_t vcn_v4_0_3_unified_ring_get_wptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) +		DRM_ERROR("wrong ring id is identified in %s", __func__); + +	if (ring->use_doorbell) +		return *ring->wptr_cpu_addr; +	else +		return RREG32_SOC15(VCN, GET_INST(VCN, ring->me), +				    regUVD_RB_WPTR); +} + +/** + * vcn_v4_0_3_unified_ring_set_wptr - set enc write pointer + * + * @ring: amdgpu_ring pointer + * + * Commits the enc write pointer to the hardware + */ +static void vcn_v4_0_3_unified_ring_set_wptr(struct amdgpu_ring *ring) +{ +	struct amdgpu_device *adev = ring->adev; + +	if (ring != &adev->vcn.inst[ring->me].ring_enc[0]) +		DRM_ERROR("wrong ring id is identified in %s", __func__); + +	if (ring->use_doorbell) { +		*ring->wptr_cpu_addr = lower_32_bits(ring->wptr); +		WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr)); +	} else { +		WREG32_SOC15(VCN, GET_INST(VCN, ring->me), regUVD_RB_WPTR, +			     lower_32_bits(ring->wptr)); +	} +} + +static const struct amdgpu_ring_funcs vcn_v4_0_3_unified_ring_vm_funcs = { +	.type = AMDGPU_RING_TYPE_VCN_ENC, +	.align_mask = 0x3f, +	.nop = VCN_ENC_CMD_NO_OP, +	.get_rptr = vcn_v4_0_3_unified_ring_get_rptr, +	.get_wptr = vcn_v4_0_3_unified_ring_get_wptr, +	.set_wptr = vcn_v4_0_3_unified_ring_set_wptr, +	.emit_frame_size = +		SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 + +		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 4 + +		4 + /* vcn_v2_0_enc_ring_emit_vm_flush */ +		5 + 5 + /* vcn_v2_0_enc_ring_emit_fence x2 vm fence */ +		1, /* vcn_v2_0_enc_ring_insert_end */ +	.emit_ib_size = 5, /* vcn_v2_0_enc_ring_emit_ib */ +	.emit_ib = vcn_v2_0_enc_ring_emit_ib, +	.emit_fence = vcn_v2_0_enc_ring_emit_fence, +	.emit_vm_flush = vcn_v2_0_enc_ring_emit_vm_flush, +	.test_ring = amdgpu_vcn_enc_ring_test_ring, +	.test_ib = amdgpu_vcn_unified_ring_test_ib, +	.insert_nop = amdgpu_ring_insert_nop, +	.insert_end = vcn_v2_0_enc_ring_insert_end, +	.pad_ib = amdgpu_ring_generic_pad_ib, +	.begin_use = amdgpu_vcn_ring_begin_use, +	.end_use = amdgpu_vcn_ring_end_use, +	.emit_wreg = vcn_v2_0_enc_ring_emit_wreg, +	.emit_reg_wait = vcn_v2_0_enc_ring_emit_reg_wait, +	.emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, +}; + +/** + * vcn_v4_0_3_set_unified_ring_funcs - set unified ring functions + * + * @adev: amdgpu_device pointer + * + * Set unified ring functions + */ +static void vcn_v4_0_3_set_unified_ring_funcs(struct amdgpu_device *adev) +{ +	int i, vcn_inst; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		adev->vcn.inst[i].ring_enc[0].funcs = &vcn_v4_0_3_unified_ring_vm_funcs; +		adev->vcn.inst[i].ring_enc[0].me = i; +		vcn_inst = GET_INST(VCN, i); +		adev->vcn.inst[i].aid_id = +			vcn_inst / adev->vcn.num_inst_per_aid; +	} +	DRM_DEV_INFO(adev->dev, "VCN decode is enabled in VM mode\n"); +} + +/** + * vcn_v4_0_3_is_idle - check VCN block is idle + * + * @handle: amdgpu_device pointer + * + * Check whether VCN block is idle + */ +static bool vcn_v4_0_3_is_idle(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, ret = 1; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		ret &= (RREG32_SOC15(VCN, GET_INST(VCN, i), regUVD_STATUS) == +			UVD_STATUS__IDLE); +	} + +	return ret; +} + +/** + * vcn_v4_0_3_wait_for_idle - wait for VCN block idle + * + * @handle: amdgpu_device pointer + * + * Wait for VCN block idle + */ +static int vcn_v4_0_3_wait_for_idle(void *handle) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int i, ret = 0; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		ret = SOC15_WAIT_ON_RREG(VCN, GET_INST(VCN, i), regUVD_STATUS, +					 UVD_STATUS__IDLE, UVD_STATUS__IDLE); +		if (ret) +			return ret; +	} + +	return ret; +} + +/* vcn_v4_0_3_set_clockgating_state - set VCN block clockgating state + * + * @handle: amdgpu_device pointer + * @state: clock gating state + * + * Set VCN block clockgating state + */ +static int vcn_v4_0_3_set_clockgating_state(void *handle, +					  enum amd_clockgating_state state) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	bool enable = (state == AMD_CG_STATE_GATE) ? true : false; +	int i; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		if (enable) { +			if (RREG32_SOC15(VCN, GET_INST(VCN, i), +					 regUVD_STATUS) != UVD_STATUS__IDLE) +				return -EBUSY; +			vcn_v4_0_3_enable_clock_gating(adev, i); +		} else { +			vcn_v4_0_3_disable_clock_gating(adev, i); +		} +	} +	return 0; +} + +/** + * vcn_v4_0_3_set_powergating_state - set VCN block powergating state + * + * @handle: amdgpu_device pointer + * @state: power gating state + * + * Set VCN block powergating state + */ +static int vcn_v4_0_3_set_powergating_state(void *handle, +					  enum amd_powergating_state state) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	int ret; + +	if (state == adev->vcn.cur_state) +		return 0; + +	if (state == AMD_PG_STATE_GATE) +		ret = vcn_v4_0_3_stop(adev); +	else +		ret = vcn_v4_0_3_start(adev); + +	if (!ret) +		adev->vcn.cur_state = state; + +	return ret; +} + +/** + * vcn_v4_0_3_set_interrupt_state - set VCN block interrupt state + * + * @adev: amdgpu_device pointer + * @source: interrupt sources + * @type: interrupt types + * @state: interrupt states + * + * Set VCN block interrupt state + */ +static int vcn_v4_0_3_set_interrupt_state(struct amdgpu_device *adev, +					struct amdgpu_irq_src *source, +					unsigned int type, +					enum amdgpu_interrupt_state state) +{ +	return 0; +} + +/** + * vcn_v4_0_3_process_interrupt - process VCN block interrupt + * + * @adev: amdgpu_device pointer + * @source: interrupt sources + * @entry: interrupt entry from clients and sources + * + * Process VCN block interrupt + */ +static int vcn_v4_0_3_process_interrupt(struct amdgpu_device *adev, +				      struct amdgpu_irq_src *source, +				      struct amdgpu_iv_entry *entry) +{ +	uint32_t i, inst; + +	i = node_id_to_phys_map[entry->node_id]; + +	DRM_DEV_DEBUG(adev->dev, "IH: VCN TRAP\n"); + +	for (inst = 0; inst < adev->vcn.num_vcn_inst; ++inst) +		if (adev->vcn.inst[inst].aid_id == i) +			break; + +	if (inst >= adev->vcn.num_vcn_inst) { +		dev_WARN_ONCE(adev->dev, 1, +			      "Interrupt received for unknown VCN instance %d", +			      entry->node_id); +		return 0; +	} + +	switch (entry->src_id) { +	case VCN_4_0__SRCID__UVD_ENC_GENERAL_PURPOSE: +		amdgpu_fence_process(&adev->vcn.inst[inst].ring_enc[0]); +		break; +	default: +		DRM_DEV_ERROR(adev->dev, "Unhandled interrupt: %d %d\n", +			  entry->src_id, entry->src_data[0]); +		break; +	} + +	return 0; +} + +static const struct amdgpu_irq_src_funcs vcn_v4_0_3_irq_funcs = { +	.set = vcn_v4_0_3_set_interrupt_state, +	.process = vcn_v4_0_3_process_interrupt, +}; + +/** + * vcn_v4_0_3_set_irq_funcs - set VCN block interrupt irq functions + * + * @adev: amdgpu_device pointer + * + * Set VCN block interrupt irq functions + */ +static void vcn_v4_0_3_set_irq_funcs(struct amdgpu_device *adev) +{ +	int i; + +	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		adev->vcn.inst->irq.num_types++; +	} +	adev->vcn.inst->irq.funcs = &vcn_v4_0_3_irq_funcs; +} + +static const struct amd_ip_funcs vcn_v4_0_3_ip_funcs = { +	.name = "vcn_v4_0_3", +	.early_init = vcn_v4_0_3_early_init, +	.late_init = NULL, +	.sw_init = vcn_v4_0_3_sw_init, +	.sw_fini = vcn_v4_0_3_sw_fini, +	.hw_init = vcn_v4_0_3_hw_init, +	.hw_fini = vcn_v4_0_3_hw_fini, +	.suspend = vcn_v4_0_3_suspend, +	.resume = vcn_v4_0_3_resume, +	.is_idle = vcn_v4_0_3_is_idle, +	.wait_for_idle = vcn_v4_0_3_wait_for_idle, +	.check_soft_reset = NULL, +	.pre_soft_reset = NULL, +	.soft_reset = NULL, +	.post_soft_reset = NULL, +	.set_clockgating_state = vcn_v4_0_3_set_clockgating_state, +	.set_powergating_state = vcn_v4_0_3_set_powergating_state, +}; + +const struct amdgpu_ip_block_version vcn_v4_0_3_ip_block = { +	.type = AMD_IP_BLOCK_TYPE_VCN, +	.major = 4, +	.minor = 0, +	.rev = 3, +	.funcs = &vcn_v4_0_3_ip_funcs, +}; + +static const struct amdgpu_ras_err_status_reg_entry vcn_v4_0_3_ue_reg_list[] = { +	{AMDGPU_RAS_REG_ENTRY(VCN, 0, regVCN_UE_ERR_STATUS_LO_VIDD, regVCN_UE_ERR_STATUS_HI_VIDD), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "VIDD"}, +	{AMDGPU_RAS_REG_ENTRY(VCN, 0, regVCN_UE_ERR_STATUS_LO_VIDV, regVCN_UE_ERR_STATUS_HI_VIDV), +	1, (AMDGPU_RAS_ERR_INFO_VALID | AMDGPU_RAS_ERR_STATUS_VALID), "VIDV"}, +}; + +static void vcn_v4_0_3_inst_query_ras_error_count(struct amdgpu_device *adev, +						  uint32_t vcn_inst, +						  void *ras_err_status) +{ +	struct ras_err_data *err_data = (struct ras_err_data *)ras_err_status; + +	/* vcn v4_0_3 only support query uncorrectable errors */ +	amdgpu_ras_inst_query_ras_error_count(adev, +			vcn_v4_0_3_ue_reg_list, +			ARRAY_SIZE(vcn_v4_0_3_ue_reg_list), +			NULL, 0, GET_INST(VCN, vcn_inst), +			AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, +			&err_data->ue_count); +} + +static void vcn_v4_0_3_query_ras_error_count(struct amdgpu_device *adev, +					     void *ras_err_status) +{ +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) { +		dev_warn(adev->dev, "VCN RAS is not supported\n"); +		return; +	} + +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) +		vcn_v4_0_3_inst_query_ras_error_count(adev, i, ras_err_status); +} + +static void vcn_v4_0_3_inst_reset_ras_error_count(struct amdgpu_device *adev, +						  uint32_t vcn_inst) +{ +	amdgpu_ras_inst_reset_ras_error_count(adev, +					vcn_v4_0_3_ue_reg_list, +					ARRAY_SIZE(vcn_v4_0_3_ue_reg_list), +					GET_INST(VCN, vcn_inst)); +} + +static void vcn_v4_0_3_reset_ras_error_count(struct amdgpu_device *adev) +{ +	uint32_t i; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) { +		dev_warn(adev->dev, "VCN RAS is not supported\n"); +		return; +	} + +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) +		vcn_v4_0_3_inst_reset_ras_error_count(adev, i); +} + +static const struct amdgpu_ras_block_hw_ops vcn_v4_0_3_ras_hw_ops = { +	.query_ras_error_count = vcn_v4_0_3_query_ras_error_count, +	.reset_ras_error_count = vcn_v4_0_3_reset_ras_error_count, +}; + +static struct amdgpu_vcn_ras vcn_v4_0_3_ras = { +	.ras_block = { +		.hw_ops = &vcn_v4_0_3_ras_hw_ops, +	}, +}; + +static void vcn_v4_0_3_set_ras_funcs(struct amdgpu_device *adev) +{ +	adev->vcn.ras = &vcn_v4_0_3_ras; +} + +static void vcn_v4_0_3_enable_ras(struct amdgpu_device *adev, +				  int inst_idx, bool indirect) +{ +	uint32_t tmp; + +	if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__VCN)) +		return; + +	tmp = VCN_RAS_CNTL__VCPU_VCODEC_REARM_MASK | +	      VCN_RAS_CNTL__VCPU_VCODEC_IH_EN_MASK | +	      VCN_RAS_CNTL__VCPU_VCODEC_PMI_EN_MASK | +	      VCN_RAS_CNTL__VCPU_VCODEC_STALL_EN_MASK; +	WREG32_SOC15_DPG_MODE(inst_idx, +			      SOC15_DPG_MODE_OFFSET(VCN, 0, regVCN_RAS_CNTL), +			      tmp, 0, indirect); + +	tmp = UVD_SYS_INT_EN__RASCNTL_VCPU_VCODEC_EN_MASK; +	WREG32_SOC15_DPG_MODE(inst_idx, +			      SOC15_DPG_MODE_OFFSET(VCN, 0, regUVD_SYS_INT_EN), +			      tmp, 0, indirect); +} diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.h b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.h new file mode 100644 index 000000000000..0b046114373a --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.h @@ -0,0 +1,29 @@ +/* + * Copyright 2022 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. + * + */ + +#ifndef __VCN_V4_0_3_H__ +#define __VCN_V4_0_3_H__ + +extern const struct amdgpu_ip_block_version vcn_v4_0_3_ip_block; + +#endif /* __VCN_V4_0_3_H__ */ diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c index 536128447b71..4d719df376a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega20_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/vega20_ih.c @@ -334,7 +334,8 @@ static int vega20_ih_irq_init(struct amdgpu_device *adev)  		vega20_setup_retry_doorbell(adev->irq.retry_cam_doorbell_index));  	/* Enable IH Retry CAM */ -	if (adev->ip_versions[OSSSYS_HWIP][0] == IP_VERSION(4, 4, 0)) +	if (adev->ip_versions[OSSSYS_HWIP][0] == IP_VERSION(4, 4, 0) || +	    adev->ip_versions[OSSSYS_HWIP][0] == IP_VERSION(4, 4, 2))  		WREG32_FIELD15(OSSSYS, 0, IH_RETRY_INT_CAM_CNTL_ALDEBARAN,  			       ENABLE, 1);  	else @@ -526,6 +527,7 @@ static int vega20_ih_early_init(void *handle)  static int vega20_ih_sw_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	bool use_bus_addr = true;  	int r;  	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_IH, 0, @@ -533,14 +535,18 @@ static int vega20_ih_sw_init(void *handle)  	if (r)  		return r; -	r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 256 * 1024, true); +	if ((adev->flags & AMD_IS_APU) && +	    (adev->ip_versions[OSSSYS_HWIP][0] == IP_VERSION(4, 4, 2))) +		use_bus_addr = false; + +	r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 256 * 1024, use_bus_addr);  	if (r)  		return r;  	adev->irq.ih.use_doorbell = true;  	adev->irq.ih.doorbell_index = adev->doorbell_index.ih << 1; -	r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, true); +	r = amdgpu_ih_ring_init(adev, &adev->irq.ih1, PAGE_SIZE, use_bus_addr);  	if (r)  		return r; @@ -559,7 +565,7 @@ static int vega20_ih_sw_init(void *handle)  	/* initialize ih control registers offset */  	vega20_ih_init_register_offset(adev); -	r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, PAGE_SIZE, true); +	r = amdgpu_ih_ring_init(adev, &adev->irq.ih_soft, PAGE_SIZE, use_bus_addr);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 531f173ade2d..6a8494f98d3e 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -542,8 +542,15 @@ static u32 vi_get_xclk(struct amdgpu_device *adev)  	u32 reference_clock = adev->clock.spll.reference_freq;  	u32 tmp; -	if (adev->flags & AMD_IS_APU) -		return reference_clock; +	if (adev->flags & AMD_IS_APU) { +		switch (adev->asic_type) { +		case CHIP_STONEY: +			/* vbios says 48Mhz, but the actual freq is 100Mhz */ +			return 10000; +		default: +			return reference_clock; +		} +	}  	tmp = RREG32_SMC(ixCG_CLKPIN_CNTL_2);  	if (REG_GET_FIELD(tmp, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK)) @@ -580,11 +587,6 @@ void vi_srbm_select(struct amdgpu_device *adev,  	WREG32(mmSRBM_GFX_CNTL, srbm_gfx_cntl);  } -static void vi_vga_set_state(struct amdgpu_device *adev, bool state) -{ -	/* todo */ -} -  static bool vi_read_disabled_bios(struct amdgpu_device *adev)  {  	u32 bus_cntl; @@ -762,12 +764,12 @@ static uint32_t vi_get_register_value(struct amdgpu_device *adev,  		mutex_lock(&adev->grbm_idx_mutex);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff, 0);  		val = RREG32(reg_offset);  		if (se_num != 0xffffffff || sh_num != 0xffffffff) -			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  		mutex_unlock(&adev->grbm_idx_mutex);  		return val;  	} else { @@ -1435,7 +1437,6 @@ static const struct amdgpu_asic_funcs vi_asic_funcs =  	.read_register = &vi_read_register,  	.reset = &vi_asic_reset,  	.reset_method = &vi_asic_reset_method, -	.set_vga_state = &vi_vga_set_state,  	.get_xclk = &vi_get_xclk,  	.set_uvd_clocks = &vi_set_uvd_clocks,  	.set_vce_clocks = &vi_set_vce_clocks, diff --git a/drivers/gpu/drm/amd/amdkfd/Makefile b/drivers/gpu/drm/amd/amdkfd/Makefile index e758c2a24cd0..2ec8f27c5366 100644 --- a/drivers/gpu/drm/amd/amdkfd/Makefile +++ b/drivers/gpu/drm/amd/amdkfd/Makefile @@ -53,9 +53,11 @@ AMDKFD_FILES	:= $(AMDKFD_PATH)/kfd_module.o \  		$(AMDKFD_PATH)/kfd_events.o \  		$(AMDKFD_PATH)/cik_event_interrupt.o \  		$(AMDKFD_PATH)/kfd_int_process_v9.o \ +		$(AMDKFD_PATH)/kfd_int_process_v10.o \  		$(AMDKFD_PATH)/kfd_int_process_v11.o \  		$(AMDKFD_PATH)/kfd_smi_events.o \ -		$(AMDKFD_PATH)/kfd_crat.o +		$(AMDKFD_PATH)/kfd_crat.o \ +		$(AMDKFD_PATH)/kfd_debug.o  ifneq ($(CONFIG_AMD_IOMMU_V2),)  AMDKFD_FILES += $(AMDKFD_PATH)/kfd_iommu.o diff --git a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c index 5c8023cba196..795382b55e0a 100644 --- a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c +++ b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c @@ -26,7 +26,7 @@  #include "amdgpu_amdkfd.h"  #include "kfd_smi_events.h" -static bool cik_event_interrupt_isr(struct kfd_dev *dev, +static bool cik_event_interrupt_isr(struct kfd_node *dev,  					const uint32_t *ih_ring_entry,  					uint32_t *patched_ihre,  					bool *patched_flag) @@ -85,7 +85,7 @@ static bool cik_event_interrupt_isr(struct kfd_dev *dev,  		!amdgpu_no_queue_eviction_on_vm_fault);  } -static void cik_event_interrupt_wq(struct kfd_dev *dev, +static void cik_event_interrupt_wq(struct kfd_node *dev,  					const uint32_t *ih_ring_entry)  {  	const struct cik_ih_ring_entry *ihre = @@ -118,9 +118,9 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,  			return;  		if (info.vmid == vmid) -			kfd_signal_vm_fault_event(dev, pasid, &info); +			kfd_signal_vm_fault_event(dev, pasid, &info, NULL);  		else -			kfd_signal_vm_fault_event(dev, pasid, NULL); +			kfd_signal_vm_fault_event(dev, pasid, NULL, NULL);  	}  } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 1b54a9aaae70..6a27b000a246 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -44,6 +44,7 @@  #include "amdgpu_amdkfd.h"  #include "kfd_smi_events.h"  #include "amdgpu_dma_buf.h" +#include "kfd_debug.h"  static long kfd_ioctl(struct file *, unsigned int, unsigned long);  static int kfd_open(struct inode *, struct file *); @@ -142,15 +143,13 @@ static int kfd_open(struct inode *inode, struct file *filep)  		return -EPERM;  	} -	process = kfd_create_process(filep); +	process = kfd_create_process(current);  	if (IS_ERR(process))  		return PTR_ERR(process); -	if (kfd_is_locked()) { -		dev_dbg(kfd_device, "kfd is locked!\n" -				"process %d unreferenced", process->pasid); +	if (kfd_process_init_cwsr_apu(process, filep)) {  		kfd_unref_process(process); -		return -EAGAIN; +		return -EFAULT;  	}  	/* filep now owns the reference returned by kfd_create_process */ @@ -186,7 +185,12 @@ static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p,  static int set_queue_properties_from_user(struct queue_properties *q_properties,  				struct kfd_ioctl_create_queue_args *args)  { -	if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { +	/* +	 * Repurpose queue percentage to accommodate new features: +	 * bit 0-7: queue percentage +	 * bit 8-15: pm4_target_xcc +	 */ +	if ((args->queue_percentage & 0xFF) > KFD_MAX_QUEUE_PERCENTAGE) {  		pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");  		return -EINVAL;  	} @@ -236,7 +240,9 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,  	q_properties->is_interop = false;  	q_properties->is_gws = false; -	q_properties->queue_percent = args->queue_percentage; +	q_properties->queue_percent = args->queue_percentage & 0xFF; +	/* bit 8-15 are repurposed to be PM4 target XCC */ +	q_properties->pm4_target_xcc = (args->queue_percentage >> 8) & 0xFF;  	q_properties->priority = args->queue_priority;  	q_properties->queue_address = args->ring_base_address;  	q_properties->queue_size = args->ring_size; @@ -293,7 +299,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,  					void *data)  {  	struct kfd_ioctl_create_queue_args *args = data; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	int err = 0;  	unsigned int queue_id;  	struct kfd_process_device *pdd; @@ -328,7 +334,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,  	}  	if (!pdd->doorbell_index && -	    kfd_alloc_process_doorbells(dev, &pdd->doorbell_index) < 0) { +	    kfd_alloc_process_doorbells(dev->kfd, &pdd->doorbell_index) < 0) {  		err = -ENOMEM;  		goto err_alloc_doorbells;  	} @@ -336,7 +342,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,  	/* Starting with GFX11, wptr BOs must be mapped to GART for MES to determine work  	 * on unmapped queues for usermode queue oversubscription (no aggregated doorbell)  	 */ -	if (dev->shared_resources.enable_mes && +	if (dev->kfd->shared_resources.enable_mes &&  			((dev->adev->mes.sched_version & AMDGPU_MES_API_VERSION_MASK)  			>> AMDGPU_MES_API_VERSION_SHIFT) >= 2) {  		struct amdgpu_bo_va_mapping *wptr_mapping; @@ -404,6 +410,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,  	pr_debug("Write ptr address   == 0x%016llX\n",  			args->write_pointer_address); +	kfd_dbg_ev_raise(KFD_EC_MASK(EC_QUEUE_NEW), p, dev, queue_id, false, NULL, 0);  	return 0;  err_create_queue: @@ -442,7 +449,12 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,  	struct kfd_ioctl_update_queue_args *args = data;  	struct queue_properties properties; -	if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { +	/* +	 * Repurpose queue percentage to accommodate new features: +	 * bit 0-7: queue percentage +	 * bit 8-15: pm4_target_xcc +	 */ +	if ((args->queue_percentage & 0xFF) > KFD_MAX_QUEUE_PERCENTAGE) {  		pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");  		return -EINVAL;  	} @@ -466,7 +478,9 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,  	properties.queue_address = args->ring_base_address;  	properties.queue_size = args->ring_size; -	properties.queue_percent = args->queue_percentage; +	properties.queue_percent = args->queue_percentage & 0xFF; +	/* bit 8-15 are repurposed to be PM4 target XCC */ +	properties.pm4_target_xcc = (args->queue_percentage >> 8) & 0xFF;  	properties.priority = args->queue_priority;  	pr_debug("Updating queue id %d for pasid 0x%x\n", @@ -524,8 +538,6 @@ static int kfd_ioctl_set_cu_mask(struct file *filp, struct kfd_process *p,  		goto out;  	} -	minfo.update_flag = UPDATE_FLAG_CU_MASK; -  	mutex_lock(&p->mutex);  	retval = pqm_update_mqd(&p->pqm, args->queue_id, &minfo); @@ -887,7 +899,7 @@ static int kfd_ioctl_set_scratch_backing_va(struct file *filep,  {  	struct kfd_ioctl_set_scratch_backing_va_args *args = data;  	struct kfd_process_device *pdd; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	long err;  	mutex_lock(&p->mutex); @@ -1006,19 +1018,26 @@ err_drm_file:  	return ret;  } -bool kfd_dev_is_large_bar(struct kfd_dev *dev) +bool kfd_dev_is_large_bar(struct kfd_node *dev)  {  	if (debug_largebar) {  		pr_debug("Simulate large-bar allocation on non large-bar machine\n");  		return true;  	} -	if (dev->use_iommu_v2) +	if (dev->kfd->use_iommu_v2)  		return false;  	if (dev->local_mem_info.local_mem_size_private == 0 && -			dev->local_mem_info.local_mem_size_public > 0) +	    dev->local_mem_info.local_mem_size_public > 0)  		return true; + +	if (dev->local_mem_info.local_mem_size_public == 0 && +	    dev->kfd->adev->gmc.is_app_apu) { +		pr_debug("APP APU, Consider like a large bar system\n"); +		return true; +	} +  	return false;  } @@ -1030,7 +1049,8 @@ static int kfd_ioctl_get_available_memory(struct file *filep,  	if (!pdd)  		return -EINVAL; -	args->available = amdgpu_amdkfd_get_available_memory(pdd->dev->adev); +	args->available = amdgpu_amdkfd_get_available_memory(pdd->dev->adev, +							pdd->dev->node_id);  	kfd_unlock_pdd(pdd);  	return 0;  } @@ -1041,7 +1061,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,  	struct kfd_ioctl_alloc_memory_of_gpu_args *args = data;  	struct kfd_process_device *pdd;  	void *mem; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	int idr_handle;  	long err;  	uint64_t offset = args->mmap_offset; @@ -1105,7 +1125,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,  	}  	if (flags & KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL) { -		if (args->size != kfd_doorbell_process_slice(dev)) { +		if (args->size != kfd_doorbell_process_slice(dev->kfd)) {  			err = -EINVAL;  			goto err_unlock;  		} @@ -1231,7 +1251,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,  	struct kfd_ioctl_map_memory_to_gpu_args *args = data;  	struct kfd_process_device *pdd, *peer_pdd;  	void *mem; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	long err = 0;  	int i;  	uint32_t *devices_arr = NULL; @@ -1405,7 +1425,7 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file *filep,  		args->n_success = i+1;  	} -	flush_tlb = kfd_flush_tlb_after_unmap(pdd->dev); +	flush_tlb = kfd_flush_tlb_after_unmap(pdd->dev->kfd);  	if (flush_tlb) {  		err = amdgpu_amdkfd_gpuvm_sync_memory(pdd->dev->adev,  				(struct kgd_mem *) mem, true); @@ -1445,7 +1465,7 @@ static int kfd_ioctl_alloc_queue_gws(struct file *filep,  	int retval;  	struct kfd_ioctl_alloc_queue_gws_args *args = data;  	struct queue *q; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	mutex_lock(&p->mutex);  	q = pqm_get_user_queue(&p->pqm, args->queue_id); @@ -1467,6 +1487,11 @@ static int kfd_ioctl_alloc_queue_gws(struct file *filep,  		goto out_unlock;  	} +	if (!kfd_dbg_has_gws_support(dev) && p->debug_trap_enabled) { +		retval = -EBUSY; +		goto out_unlock; +	} +  	retval = pqm_set_gws(&p->pqm, args->queue_id, args->num_gws ? dev->gws : NULL);  	mutex_unlock(&p->mutex); @@ -1482,10 +1507,11 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,  		struct kfd_process *p, void *data)  {  	struct kfd_ioctl_get_dmabuf_info_args *args = data; -	struct kfd_dev *dev = NULL; +	struct kfd_node *dev = NULL;  	struct amdgpu_device *dmabuf_adev;  	void *metadata_buffer = NULL;  	uint32_t flags; +	int8_t xcp_id;  	unsigned int i;  	int r; @@ -1506,17 +1532,14 @@ static int kfd_ioctl_get_dmabuf_info(struct file *filep,  	r = amdgpu_amdkfd_get_dmabuf_info(dev->adev, args->dmabuf_fd,  					  &dmabuf_adev, &args->size,  					  metadata_buffer, args->metadata_size, -					  &args->metadata_size, &flags); +					  &args->metadata_size, &flags, &xcp_id);  	if (r)  		goto exit; -	/* Reverse-lookup gpu_id from kgd pointer */ -	dev = kfd_device_by_adev(dmabuf_adev); -	if (!dev) { -		r = -EINVAL; -		goto exit; -	} -	args->gpu_id = dev->id; +	if (xcp_id >= 0) +		args->gpu_id = dmabuf_adev->kfd.dev->nodes[xcp_id]->id; +	else +		args->gpu_id = dmabuf_adev->kfd.dev->nodes[0]->id;  	args->flags = flags;  	/* Copy metadata buffer to user mode */ @@ -1596,7 +1619,7 @@ static int kfd_ioctl_export_dmabuf(struct file *filep,  	struct kfd_ioctl_export_dmabuf_args *args = data;  	struct kfd_process_device *pdd;  	struct dma_buf *dmabuf; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	void *mem;  	int ret = 0; @@ -2178,7 +2201,7 @@ static int criu_restore_devices(struct kfd_process *p,  	}  	for (i = 0; i < args->num_devices; i++) { -		struct kfd_dev *dev; +		struct kfd_node *dev;  		struct kfd_process_device *pdd;  		struct file *drm_file; @@ -2240,7 +2263,7 @@ static int criu_restore_devices(struct kfd_process *p,  		}  		if (!pdd->doorbell_index && -		    kfd_alloc_process_doorbells(pdd->dev, &pdd->doorbell_index) < 0) { +		    kfd_alloc_process_doorbells(pdd->dev->kfd, &pdd->doorbell_index) < 0) {  			ret = -ENOMEM;  			goto exit;  		} @@ -2268,7 +2291,8 @@ static int criu_restore_memory_of_gpu(struct kfd_process_device *pdd,  	u64 offset;  	if (bo_bucket->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL) { -		if (bo_bucket->size != kfd_doorbell_process_slice(pdd->dev)) +		if (bo_bucket->size != +				kfd_doorbell_process_slice(pdd->dev->kfd))  			return -EINVAL;  		offset = kfd_get_process_doorbells(pdd); @@ -2350,7 +2374,7 @@ static int criu_restore_bo(struct kfd_process *p,  	/* now map these BOs to GPU/s */  	for (j = 0; j < p->n_pdds; j++) { -		struct kfd_dev *peer; +		struct kfd_node *peer;  		struct kfd_process_device *peer_pdd;  		if (!bo_priv->mapped_gpuids[j]) @@ -2715,6 +2739,356 @@ static int kfd_ioctl_criu(struct file *filep, struct kfd_process *p, void *data)  	return ret;  } +static int runtime_enable(struct kfd_process *p, uint64_t r_debug, +			bool enable_ttmp_setup) +{ +	int i = 0, ret = 0; + +	if (p->is_runtime_retry) +		goto retry; + +	if (p->runtime_info.runtime_state != DEBUG_RUNTIME_STATE_DISABLED) +		return -EBUSY; + +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; + +		if (pdd->qpd.queue_count) +			return -EEXIST; +	} + +	p->runtime_info.runtime_state = DEBUG_RUNTIME_STATE_ENABLED; +	p->runtime_info.r_debug = r_debug; +	p->runtime_info.ttmp_setup = enable_ttmp_setup; + +	if (p->runtime_info.ttmp_setup) { +		for (i = 0; i < p->n_pdds; i++) { +			struct kfd_process_device *pdd = p->pdds[i]; + +			if (!kfd_dbg_is_rlc_restore_supported(pdd->dev)) { +				amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +				pdd->dev->kfd2kgd->enable_debug_trap( +						pdd->dev->adev, +						true, +						pdd->dev->vm_info.last_vmid_kfd); +			} else if (kfd_dbg_is_per_vmid_supported(pdd->dev)) { +				pdd->spi_dbg_override = pdd->dev->kfd2kgd->enable_debug_trap( +						pdd->dev->adev, +						false, +						0); +			} +		} +	} + +retry: +	if (p->debug_trap_enabled) { +		if (!p->is_runtime_retry) { +			kfd_dbg_trap_activate(p); +			kfd_dbg_ev_raise(KFD_EC_MASK(EC_PROCESS_RUNTIME), +					p, NULL, 0, false, NULL, 0); +		} + +		mutex_unlock(&p->mutex); +		ret = down_interruptible(&p->runtime_enable_sema); +		mutex_lock(&p->mutex); + +		p->is_runtime_retry = !!ret; +	} + +	return ret; +} + +static int runtime_disable(struct kfd_process *p) +{ +	int i = 0, ret; +	bool was_enabled = p->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED; + +	p->runtime_info.runtime_state = DEBUG_RUNTIME_STATE_DISABLED; +	p->runtime_info.r_debug = 0; + +	if (p->debug_trap_enabled) { +		if (was_enabled) +			kfd_dbg_trap_deactivate(p, false, 0); + +		if (!p->is_runtime_retry) +			kfd_dbg_ev_raise(KFD_EC_MASK(EC_PROCESS_RUNTIME), +					p, NULL, 0, false, NULL, 0); + +		mutex_unlock(&p->mutex); +		ret = down_interruptible(&p->runtime_enable_sema); +		mutex_lock(&p->mutex); + +		p->is_runtime_retry = !!ret; +		if (ret) +			return ret; +	} + +	if (was_enabled && p->runtime_info.ttmp_setup) { +		for (i = 0; i < p->n_pdds; i++) { +			struct kfd_process_device *pdd = p->pdds[i]; + +			if (!kfd_dbg_is_rlc_restore_supported(pdd->dev)) +				amdgpu_gfx_off_ctrl(pdd->dev->adev, true); +		} +	} + +	p->runtime_info.ttmp_setup = false; + +	/* disable ttmp setup */ +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; + +		if (kfd_dbg_is_per_vmid_supported(pdd->dev)) { +			pdd->spi_dbg_override = +					pdd->dev->kfd2kgd->disable_debug_trap( +					pdd->dev->adev, +					false, +					pdd->dev->vm_info.last_vmid_kfd); + +			if (!pdd->dev->kfd->shared_resources.enable_mes) +				debug_refresh_runlist(pdd->dev->dqm); +			else +				kfd_dbg_set_mes_debug_mode(pdd); +		} +	} + +	return 0; +} + +static int kfd_ioctl_runtime_enable(struct file *filep, struct kfd_process *p, void *data) +{ +	struct kfd_ioctl_runtime_enable_args *args = data; +	int r; + +	mutex_lock(&p->mutex); + +	if (args->mode_mask & KFD_RUNTIME_ENABLE_MODE_ENABLE_MASK) +		r = runtime_enable(p, args->r_debug, +				!!(args->mode_mask & KFD_RUNTIME_ENABLE_MODE_TTMP_SAVE_MASK)); +	else +		r = runtime_disable(p); + +	mutex_unlock(&p->mutex); + +	return r; +} + +static int kfd_ioctl_set_debug_trap(struct file *filep, struct kfd_process *p, void *data) +{ +	struct kfd_ioctl_dbg_trap_args *args = data; +	struct task_struct *thread = NULL; +	struct mm_struct *mm = NULL; +	struct pid *pid = NULL; +	struct kfd_process *target = NULL; +	struct kfd_process_device *pdd = NULL; +	int r = 0; + +	if (sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		pr_err("Debugging does not support sched_policy %i", sched_policy); +		return -EINVAL; +	} + +	pid = find_get_pid(args->pid); +	if (!pid) { +		pr_debug("Cannot find pid info for %i\n", args->pid); +		r = -ESRCH; +		goto out; +	} + +	thread = get_pid_task(pid, PIDTYPE_PID); +	if (!thread) { +		r = -ESRCH; +		goto out; +	} + +	mm = get_task_mm(thread); +	if (!mm) { +		r = -ESRCH; +		goto out; +	} + +	if (args->op == KFD_IOC_DBG_TRAP_ENABLE) { +		bool create_process; + +		rcu_read_lock(); +		create_process = thread && thread != current && ptrace_parent(thread) == current; +		rcu_read_unlock(); + +		target = create_process ? kfd_create_process(thread) : +					kfd_lookup_process_by_pid(pid); +	} else { +		target = kfd_lookup_process_by_pid(pid); +	} + +	if (IS_ERR_OR_NULL(target)) { +		pr_debug("Cannot find process PID %i to debug\n", args->pid); +		r = target ? PTR_ERR(target) : -ESRCH; +		goto out; +	} + +	/* Check if target is still PTRACED. */ +	rcu_read_lock(); +	if (target != p && args->op != KFD_IOC_DBG_TRAP_DISABLE +				&& ptrace_parent(target->lead_thread) != current) { +		pr_err("PID %i is not PTRACED and cannot be debugged\n", args->pid); +		r = -EPERM; +	} +	rcu_read_unlock(); + +	if (r) +		goto out; + +	mutex_lock(&target->mutex); + +	if (args->op != KFD_IOC_DBG_TRAP_ENABLE && !target->debug_trap_enabled) { +		pr_err("PID %i not debug enabled for op %i\n", args->pid, args->op); +		r = -EINVAL; +		goto unlock_out; +	} + +	if (target->runtime_info.runtime_state != DEBUG_RUNTIME_STATE_ENABLED && +			(args->op == KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE || +			 args->op == KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE || +			 args->op == KFD_IOC_DBG_TRAP_SUSPEND_QUEUES || +			 args->op == KFD_IOC_DBG_TRAP_RESUME_QUEUES || +			 args->op == KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH || +			 args->op == KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH || +			 args->op == KFD_IOC_DBG_TRAP_SET_FLAGS)) { +		r = -EPERM; +		goto unlock_out; +	} + +	if (args->op == KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH || +	    args->op == KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH) { +		int user_gpu_id = kfd_process_get_user_gpu_id(target, +				args->op == KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH ? +					args->set_node_address_watch.gpu_id : +					args->clear_node_address_watch.gpu_id); + +		pdd = kfd_process_device_data_by_id(target, user_gpu_id); +		if (user_gpu_id == -EINVAL || !pdd) { +			r = -ENODEV; +			goto unlock_out; +		} +	} + +	switch (args->op) { +	case KFD_IOC_DBG_TRAP_ENABLE: +		if (target != p) +			target->debugger_process = p; + +		r = kfd_dbg_trap_enable(target, +					args->enable.dbg_fd, +					(void __user *)args->enable.rinfo_ptr, +					&args->enable.rinfo_size); +		if (!r) +			target->exception_enable_mask = args->enable.exception_mask; + +		break; +	case KFD_IOC_DBG_TRAP_DISABLE: +		r = kfd_dbg_trap_disable(target); +		break; +	case KFD_IOC_DBG_TRAP_SEND_RUNTIME_EVENT: +		r = kfd_dbg_send_exception_to_runtime(target, +				args->send_runtime_event.gpu_id, +				args->send_runtime_event.queue_id, +				args->send_runtime_event.exception_mask); +		break; +	case KFD_IOC_DBG_TRAP_SET_EXCEPTIONS_ENABLED: +		kfd_dbg_set_enabled_debug_exception_mask(target, +				args->set_exceptions_enabled.exception_mask); +		break; +	case KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE: +		r = kfd_dbg_trap_set_wave_launch_override(target, +				args->launch_override.override_mode, +				args->launch_override.enable_mask, +				args->launch_override.support_request_mask, +				&args->launch_override.enable_mask, +				&args->launch_override.support_request_mask); +		break; +	case KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE: +		r = kfd_dbg_trap_set_wave_launch_mode(target, +				args->launch_mode.launch_mode); +		break; +	case KFD_IOC_DBG_TRAP_SUSPEND_QUEUES: +		r = suspend_queues(target, +				args->suspend_queues.num_queues, +				args->suspend_queues.grace_period, +				args->suspend_queues.exception_mask, +				(uint32_t *)args->suspend_queues.queue_array_ptr); + +		break; +	case KFD_IOC_DBG_TRAP_RESUME_QUEUES: +		r = resume_queues(target, args->resume_queues.num_queues, +				(uint32_t *)args->resume_queues.queue_array_ptr); +		break; +	case KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH: +		r = kfd_dbg_trap_set_dev_address_watch(pdd, +				args->set_node_address_watch.address, +				args->set_node_address_watch.mask, +				&args->set_node_address_watch.id, +				args->set_node_address_watch.mode); +		break; +	case KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH: +		r = kfd_dbg_trap_clear_dev_address_watch(pdd, +				args->clear_node_address_watch.id); +		break; +	case KFD_IOC_DBG_TRAP_SET_FLAGS: +		r = kfd_dbg_trap_set_flags(target, &args->set_flags.flags); +		break; +	case KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT: +		r = kfd_dbg_ev_query_debug_event(target, +				&args->query_debug_event.queue_id, +				&args->query_debug_event.gpu_id, +				args->query_debug_event.exception_mask, +				&args->query_debug_event.exception_mask); +		break; +	case KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO: +		r = kfd_dbg_trap_query_exception_info(target, +				args->query_exception_info.source_id, +				args->query_exception_info.exception_code, +				args->query_exception_info.clear_exception, +				(void __user *)args->query_exception_info.info_ptr, +				&args->query_exception_info.info_size); +		break; +	case KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT: +		r = pqm_get_queue_snapshot(&target->pqm, +				args->queue_snapshot.exception_mask, +				(void __user *)args->queue_snapshot.snapshot_buf_ptr, +				&args->queue_snapshot.num_queues, +				&args->queue_snapshot.entry_size); +		break; +	case KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT: +		r = kfd_dbg_trap_device_snapshot(target, +				args->device_snapshot.exception_mask, +				(void __user *)args->device_snapshot.snapshot_buf_ptr, +				&args->device_snapshot.num_devices, +				&args->device_snapshot.entry_size); +		break; +	default: +		pr_err("Invalid option: %i\n", args->op); +		r = -EINVAL; +	} + +unlock_out: +	mutex_unlock(&target->mutex); + +out: +	if (thread) +		put_task_struct(thread); + +	if (mm) +		mmput(mm); + +	if (pid) +		put_pid(pid); + +	if (target) +		kfd_unref_process(target); + +	return r; +} +  #define AMDKFD_IOCTL_DEF(ioctl, _func, _flags) \  	[_IOC_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, \  			    .cmd_drv = 0, .name = #ioctl} @@ -2827,6 +3201,12 @@ static const struct amdkfd_ioctl_desc amdkfd_ioctls[] = {  	AMDKFD_IOCTL_DEF(AMDKFD_IOC_EXPORT_DMABUF,  				kfd_ioctl_export_dmabuf, 0), + +	AMDKFD_IOCTL_DEF(AMDKFD_IOC_RUNTIME_ENABLE, +			kfd_ioctl_runtime_enable, 0), + +	AMDKFD_IOCTL_DEF(AMDKFD_IOC_DBG_TRAP, +			kfd_ioctl_set_debug_trap, 0),  };  #define AMDKFD_CORE_IOCTL_COUNT	ARRAY_SIZE(amdkfd_ioctls) @@ -2947,7 +3327,7 @@ err_i1:  	return retcode;  } -static int kfd_mmio_mmap(struct kfd_dev *dev, struct kfd_process *process, +static int kfd_mmio_mmap(struct kfd_node *dev, struct kfd_process *process,  		      struct vm_area_struct *vma)  {  	phys_addr_t address; @@ -2981,7 +3361,7 @@ static int kfd_mmio_mmap(struct kfd_dev *dev, struct kfd_process *process,  static int kfd_mmap(struct file *filp, struct vm_area_struct *vma)  {  	struct kfd_process *process; -	struct kfd_dev *dev = NULL; +	struct kfd_node *dev = NULL;  	unsigned long mmap_offset;  	unsigned int gpu_id; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c index 475e47027354..3dcd8f8bc98e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c @@ -30,6 +30,9 @@  #include "amdgpu.h"  #include "amdgpu_amdkfd.h" +/* Fixme: Fake 32GB for 1PNPS1 mode bringup */ +#define DUMMY_VRAM_SIZE 31138512896 +  /* GPU Processor ID base for dGPUs for which VCRAT needs to be created.   * GPU processor ID are expressed with Bit[31]=1.   * The base is set to 0x8000_0000 + 0x1000 to avoid collision with GPU IDs @@ -1053,6 +1056,8 @@ static int kfd_parse_subtype_mem(struct crat_subtype_memory *mem,  			props->heap_type = heap_type;  			props->flags = flags; +			if (size_in_bytes == 0) +				size_in_bytes = DUMMY_VRAM_SIZE; /* Fixme: TBD */  			props->size_in_bytes = size_in_bytes;  			props->width = width; @@ -1166,7 +1171,7 @@ static int kfd_parse_subtype_iolink(struct crat_subtype_iolink *iolink,  			if (props->iolink_type == CRAT_IOLINK_TYPE_PCIEXPRESS)  				props->weight = 20;  			else if (props->iolink_type == CRAT_IOLINK_TYPE_XGMI) -				props->weight = 15 * iolink->num_hops_xgmi; +				props->weight = iolink->weight_xgmi;  			else  				props->weight = node_distance(id_from, id_to); @@ -1405,7 +1410,7 @@ static int kfd_fill_gpu_cache_info_from_gfx_config(struct kfd_dev *kdev,  	return i;  } -int kfd_get_gpu_cache_info(struct kfd_dev *kdev, struct kfd_gpu_cache_info **pcache_info) +int kfd_get_gpu_cache_info(struct kfd_node *kdev, struct kfd_gpu_cache_info **pcache_info)  {  	int num_of_cache_types = 0; @@ -1524,7 +1529,7 @@ int kfd_get_gpu_cache_info(struct kfd_dev *kdev, struct kfd_gpu_cache_info **pca  		case IP_VERSION(11, 0, 3):  		case IP_VERSION(11, 0, 4):  			num_of_cache_types = -				kfd_fill_gpu_cache_info_from_gfx_config(kdev, *pcache_info); +				kfd_fill_gpu_cache_info_from_gfx_config(kdev->kfd, *pcache_info);  			break;  		default:  			*pcache_info = dummy_cache_info; @@ -1858,7 +1863,7 @@ static int kfd_create_vcrat_image_cpu(void *pcrat_image, size_t *size)  }  static int kfd_fill_gpu_memory_affinity(int *avail_size, -		struct kfd_dev *kdev, uint8_t type, uint64_t size, +		struct kfd_node *kdev, uint8_t type, uint64_t size,  		struct crat_subtype_memory *sub_type_hdr,  		uint32_t proximity_domain,  		const struct kfd_local_mem_info *local_mem_info) @@ -1887,7 +1892,7 @@ static int kfd_fill_gpu_memory_affinity(int *avail_size,  }  #ifdef CONFIG_ACPI_NUMA -static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev) +static void kfd_find_numa_node_in_srat(struct kfd_node *kdev)  {  	struct acpi_table_header *table_header = NULL;  	struct acpi_subtable_header *sub_header = NULL; @@ -1972,6 +1977,9 @@ static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)  }  #endif +#define KFD_CRAT_INTRA_SOCKET_WEIGHT	13 +#define KFD_CRAT_XGMI_WEIGHT		15 +  /* kfd_fill_gpu_direct_io_link - Fill in direct io link from GPU   * to its NUMA node   *	@avail_size: Available size in the memory @@ -1982,7 +1990,7 @@ static void kfd_find_numa_node_in_srat(struct kfd_dev *kdev)   *	Return 0 if successful else return -ve value   */  static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size, -			struct kfd_dev *kdev, +			struct kfd_node *kdev,  			struct crat_subtype_iolink *sub_type_hdr,  			uint32_t proximity_domain)  { @@ -2002,7 +2010,16 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,  	/* Fill in IOLINK subtype.  	 * TODO: Fill-in other fields of iolink subtype  	 */ -	if (kdev->adev->gmc.xgmi.connected_to_cpu) { +	if (kdev->adev->gmc.xgmi.connected_to_cpu || +	    (KFD_GC_VERSION(kdev) == IP_VERSION(9, 4, 3) && +	     kdev->adev->smuio.funcs->get_pkg_type(kdev->adev) == +	     AMDGPU_PKG_TYPE_APU)) { +		bool ext_cpu = KFD_GC_VERSION(kdev) != IP_VERSION(9, 4, 3); +		int mem_bw = 819200, weight = ext_cpu ? KFD_CRAT_XGMI_WEIGHT : +							KFD_CRAT_INTRA_SOCKET_WEIGHT; +		uint32_t bandwidth = ext_cpu ? amdgpu_amdkfd_get_xgmi_bandwidth_mbytes( +							kdev->adev, NULL, true) : mem_bw; +  		/*  		 * with host gpu xgmi link, host can access gpu memory whether  		 * or not pcie bar type is large, so always create bidirectional @@ -2010,14 +2027,9 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,  		 */  		sub_type_hdr->flags |= CRAT_IOLINK_FLAGS_BI_DIRECTIONAL;  		sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_XGMI; -		sub_type_hdr->num_hops_xgmi = 1; -		if (KFD_GC_VERSION(kdev) == IP_VERSION(9, 4, 2)) { -			sub_type_hdr->minimum_bandwidth_mbs = -					amdgpu_amdkfd_get_xgmi_bandwidth_mbytes( -							kdev->adev, NULL, true); -			sub_type_hdr->maximum_bandwidth_mbs = -					sub_type_hdr->minimum_bandwidth_mbs; -		} +		sub_type_hdr->weight_xgmi = weight; +		sub_type_hdr->minimum_bandwidth_mbs = bandwidth; +		sub_type_hdr->maximum_bandwidth_mbs = bandwidth;  	} else {  		sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_PCIEXPRESS;  		sub_type_hdr->minimum_bandwidth_mbs = @@ -2029,7 +2041,8 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,  	sub_type_hdr->proximity_domain_from = proximity_domain;  #ifdef CONFIG_ACPI_NUMA -	if (kdev->adev->pdev->dev.numa_node == NUMA_NO_NODE) +	if (kdev->adev->pdev->dev.numa_node == NUMA_NO_NODE && +	    num_possible_nodes() > 1)  		kfd_find_numa_node_in_srat(kdev);  #endif  #ifdef CONFIG_NUMA @@ -2044,12 +2057,14 @@ static int kfd_fill_gpu_direct_io_link_to_cpu(int *avail_size,  }  static int kfd_fill_gpu_xgmi_link_to_gpu(int *avail_size, -			struct kfd_dev *kdev, -			struct kfd_dev *peer_kdev, +			struct kfd_node *kdev, +			struct kfd_node *peer_kdev,  			struct crat_subtype_iolink *sub_type_hdr,  			uint32_t proximity_domain_from,  			uint32_t proximity_domain_to)  { +	bool use_ta_info = kdev->kfd->num_nodes == 1; +  	*avail_size -= sizeof(struct crat_subtype_iolink);  	if (*avail_size < 0)  		return -ENOMEM; @@ -2064,12 +2079,25 @@ static int kfd_fill_gpu_xgmi_link_to_gpu(int *avail_size,  	sub_type_hdr->io_interface_type = CRAT_IOLINK_TYPE_XGMI;  	sub_type_hdr->proximity_domain_from = proximity_domain_from;  	sub_type_hdr->proximity_domain_to = proximity_domain_to; -	sub_type_hdr->num_hops_xgmi = -		amdgpu_amdkfd_get_xgmi_hops_count(kdev->adev, peer_kdev->adev); -	sub_type_hdr->maximum_bandwidth_mbs = -		amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->adev, peer_kdev->adev, false); -	sub_type_hdr->minimum_bandwidth_mbs = sub_type_hdr->maximum_bandwidth_mbs ? -		amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->adev, NULL, true) : 0; + +	if (use_ta_info) { +		sub_type_hdr->weight_xgmi = KFD_CRAT_XGMI_WEIGHT * +			amdgpu_amdkfd_get_xgmi_hops_count(kdev->adev, peer_kdev->adev); +		sub_type_hdr->maximum_bandwidth_mbs = +			amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->adev, +							peer_kdev->adev, false); +		sub_type_hdr->minimum_bandwidth_mbs = sub_type_hdr->maximum_bandwidth_mbs ? +			amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(kdev->adev, NULL, true) : 0; +	} else { +		bool is_single_hop = kdev->kfd == peer_kdev->kfd; +		int weight = is_single_hop ? KFD_CRAT_INTRA_SOCKET_WEIGHT : +			(2 * KFD_CRAT_INTRA_SOCKET_WEIGHT) + KFD_CRAT_XGMI_WEIGHT; +		int mem_bw = 819200; + +		sub_type_hdr->weight_xgmi = weight; +		sub_type_hdr->maximum_bandwidth_mbs = is_single_hop ? mem_bw : 0; +		sub_type_hdr->minimum_bandwidth_mbs = is_single_hop ? mem_bw : 0; +	}  	return 0;  } @@ -2081,7 +2109,7 @@ static int kfd_fill_gpu_xgmi_link_to_gpu(int *avail_size,   *		[OUT] actual size of data filled in crat_image   */  static int kfd_create_vcrat_image_gpu(void *pcrat_image, -				      size_t *size, struct kfd_dev *kdev, +				      size_t *size, struct kfd_node *kdev,  				      uint32_t proximity_domain)  {  	struct crat_header *crat_table = (struct crat_header *)pcrat_image; @@ -2153,7 +2181,7 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,  	/* Check if this node supports IOMMU. During parsing this flag will  	 * translate to HSA_CAP_ATS_PRESENT  	 */ -	if (!kfd_iommu_check_device(kdev)) +	if (!kfd_iommu_check_device(kdev->kfd))  		cu->hsa_capability |= CRAT_CU_FLAGS_IOMMU_PRESENT;  	crat_table->length += sub_type_hdr->length; @@ -2216,12 +2244,12 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,  	 * (from other GPU to this GPU) will be added  	 * in kfd_parse_subtype_iolink.  	 */ -	if (kdev->hive_id) { +	if (kdev->kfd->hive_id) {  		for (nid = 0; nid < proximity_domain; ++nid) {  			peer_dev = kfd_topology_device_by_proximity_domain_no_lock(nid);  			if (!peer_dev->gpu)  				continue; -			if (peer_dev->gpu->hive_id != kdev->hive_id) +			if (peer_dev->gpu->kfd->hive_id != kdev->kfd->hive_id)  				continue;  			sub_type_hdr = (typeof(sub_type_hdr))(  				(char *)sub_type_hdr + @@ -2255,12 +2283,12 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,   *		(COMPUTE_UNIT_CPU | COMPUTE_UNIT_GPU) - Create VCRAT for APU   *			-- this option is not currently implemented.   *			The assumption is that all AMD APUs will have CRAT - *	@kdev: Valid kfd_device required if flags contain COMPUTE_UNIT_GPU + *	@kdev: Valid kfd_node required if flags contain COMPUTE_UNIT_GPU   *   *	Return 0 if successful else return -ve value   */  int kfd_create_crat_image_virtual(void **crat_image, size_t *size, -				  int flags, struct kfd_dev *kdev, +				  int flags, struct kfd_node *kdev,  				  uint32_t proximity_domain)  {  	void *pcrat_image = NULL; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.h b/drivers/gpu/drm/amd/amdkfd/kfd_crat.h index 8d1e8ba58dee..fc719389b5d6 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.h @@ -275,7 +275,7 @@ struct crat_subtype_iolink {  	uint32_t	maximum_bandwidth_mbs;  	uint32_t	recommended_transfer_size;  	uint8_t		reserved2[CRAT_IOLINK_RESERVED_LENGTH - 1]; -	uint8_t		num_hops_xgmi; +	uint8_t		weight_xgmi;  };  /* @@ -293,7 +293,7 @@ struct crat_subtype_generic {  #pragma pack() -struct kfd_dev; +struct kfd_node;  /* Static table to describe GPU Cache information */  struct kfd_gpu_cache_info { @@ -305,14 +305,14 @@ struct kfd_gpu_cache_info {  	 */  	uint32_t	num_cu_shared;  }; -int kfd_get_gpu_cache_info(struct kfd_dev *kdev, struct kfd_gpu_cache_info **pcache_info); +int kfd_get_gpu_cache_info(struct kfd_node *kdev, struct kfd_gpu_cache_info **pcache_info);  int kfd_create_crat_image_acpi(void **crat_image, size_t *size);  void kfd_destroy_crat_image(void *crat_image);  int kfd_parse_crat_table(void *crat_image, struct list_head *device_list,  			 uint32_t proximity_domain);  int kfd_create_crat_image_virtual(void **crat_image, size_t *size, -				  int flags, struct kfd_dev *kdev, +				  int flags, struct kfd_node *kdev,  				  uint32_t proximity_domain);  #endif /* KFD_CRAT_H_INCLUDED */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debug.c b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c new file mode 100644 index 000000000000..cd34e7aaead4 --- /dev/null +++ b/drivers/gpu/drm/amd/amdkfd/kfd_debug.c @@ -0,0 +1,1118 @@ +/* + * Copyright 2023 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 "kfd_debug.h" +#include "kfd_device_queue_manager.h" +#include "kfd_topology.h" +#include <linux/file.h> +#include <uapi/linux/kfd_ioctl.h> + +#define MAX_WATCH_ADDRESSES	4 + +int kfd_dbg_ev_query_debug_event(struct kfd_process *process, +		      unsigned int *queue_id, +		      unsigned int *gpu_id, +		      uint64_t exception_clear_mask, +		      uint64_t *event_status) +{ +	struct process_queue_manager *pqm; +	struct process_queue_node *pqn; +	int i; + +	if (!(process && process->debug_trap_enabled)) +		return -ENODATA; + +	mutex_lock(&process->event_mutex); +	*event_status = 0; +	*queue_id = 0; +	*gpu_id = 0; + +	/* find and report queue events */ +	pqm = &process->pqm; +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) { +		uint64_t tmp = process->exception_enable_mask; + +		if (!pqn->q) +			continue; + +		tmp &= pqn->q->properties.exception_status; + +		if (!tmp) +			continue; + +		*event_status = pqn->q->properties.exception_status; +		*queue_id = pqn->q->properties.queue_id; +		*gpu_id = pqn->q->device->id; +		pqn->q->properties.exception_status &= ~exception_clear_mask; +		goto out; +	} + +	/* find and report device events */ +	for (i = 0; i < process->n_pdds; i++) { +		struct kfd_process_device *pdd = process->pdds[i]; +		uint64_t tmp = process->exception_enable_mask +						& pdd->exception_status; + +		if (!tmp) +			continue; + +		*event_status = pdd->exception_status; +		*gpu_id = pdd->dev->id; +		pdd->exception_status &= ~exception_clear_mask; +		goto out; +	} + +	/* report process events */ +	if (process->exception_enable_mask & process->exception_status) { +		*event_status = process->exception_status; +		process->exception_status &= ~exception_clear_mask; +	} + +out: +	mutex_unlock(&process->event_mutex); +	return *event_status ? 0 : -EAGAIN; +} + +void debug_event_write_work_handler(struct work_struct *work) +{ +	struct kfd_process *process; + +	static const char write_data = '.'; +	loff_t pos = 0; + +	process = container_of(work, +			struct kfd_process, +			debug_event_workarea); + +	kernel_write(process->dbg_ev_file, &write_data, 1, &pos); +} + +/* update process/device/queue exception status, write to descriptor + * only if exception_status is enabled. + */ +bool kfd_dbg_ev_raise(uint64_t event_mask, +			struct kfd_process *process, struct kfd_node *dev, +			unsigned int source_id, bool use_worker, +			void *exception_data, size_t exception_data_size) +{ +	struct process_queue_manager *pqm; +	struct process_queue_node *pqn; +	int i; +	static const char write_data = '.'; +	loff_t pos = 0; +	bool is_subscribed = true; + +	if (!(process && process->debug_trap_enabled)) +		return false; + +	mutex_lock(&process->event_mutex); + +	if (event_mask & KFD_EC_MASK_DEVICE) { +		for (i = 0; i < process->n_pdds; i++) { +			struct kfd_process_device *pdd = process->pdds[i]; + +			if (pdd->dev != dev) +				continue; + +			pdd->exception_status |= event_mask & KFD_EC_MASK_DEVICE; + +			if (event_mask & KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION)) { +				if (!pdd->vm_fault_exc_data) { +					pdd->vm_fault_exc_data = kmemdup( +							exception_data, +							exception_data_size, +							GFP_KERNEL); +					if (!pdd->vm_fault_exc_data) +						pr_debug("Failed to allocate exception data memory"); +				} else { +					pr_debug("Debugger exception data not saved\n"); +					print_hex_dump_bytes("exception data: ", +							DUMP_PREFIX_OFFSET, +							exception_data, +							exception_data_size); +				} +			} +			break; +		} +	} else if (event_mask & KFD_EC_MASK_PROCESS) { +		process->exception_status |= event_mask & KFD_EC_MASK_PROCESS; +	} else { +		pqm = &process->pqm; +		list_for_each_entry(pqn, &pqm->queues, +				process_queue_list) { +			int target_id; + +			if (!pqn->q) +				continue; + +			target_id = event_mask & KFD_EC_MASK(EC_QUEUE_NEW) ? +					pqn->q->properties.queue_id : +							pqn->q->doorbell_id; + +			if (pqn->q->device != dev || target_id != source_id) +				continue; + +			pqn->q->properties.exception_status |= event_mask; +			break; +		} +	} + +	if (process->exception_enable_mask & event_mask) { +		if (use_worker) +			schedule_work(&process->debug_event_workarea); +		else +			kernel_write(process->dbg_ev_file, +					&write_data, +					1, +					&pos); +	} else { +		is_subscribed = false; +	} + +	mutex_unlock(&process->event_mutex); + +	return is_subscribed; +} + +/* set pending event queue entry from ring entry  */ +bool kfd_set_dbg_ev_from_interrupt(struct kfd_node *dev, +				   unsigned int pasid, +				   uint32_t doorbell_id, +				   uint64_t trap_mask, +				   void *exception_data, +				   size_t exception_data_size) +{ +	struct kfd_process *p; +	bool signaled_to_debugger_or_runtime = false; + +	p = kfd_lookup_process_by_pasid(pasid); + +	if (!p) +		return false; + +	if (!kfd_dbg_ev_raise(trap_mask, p, dev, doorbell_id, true, +			      exception_data, exception_data_size)) { +		struct process_queue_manager *pqm; +		struct process_queue_node *pqn; + +		if (!!(trap_mask & KFD_EC_MASK_QUEUE) && +		       p->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED) { +			mutex_lock(&p->mutex); + +			pqm = &p->pqm; +			list_for_each_entry(pqn, &pqm->queues, +							process_queue_list) { + +				if (!(pqn->q && pqn->q->device == dev && +				      pqn->q->doorbell_id == doorbell_id)) +					continue; + +				kfd_send_exception_to_runtime(p, pqn->q->properties.queue_id, +							      trap_mask); + +				signaled_to_debugger_or_runtime = true; + +				break; +			} + +			mutex_unlock(&p->mutex); +		} else if (trap_mask & KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION)) { +			kfd_dqm_evict_pasid(dev->dqm, p->pasid); +			kfd_signal_vm_fault_event(dev, p->pasid, NULL, +							exception_data); + +			signaled_to_debugger_or_runtime = true; +		} +	} else { +		signaled_to_debugger_or_runtime = true; +	} + +	kfd_unref_process(p); + +	return signaled_to_debugger_or_runtime; +} + +int kfd_dbg_send_exception_to_runtime(struct kfd_process *p, +					unsigned int dev_id, +					unsigned int queue_id, +					uint64_t error_reason) +{ +	if (error_reason & KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION)) { +		struct kfd_process_device *pdd = NULL; +		struct kfd_hsa_memory_exception_data *data; +		int i; + +		for (i = 0; i < p->n_pdds; i++) { +			if (p->pdds[i]->dev->id == dev_id) { +				pdd = p->pdds[i]; +				break; +			} +		} + +		if (!pdd) +			return -ENODEV; + +		data = (struct kfd_hsa_memory_exception_data *) +						pdd->vm_fault_exc_data; + +		kfd_dqm_evict_pasid(pdd->dev->dqm, p->pasid); +		kfd_signal_vm_fault_event(pdd->dev, p->pasid, NULL, data); +		error_reason &= ~KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION); +	} + +	if (error_reason & (KFD_EC_MASK(EC_PROCESS_RUNTIME))) { +		/* +		 * block should only happen after the debugger receives runtime +		 * enable notice. +		 */ +		up(&p->runtime_enable_sema); +		error_reason &= ~KFD_EC_MASK(EC_PROCESS_RUNTIME); +	} + +	if (error_reason) +		return kfd_send_exception_to_runtime(p, queue_id, error_reason); + +	return 0; +} + +static int kfd_dbg_set_queue_workaround(struct queue *q, bool enable) +{ +	struct mqd_update_info minfo = {0}; +	int err; + +	if (!q) +		return 0; + +	if (KFD_GC_VERSION(q->device) < IP_VERSION(11, 0, 0) || +	    KFD_GC_VERSION(q->device) >= IP_VERSION(12, 0, 0)) +		return 0; + +	if (enable && q->properties.is_user_cu_masked) +		return -EBUSY; + +	minfo.update_flag = enable ? UPDATE_FLAG_DBG_WA_ENABLE : UPDATE_FLAG_DBG_WA_DISABLE; + +	q->properties.is_dbg_wa = enable; +	err = q->device->dqm->ops.update_queue(q->device->dqm, q, &minfo); +	if (err) +		q->properties.is_dbg_wa = false; + +	return err; +} + +static int kfd_dbg_set_workaround(struct kfd_process *target, bool enable) +{ +	struct process_queue_manager *pqm = &target->pqm; +	struct process_queue_node *pqn; +	int r = 0; + +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) { +		r = kfd_dbg_set_queue_workaround(pqn->q, enable); +		if (enable && r) +			goto unwind; +	} + +	return 0; + +unwind: +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) +		kfd_dbg_set_queue_workaround(pqn->q, false); + +	if (enable) +		target->runtime_info.runtime_state = r == -EBUSY ? +				DEBUG_RUNTIME_STATE_ENABLED_BUSY : +				DEBUG_RUNTIME_STATE_ENABLED_ERROR; + +	return r; +} + +int kfd_dbg_set_mes_debug_mode(struct kfd_process_device *pdd) +{ +	uint32_t spi_dbg_cntl = pdd->spi_dbg_override | pdd->spi_dbg_launch_mode; +	uint32_t flags = pdd->process->dbg_flags; +	bool sq_trap_en = !!spi_dbg_cntl; + +	if (!kfd_dbg_is_per_vmid_supported(pdd->dev)) +		return 0; + +	return amdgpu_mes_set_shader_debugger(pdd->dev->adev, pdd->proc_ctx_gpu_addr, spi_dbg_cntl, +						pdd->watch_points, flags, sq_trap_en); +} + +#define KFD_DEBUGGER_INVALID_WATCH_POINT_ID -1 +static int kfd_dbg_get_dev_watch_id(struct kfd_process_device *pdd, int *watch_id) +{ +	int i; + +	*watch_id = KFD_DEBUGGER_INVALID_WATCH_POINT_ID; + +	spin_lock(&pdd->dev->kfd->watch_points_lock); + +	for (i = 0; i < MAX_WATCH_ADDRESSES; i++) { +		/* device watchpoint in use so skip */ +		if ((pdd->dev->kfd->alloc_watch_ids >> i) & 0x1) +			continue; + +		pdd->alloc_watch_ids |= 0x1 << i; +		pdd->dev->kfd->alloc_watch_ids |= 0x1 << i; +		*watch_id = i; +		spin_unlock(&pdd->dev->kfd->watch_points_lock); +		return 0; +	} + +	spin_unlock(&pdd->dev->kfd->watch_points_lock); + +	return -ENOMEM; +} + +static void kfd_dbg_clear_dev_watch_id(struct kfd_process_device *pdd, int watch_id) +{ +	spin_lock(&pdd->dev->kfd->watch_points_lock); + +	/* process owns device watch point so safe to clear */ +	if ((pdd->alloc_watch_ids >> watch_id) & 0x1) { +		pdd->alloc_watch_ids &= ~(0x1 << watch_id); +		pdd->dev->kfd->alloc_watch_ids &= ~(0x1 << watch_id); +	} + +	spin_unlock(&pdd->dev->kfd->watch_points_lock); +} + +static bool kfd_dbg_owns_dev_watch_id(struct kfd_process_device *pdd, int watch_id) +{ +	bool owns_watch_id = false; + +	spin_lock(&pdd->dev->kfd->watch_points_lock); +	owns_watch_id = watch_id < MAX_WATCH_ADDRESSES && +			((pdd->alloc_watch_ids >> watch_id) & 0x1); + +	spin_unlock(&pdd->dev->kfd->watch_points_lock); + +	return owns_watch_id; +} + +int kfd_dbg_trap_clear_dev_address_watch(struct kfd_process_device *pdd, +					uint32_t watch_id) +{ +	int r; + +	if (!kfd_dbg_owns_dev_watch_id(pdd, watch_id)) +		return -EINVAL; + +	if (!pdd->dev->kfd->shared_resources.enable_mes) { +		r = debug_lock_and_unmap(pdd->dev->dqm); +		if (r) +			return r; +	} + +	amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +	pdd->watch_points[watch_id] = pdd->dev->kfd2kgd->clear_address_watch( +							pdd->dev->adev, +							watch_id); +	amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +	if (!pdd->dev->kfd->shared_resources.enable_mes) +		r = debug_map_and_unlock(pdd->dev->dqm); +	else +		r = kfd_dbg_set_mes_debug_mode(pdd); + +	kfd_dbg_clear_dev_watch_id(pdd, watch_id); + +	return r; +} + +int kfd_dbg_trap_set_dev_address_watch(struct kfd_process_device *pdd, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t *watch_id, +					uint32_t watch_mode) +{ +	int r = kfd_dbg_get_dev_watch_id(pdd, watch_id); + +	if (r) +		return r; + +	if (!pdd->dev->kfd->shared_resources.enable_mes) { +		r = debug_lock_and_unmap(pdd->dev->dqm); +		if (r) { +			kfd_dbg_clear_dev_watch_id(pdd, *watch_id); +			return r; +		} +	} + +	amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +	pdd->watch_points[*watch_id] = pdd->dev->kfd2kgd->set_address_watch( +				pdd->dev->adev, +				watch_address, +				watch_address_mask, +				*watch_id, +				watch_mode, +				pdd->dev->vm_info.last_vmid_kfd); +	amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +	if (!pdd->dev->kfd->shared_resources.enable_mes) +		r = debug_map_and_unlock(pdd->dev->dqm); +	else +		r = kfd_dbg_set_mes_debug_mode(pdd); + +	/* HWS is broken so no point in HW rollback but release the watchpoint anyways */ +	if (r) +		kfd_dbg_clear_dev_watch_id(pdd, *watch_id); + +	return 0; +} + +static void kfd_dbg_clear_process_address_watch(struct kfd_process *target) +{ +	int i, j; + +	for (i = 0; i < target->n_pdds; i++) +		for (j = 0; j < MAX_WATCH_ADDRESSES; j++) +			kfd_dbg_trap_clear_dev_address_watch(target->pdds[i], j); +} + +int kfd_dbg_trap_set_flags(struct kfd_process *target, uint32_t *flags) +{ +	uint32_t prev_flags = target->dbg_flags; +	int i, r = 0, rewind_count = 0; + +	for (i = 0; i < target->n_pdds; i++) { +		if (!kfd_dbg_is_per_vmid_supported(target->pdds[i]->dev) && +			(*flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP)) { +			*flags = prev_flags; +			return -EACCES; +		} +	} + +	target->dbg_flags = *flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP; +	*flags = prev_flags; +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		if (!kfd_dbg_is_per_vmid_supported(pdd->dev)) +			continue; + +		if (!pdd->dev->kfd->shared_resources.enable_mes) +			r = debug_refresh_runlist(pdd->dev->dqm); +		else +			r = kfd_dbg_set_mes_debug_mode(pdd); + +		if (r) { +			target->dbg_flags = prev_flags; +			break; +		} + +		rewind_count++; +	} + +	/* Rewind flags */ +	if (r) { +		target->dbg_flags = prev_flags; + +		for (i = 0; i < rewind_count; i++) { +			struct kfd_process_device *pdd = target->pdds[i]; + +			if (!kfd_dbg_is_per_vmid_supported(pdd->dev)) +				continue; + +			if (!pdd->dev->kfd->shared_resources.enable_mes) +				debug_refresh_runlist(pdd->dev->dqm); +			else +				kfd_dbg_set_mes_debug_mode(pdd); +		} +	} + +	return r; +} + +/* kfd_dbg_trap_deactivate: + *	target: target process + *	unwind: If this is unwinding a failed kfd_dbg_trap_enable() + *	unwind_count: + *		If unwind == true, how far down the pdd list we need + *				to unwind + *		else: ignored + */ +void kfd_dbg_trap_deactivate(struct kfd_process *target, bool unwind, int unwind_count) +{ +	int i; + +	if (!unwind) { +		uint32_t flags = 0; +		int resume_count = resume_queues(target, 0, NULL); + +		if (resume_count) +			pr_debug("Resumed %d queues\n", resume_count); + +		cancel_work_sync(&target->debug_event_workarea); +		kfd_dbg_clear_process_address_watch(target); +		kfd_dbg_trap_set_wave_launch_mode(target, 0); + +		kfd_dbg_trap_set_flags(target, &flags); +	} + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		/* If this is an unwind, and we have unwound the required +		 * enable calls on the pdd list, we need to stop now +		 * otherwise we may mess up another debugger session. +		 */ +		if (unwind && i == unwind_count) +			break; + +		kfd_process_set_trap_debug_flag(&pdd->qpd, false); + +		/* GFX off is already disabled by debug activate if not RLC restore supported. */ +		if (kfd_dbg_is_rlc_restore_supported(pdd->dev)) +			amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +		pdd->spi_dbg_override = +				pdd->dev->kfd2kgd->disable_debug_trap( +				pdd->dev->adev, +				target->runtime_info.ttmp_setup, +				pdd->dev->vm_info.last_vmid_kfd); +		amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +		if (!kfd_dbg_is_per_vmid_supported(pdd->dev) && +				release_debug_trap_vmid(pdd->dev->dqm, &pdd->qpd)) +			pr_err("Failed to release debug vmid on [%i]\n", pdd->dev->id); + +		if (!pdd->dev->kfd->shared_resources.enable_mes) +			debug_refresh_runlist(pdd->dev->dqm); +		else +			kfd_dbg_set_mes_debug_mode(pdd); +	} + +	kfd_dbg_set_workaround(target, false); +} + +static void kfd_dbg_clean_exception_status(struct kfd_process *target) +{ +	struct process_queue_manager *pqm; +	struct process_queue_node *pqn; +	int i; + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		kfd_process_drain_interrupts(pdd); + +		pdd->exception_status = 0; +	} + +	pqm = &target->pqm; +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) { +		if (!pqn->q) +			continue; + +		pqn->q->properties.exception_status = 0; +	} + +	target->exception_status = 0; +} + +int kfd_dbg_trap_disable(struct kfd_process *target) +{ +	if (!target->debug_trap_enabled) +		return 0; + +	/* +	 * Defer deactivation to runtime if runtime not enabled otherwise reset +	 * attached running target runtime state to enable for re-attach. +	 */ +	if (target->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED) +		kfd_dbg_trap_deactivate(target, false, 0); +	else if (target->runtime_info.runtime_state != DEBUG_RUNTIME_STATE_DISABLED) +		target->runtime_info.runtime_state = DEBUG_RUNTIME_STATE_ENABLED; + +	fput(target->dbg_ev_file); +	target->dbg_ev_file = NULL; + +	if (target->debugger_process) { +		atomic_dec(&target->debugger_process->debugged_process_count); +		target->debugger_process = NULL; +	} + +	target->debug_trap_enabled = false; +	kfd_dbg_clean_exception_status(target); +	kfd_unref_process(target); + +	return 0; +} + +int kfd_dbg_trap_activate(struct kfd_process *target) +{ +	int i, r = 0; + +	r = kfd_dbg_set_workaround(target, true); +	if (r) +		return r; + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		if (!kfd_dbg_is_per_vmid_supported(pdd->dev)) { +			r = reserve_debug_trap_vmid(pdd->dev->dqm, &pdd->qpd); + +			if (r) { +				target->runtime_info.runtime_state = (r == -EBUSY) ? +							DEBUG_RUNTIME_STATE_ENABLED_BUSY : +							DEBUG_RUNTIME_STATE_ENABLED_ERROR; + +				goto unwind_err; +			} +		} + +		/* Disable GFX OFF to prevent garbage read/writes to debug registers. +		 * If RLC restore of debug registers is not supported and runtime enable +		 * hasn't done so already on ttmp setup request, restore the trap config registers. +		 * +		 * If RLC restore of debug registers is not supported, keep gfx off disabled for +		 * the debug session. +		 */ +		amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +		if (!(kfd_dbg_is_rlc_restore_supported(pdd->dev) || +						target->runtime_info.ttmp_setup)) +			pdd->dev->kfd2kgd->enable_debug_trap(pdd->dev->adev, true, +								pdd->dev->vm_info.last_vmid_kfd); + +		pdd->spi_dbg_override = pdd->dev->kfd2kgd->enable_debug_trap( +					pdd->dev->adev, +					false, +					pdd->dev->vm_info.last_vmid_kfd); + +		if (kfd_dbg_is_rlc_restore_supported(pdd->dev)) +			amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +		/* +		 * Setting the debug flag in the trap handler requires that the TMA has been +		 * allocated, which occurs during CWSR initialization. +		 * In the event that CWSR has not been initialized at this point, setting the +		 * flag will be called again during CWSR initialization if the target process +		 * is still debug enabled. +		 */ +		kfd_process_set_trap_debug_flag(&pdd->qpd, true); + +		if (!pdd->dev->kfd->shared_resources.enable_mes) +			r = debug_refresh_runlist(pdd->dev->dqm); +		else +			r = kfd_dbg_set_mes_debug_mode(pdd); + +		if (r) { +			target->runtime_info.runtime_state = +					DEBUG_RUNTIME_STATE_ENABLED_ERROR; +			goto unwind_err; +		} +	} + +	return 0; + +unwind_err: +	/* Enabling debug failed, we need to disable on +	 * all GPUs so the enable is all or nothing. +	 */ +	kfd_dbg_trap_deactivate(target, true, i); +	return r; +} + +int kfd_dbg_trap_enable(struct kfd_process *target, uint32_t fd, +			void __user *runtime_info, uint32_t *runtime_size) +{ +	struct file *f; +	uint32_t copy_size; +	int i, r = 0; + +	if (target->debug_trap_enabled) +		return -EALREADY; + +	/* Enable pre-checks */ +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		if (!KFD_IS_SOC15(pdd->dev)) +			return -ENODEV; + +		if (!kfd_dbg_has_gws_support(pdd->dev) && pdd->qpd.num_gws) +			return -EBUSY; +	} + +	copy_size = min((size_t)(*runtime_size), sizeof(target->runtime_info)); + +	f = fget(fd); +	if (!f) { +		pr_err("Failed to get file for (%i)\n", fd); +		return -EBADF; +	} + +	target->dbg_ev_file = f; + +	/* defer activation to runtime if not runtime enabled */ +	if (target->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED) +		kfd_dbg_trap_activate(target); + +	/* We already hold the process reference but hold another one for the +	 * debug session. +	 */ +	kref_get(&target->ref); +	target->debug_trap_enabled = true; + +	if (target->debugger_process) +		atomic_inc(&target->debugger_process->debugged_process_count); + +	if (copy_to_user(runtime_info, (void *)&target->runtime_info, copy_size)) { +		kfd_dbg_trap_deactivate(target, false, 0); +		r = -EFAULT; +	} + +	*runtime_size = sizeof(target->runtime_info); + +	return r; +} + +static int kfd_dbg_validate_trap_override_request(struct kfd_process *p, +						uint32_t trap_override, +						uint32_t trap_mask_request, +						uint32_t *trap_mask_supported) +{ +	int i = 0; + +	*trap_mask_supported = 0xffffffff; + +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; +		int err = pdd->dev->kfd2kgd->validate_trap_override_request( +								pdd->dev->adev, +								trap_override, +								trap_mask_supported); + +		if (err) +			return err; +	} + +	if (trap_mask_request & ~*trap_mask_supported) +		return -EACCES; + +	return 0; +} + +int kfd_dbg_trap_set_wave_launch_override(struct kfd_process *target, +					uint32_t trap_override, +					uint32_t trap_mask_bits, +					uint32_t trap_mask_request, +					uint32_t *trap_mask_prev, +					uint32_t *trap_mask_supported) +{ +	int r = 0, i; + +	r = kfd_dbg_validate_trap_override_request(target, +						trap_override, +						trap_mask_request, +						trap_mask_supported); + +	if (r) +		return r; + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +		pdd->spi_dbg_override = pdd->dev->kfd2kgd->set_wave_launch_trap_override( +				pdd->dev->adev, +				pdd->dev->vm_info.last_vmid_kfd, +				trap_override, +				trap_mask_bits, +				trap_mask_request, +				trap_mask_prev, +				pdd->spi_dbg_override); +		amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +		if (!pdd->dev->kfd->shared_resources.enable_mes) +			r = debug_refresh_runlist(pdd->dev->dqm); +		else +			r = kfd_dbg_set_mes_debug_mode(pdd); + +		if (r) +			break; +	} + +	return r; +} + +int kfd_dbg_trap_set_wave_launch_mode(struct kfd_process *target, +					uint8_t wave_launch_mode) +{ +	int r = 0, i; + +	if (wave_launch_mode != KFD_DBG_TRAP_WAVE_LAUNCH_MODE_NORMAL && +			wave_launch_mode != KFD_DBG_TRAP_WAVE_LAUNCH_MODE_HALT && +			wave_launch_mode != KFD_DBG_TRAP_WAVE_LAUNCH_MODE_DEBUG) +		return -EINVAL; + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		amdgpu_gfx_off_ctrl(pdd->dev->adev, false); +		pdd->spi_dbg_launch_mode = pdd->dev->kfd2kgd->set_wave_launch_mode( +				pdd->dev->adev, +				wave_launch_mode, +				pdd->dev->vm_info.last_vmid_kfd); +		amdgpu_gfx_off_ctrl(pdd->dev->adev, true); + +		if (!pdd->dev->kfd->shared_resources.enable_mes) +			r = debug_refresh_runlist(pdd->dev->dqm); +		else +			r = kfd_dbg_set_mes_debug_mode(pdd); + +		if (r) +			break; +	} + +	return r; +} + +int kfd_dbg_trap_query_exception_info(struct kfd_process *target, +		uint32_t source_id, +		uint32_t exception_code, +		bool clear_exception, +		void __user *info, +		uint32_t *info_size) +{ +	bool found = false; +	int r = 0; +	uint32_t copy_size, actual_info_size = 0; +	uint64_t *exception_status_ptr = NULL; + +	if (!target) +		return -EINVAL; + +	if (!info || !info_size) +		return -EINVAL; + +	mutex_lock(&target->event_mutex); + +	if (KFD_DBG_EC_TYPE_IS_QUEUE(exception_code)) { +		/* Per queue exceptions */ +		struct queue *queue = NULL; +		int i; + +		for (i = 0; i < target->n_pdds; i++) { +			struct kfd_process_device *pdd = target->pdds[i]; +			struct qcm_process_device *qpd = &pdd->qpd; + +			list_for_each_entry(queue, &qpd->queues_list, list) { +				if (!found && queue->properties.queue_id == source_id) { +					found = true; +					break; +				} +			} +			if (found) +				break; +		} + +		if (!found) { +			r = -EINVAL; +			goto out; +		} + +		if (!(queue->properties.exception_status & KFD_EC_MASK(exception_code))) { +			r = -ENODATA; +			goto out; +		} +		exception_status_ptr = &queue->properties.exception_status; +	} else if (KFD_DBG_EC_TYPE_IS_DEVICE(exception_code)) { +		/* Per device exceptions */ +		struct kfd_process_device *pdd = NULL; +		int i; + +		for (i = 0; i < target->n_pdds; i++) { +			pdd = target->pdds[i]; +			if (pdd->dev->id == source_id) { +				found = true; +				break; +			} +		} + +		if (!found) { +			r = -EINVAL; +			goto out; +		} + +		if (!(pdd->exception_status & KFD_EC_MASK(exception_code))) { +			r = -ENODATA; +			goto out; +		} + +		if (exception_code == EC_DEVICE_MEMORY_VIOLATION) { +			copy_size = min((size_t)(*info_size), pdd->vm_fault_exc_data_size); + +			if (copy_to_user(info, pdd->vm_fault_exc_data, copy_size)) { +				r = -EFAULT; +				goto out; +			} +			actual_info_size = pdd->vm_fault_exc_data_size; +			if (clear_exception) { +				kfree(pdd->vm_fault_exc_data); +				pdd->vm_fault_exc_data = NULL; +				pdd->vm_fault_exc_data_size = 0; +			} +		} +		exception_status_ptr = &pdd->exception_status; +	} else if (KFD_DBG_EC_TYPE_IS_PROCESS(exception_code)) { +		/* Per process exceptions */ +		if (!(target->exception_status & KFD_EC_MASK(exception_code))) { +			r = -ENODATA; +			goto out; +		} + +		if (exception_code == EC_PROCESS_RUNTIME) { +			copy_size = min((size_t)(*info_size), sizeof(target->runtime_info)); + +			if (copy_to_user(info, (void *)&target->runtime_info, copy_size)) { +				r = -EFAULT; +				goto out; +			} + +			actual_info_size = sizeof(target->runtime_info); +		} + +		exception_status_ptr = &target->exception_status; +	} else { +		pr_debug("Bad exception type [%i]\n", exception_code); +		r = -EINVAL; +		goto out; +	} + +	*info_size = actual_info_size; +	if (clear_exception) +		*exception_status_ptr &= ~KFD_EC_MASK(exception_code); +out: +	mutex_unlock(&target->event_mutex); +	return r; +} + +int kfd_dbg_trap_device_snapshot(struct kfd_process *target, +		uint64_t exception_clear_mask, +		void __user *user_info, +		uint32_t *number_of_device_infos, +		uint32_t *entry_size) +{ +	struct kfd_dbg_device_info_entry device_info; +	uint32_t tmp_entry_size = *entry_size, tmp_num_devices; +	int i, r = 0; + +	if (!(target && user_info && number_of_device_infos && entry_size)) +		return -EINVAL; + +	tmp_num_devices = min_t(size_t, *number_of_device_infos, target->n_pdds); +	*number_of_device_infos = target->n_pdds; +	*entry_size = min_t(size_t, *entry_size, sizeof(device_info)); + +	if (!tmp_num_devices) +		return 0; + +	memset(&device_info, 0, sizeof(device_info)); + +	mutex_lock(&target->event_mutex); + +	/* Run over all pdd of the process */ +	for (i = 0; i < tmp_num_devices; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; +		struct kfd_topology_device *topo_dev = kfd_topology_device_by_id(pdd->dev->id); + +		device_info.gpu_id = pdd->dev->id; +		device_info.exception_status = pdd->exception_status; +		device_info.lds_base = pdd->lds_base; +		device_info.lds_limit = pdd->lds_limit; +		device_info.scratch_base = pdd->scratch_base; +		device_info.scratch_limit = pdd->scratch_limit; +		device_info.gpuvm_base = pdd->gpuvm_base; +		device_info.gpuvm_limit = pdd->gpuvm_limit; +		device_info.location_id = topo_dev->node_props.location_id; +		device_info.vendor_id = topo_dev->node_props.vendor_id; +		device_info.device_id = topo_dev->node_props.device_id; +		device_info.revision_id = pdd->dev->adev->pdev->revision; +		device_info.subsystem_vendor_id = pdd->dev->adev->pdev->subsystem_vendor; +		device_info.subsystem_device_id = pdd->dev->adev->pdev->subsystem_device; +		device_info.fw_version = pdd->dev->kfd->mec_fw_version; +		device_info.gfx_target_version = +			topo_dev->node_props.gfx_target_version; +		device_info.simd_count = topo_dev->node_props.simd_count; +		device_info.max_waves_per_simd = +			topo_dev->node_props.max_waves_per_simd; +		device_info.array_count = topo_dev->node_props.array_count; +		device_info.simd_arrays_per_engine = +			topo_dev->node_props.simd_arrays_per_engine; +		device_info.num_xcc = NUM_XCC(pdd->dev->xcc_mask); +		device_info.capability = topo_dev->node_props.capability; +		device_info.debug_prop = topo_dev->node_props.debug_prop; + +		if (exception_clear_mask) +			pdd->exception_status &= ~exception_clear_mask; + +		if (copy_to_user(user_info, &device_info, *entry_size)) { +			r = -EFAULT; +			break; +		} + +		user_info += tmp_entry_size; +	} + +	mutex_unlock(&target->event_mutex); + +	return r; +} + +void kfd_dbg_set_enabled_debug_exception_mask(struct kfd_process *target, +					uint64_t exception_set_mask) +{ +	uint64_t found_mask = 0; +	struct process_queue_manager *pqm; +	struct process_queue_node *pqn; +	static const char write_data = '.'; +	loff_t pos = 0; +	int i; + +	mutex_lock(&target->event_mutex); + +	found_mask |= target->exception_status; + +	pqm = &target->pqm; +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) { +		if (!pqn) +			continue; + +		found_mask |= pqn->q->properties.exception_status; +	} + +	for (i = 0; i < target->n_pdds; i++) { +		struct kfd_process_device *pdd = target->pdds[i]; + +		found_mask |= pdd->exception_status; +	} + +	if (exception_set_mask & found_mask) +		kernel_write(target->dbg_ev_file, &write_data, 1, &pos); + +	target->exception_enable_mask = exception_set_mask; + +	mutex_unlock(&target->event_mutex); +} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debug.h b/drivers/gpu/drm/amd/amdkfd/kfd_debug.h new file mode 100644 index 000000000000..a289e59ceb79 --- /dev/null +++ b/drivers/gpu/drm/amd/amdkfd/kfd_debug.h @@ -0,0 +1,123 @@ +/* + * Copyright 2023 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. + */ + +#ifndef KFD_DEBUG_EVENTS_H_INCLUDED +#define KFD_DEBUG_EVENTS_H_INCLUDED + +#include "kfd_priv.h" + +void kfd_dbg_trap_deactivate(struct kfd_process *target, bool unwind, int unwind_count); +int kfd_dbg_trap_activate(struct kfd_process *target); +int kfd_dbg_ev_query_debug_event(struct kfd_process *process, +			unsigned int *queue_id, +			unsigned int *gpu_id, +			uint64_t exception_clear_mask, +			uint64_t *event_status); +bool kfd_set_dbg_ev_from_interrupt(struct kfd_node *dev, +				   unsigned int pasid, +				   uint32_t doorbell_id, +				   uint64_t trap_mask, +				   void *exception_data, +				   size_t exception_data_size); +bool kfd_dbg_ev_raise(uint64_t event_mask, +			struct kfd_process *process, struct kfd_node *dev, +			unsigned int source_id, bool use_worker, +			void *exception_data, +			size_t exception_data_size); +int kfd_dbg_trap_disable(struct kfd_process *target); +int kfd_dbg_trap_enable(struct kfd_process *target, uint32_t fd, +			void __user *runtime_info, +			uint32_t *runtime_info_size); +int kfd_dbg_trap_set_wave_launch_override(struct kfd_process *target, +					uint32_t trap_override, +					uint32_t trap_mask_bits, +					uint32_t trap_mask_request, +					uint32_t *trap_mask_prev, +					uint32_t *trap_mask_supported); +int kfd_dbg_trap_set_wave_launch_mode(struct kfd_process *target, +					uint8_t wave_launch_mode); +int kfd_dbg_trap_clear_dev_address_watch(struct kfd_process_device *pdd, +					uint32_t watch_id); +int kfd_dbg_trap_set_dev_address_watch(struct kfd_process_device *pdd, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t *watch_id, +					uint32_t watch_mode); +int kfd_dbg_trap_set_flags(struct kfd_process *target, uint32_t *flags); +int kfd_dbg_trap_query_exception_info(struct kfd_process *target, +		uint32_t source_id, +		uint32_t exception_code, +		bool clear_exception, +		void __user *info, +		uint32_t *info_size); +int kfd_dbg_send_exception_to_runtime(struct kfd_process *p, +					unsigned int dev_id, +					unsigned int queue_id, +					uint64_t error_reason); + +static inline bool kfd_dbg_is_per_vmid_supported(struct kfd_node *dev) +{ +	return KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2) || +	       KFD_GC_VERSION(dev) >= IP_VERSION(11, 0, 0); +} + +void debug_event_write_work_handler(struct work_struct *work); +int kfd_dbg_trap_device_snapshot(struct kfd_process *target, +		uint64_t exception_clear_mask, +		void __user *user_info, +		uint32_t *number_of_device_infos, +		uint32_t *entry_size); + +void kfd_dbg_set_enabled_debug_exception_mask(struct kfd_process *target, +					uint64_t exception_set_mask); +/* + * If GFX off is enabled, chips that do not support RLC restore for the debug + * registers will disable GFX off temporarily for the entire debug session. + * See disable_on_trap_action_entry and enable_on_trap_action_exit for details. + */ +static inline bool kfd_dbg_is_rlc_restore_supported(struct kfd_node *dev) +{ +	return !(KFD_GC_VERSION(dev) == IP_VERSION(10, 1, 10) || +		 KFD_GC_VERSION(dev) == IP_VERSION(10, 1, 1)); +} + +static inline bool kfd_dbg_has_gws_support(struct kfd_node *dev) +{ +	if ((KFD_GC_VERSION(dev) == IP_VERSION(9, 0, 1) +			&& dev->kfd->mec2_fw_version < 0x81b6) || +		(KFD_GC_VERSION(dev) >= IP_VERSION(9, 1, 0) +			&& KFD_GC_VERSION(dev) <= IP_VERSION(9, 2, 2) +			&& dev->kfd->mec2_fw_version < 0x1b6) || +		(KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 0) +			&& dev->kfd->mec2_fw_version < 0x1b6) || +		(KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) +			&& dev->kfd->mec2_fw_version < 0x30) || +		(KFD_GC_VERSION(dev) >= IP_VERSION(11, 0, 0) && +			KFD_GC_VERSION(dev) < IP_VERSION(12, 0, 0))) +		return false; + +	/* Assume debugging and cooperative launch supported otherwise. */ +	return true; +} + +int kfd_dbg_set_mes_debug_mode(struct kfd_process_device *pdd); +#endif diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c index ad5a40a685ac..4a5a0a4e00f2 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_debugfs.c @@ -43,7 +43,7 @@ static int kfd_debugfs_hang_hws_read(struct seq_file *m, void *data)  static ssize_t kfd_debugfs_hang_hws_write(struct file *file,  	const char __user *user_buf, size_t size, loff_t *ppos)  { -	struct kfd_dev *dev; +	struct kfd_node *dev;  	char tmp[16];  	uint32_t gpu_id;  	int ret = -EINVAL; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index 00f528eb9812..9d4abfd8b55e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -32,8 +32,10 @@  #include "kfd_iommu.h"  #include "amdgpu_amdkfd.h"  #include "kfd_smi_events.h" +#include "kfd_svm.h"  #include "kfd_migrate.h"  #include "amdgpu.h" +#include "amdgpu_xcp.h"  #define MQD_SIZE_ALIGNED 768 @@ -42,7 +44,7 @@   * once locked, kfd driver will stop any further GPU execution.   * create process (open) will return -EAGAIN.   */ -static atomic_t kfd_locked = ATOMIC_INIT(0); +static int kfd_locked;  #ifdef CONFIG_DRM_AMDGPU_CIK  extern const struct kfd2kgd_calls gfx_v7_kfd2kgd; @@ -51,6 +53,7 @@ extern const struct kfd2kgd_calls gfx_v8_kfd2kgd;  extern const struct kfd2kgd_calls gfx_v9_kfd2kgd;  extern const struct kfd2kgd_calls arcturus_kfd2kgd;  extern const struct kfd2kgd_calls aldebaran_kfd2kgd; +extern const struct kfd2kgd_calls gc_9_4_3_kfd2kgd;  extern const struct kfd2kgd_calls gfx_v10_kfd2kgd;  extern const struct kfd2kgd_calls gfx_v10_3_kfd2kgd;  extern const struct kfd2kgd_calls gfx_v11_kfd2kgd; @@ -60,7 +63,7 @@ static int kfd_gtt_sa_init(struct kfd_dev *kfd, unsigned int buf_size,  static void kfd_gtt_sa_fini(struct kfd_dev *kfd);  static int kfd_resume_iommu(struct kfd_dev *kfd); -static int kfd_resume(struct kfd_dev *kfd); +static int kfd_resume(struct kfd_node *kfd);  static void kfd_device_info_set_sdma_info(struct kfd_dev *kfd)  { @@ -81,6 +84,7 @@ static void kfd_device_info_set_sdma_info(struct kfd_dev *kfd)  	case IP_VERSION(4, 2, 0):/* VEGA20 */  	case IP_VERSION(4, 2, 2):/* ARCTURUS */  	case IP_VERSION(4, 4, 0):/* ALDEBARAN */ +	case IP_VERSION(4, 4, 2):  	case IP_VERSION(5, 0, 0):/* NAVI10 */  	case IP_VERSION(5, 0, 1):/* CYAN_SKILLFISH */  	case IP_VERSION(5, 0, 2):/* NAVI14 */ @@ -102,20 +106,19 @@ static void kfd_device_info_set_sdma_info(struct kfd_dev *kfd)  		kfd->device_info.num_sdma_queues_per_engine = 8;  	} +	bitmap_zero(kfd->device_info.reserved_sdma_queues_bitmap, KFD_MAX_SDMA_QUEUES); +  	switch (sdma_version) {  	case IP_VERSION(6, 0, 0): +	case IP_VERSION(6, 0, 1):  	case IP_VERSION(6, 0, 2):  	case IP_VERSION(6, 0, 3):  		/* Reserve 1 for paging and 1 for gfx */  		kfd->device_info.num_reserved_sdma_queues_per_engine = 2;  		/* BIT(0)=engine-0 queue-0; BIT(1)=engine-1 queue-0; BIT(2)=engine-0 queue-1; ... */ -		kfd->device_info.reserved_sdma_queues_bitmap = 0xFULL; -		break; -	case IP_VERSION(6, 0, 1): -		/* Reserve 1 for paging and 1 for gfx */ -		kfd->device_info.num_reserved_sdma_queues_per_engine = 2; -		/* BIT(0)=engine-0 queue-0; BIT(1)=engine-0 queue-1; ... */ -		kfd->device_info.reserved_sdma_queues_bitmap = 0x3ULL; +		bitmap_set(kfd->device_info.reserved_sdma_queues_bitmap, 0, +			   kfd->adev->sdma.num_instances * +			   kfd->device_info.num_reserved_sdma_queues_per_engine);  		break;  	default:  		break; @@ -135,6 +138,9 @@ static void kfd_device_info_set_event_interrupt_class(struct kfd_dev *kfd)  	case IP_VERSION(9, 4, 0): /* VEGA20 */  	case IP_VERSION(9, 4, 1): /* ARCTURUS */  	case IP_VERSION(9, 4, 2): /* ALDEBARAN */ +	case IP_VERSION(9, 4, 3): /* GC 9.4.3 */ +		kfd->device_info.event_interrupt_class = &event_interrupt_class_v9; +		break;  	case IP_VERSION(10, 3, 1): /* VANGOGH */  	case IP_VERSION(10, 3, 3): /* YELLOW_CARP */  	case IP_VERSION(10, 3, 6): /* GC 10.3.6 */ @@ -148,7 +154,7 @@ static void kfd_device_info_set_event_interrupt_class(struct kfd_dev *kfd)  	case IP_VERSION(10, 3, 2): /* NAVY_FLOUNDER */  	case IP_VERSION(10, 3, 4): /* DIMGREY_CAVEFISH */  	case IP_VERSION(10, 3, 5): /* BEIGE_GOBY */ -		kfd->device_info.event_interrupt_class = &event_interrupt_class_v9; +		kfd->device_info.event_interrupt_class = &event_interrupt_class_v10;  		break;  	case IP_VERSION(11, 0, 0):  	case IP_VERSION(11, 0, 1): @@ -327,8 +333,10 @@ struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)  			f2g = &aldebaran_kfd2kgd;  			break;  		case IP_VERSION(9, 4, 3): -			gfx_target_version = 90400; -			f2g = &aldebaran_kfd2kgd; +			gfx_target_version = adev->rev_id >= 1 ? 90402 +					   : adev->flags & AMD_IS_APU ? 90400 +					   : 90401; +			f2g = &gc_9_4_3_kfd2kgd;  			break;  		/* Navi10 */  		case IP_VERSION(10, 1, 10): @@ -406,8 +414,15 @@ struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)  			f2g = &gfx_v11_kfd2kgd;  			break;  		case IP_VERSION(11, 0, 3): -			/* Note: Compiler version is 11.0.1 while HW version is 11.0.3 */ -			gfx_target_version = 110001; +			if ((adev->pdev->device == 0x7460 && +			     adev->pdev->revision == 0x00) || +			    (adev->pdev->device == 0x7461 && +			     adev->pdev->revision == 0x00)) +				/* Note: Compiler version is 11.0.5 while HW version is 11.0.3 */ +				gfx_target_version = 110005; +			else +				/* Note: Compiler version is 11.0.1 while HW version is 11.0.3 */ +				gfx_target_version = 110001;  			f2g = &gfx_v11_kfd2kgd;  			break;  		default: @@ -440,8 +455,6 @@ struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)  	memset(&kfd->doorbell_available_index, 0,  		sizeof(kfd->doorbell_available_index)); -	atomic_set(&kfd->sram_ecc_flag, 0); -  	ida_init(&kfd->doorbell_ida);  	return kfd; @@ -488,41 +501,112 @@ static void kfd_cwsr_init(struct kfd_dev *kfd)  	}  } -static int kfd_gws_init(struct kfd_dev *kfd) +static int kfd_gws_init(struct kfd_node *node)  {  	int ret = 0; +	struct kfd_dev *kfd = node->kfd; -	if (kfd->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) +	if (node->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS)  		return 0; -	if (hws_gws_support || (KFD_IS_SOC15(kfd) && -		((KFD_GC_VERSION(kfd) == IP_VERSION(9, 0, 1) +	if (hws_gws_support || (KFD_IS_SOC15(node) && +		((KFD_GC_VERSION(node) == IP_VERSION(9, 0, 1)  			&& kfd->mec2_fw_version >= 0x81b3) || -		(KFD_GC_VERSION(kfd) <= IP_VERSION(9, 4, 0) +		(KFD_GC_VERSION(node) <= IP_VERSION(9, 4, 0)  			&& kfd->mec2_fw_version >= 0x1b3)  || -		(KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 1) +		(KFD_GC_VERSION(node) == IP_VERSION(9, 4, 1)  			&& kfd->mec2_fw_version >= 0x30)   || -		(KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 2) +		(KFD_GC_VERSION(node) == IP_VERSION(9, 4, 2)  			&& kfd->mec2_fw_version >= 0x28) || -		(KFD_GC_VERSION(kfd) >= IP_VERSION(10, 3, 0) -			&& KFD_GC_VERSION(kfd) < IP_VERSION(11, 0, 0) +		(KFD_GC_VERSION(node) >= IP_VERSION(10, 3, 0) +			&& KFD_GC_VERSION(node) < IP_VERSION(11, 0, 0)  			&& kfd->mec2_fw_version >= 0x6b)))) -		ret = amdgpu_amdkfd_alloc_gws(kfd->adev, -				kfd->adev->gds.gws_size, &kfd->gws); +		ret = amdgpu_amdkfd_alloc_gws(node->adev, +				node->adev->gds.gws_size, &node->gws);  	return ret;  } -static void kfd_smi_init(struct kfd_dev *dev) +static void kfd_smi_init(struct kfd_node *dev)  {  	INIT_LIST_HEAD(&dev->smi_clients);  	spin_lock_init(&dev->smi_lock);  } +static int kfd_init_node(struct kfd_node *node) +{ +	int err = -1; + +	if (kfd_interrupt_init(node)) { +		dev_err(kfd_device, "Error initializing interrupts\n"); +		goto kfd_interrupt_error; +	} + +	node->dqm = device_queue_manager_init(node); +	if (!node->dqm) { +		dev_err(kfd_device, "Error initializing queue manager\n"); +		goto device_queue_manager_error; +	} + +	if (kfd_gws_init(node)) { +		dev_err(kfd_device, "Could not allocate %d gws\n", +			node->adev->gds.gws_size); +		goto gws_error; +	} + +	if (kfd_resume(node)) +		goto kfd_resume_error; + +	if (kfd_topology_add_device(node)) { +		dev_err(kfd_device, "Error adding device to topology\n"); +		goto kfd_topology_add_device_error; +	} + +	kfd_smi_init(node); + +	return 0; + +kfd_topology_add_device_error: +kfd_resume_error: +gws_error: +	device_queue_manager_uninit(node->dqm); +device_queue_manager_error: +	kfd_interrupt_exit(node); +kfd_interrupt_error: +	if (node->gws) +		amdgpu_amdkfd_free_gws(node->adev, node->gws); + +	/* Cleanup the node memory here */ +	kfree(node); +	return err; +} + +static void kfd_cleanup_nodes(struct kfd_dev *kfd, unsigned int num_nodes) +{ +	struct kfd_node *knode; +	unsigned int i; + +	for (i = 0; i < num_nodes; i++) { +		knode = kfd->nodes[i]; +		device_queue_manager_uninit(knode->dqm); +		kfd_interrupt_exit(knode); +		kfd_topology_remove_device(knode); +		if (knode->gws) +			amdgpu_amdkfd_free_gws(knode->adev, knode->gws); +		kfree(knode); +		kfd->nodes[i] = NULL; +	} +} +  bool kgd2kfd_device_init(struct kfd_dev *kfd,  			 const struct kgd2kfd_shared_resources *gpu_resources)  { -	unsigned int size, map_process_packet_size; +	unsigned int size, map_process_packet_size, i; +	struct kfd_node *node; +	uint32_t first_vmid_kfd, last_vmid_kfd, vmid_num_kfd; +	unsigned int max_proc_per_quantum; +	int partition_mode; +	int xcp_idx;  	kfd->mec_fw_version = amdgpu_amdkfd_get_fw_version(kfd->adev,  			KGD_ENGINE_MEC1); @@ -532,10 +616,14 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,  			KGD_ENGINE_SDMA1);  	kfd->shared_resources = *gpu_resources; -	kfd->vm_info.first_vmid_kfd = ffs(gpu_resources->compute_vmid_bitmap)-1; -	kfd->vm_info.last_vmid_kfd = fls(gpu_resources->compute_vmid_bitmap)-1; -	kfd->vm_info.vmid_num_kfd = kfd->vm_info.last_vmid_kfd -			- kfd->vm_info.first_vmid_kfd + 1; +	kfd->num_nodes = amdgpu_xcp_get_num_xcp(kfd->adev->xcp_mgr); + +	if (kfd->num_nodes == 0) { +		dev_err(kfd_device, +			"KFD num nodes cannot be 0, num_xcc_in_node: %d\n", +			kfd->adev->gfx.num_xcc_per_xcp); +		goto out; +	}  	/* Allow BIF to recode atomics to PCIe 3.0 AtomicOps.  	 * 32 and 64-bit requests are possible and must be @@ -554,11 +642,34 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,  		return false;  	} +	first_vmid_kfd = ffs(gpu_resources->compute_vmid_bitmap)-1; +	last_vmid_kfd = fls(gpu_resources->compute_vmid_bitmap)-1; +	vmid_num_kfd = last_vmid_kfd - first_vmid_kfd + 1; + +	/* For GFX9.4.3, we need special handling for VMIDs depending on +	 * partition mode. +	 * In CPX mode, the VMID range needs to be shared between XCDs. +	 * Additionally, there are 13 VMIDs (3-15) available for KFD. To +	 * divide them equally, we change starting VMID to 4 and not use +	 * VMID 3. +	 * If the VMID range changes for GFX9.4.3, then this code MUST be +	 * revisited. +	 */ +	if (kfd->adev->xcp_mgr) { +		partition_mode = amdgpu_xcp_query_partition_mode(kfd->adev->xcp_mgr, +								 AMDGPU_XCP_FL_LOCKED); +		if (partition_mode == AMDGPU_CPX_PARTITION_MODE && +		    kfd->num_nodes != 1) { +			vmid_num_kfd /= 2; +			first_vmid_kfd = last_vmid_kfd + 1 - vmid_num_kfd*2; +		} +	} +  	/* Verify module parameters regarding mapped process number*/  	if (hws_max_conc_proc >= 0) -		kfd->max_proc_per_quantum = min((u32)hws_max_conc_proc, kfd->vm_info.vmid_num_kfd); +		max_proc_per_quantum = min((u32)hws_max_conc_proc, vmid_num_kfd);  	else -		kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd; +		max_proc_per_quantum = vmid_num_kfd;  	/* calculate max size of mqds needed for queues */  	size = max_num_of_queues_per_device * @@ -606,27 +717,15 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,  	if (amdgpu_use_xgmi_p2p)  		kfd->hive_id = kfd->adev->gmc.xgmi.hive_id; -	kfd->noretry = kfd->adev->gmc.noretry; - -	if (kfd_interrupt_init(kfd)) { -		dev_err(kfd_device, "Error initializing interrupts\n"); -		goto kfd_interrupt_error; -	} - -	kfd->dqm = device_queue_manager_init(kfd); -	if (!kfd->dqm) { -		dev_err(kfd_device, "Error initializing queue manager\n"); -		goto device_queue_manager_error; -	} - -	/* If supported on this device, allocate global GWS that is shared -	 * by all KFD processes +	/* +	 * For GFX9.4.3, the KFD abstracts all partitions within a socket as +	 * xGMI connected in the topology so assign a unique hive id per +	 * device based on the pci device location if device is in PCIe mode.  	 */ -	if (kfd_gws_init(kfd)) { -		dev_err(kfd_device, "Could not allocate %d gws\n", -			kfd->adev->gds.gws_size); -		goto gws_error; -	} +	if (!kfd->hive_id && (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3)) && kfd->num_nodes > 1) +		kfd->hive_id = pci_dev_id(kfd->adev->pdev); + +	kfd->noretry = kfd->adev->gmc.noretry;  	/* If CRAT is broken, won't set iommu enabled */  	kfd_double_confirm_iommu_support(kfd); @@ -639,48 +738,100 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,  	kfd_cwsr_init(kfd); -	svm_migrate_init(kfd->adev); +	dev_info(kfd_device, "Total number of KFD nodes to be created: %d\n", +				kfd->num_nodes); -	if (kfd_resume_iommu(kfd)) -		goto device_iommu_error; +	/* Allocate the KFD nodes */ +	for (i = 0, xcp_idx = 0; i < kfd->num_nodes; i++) { +		node = kzalloc(sizeof(struct kfd_node), GFP_KERNEL); +		if (!node) +			goto node_alloc_error; -	if (kfd_resume(kfd)) -		goto kfd_resume_error; +		node->node_id = i; +		node->adev = kfd->adev; +		node->kfd = kfd; +		node->kfd2kgd = kfd->kfd2kgd; +		node->vm_info.vmid_num_kfd = vmid_num_kfd; +		node->xcp = amdgpu_get_next_xcp(kfd->adev->xcp_mgr, &xcp_idx); +		/* TODO : Check if error handling is needed */ +		if (node->xcp) { +			amdgpu_xcp_get_inst_details(node->xcp, AMDGPU_XCP_GFX, +						    &node->xcc_mask); +			++xcp_idx; +		} else { +			node->xcc_mask = +				(1U << NUM_XCC(kfd->adev->gfx.xcc_mask)) - 1; +		} -	amdgpu_amdkfd_get_local_mem_info(kfd->adev, &kfd->local_mem_info); +		if (node->xcp) { +			dev_info(kfd_device, "KFD node %d partition %d size %lldM\n", +				node->node_id, node->xcp->mem_id, +				KFD_XCP_MEMORY_SIZE(node->adev, node->node_id) >> 20); +		} -	if (kfd_topology_add_device(kfd)) { -		dev_err(kfd_device, "Error adding device to topology\n"); -		goto kfd_topology_add_device_error; +		if (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3) && +		    partition_mode == AMDGPU_CPX_PARTITION_MODE && +		    kfd->num_nodes != 1) { +			/* For GFX9.4.3 and CPX mode, first XCD gets VMID range +			 * 4-9 and second XCD gets VMID range 10-15. +			 */ + +			node->vm_info.first_vmid_kfd = (i%2 == 0) ? +						first_vmid_kfd : +						first_vmid_kfd+vmid_num_kfd; +			node->vm_info.last_vmid_kfd = (i%2 == 0) ? +						last_vmid_kfd-vmid_num_kfd : +						last_vmid_kfd; +			node->compute_vmid_bitmap = +				((0x1 << (node->vm_info.last_vmid_kfd + 1)) - 1) - +				((0x1 << (node->vm_info.first_vmid_kfd)) - 1); +		} else { +			node->vm_info.first_vmid_kfd = first_vmid_kfd; +			node->vm_info.last_vmid_kfd = last_vmid_kfd; +			node->compute_vmid_bitmap = +				gpu_resources->compute_vmid_bitmap; +		} +		node->max_proc_per_quantum = max_proc_per_quantum; +		atomic_set(&node->sram_ecc_flag, 0); + +		amdgpu_amdkfd_get_local_mem_info(kfd->adev, +					&node->local_mem_info, node->xcp); + +		/* Initialize the KFD node */ +		if (kfd_init_node(node)) { +			dev_err(kfd_device, "Error initializing KFD node\n"); +			goto node_init_error; +		} +		kfd->nodes[i] = node;  	} -	kfd_smi_init(kfd); +	svm_range_set_max_pages(kfd->adev); + +	if (kfd_resume_iommu(kfd)) +		goto kfd_resume_iommu_error; + +	spin_lock_init(&kfd->watch_points_lock);  	kfd->init_complete = true;  	dev_info(kfd_device, "added device %x:%x\n", kfd->adev->pdev->vendor,  		 kfd->adev->pdev->device);  	pr_debug("Starting kfd with the following scheduling policy %d\n", -		kfd->dqm->sched_policy); +		node->dqm->sched_policy);  	goto out; -kfd_topology_add_device_error: -kfd_resume_error: +kfd_resume_iommu_error: +node_init_error: +node_alloc_error: +	kfd_cleanup_nodes(kfd, i);  device_iommu_error: -gws_error: -	device_queue_manager_uninit(kfd->dqm); -device_queue_manager_error: -	kfd_interrupt_exit(kfd); -kfd_interrupt_error:  	kfd_doorbell_fini(kfd);  kfd_doorbell_error:  	kfd_gtt_sa_fini(kfd);  kfd_gtt_sa_init_error:  	amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem);  alloc_gtt_mem_failure: -	if (kfd->gws) -		amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);  	dev_err(kfd_device,  		"device %x:%x NOT added due to errors\n",  		kfd->adev->pdev->vendor, kfd->adev->pdev->device); @@ -691,15 +842,13 @@ out:  void kgd2kfd_device_exit(struct kfd_dev *kfd)  {  	if (kfd->init_complete) { -		device_queue_manager_uninit(kfd->dqm); -		kfd_interrupt_exit(kfd); -		kfd_topology_remove_device(kfd); +		/* Cleanup KFD nodes */ +		kfd_cleanup_nodes(kfd, kfd->num_nodes); +		/* Cleanup common/shared resources */  		kfd_doorbell_fini(kfd);  		ida_destroy(&kfd->doorbell_ida);  		kfd_gtt_sa_fini(kfd);  		amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem); -		if (kfd->gws) -			amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);  	}  	kfree(kfd); @@ -707,16 +856,23 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)  int kgd2kfd_pre_reset(struct kfd_dev *kfd)  { +	struct kfd_node *node; +	int i; +  	if (!kfd->init_complete)  		return 0; -	kfd_smi_event_update_gpu_reset(kfd, false); - -	kfd->dqm->ops.pre_reset(kfd->dqm); +	for (i = 0; i < kfd->num_nodes; i++) { +		node = kfd->nodes[i]; +		kfd_smi_event_update_gpu_reset(node, false); +		node->dqm->ops.pre_reset(node->dqm); +	}  	kgd2kfd_suspend(kfd, false); -	kfd_signal_reset_event(kfd); +	for (i = 0; i < kfd->num_nodes; i++) +		kfd_signal_reset_event(kfd->nodes[i]); +  	return 0;  } @@ -729,57 +885,83 @@ int kgd2kfd_pre_reset(struct kfd_dev *kfd)  int kgd2kfd_post_reset(struct kfd_dev *kfd)  {  	int ret; +	struct kfd_node *node; +	int i;  	if (!kfd->init_complete)  		return 0; -	ret = kfd_resume(kfd); -	if (ret) -		return ret; -	atomic_dec(&kfd_locked); +	for (i = 0; i < kfd->num_nodes; i++) { +		ret = kfd_resume(kfd->nodes[i]); +		if (ret) +			return ret; +	} -	atomic_set(&kfd->sram_ecc_flag, 0); +	mutex_lock(&kfd_processes_mutex); +	--kfd_locked; +	mutex_unlock(&kfd_processes_mutex); -	kfd_smi_event_update_gpu_reset(kfd, true); +	for (i = 0; i < kfd->num_nodes; i++) { +		node = kfd->nodes[i]; +		atomic_set(&node->sram_ecc_flag, 0); +		kfd_smi_event_update_gpu_reset(node, true); +	}  	return 0;  }  bool kfd_is_locked(void)  { -	return  (atomic_read(&kfd_locked) > 0); +	lockdep_assert_held(&kfd_processes_mutex); +	return  (kfd_locked > 0);  }  void kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm)  { +	struct kfd_node *node; +	int i; +	int count; +  	if (!kfd->init_complete)  		return;  	/* for runtime suspend, skip locking kfd */  	if (!run_pm) { +		mutex_lock(&kfd_processes_mutex); +		count = ++kfd_locked; +		mutex_unlock(&kfd_processes_mutex); +  		/* For first KFD device suspend all the KFD processes */ -		if (atomic_inc_return(&kfd_locked) == 1) +		if (count == 1)  			kfd_suspend_all_processes();  	} -	kfd->dqm->ops.stop(kfd->dqm); +	for (i = 0; i < kfd->num_nodes; i++) { +		node = kfd->nodes[i]; +		node->dqm->ops.stop(node->dqm); +	}  	kfd_iommu_suspend(kfd);  }  int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm)  { -	int ret, count; +	int ret, count, i;  	if (!kfd->init_complete)  		return 0; -	ret = kfd_resume(kfd); -	if (ret) -		return ret; +	for (i = 0; i < kfd->num_nodes; i++) { +		ret = kfd_resume(kfd->nodes[i]); +		if (ret) +			return ret; +	}  	/* for runtime resume, skip unlocking kfd */  	if (!run_pm) { -		count = atomic_dec_return(&kfd_locked); +		mutex_lock(&kfd_processes_mutex); +		count = --kfd_locked; +		mutex_unlock(&kfd_processes_mutex); +  		WARN_ONCE(count < 0, "KFD suspend / resume ref. error");  		if (count == 0)  			ret = kfd_resume_all_processes(); @@ -808,15 +990,15 @@ static int kfd_resume_iommu(struct kfd_dev *kfd)  	return err;  } -static int kfd_resume(struct kfd_dev *kfd) +static int kfd_resume(struct kfd_node *node)  {  	int err = 0; -	err = kfd->dqm->ops.start(kfd->dqm); +	err = node->dqm->ops.start(node->dqm);  	if (err)  		dev_err(kfd_device,  			"Error starting queue manager for device %x:%x\n", -			kfd->adev->pdev->vendor, kfd->adev->pdev->device); +			node->adev->pdev->vendor, node->adev->pdev->device);  	return err;  } @@ -839,9 +1021,10 @@ static inline void kfd_queue_work(struct workqueue_struct *wq,  /* This is called directly from KGD at ISR. */  void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)  { -	uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE]; +	uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE], i;  	bool is_patched = false;  	unsigned long flags; +	struct kfd_node *node;  	if (!kfd->init_complete)  		return; @@ -851,16 +1034,22 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)  		return;  	} -	spin_lock_irqsave(&kfd->interrupt_lock, flags); +	for (i = 0; i < kfd->num_nodes; i++) { +		node = kfd->nodes[i]; +		spin_lock_irqsave(&node->interrupt_lock, flags); -	if (kfd->interrupts_active -	    && interrupt_is_wanted(kfd, ih_ring_entry, -				   patched_ihre, &is_patched) -	    && enqueue_ih_ring_entry(kfd, -				     is_patched ? patched_ihre : ih_ring_entry)) -		kfd_queue_work(kfd->ih_wq, &kfd->interrupt_work); +		if (node->interrupts_active +		    && interrupt_is_wanted(node, ih_ring_entry, +			    	patched_ihre, &is_patched) +		    && enqueue_ih_ring_entry(node, +			    	is_patched ? patched_ihre : ih_ring_entry)) { +			kfd_queue_work(node->ih_wq, &node->interrupt_work); +			spin_unlock_irqrestore(&node->interrupt_lock, flags); +			return; +		} +		spin_unlock_irqrestore(&node->interrupt_lock, flags); +	} -	spin_unlock_irqrestore(&kfd->interrupt_lock, flags);  }  int kgd2kfd_quiesce_mm(struct mm_struct *mm, uint32_t trigger) @@ -998,10 +1187,11 @@ static inline uint32_t *kfd_gtt_sa_calc_cpu_addr(void *start_addr,  	return (uint32_t *) ((uint64_t) start_addr + bit_num * chunk_size);  } -int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int size, +int kfd_gtt_sa_allocate(struct kfd_node *node, unsigned int size,  			struct kfd_mem_obj **mem_obj)  {  	unsigned int found, start_search, cur_size; +	struct kfd_dev *kfd = node->kfd;  	if (size == 0)  		return -EINVAL; @@ -1101,8 +1291,10 @@ kfd_gtt_no_free_chunk:  	return -ENOMEM;  } -int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj) +int kfd_gtt_sa_free(struct kfd_node *node, struct kfd_mem_obj *mem_obj)  { +	struct kfd_dev *kfd = node->kfd; +  	/* Act like kfree when trying to free a NULL object */  	if (!mem_obj)  		return 0; @@ -1124,29 +1316,40 @@ int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj)  void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)  { +	/* +	 * TODO: Currently update SRAM ECC flag for first node. +	 * This needs to be updated later when we can +	 * identify SRAM ECC error on other nodes also. +	 */  	if (kfd) -		atomic_inc(&kfd->sram_ecc_flag); +		atomic_inc(&kfd->nodes[0]->sram_ecc_flag);  } -void kfd_inc_compute_active(struct kfd_dev *kfd) +void kfd_inc_compute_active(struct kfd_node *node)  { -	if (atomic_inc_return(&kfd->compute_profile) == 1) -		amdgpu_amdkfd_set_compute_idle(kfd->adev, false); +	if (atomic_inc_return(&node->kfd->compute_profile) == 1) +		amdgpu_amdkfd_set_compute_idle(node->adev, false);  } -void kfd_dec_compute_active(struct kfd_dev *kfd) +void kfd_dec_compute_active(struct kfd_node *node)  { -	int count = atomic_dec_return(&kfd->compute_profile); +	int count = atomic_dec_return(&node->kfd->compute_profile);  	if (count == 0) -		amdgpu_amdkfd_set_compute_idle(kfd->adev, true); +		amdgpu_amdkfd_set_compute_idle(node->adev, true);  	WARN_ONCE(count < 0, "Compute profile ref. count error");  }  void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)  { +	/* +	 * TODO: For now, raise the throttling event only on first node. +	 * This will need to change after we are able to determine +	 * which node raised the throttling event. +	 */  	if (kfd && kfd->init_complete) -		kfd_smi_event_update_thermal_throttling(kfd, throttle_bitmask); +		kfd_smi_event_update_thermal_throttling(kfd->nodes[0], +							throttle_bitmask);  }  /* kfd_get_num_sdma_engines returns the number of PCIe optimized SDMA and @@ -1154,19 +1357,41 @@ void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)   * When the device has more than two engines, we reserve two for PCIe to enable   * full-duplex and the rest are used as XGMI.   */ -unsigned int kfd_get_num_sdma_engines(struct kfd_dev *kdev) +unsigned int kfd_get_num_sdma_engines(struct kfd_node *node)  {  	/* If XGMI is not supported, all SDMA engines are PCIe */ -	if (!kdev->adev->gmc.xgmi.supported) -		return kdev->adev->sdma.num_instances; +	if (!node->adev->gmc.xgmi.supported) +		return node->adev->sdma.num_instances/(int)node->kfd->num_nodes; -	return min(kdev->adev->sdma.num_instances, 2); +	return min(node->adev->sdma.num_instances/(int)node->kfd->num_nodes, 2);  } -unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_dev *kdev) +unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_node *node)  {  	/* After reserved for PCIe, the rest of engines are XGMI */ -	return kdev->adev->sdma.num_instances - kfd_get_num_sdma_engines(kdev); +	return node->adev->sdma.num_instances/(int)node->kfd->num_nodes - +		kfd_get_num_sdma_engines(node); +} + +int kgd2kfd_check_and_lock_kfd(void) +{ +	mutex_lock(&kfd_processes_mutex); +	if (!hash_empty(kfd_processes_table) || kfd_is_locked()) { +		mutex_unlock(&kfd_processes_mutex); +		return -EBUSY; +	} + +	++kfd_locked; +	mutex_unlock(&kfd_processes_mutex); + +	return 0; +} + +void kgd2kfd_unlock_kfd(void) +{ +	mutex_lock(&kfd_processes_mutex); +	--kfd_locked; +	mutex_unlock(&kfd_processes_mutex);  }  #if defined(CONFIG_DEBUG_FS) @@ -1174,7 +1399,7 @@ unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_dev *kdev)  /* This function will send a package to HIQ to hang the HWS   * which will trigger a GPU reset and bring the HWS back to normal state   */ -int kfd_debugfs_hang_hws(struct kfd_dev *dev) +int kfd_debugfs_hang_hws(struct kfd_node *dev)  {  	if (dev->dqm->sched_policy != KFD_SCHED_POLICY_HWS) {  		pr_err("HWS is not enabled"); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index 7a95698d83f7..d6b15493fffd 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c @@ -36,6 +36,7 @@  #include "kfd_kernel_queue.h"  #include "amdgpu_amdkfd.h"  #include "mes_api_def.h" +#include "kfd_debug.h"  /* Size of the per-pipe EOP queue */  #define CIK_HPD_EOP_BYTES_LOG2 11 @@ -46,10 +47,13 @@ static int set_pasid_vmid_mapping(struct device_queue_manager *dqm,  static int execute_queues_cpsch(struct device_queue_manager *dqm,  				enum kfd_unmap_queues_filter filter, -				uint32_t filter_param); +				uint32_t filter_param, +				uint32_t grace_period);  static int unmap_queues_cpsch(struct device_queue_manager *dqm,  				enum kfd_unmap_queues_filter filter, -				uint32_t filter_param, bool reset); +				uint32_t filter_param, +				uint32_t grace_period, +				bool reset);  static int map_queues_cpsch(struct device_queue_manager *dqm); @@ -74,31 +78,31 @@ enum KFD_MQD_TYPE get_mqd_type_from_queue_type(enum kfd_queue_type type)  static bool is_pipe_enabled(struct device_queue_manager *dqm, int mec, int pipe)  {  	int i; -	int pipe_offset = (mec * dqm->dev->shared_resources.num_pipe_per_mec -		+ pipe) * dqm->dev->shared_resources.num_queue_per_pipe; +	int pipe_offset = (mec * dqm->dev->kfd->shared_resources.num_pipe_per_mec +		+ pipe) * dqm->dev->kfd->shared_resources.num_queue_per_pipe;  	/* queue is available for KFD usage if bit is 1 */ -	for (i = 0; i <  dqm->dev->shared_resources.num_queue_per_pipe; ++i) +	for (i = 0; i <  dqm->dev->kfd->shared_resources.num_queue_per_pipe; ++i)  		if (test_bit(pipe_offset + i, -			      dqm->dev->shared_resources.cp_queue_bitmap)) +			      dqm->dev->kfd->shared_resources.cp_queue_bitmap))  			return true;  	return false;  }  unsigned int get_cp_queues_num(struct device_queue_manager *dqm)  { -	return bitmap_weight(dqm->dev->shared_resources.cp_queue_bitmap, +	return bitmap_weight(dqm->dev->kfd->shared_resources.cp_queue_bitmap,  				KGD_MAX_QUEUES);  }  unsigned int get_queues_per_pipe(struct device_queue_manager *dqm)  { -	return dqm->dev->shared_resources.num_queue_per_pipe; +	return dqm->dev->kfd->shared_resources.num_queue_per_pipe;  }  unsigned int get_pipes_per_mec(struct device_queue_manager *dqm)  { -	return dqm->dev->shared_resources.num_pipe_per_mec; +	return dqm->dev->kfd->shared_resources.num_pipe_per_mec;  }  static unsigned int get_num_all_sdma_engines(struct device_queue_manager *dqm) @@ -110,29 +114,40 @@ static unsigned int get_num_all_sdma_engines(struct device_queue_manager *dqm)  unsigned int get_num_sdma_queues(struct device_queue_manager *dqm)  {  	return kfd_get_num_sdma_engines(dqm->dev) * -		dqm->dev->device_info.num_sdma_queues_per_engine; +		dqm->dev->kfd->device_info.num_sdma_queues_per_engine;  }  unsigned int get_num_xgmi_sdma_queues(struct device_queue_manager *dqm)  {  	return kfd_get_num_xgmi_sdma_engines(dqm->dev) * -		dqm->dev->device_info.num_sdma_queues_per_engine; +		dqm->dev->kfd->device_info.num_sdma_queues_per_engine;  } -static inline uint64_t get_reserved_sdma_queues_bitmap(struct device_queue_manager *dqm) +static void init_sdma_bitmaps(struct device_queue_manager *dqm)  { -	return dqm->dev->device_info.reserved_sdma_queues_bitmap; +	bitmap_zero(dqm->sdma_bitmap, KFD_MAX_SDMA_QUEUES); +	bitmap_set(dqm->sdma_bitmap, 0, get_num_sdma_queues(dqm)); + +	bitmap_zero(dqm->xgmi_sdma_bitmap, KFD_MAX_SDMA_QUEUES); +	bitmap_set(dqm->xgmi_sdma_bitmap, 0, get_num_xgmi_sdma_queues(dqm)); + +	/* Mask out the reserved queues */ +	bitmap_andnot(dqm->sdma_bitmap, dqm->sdma_bitmap, +		      dqm->dev->kfd->device_info.reserved_sdma_queues_bitmap, +		      KFD_MAX_SDMA_QUEUES);  }  void program_sh_mem_settings(struct device_queue_manager *dqm,  					struct qcm_process_device *qpd)  { -	return dqm->dev->kfd2kgd->program_sh_mem_settings( -						dqm->dev->adev, qpd->vmid, -						qpd->sh_mem_config, -						qpd->sh_mem_ape1_base, -						qpd->sh_mem_ape1_limit, -						qpd->sh_mem_bases); +	uint32_t xcc_mask = dqm->dev->xcc_mask; +	int xcc_id; + +	for_each_inst(xcc_id, xcc_mask) +		dqm->dev->kfd2kgd->program_sh_mem_settings( +			dqm->dev->adev, qpd->vmid, qpd->sh_mem_config, +			qpd->sh_mem_ape1_base, qpd->sh_mem_ape1_limit, +			qpd->sh_mem_bases, xcc_id);  }  static void kfd_hws_hang(struct device_queue_manager *dqm) @@ -211,6 +226,9 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,  	queue_input.paging = false;  	queue_input.tba_addr = qpd->tba_addr;  	queue_input.tma_addr = qpd->tma_addr; +	queue_input.trap_en = KFD_GC_VERSION(q->device) < IP_VERSION(11, 0, 0) || +			      KFD_GC_VERSION(q->device) >= IP_VERSION(12, 0, 0); +	queue_input.skip_process_ctx_clear = qpd->pqm->process->debug_trap_enabled;  	queue_type = convert_to_mes_queue_type(q->properties.type);  	if (queue_type < 0) { @@ -330,7 +348,7 @@ static int allocate_doorbell(struct qcm_process_device *qpd,  			     struct queue *q,  			     uint32_t const *restore_id)  { -	struct kfd_dev *dev = qpd->dqm->dev; +	struct kfd_node *dev = qpd->dqm->dev;  	if (!KFD_IS_SOC15(dev)) {  		/* On pre-SOC15 chips we need to use the queue ID to @@ -349,8 +367,17 @@ static int allocate_doorbell(struct qcm_process_device *qpd,  		 * for a SDMA engine is 512.  		 */ -		uint32_t *idx_offset = dev->shared_resources.sdma_doorbell_idx; -		uint32_t valid_id = idx_offset[q->properties.sdma_engine_id] +		uint32_t *idx_offset = dev->kfd->shared_resources.sdma_doorbell_idx; + +		/* +		 * q->properties.sdma_engine_id corresponds to the virtual +		 * sdma engine number. However, for doorbell allocation, +		 * we need the physical sdma engine id in order to get the +		 * correct doorbell offset. +		 */ +		uint32_t valid_id = idx_offset[qpd->dqm->dev->node_id * +					       get_num_all_sdma_engines(qpd->dqm) + +					       q->properties.sdma_engine_id]  						+ (q->properties.sdma_queue_id & 1)  						* KFD_QUEUE_DOORBELL_MIRROR_OFFSET  						+ (q->properties.sdma_queue_id >> 1); @@ -382,7 +409,7 @@ static int allocate_doorbell(struct qcm_process_device *qpd,  	}  	q->properties.doorbell_off = -		kfd_get_doorbell_dw_offset_in_bar(dev, qpd_to_pdd(qpd), +		kfd_get_doorbell_dw_offset_in_bar(dev->kfd, qpd_to_pdd(qpd),  					  q->doorbell_id);  	return 0;  } @@ -391,7 +418,7 @@ static void deallocate_doorbell(struct qcm_process_device *qpd,  				struct queue *q)  {  	unsigned int old; -	struct kfd_dev *dev = qpd->dqm->dev; +	struct kfd_node *dev = qpd->dqm->dev;  	if (!KFD_IS_SOC15(dev) ||  	    q->properties.type == KFD_QUEUE_TYPE_SDMA || @@ -405,10 +432,14 @@ static void deallocate_doorbell(struct qcm_process_device *qpd,  static void program_trap_handler_settings(struct device_queue_manager *dqm,  				struct qcm_process_device *qpd)  { +	uint32_t xcc_mask = dqm->dev->xcc_mask; +	int xcc_id; +  	if (dqm->dev->kfd2kgd->program_trap_handler_settings) -		dqm->dev->kfd2kgd->program_trap_handler_settings( -						dqm->dev->adev, qpd->vmid, -						qpd->tba_addr, qpd->tma_addr); +		for_each_inst(xcc_id, xcc_mask) +			dqm->dev->kfd2kgd->program_trap_handler_settings( +				dqm->dev->adev, qpd->vmid, qpd->tba_addr, +				qpd->tma_addr, xcc_id);  }  static int allocate_vmid(struct device_queue_manager *dqm, @@ -441,7 +472,7 @@ static int allocate_vmid(struct device_queue_manager *dqm,  	program_sh_mem_settings(dqm, qpd); -	if (KFD_IS_SOC15(dqm->dev) && dqm->dev->cwsr_enabled) +	if (KFD_IS_SOC15(dqm->dev) && dqm->dev->kfd->cwsr_enabled)  		program_trap_handler_settings(dqm, qpd);  	/* qpd->page_table_base is set earlier when register_process() @@ -460,7 +491,7 @@ static int allocate_vmid(struct device_queue_manager *dqm,  	return 0;  } -static int flush_texture_cache_nocpsch(struct kfd_dev *kdev, +static int flush_texture_cache_nocpsch(struct kfd_node *kdev,  				struct qcm_process_device *qpd)  {  	const struct packet_manager_funcs *pmf = qpd->dqm->packet_mgr.pmf; @@ -661,7 +692,7 @@ static inline void deallocate_hqd(struct device_queue_manager *dqm,  #define SQ_IND_CMD_CMD_KILL		0x00000003  #define SQ_IND_CMD_MODE_BROADCAST	0x00000001 -static int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p) +static int dbgdev_wave_reset_wavefronts(struct kfd_node *dev, struct kfd_process *p)  {  	int status = 0;  	unsigned int vmid; @@ -671,6 +702,8 @@ static int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process  	struct kfd_process_device *pdd;  	int first_vmid_to_scan = dev->vm_info.first_vmid_kfd;  	int last_vmid_to_scan = dev->vm_info.last_vmid_kfd; +	uint32_t xcc_mask = dev->xcc_mask; +	int xcc_id;  	reg_sq_cmd.u32All = 0;  	reg_gfx_index.u32All = 0; @@ -715,9 +748,10 @@ static int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process  	reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_KILL;  	reg_sq_cmd.bits.vm_id = vmid; -	dev->kfd2kgd->wave_control_execute(dev->adev, -					reg_gfx_index.u32All, -					reg_sq_cmd.u32All); +	for_each_inst(xcc_id, xcc_mask) +		dev->kfd2kgd->wave_control_execute( +			dev->adev, reg_gfx_index.u32All, +			reg_sq_cmd.u32All, xcc_id);  	return 0;  } @@ -837,9 +871,9 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,  	/* Make sure the queue is unmapped before updating the MQD */  	if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) { -		if (!dqm->dev->shared_resources.enable_mes) +		if (!dqm->dev->kfd->shared_resources.enable_mes)  			retval = unmap_queues_cpsch(dqm, -						    KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false); +						    KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD, false);  		else if (prev_active)  			retval = remove_queue_mes(dqm, q, &pdd->qpd); @@ -858,7 +892,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,  		}  		retval = mqd_mgr->destroy_mqd(mqd_mgr, q->mqd, -				(dqm->dev->cwsr_enabled ? +				(dqm->dev->kfd->cwsr_enabled ?  				 KFD_PREEMPT_TYPE_WAVEFRONT_SAVE :  				 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN),  				KFD_UNMAP_LATENCY_MS, q->pipe, q->queue); @@ -895,7 +929,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q,  	}  	if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) { -		if (!dqm->dev->shared_resources.enable_mes) +		if (!dqm->dev->kfd->shared_resources.enable_mes)  			retval = map_queues_cpsch(dqm);  		else if (q->properties.is_active)  			retval = add_queue_mes(dqm, q, &pdd->qpd); @@ -917,6 +951,92 @@ out_unlock:  	return retval;  } +/* suspend_single_queue does not lock the dqm like the + * evict_process_queues_cpsch or evict_process_queues_nocpsch. You should + * lock the dqm before calling, and unlock after calling. + * + * The reason we don't lock the dqm is because this function may be + * called on multiple queues in a loop, so rather than locking/unlocking + * multiple times, we will just keep the dqm locked for all of the calls. + */ +static int suspend_single_queue(struct device_queue_manager *dqm, +				      struct kfd_process_device *pdd, +				      struct queue *q) +{ +	bool is_new; + +	if (q->properties.is_suspended) +		return 0; + +	pr_debug("Suspending PASID %u queue [%i]\n", +			pdd->process->pasid, +			q->properties.queue_id); + +	is_new = q->properties.exception_status & KFD_EC_MASK(EC_QUEUE_NEW); + +	if (is_new || q->properties.is_being_destroyed) { +		pr_debug("Suspend: skip %s queue id %i\n", +				is_new ? "new" : "destroyed", +				q->properties.queue_id); +		return -EBUSY; +	} + +	q->properties.is_suspended = true; +	if (q->properties.is_active) { +		if (dqm->dev->kfd->shared_resources.enable_mes) { +			int r = remove_queue_mes(dqm, q, &pdd->qpd); + +			if (r) +				return r; +		} + +		decrement_queue_count(dqm, &pdd->qpd, q); +		q->properties.is_active = false; +	} + +	return 0; +} + +/* resume_single_queue does not lock the dqm like the functions + * restore_process_queues_cpsch or restore_process_queues_nocpsch. You should + * lock the dqm before calling, and unlock after calling. + * + * The reason we don't lock the dqm is because this function may be + * called on multiple queues in a loop, so rather than locking/unlocking + * multiple times, we will just keep the dqm locked for all of the calls. + */ +static int resume_single_queue(struct device_queue_manager *dqm, +				      struct qcm_process_device *qpd, +				      struct queue *q) +{ +	struct kfd_process_device *pdd; + +	if (!q->properties.is_suspended) +		return 0; + +	pdd = qpd_to_pdd(qpd); + +	pr_debug("Restoring from suspend PASID %u queue [%i]\n", +			    pdd->process->pasid, +			    q->properties.queue_id); + +	q->properties.is_suspended = false; + +	if (QUEUE_IS_ACTIVE(q->properties)) { +		if (dqm->dev->kfd->shared_resources.enable_mes) { +			int r = add_queue_mes(dqm, q, &pdd->qpd); + +			if (r) +				return r; +		} + +		q->properties.is_active = true; +		increment_queue_count(dqm, qpd, q); +	} + +	return 0; +} +  static int evict_process_queues_nocpsch(struct device_queue_manager *dqm,  					struct qcm_process_device *qpd)  { @@ -951,7 +1071,7 @@ static int evict_process_queues_nocpsch(struct device_queue_manager *dqm,  			continue;  		retval = mqd_mgr->destroy_mqd(mqd_mgr, q->mqd, -				(dqm->dev->cwsr_enabled ? +				(dqm->dev->kfd->cwsr_enabled ?  				 KFD_PREEMPT_TYPE_WAVEFRONT_SAVE :  				 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN),  				KFD_UNMAP_LATENCY_MS, q->pipe, q->queue); @@ -979,6 +1099,14 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,  		goto out;  	pdd = qpd_to_pdd(qpd); + +	/* The debugger creates processes that temporarily have not acquired +	 * all VMs for all devices and has no VMs itself. +	 * Skip queue eviction on process eviction. +	 */ +	if (!pdd->drm_priv) +		goto out; +  	pr_debug_ratelimited("Evicting PASID 0x%x queues\n",  			    pdd->process->pasid); @@ -993,7 +1121,7 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,  		q->properties.is_active = false;  		decrement_queue_count(dqm, qpd, q); -		if (dqm->dev->shared_resources.enable_mes) { +		if (dqm->dev->kfd->shared_resources.enable_mes) {  			retval = remove_queue_mes(dqm, q, qpd);  			if (retval) {  				pr_err("Failed to evict queue %d\n", @@ -1003,11 +1131,12 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm,  		}  	}  	pdd->last_evict_timestamp = get_jiffies_64(); -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		retval = execute_queues_cpsch(dqm,  					      qpd->is_debug ?  					      KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES : -					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, +					      USE_DEFAULT_GRACE_PERIOD);  out:  	dqm_unlock(dqm); @@ -1100,13 +1229,10 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,  {  	struct queue *q;  	struct kfd_process_device *pdd; -	uint64_t pd_base;  	uint64_t eviction_duration;  	int retval = 0;  	pdd = qpd_to_pdd(qpd); -	/* Retrieve PD base */ -	pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->drm_priv);  	dqm_lock(dqm);  	if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */ @@ -1116,12 +1242,19 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,  		goto out;  	} +	/* The debugger creates processes that temporarily have not acquired +	 * all VMs for all devices and has no VMs itself. +	 * Skip queue restore on process restore. +	 */ +	if (!pdd->drm_priv) +		goto vm_not_acquired; +  	pr_debug_ratelimited("Restoring PASID 0x%x queues\n",  			    pdd->process->pasid);  	/* Update PD Base in QPD */ -	qpd->page_table_base = pd_base; -	pr_debug("Updated PD address to 0x%llx\n", pd_base); +	qpd->page_table_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->drm_priv); +	pr_debug("Updated PD address to 0x%llx\n", qpd->page_table_base);  	/* activate all active queues on the qpd */  	list_for_each_entry(q, &qpd->queues_list, list) { @@ -1132,7 +1265,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,  		q->properties.is_active = true;  		increment_queue_count(dqm, &pdd->qpd, q); -		if (dqm->dev->shared_resources.enable_mes) { +		if (dqm->dev->kfd->shared_resources.enable_mes) {  			retval = add_queue_mes(dqm, q, qpd);  			if (retval) {  				pr_err("Failed to restore queue %d\n", @@ -1141,12 +1274,13 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,  			}  		}  	} -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		retval = execute_queues_cpsch(dqm, -					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); -	qpd->evicted = 0; +					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);  	eviction_duration = get_jiffies_64() - pdd->last_evict_timestamp;  	atomic64_add(eviction_duration, &pdd->evict_duration_counter); +vm_not_acquired: +	qpd->evicted = 0;  out:  	dqm_unlock(dqm);  	return retval; @@ -1229,35 +1363,32 @@ static int  set_pasid_vmid_mapping(struct device_queue_manager *dqm, u32 pasid,  			unsigned int vmid)  { -	return dqm->dev->kfd2kgd->set_pasid_vmid_mapping( -						dqm->dev->adev, pasid, vmid); -} +	uint32_t xcc_mask = dqm->dev->xcc_mask; +	int xcc_id, ret; -static void init_interrupts(struct device_queue_manager *dqm) -{ -	unsigned int i; +	for_each_inst(xcc_id, xcc_mask) { +		ret = dqm->dev->kfd2kgd->set_pasid_vmid_mapping( +			dqm->dev->adev, pasid, vmid, xcc_id); +		if (ret) +			break; +	} -	for (i = 0 ; i < get_pipes_per_mec(dqm) ; i++) -		if (is_pipe_enabled(dqm, 0, i)) -			dqm->dev->kfd2kgd->init_interrupts(dqm->dev->adev, i); +	return ret;  } -static void init_sdma_bitmaps(struct device_queue_manager *dqm) +static void init_interrupts(struct device_queue_manager *dqm)  { -	unsigned int num_sdma_queues = -		min_t(unsigned int, sizeof(dqm->sdma_bitmap)*8, -		      get_num_sdma_queues(dqm)); -	unsigned int num_xgmi_sdma_queues = -		min_t(unsigned int, sizeof(dqm->xgmi_sdma_bitmap)*8, -		      get_num_xgmi_sdma_queues(dqm)); - -	if (num_sdma_queues) -		dqm->sdma_bitmap = GENMASK_ULL(num_sdma_queues-1, 0); -	if (num_xgmi_sdma_queues) -		dqm->xgmi_sdma_bitmap = GENMASK_ULL(num_xgmi_sdma_queues-1, 0); +	uint32_t xcc_mask = dqm->dev->xcc_mask; +	unsigned int i, xcc_id; -	dqm->sdma_bitmap &= ~get_reserved_sdma_queues_bitmap(dqm); -	pr_info("sdma_bitmap: %llx\n", dqm->sdma_bitmap); +	for_each_inst(xcc_id, xcc_mask) { +		for (i = 0 ; i < get_pipes_per_mec(dqm) ; i++) { +			if (is_pipe_enabled(dqm, 0, i)) { +				dqm->dev->kfd2kgd->init_interrupts( +					dqm->dev->adev, i, xcc_id); +			} +		} +	}  }  static int initialize_nocpsch(struct device_queue_manager *dqm) @@ -1282,7 +1413,7 @@ static int initialize_nocpsch(struct device_queue_manager *dqm)  		for (queue = 0; queue < get_queues_per_pipe(dqm); queue++)  			if (test_bit(pipe_offset + queue, -				     dqm->dev->shared_resources.cp_queue_bitmap)) +				     dqm->dev->kfd->shared_resources.cp_queue_bitmap))  				dqm->allocated_queues[pipe] |= 1 << queue;  	} @@ -1322,9 +1453,16 @@ static int start_nocpsch(struct device_queue_manager *dqm)  static int stop_nocpsch(struct device_queue_manager *dqm)  { +	dqm_lock(dqm); +	if (!dqm->sched_running) { +		dqm_unlock(dqm); +		return 0; +	} +  	if (dqm->dev->adev->asic_type == CHIP_HAWAII)  		pm_uninit(&dqm->packet_mgr, false);  	dqm->sched_running = false; +	dqm_unlock(dqm);  	return 0;  } @@ -1342,46 +1480,48 @@ static int allocate_sdma_queue(struct device_queue_manager *dqm,  	int bit;  	if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { -		if (dqm->sdma_bitmap == 0) { +		if (bitmap_empty(dqm->sdma_bitmap, KFD_MAX_SDMA_QUEUES)) {  			pr_err("No more SDMA queue to allocate\n");  			return -ENOMEM;  		}  		if (restore_sdma_id) {  			/* Re-use existing sdma_id */ -			if (!(dqm->sdma_bitmap & (1ULL << *restore_sdma_id))) { +			if (!test_bit(*restore_sdma_id, dqm->sdma_bitmap)) {  				pr_err("SDMA queue already in use\n");  				return -EBUSY;  			} -			dqm->sdma_bitmap &= ~(1ULL << *restore_sdma_id); +			clear_bit(*restore_sdma_id, dqm->sdma_bitmap);  			q->sdma_id = *restore_sdma_id;  		} else {  			/* Find first available sdma_id */ -			bit = __ffs64(dqm->sdma_bitmap); -			dqm->sdma_bitmap &= ~(1ULL << bit); +			bit = find_first_bit(dqm->sdma_bitmap, +					     get_num_sdma_queues(dqm)); +			clear_bit(bit, dqm->sdma_bitmap);  			q->sdma_id = bit;  		} -		q->properties.sdma_engine_id = q->sdma_id % -				kfd_get_num_sdma_engines(dqm->dev); +		q->properties.sdma_engine_id = +			q->sdma_id % kfd_get_num_sdma_engines(dqm->dev);  		q->properties.sdma_queue_id = q->sdma_id /  				kfd_get_num_sdma_engines(dqm->dev);  	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) { -		if (dqm->xgmi_sdma_bitmap == 0) { +		if (bitmap_empty(dqm->xgmi_sdma_bitmap, KFD_MAX_SDMA_QUEUES)) {  			pr_err("No more XGMI SDMA queue to allocate\n");  			return -ENOMEM;  		}  		if (restore_sdma_id) {  			/* Re-use existing sdma_id */ -			if (!(dqm->xgmi_sdma_bitmap & (1ULL << *restore_sdma_id))) { +			if (!test_bit(*restore_sdma_id, dqm->xgmi_sdma_bitmap)) {  				pr_err("SDMA queue already in use\n");  				return -EBUSY;  			} -			dqm->xgmi_sdma_bitmap &= ~(1ULL << *restore_sdma_id); +			clear_bit(*restore_sdma_id, dqm->xgmi_sdma_bitmap);  			q->sdma_id = *restore_sdma_id;  		} else { -			bit = __ffs64(dqm->xgmi_sdma_bitmap); -			dqm->xgmi_sdma_bitmap &= ~(1ULL << bit); +			bit = find_first_bit(dqm->xgmi_sdma_bitmap, +					     get_num_xgmi_sdma_queues(dqm)); +			clear_bit(bit, dqm->xgmi_sdma_bitmap);  			q->sdma_id = bit;  		}  		/* sdma_engine_id is sdma id including @@ -1409,11 +1549,11 @@ static void deallocate_sdma_queue(struct device_queue_manager *dqm,  	if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {  		if (q->sdma_id >= get_num_sdma_queues(dqm))  			return; -		dqm->sdma_bitmap |= (1ULL << q->sdma_id); +		set_bit(q->sdma_id, dqm->sdma_bitmap);  	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {  		if (q->sdma_id >= get_num_xgmi_sdma_queues(dqm))  			return; -		dqm->xgmi_sdma_bitmap |= (1ULL << q->sdma_id); +		set_bit(q->sdma_id, dqm->xgmi_sdma_bitmap);  	}  } @@ -1426,14 +1566,14 @@ static int set_sched_resources(struct device_queue_manager *dqm)  	int i, mec;  	struct scheduling_resources res; -	res.vmid_mask = dqm->dev->shared_resources.compute_vmid_bitmap; +	res.vmid_mask = dqm->dev->compute_vmid_bitmap;  	res.queue_mask = 0;  	for (i = 0; i < KGD_MAX_QUEUES; ++i) { -		mec = (i / dqm->dev->shared_resources.num_queue_per_pipe) -			/ dqm->dev->shared_resources.num_pipe_per_mec; +		mec = (i / dqm->dev->kfd->shared_resources.num_queue_per_pipe) +			/ dqm->dev->kfd->shared_resources.num_pipe_per_mec; -		if (!test_bit(i, dqm->dev->shared_resources.cp_queue_bitmap)) +		if (!test_bit(i, dqm->dev->kfd->shared_resources.cp_queue_bitmap))  			continue;  		/* only acquire queues from the first MEC */ @@ -1475,9 +1615,13 @@ static int initialize_cpsch(struct device_queue_manager *dqm)  	dqm->gws_queue_count = 0;  	dqm->active_runlist = false;  	INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception); +	dqm->trap_debug_vmid = 0;  	init_sdma_bitmaps(dqm); +	if (dqm->dev->kfd2kgd->get_iq_wait_times) +		dqm->dev->kfd2kgd->get_iq_wait_times(dqm->dev->adev, +					&dqm->wait_times);  	return 0;  } @@ -1489,7 +1633,7 @@ static int start_cpsch(struct device_queue_manager *dqm)  	dqm_lock(dqm); -	if (!dqm->dev->shared_resources.enable_mes) { +	if (!dqm->dev->kfd->shared_resources.enable_mes) {  		retval = pm_init(&dqm->packet_mgr, dqm);  		if (retval)  			goto fail_packet_manager_init; @@ -1516,14 +1660,15 @@ static int start_cpsch(struct device_queue_manager *dqm)  	dqm->is_hws_hang = false;  	dqm->is_resetting = false;  	dqm->sched_running = true; -	if (!dqm->dev->shared_resources.enable_mes) -		execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); + +	if (!dqm->dev->kfd->shared_resources.enable_mes) +		execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);  	dqm_unlock(dqm);  	return 0;  fail_allocate_vidmem:  fail_set_sched_resources: -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		pm_uninit(&dqm->packet_mgr, false);  fail_packet_manager_init:  	dqm_unlock(dqm); @@ -1541,8 +1686,8 @@ static int stop_cpsch(struct device_queue_manager *dqm)  	}  	if (!dqm->is_hws_hang) { -		if (!dqm->dev->shared_resources.enable_mes) -			unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, false); +		if (!dqm->dev->kfd->shared_resources.enable_mes) +			unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD, false);  		else  			remove_all_queues_mes(dqm);  	} @@ -1550,11 +1695,11 @@ static int stop_cpsch(struct device_queue_manager *dqm)  	hanging = dqm->is_hws_hang || dqm->is_resetting;  	dqm->sched_running = false; -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		pm_release_ib(&dqm->packet_mgr);  	kfd_gtt_sa_free(dqm->dev, dqm->fence_mem); -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		pm_uninit(&dqm->packet_mgr, hanging);  	dqm_unlock(dqm); @@ -1584,7 +1729,8 @@ static int create_kernel_queue_cpsch(struct device_queue_manager *dqm,  	list_add(&kq->list, &qpd->priv_queue_list);  	increment_queue_count(dqm, qpd, kq->queue);  	qpd->is_debug = true; -	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, +			USE_DEFAULT_GRACE_PERIOD);  	dqm_unlock(dqm);  	return 0; @@ -1598,7 +1744,8 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm,  	list_del(&kq->list);  	decrement_queue_count(dqm, qpd, kq->queue);  	qpd->is_debug = false; -	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0); +	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, +			USE_DEFAULT_GRACE_PERIOD);  	/*  	 * Unconditionally decrement this counter, regardless of the queue's  	 * type. @@ -1658,6 +1805,9 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,  	 * updates the is_evicted flag but is a no-op otherwise.  	 */  	q->properties.is_evicted = !!qpd->evicted; +	q->properties.is_dbg_wa = qpd->pqm->process->debug_trap_enabled && +			KFD_GC_VERSION(q->device) >= IP_VERSION(11, 0, 0) && +			KFD_GC_VERSION(q->device) < IP_VERSION(12, 0, 0);  	if (qd)  		mqd_mgr->restore_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj, &q->gart_mqd_addr, @@ -1673,9 +1823,9 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,  	if (q->properties.is_active) {  		increment_queue_count(dqm, qpd, q); -		if (!dqm->dev->shared_resources.enable_mes) +		if (!dqm->dev->kfd->shared_resources.enable_mes)  			retval = execute_queues_cpsch(dqm, -					KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +					KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);  		else  			retval = add_queue_mes(dqm, q, qpd);  		if (retval) @@ -1764,7 +1914,9 @@ static int map_queues_cpsch(struct device_queue_manager *dqm)  /* dqm->lock mutex has to be locked before calling this function */  static int unmap_queues_cpsch(struct device_queue_manager *dqm,  				enum kfd_unmap_queues_filter filter, -				uint32_t filter_param, bool reset) +				uint32_t filter_param, +				uint32_t grace_period, +				bool reset)  {  	int retval = 0;  	struct mqd_manager *mqd_mgr; @@ -1776,6 +1928,12 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm,  	if (!dqm->active_runlist)  		return retval; +	if (grace_period != USE_DEFAULT_GRACE_PERIOD) { +		retval = pm_update_grace_period(&dqm->packet_mgr, grace_period); +		if (retval) +			return retval; +	} +  	retval = pm_send_unmap_queue(&dqm->packet_mgr, filter, filter_param, reset);  	if (retval)  		return retval; @@ -1808,6 +1966,13 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm,  		return -ETIME;  	} +	/* We need to reset the grace period value for this device */ +	if (grace_period != USE_DEFAULT_GRACE_PERIOD) { +		if (pm_update_grace_period(&dqm->packet_mgr, +					USE_DEFAULT_GRACE_PERIOD)) +			pr_err("Failed to reset grace period\n"); +	} +  	pm_release_ib(&dqm->packet_mgr);  	dqm->active_runlist = false; @@ -1823,7 +1988,7 @@ static int reset_queues_cpsch(struct device_queue_manager *dqm,  	dqm_lock(dqm);  	retval = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_BY_PASID, -			pasid, true); +			pasid, USE_DEFAULT_GRACE_PERIOD, true);  	dqm_unlock(dqm);  	return retval; @@ -1832,19 +1997,45 @@ static int reset_queues_cpsch(struct device_queue_manager *dqm,  /* dqm->lock mutex has to be locked before calling this function */  static int execute_queues_cpsch(struct device_queue_manager *dqm,  				enum kfd_unmap_queues_filter filter, -				uint32_t filter_param) +				uint32_t filter_param, +				uint32_t grace_period)  {  	int retval;  	if (dqm->is_hws_hang)  		return -EIO; -	retval = unmap_queues_cpsch(dqm, filter, filter_param, false); +	retval = unmap_queues_cpsch(dqm, filter, filter_param, grace_period, false);  	if (retval)  		return retval;  	return map_queues_cpsch(dqm);  } +static int wait_on_destroy_queue(struct device_queue_manager *dqm, +				 struct queue *q) +{ +	struct kfd_process_device *pdd = kfd_get_process_device_data(q->device, +								q->process); +	int ret = 0; + +	if (pdd->qpd.is_debug) +		return ret; + +	q->properties.is_being_destroyed = true; + +	if (pdd->process->debug_trap_enabled && q->properties.is_suspended) { +		dqm_unlock(dqm); +		mutex_unlock(&q->process->mutex); +		ret = wait_event_interruptible(dqm->destroy_wait, +						!q->properties.is_suspended); + +		mutex_lock(&q->process->mutex); +		dqm_lock(dqm); +	} + +	return ret; +} +  static int destroy_queue_cpsch(struct device_queue_manager *dqm,  				struct qcm_process_device *qpd,  				struct queue *q) @@ -1864,11 +2055,16 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,  				q->properties.queue_id);  	} -	retval = 0; -  	/* remove queue from list to prevent rescheduling after preemption */  	dqm_lock(dqm); +	retval = wait_on_destroy_queue(dqm, q); + +	if (retval) { +		dqm_unlock(dqm); +		return retval; +	} +  	if (qpd->is_debug) {  		/*  		 * error, currently we do not allow to destroy a queue @@ -1893,10 +2089,11 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,  	list_del(&q->list);  	qpd->queue_count--;  	if (q->properties.is_active) { -		if (!dqm->dev->shared_resources.enable_mes) { +		if (!dqm->dev->kfd->shared_resources.enable_mes) {  			decrement_queue_count(dqm, qpd, q);  			retval = execute_queues_cpsch(dqm, -						      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +						      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, +						      USE_DEFAULT_GRACE_PERIOD);  			if (retval == -ETIME)  				qpd->reset_wavefronts = true;  		} else { @@ -1914,7 +2111,14 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,  	dqm_unlock(dqm); -	/* Do free_mqd after dqm_unlock(dqm) to avoid circular locking */ +	/* +	 * Do free_mqd and raise delete event after dqm_unlock(dqm) to avoid +	 * circular locking +	 */ +	kfd_dbg_ev_raise(KFD_EC_MASK(EC_DEVICE_QUEUE_DELETE), +				qpd->pqm->process, q->device, +				-1, false, NULL, 0); +  	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);  	return retval; @@ -2056,7 +2260,7 @@ static int get_wave_state(struct device_queue_manager *dqm,  	mqd_mgr = dqm->mqd_mgrs[KFD_MQD_TYPE_CP];  	if (q->properties.type != KFD_QUEUE_TYPE_COMPUTE || -	    q->properties.is_active || !q->device->cwsr_enabled || +	    q->properties.is_active || !q->device->kfd->cwsr_enabled ||  	    !mqd_mgr->get_wave_state) {  		dqm_unlock(dqm);  		return -EINVAL; @@ -2069,8 +2273,8 @@ static int get_wave_state(struct device_queue_manager *dqm,  	 * and the queue should be protected against destruction by the process  	 * lock.  	 */ -	return mqd_mgr->get_wave_state(mqd_mgr, q->mqd, ctl_stack, -			ctl_stack_used_size, save_area_used_size); +	return mqd_mgr->get_wave_state(mqd_mgr, q->mqd, &q->properties, +			ctl_stack, ctl_stack_used_size, save_area_used_size);  }  static void get_queue_checkpoint_info(struct device_queue_manager *dqm, @@ -2105,7 +2309,7 @@ static int checkpoint_mqd(struct device_queue_manager *dqm,  	dqm_lock(dqm); -	if (q->properties.is_active || !q->device->cwsr_enabled) { +	if (q->properties.is_active || !q->device->kfd->cwsr_enabled) {  		r = -EINVAL;  		goto dqm_unlock;  	} @@ -2158,7 +2362,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,  		if (q->properties.is_active) {  			decrement_queue_count(dqm, qpd, q); -			if (dqm->dev->shared_resources.enable_mes) { +			if (dqm->dev->kfd->shared_resources.enable_mes) {  				retval = remove_queue_mes(dqm, q, qpd);  				if (retval)  					pr_err("Failed to remove queue %d\n", @@ -2180,8 +2384,8 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,  		}  	} -	if (!dqm->dev->shared_resources.enable_mes) -		retval = execute_queues_cpsch(dqm, filter, 0); +	if (!dqm->dev->kfd->shared_resources.enable_mes) +		retval = execute_queues_cpsch(dqm, filter, 0, USE_DEFAULT_GRACE_PERIOD);  	if ((!dqm->is_hws_hang) && (retval || qpd->reset_wavefronts)) {  		pr_warn("Resetting wave fronts (cpsch) on dev %p\n", dqm->dev); @@ -2242,12 +2446,13 @@ out_free:  static int allocate_hiq_sdma_mqd(struct device_queue_manager *dqm)  {  	int retval; -	struct kfd_dev *dev = dqm->dev; +	struct kfd_node *dev = dqm->dev;  	struct kfd_mem_obj *mem_obj = &dqm->hiq_sdma_mqd;  	uint32_t size = dqm->mqd_mgrs[KFD_MQD_TYPE_SDMA]->mqd_size *  		get_num_all_sdma_engines(dqm) * -		dev->device_info.num_sdma_queues_per_engine + -		dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size; +		dev->kfd->device_info.num_sdma_queues_per_engine + +		(dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size * +		NUM_XCC(dqm->dev->xcc_mask));  	retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev, size,  		&(mem_obj->gtt_mem), &(mem_obj->gpu_addr), @@ -2256,7 +2461,7 @@ static int allocate_hiq_sdma_mqd(struct device_queue_manager *dqm)  	return retval;  } -struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev) +struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)  {  	struct device_queue_manager *dqm; @@ -2373,20 +2578,22 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev)  	if (init_mqd_managers(dqm))  		goto out_free; -	if (!dev->shared_resources.enable_mes && allocate_hiq_sdma_mqd(dqm)) { +	if (!dev->kfd->shared_resources.enable_mes && allocate_hiq_sdma_mqd(dqm)) {  		pr_err("Failed to allocate hiq sdma mqd trunk buffer\n");  		goto out_free;  	} -	if (!dqm->ops.initialize(dqm)) +	if (!dqm->ops.initialize(dqm)) { +		init_waitqueue_head(&dqm->destroy_wait);  		return dqm; +	}  out_free:  	kfree(dqm);  	return NULL;  } -static void deallocate_hiq_sdma_mqd(struct kfd_dev *dev, +static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,  				    struct kfd_mem_obj *mqd)  {  	WARN(!mqd, "No hiq sdma mqd trunk to free"); @@ -2396,8 +2603,9 @@ static void deallocate_hiq_sdma_mqd(struct kfd_dev *dev,  void device_queue_manager_uninit(struct device_queue_manager *dqm)  { +	dqm->ops.stop(dqm);  	dqm->ops.uninitialize(dqm); -	if (!dqm->dev->shared_resources.enable_mes) +	if (!dqm->dev->kfd->shared_resources.enable_mes)  		deallocate_hiq_sdma_mqd(dqm->dev, &dqm->hiq_sdma_mqd);  	kfree(dqm);  } @@ -2426,6 +2634,498 @@ static void kfd_process_hw_exception(struct work_struct *work)  	amdgpu_amdkfd_gpu_reset(dqm->dev->adev);  } +int reserve_debug_trap_vmid(struct device_queue_manager *dqm, +				struct qcm_process_device *qpd) +{ +	int r; +	int updated_vmid_mask; + +	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		pr_err("Unsupported on sched_policy: %i\n", dqm->sched_policy); +		return -EINVAL; +	} + +	dqm_lock(dqm); + +	if (dqm->trap_debug_vmid != 0) { +		pr_err("Trap debug id already reserved\n"); +		r = -EBUSY; +		goto out_unlock; +	} + +	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, +			USE_DEFAULT_GRACE_PERIOD, false); +	if (r) +		goto out_unlock; + +	updated_vmid_mask = dqm->dev->kfd->shared_resources.compute_vmid_bitmap; +	updated_vmid_mask &= ~(1 << dqm->dev->vm_info.last_vmid_kfd); + +	dqm->dev->kfd->shared_resources.compute_vmid_bitmap = updated_vmid_mask; +	dqm->trap_debug_vmid = dqm->dev->vm_info.last_vmid_kfd; +	r = set_sched_resources(dqm); +	if (r) +		goto out_unlock; + +	r = map_queues_cpsch(dqm); +	if (r) +		goto out_unlock; + +	pr_debug("Reserved VMID for trap debug: %i\n", dqm->trap_debug_vmid); + +out_unlock: +	dqm_unlock(dqm); +	return r; +} + +/* + * Releases vmid for the trap debugger + */ +int release_debug_trap_vmid(struct device_queue_manager *dqm, +			struct qcm_process_device *qpd) +{ +	int r; +	int updated_vmid_mask; +	uint32_t trap_debug_vmid; + +	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		pr_err("Unsupported on sched_policy: %i\n", dqm->sched_policy); +		return -EINVAL; +	} + +	dqm_lock(dqm); +	trap_debug_vmid = dqm->trap_debug_vmid; +	if (dqm->trap_debug_vmid == 0) { +		pr_err("Trap debug id is not reserved\n"); +		r = -EINVAL; +		goto out_unlock; +	} + +	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, +			USE_DEFAULT_GRACE_PERIOD, false); +	if (r) +		goto out_unlock; + +	updated_vmid_mask = dqm->dev->kfd->shared_resources.compute_vmid_bitmap; +	updated_vmid_mask |= (1 << dqm->dev->vm_info.last_vmid_kfd); + +	dqm->dev->kfd->shared_resources.compute_vmid_bitmap = updated_vmid_mask; +	dqm->trap_debug_vmid = 0; +	r = set_sched_resources(dqm); +	if (r) +		goto out_unlock; + +	r = map_queues_cpsch(dqm); +	if (r) +		goto out_unlock; + +	pr_debug("Released VMID for trap debug: %i\n", trap_debug_vmid); + +out_unlock: +	dqm_unlock(dqm); +	return r; +} + +#define QUEUE_NOT_FOUND		-1 +/* invalidate queue operation in array */ +static void q_array_invalidate(uint32_t num_queues, uint32_t *queue_ids) +{ +	int i; + +	for (i = 0; i < num_queues; i++) +		queue_ids[i] |= KFD_DBG_QUEUE_INVALID_MASK; +} + +/* find queue index in array */ +static int q_array_get_index(unsigned int queue_id, +		uint32_t num_queues, +		uint32_t *queue_ids) +{ +	int i; + +	for (i = 0; i < num_queues; i++) +		if (queue_id == (queue_ids[i] & ~KFD_DBG_QUEUE_INVALID_MASK)) +			return i; + +	return QUEUE_NOT_FOUND; +} + +struct copy_context_work_handler_workarea { +	struct work_struct copy_context_work; +	struct kfd_process *p; +}; + +static void copy_context_work_handler (struct work_struct *work) +{ +	struct copy_context_work_handler_workarea *workarea; +	struct mqd_manager *mqd_mgr; +	struct queue *q; +	struct mm_struct *mm; +	struct kfd_process *p; +	uint32_t tmp_ctl_stack_used_size, tmp_save_area_used_size; +	int i; + +	workarea = container_of(work, +			struct copy_context_work_handler_workarea, +			copy_context_work); + +	p = workarea->p; +	mm = get_task_mm(p->lead_thread); + +	if (!mm) +		return; + +	kthread_use_mm(mm); +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; +		struct device_queue_manager *dqm = pdd->dev->dqm; +		struct qcm_process_device *qpd = &pdd->qpd; + +		list_for_each_entry(q, &qpd->queues_list, list) { +			mqd_mgr = dqm->mqd_mgrs[KFD_MQD_TYPE_CP]; + +			/* We ignore the return value from get_wave_state +			 * because +			 * i) right now, it always returns 0, and +			 * ii) if we hit an error, we would continue to the +			 *      next queue anyway. +			 */ +			mqd_mgr->get_wave_state(mqd_mgr, +					q->mqd, +					&q->properties, +					(void __user *)	q->properties.ctx_save_restore_area_address, +					&tmp_ctl_stack_used_size, +					&tmp_save_area_used_size); +		} +	} +	kthread_unuse_mm(mm); +	mmput(mm); +} + +static uint32_t *get_queue_ids(uint32_t num_queues, uint32_t *usr_queue_id_array) +{ +	size_t array_size = num_queues * sizeof(uint32_t); +	uint32_t *queue_ids = NULL; + +	if (!usr_queue_id_array) +		return NULL; + +	queue_ids = kzalloc(array_size, GFP_KERNEL); +	if (!queue_ids) +		return ERR_PTR(-ENOMEM); + +	if (copy_from_user(queue_ids, usr_queue_id_array, array_size)) +		return ERR_PTR(-EFAULT); + +	return queue_ids; +} + +int resume_queues(struct kfd_process *p, +		uint32_t num_queues, +		uint32_t *usr_queue_id_array) +{ +	uint32_t *queue_ids = NULL; +	int total_resumed = 0; +	int i; + +	if (usr_queue_id_array) { +		queue_ids = get_queue_ids(num_queues, usr_queue_id_array); + +		if (IS_ERR(queue_ids)) +			return PTR_ERR(queue_ids); + +		/* mask all queues as invalid.  unmask per successful request */ +		q_array_invalidate(num_queues, queue_ids); +	} + +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; +		struct device_queue_manager *dqm = pdd->dev->dqm; +		struct qcm_process_device *qpd = &pdd->qpd; +		struct queue *q; +		int r, per_device_resumed = 0; + +		dqm_lock(dqm); + +		/* unmask queues that resume or already resumed as valid */ +		list_for_each_entry(q, &qpd->queues_list, list) { +			int q_idx = QUEUE_NOT_FOUND; + +			if (queue_ids) +				q_idx = q_array_get_index( +						q->properties.queue_id, +						num_queues, +						queue_ids); + +			if (!queue_ids || q_idx != QUEUE_NOT_FOUND) { +				int err = resume_single_queue(dqm, &pdd->qpd, q); + +				if (queue_ids) { +					if (!err) { +						queue_ids[q_idx] &= +							~KFD_DBG_QUEUE_INVALID_MASK; +					} else { +						queue_ids[q_idx] |= +							KFD_DBG_QUEUE_ERROR_MASK; +						break; +					} +				} + +				if (dqm->dev->kfd->shared_resources.enable_mes) { +					wake_up_all(&dqm->destroy_wait); +					if (!err) +						total_resumed++; +				} else { +					per_device_resumed++; +				} +			} +		} + +		if (!per_device_resumed) { +			dqm_unlock(dqm); +			continue; +		} + +		r = execute_queues_cpsch(dqm, +					KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, +					0, +					USE_DEFAULT_GRACE_PERIOD); +		if (r) { +			pr_err("Failed to resume process queues\n"); +			if (queue_ids) { +				list_for_each_entry(q, &qpd->queues_list, list) { +					int q_idx = q_array_get_index( +							q->properties.queue_id, +							num_queues, +							queue_ids); + +					/* mask queue as error on resume fail */ +					if (q_idx != QUEUE_NOT_FOUND) +						queue_ids[q_idx] |= +							KFD_DBG_QUEUE_ERROR_MASK; +				} +			} +		} else { +			wake_up_all(&dqm->destroy_wait); +			total_resumed += per_device_resumed; +		} + +		dqm_unlock(dqm); +	} + +	if (queue_ids) { +		if (copy_to_user((void __user *)usr_queue_id_array, queue_ids, +				num_queues * sizeof(uint32_t))) +			pr_err("copy_to_user failed on queue resume\n"); + +		kfree(queue_ids); +	} + +	return total_resumed; +} + +int suspend_queues(struct kfd_process *p, +			uint32_t num_queues, +			uint32_t grace_period, +			uint64_t exception_clear_mask, +			uint32_t *usr_queue_id_array) +{ +	uint32_t *queue_ids = get_queue_ids(num_queues, usr_queue_id_array); +	int total_suspended = 0; +	int i; + +	if (IS_ERR(queue_ids)) +		return PTR_ERR(queue_ids); + +	/* mask all queues as invalid.  umask on successful request */ +	q_array_invalidate(num_queues, queue_ids); + +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; +		struct device_queue_manager *dqm = pdd->dev->dqm; +		struct qcm_process_device *qpd = &pdd->qpd; +		struct queue *q; +		int r, per_device_suspended = 0; + +		mutex_lock(&p->event_mutex); +		dqm_lock(dqm); + +		/* unmask queues that suspend or already suspended */ +		list_for_each_entry(q, &qpd->queues_list, list) { +			int q_idx = q_array_get_index(q->properties.queue_id, +							num_queues, +							queue_ids); + +			if (q_idx != QUEUE_NOT_FOUND) { +				int err = suspend_single_queue(dqm, pdd, q); +				bool is_mes = dqm->dev->kfd->shared_resources.enable_mes; + +				if (!err) { +					queue_ids[q_idx] &= ~KFD_DBG_QUEUE_INVALID_MASK; +					if (exception_clear_mask && is_mes) +						q->properties.exception_status &= +							~exception_clear_mask; + +					if (is_mes) +						total_suspended++; +					else +						per_device_suspended++; +				} else if (err != -EBUSY) { +					r = err; +					queue_ids[q_idx] |= KFD_DBG_QUEUE_ERROR_MASK; +					break; +				} +			} +		} + +		if (!per_device_suspended) { +			dqm_unlock(dqm); +			mutex_unlock(&p->event_mutex); +			if (total_suspended) +				amdgpu_amdkfd_debug_mem_fence(dqm->dev->adev); +			continue; +		} + +		r = execute_queues_cpsch(dqm, +			KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, +			grace_period); + +		if (r) +			pr_err("Failed to suspend process queues.\n"); +		else +			total_suspended += per_device_suspended; + +		list_for_each_entry(q, &qpd->queues_list, list) { +			int q_idx = q_array_get_index(q->properties.queue_id, +						num_queues, queue_ids); + +			if (q_idx == QUEUE_NOT_FOUND) +				continue; + +			/* mask queue as error on suspend fail */ +			if (r) +				queue_ids[q_idx] |= KFD_DBG_QUEUE_ERROR_MASK; +			else if (exception_clear_mask) +				q->properties.exception_status &= +							~exception_clear_mask; +		} + +		dqm_unlock(dqm); +		mutex_unlock(&p->event_mutex); +		amdgpu_device_flush_hdp(dqm->dev->adev, NULL); +	} + +	if (total_suspended) { +		struct copy_context_work_handler_workarea copy_context_worker; + +		INIT_WORK_ONSTACK( +				©_context_worker.copy_context_work, +				copy_context_work_handler); + +		copy_context_worker.p = p; + +		schedule_work(©_context_worker.copy_context_work); + + +		flush_work(©_context_worker.copy_context_work); +		destroy_work_on_stack(©_context_worker.copy_context_work); +	} + +	if (copy_to_user((void __user *)usr_queue_id_array, queue_ids, +			num_queues * sizeof(uint32_t))) +		pr_err("copy_to_user failed on queue suspend\n"); + +	kfree(queue_ids); + +	return total_suspended; +} + +static uint32_t set_queue_type_for_user(struct queue_properties *q_props) +{ +	switch (q_props->type) { +	case KFD_QUEUE_TYPE_COMPUTE: +		return q_props->format == KFD_QUEUE_FORMAT_PM4 +					? KFD_IOC_QUEUE_TYPE_COMPUTE +					: KFD_IOC_QUEUE_TYPE_COMPUTE_AQL; +	case KFD_QUEUE_TYPE_SDMA: +		return KFD_IOC_QUEUE_TYPE_SDMA; +	case KFD_QUEUE_TYPE_SDMA_XGMI: +		return KFD_IOC_QUEUE_TYPE_SDMA_XGMI; +	default: +		WARN_ONCE(true, "queue type not recognized!"); +		return 0xffffffff; +	}; +} + +void set_queue_snapshot_entry(struct queue *q, +			      uint64_t exception_clear_mask, +			      struct kfd_queue_snapshot_entry *qss_entry) +{ +	qss_entry->ring_base_address = q->properties.queue_address; +	qss_entry->write_pointer_address = (uint64_t)q->properties.write_ptr; +	qss_entry->read_pointer_address = (uint64_t)q->properties.read_ptr; +	qss_entry->ctx_save_restore_address = +				q->properties.ctx_save_restore_area_address; +	qss_entry->ctx_save_restore_area_size = +				q->properties.ctx_save_restore_area_size; +	qss_entry->exception_status = q->properties.exception_status; +	qss_entry->queue_id = q->properties.queue_id; +	qss_entry->gpu_id = q->device->id; +	qss_entry->ring_size = (uint32_t)q->properties.queue_size; +	qss_entry->queue_type = set_queue_type_for_user(&q->properties); +	q->properties.exception_status &= ~exception_clear_mask; +} + +int debug_lock_and_unmap(struct device_queue_manager *dqm) +{ +	int r; + +	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		pr_err("Unsupported on sched_policy: %i\n", dqm->sched_policy); +		return -EINVAL; +	} + +	if (!kfd_dbg_is_per_vmid_supported(dqm->dev)) +		return 0; + +	dqm_lock(dqm); + +	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, 0, false); +	if (r) +		dqm_unlock(dqm); + +	return r; +} + +int debug_map_and_unlock(struct device_queue_manager *dqm) +{ +	int r; + +	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) { +		pr_err("Unsupported on sched_policy: %i\n", dqm->sched_policy); +		return -EINVAL; +	} + +	if (!kfd_dbg_is_per_vmid_supported(dqm->dev)) +		return 0; + +	r = map_queues_cpsch(dqm); + +	dqm_unlock(dqm); + +	return r; +} + +int debug_refresh_runlist(struct device_queue_manager *dqm) +{ +	int r = debug_lock_and_unmap(dqm); + +	if (r) +		return r; + +	return debug_map_and_unlock(dqm); +} +  #if defined(CONFIG_DEBUG_FS)  static void seq_reg_dump(struct seq_file *m, @@ -2452,52 +3152,66 @@ static void seq_reg_dump(struct seq_file *m,  int dqm_debugfs_hqds(struct seq_file *m, void *data)  {  	struct device_queue_manager *dqm = data; +	uint32_t xcc_mask = dqm->dev->xcc_mask;  	uint32_t (*dump)[2], n_regs;  	int pipe, queue; -	int r = 0; +	int r = 0, xcc_id; +	uint32_t sdma_engine_start;  	if (!dqm->sched_running) {  		seq_puts(m, " Device is stopped\n");  		return 0;  	} -	r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->adev, -					KFD_CIK_HIQ_PIPE, KFD_CIK_HIQ_QUEUE, -					&dump, &n_regs); -	if (!r) { -		seq_printf(m, "  HIQ on MEC %d Pipe %d Queue %d\n", -			   KFD_CIK_HIQ_PIPE/get_pipes_per_mec(dqm)+1, -			   KFD_CIK_HIQ_PIPE%get_pipes_per_mec(dqm), -			   KFD_CIK_HIQ_QUEUE); -		seq_reg_dump(m, dump, n_regs); +	for_each_inst(xcc_id, xcc_mask) { +		r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->adev, +						KFD_CIK_HIQ_PIPE, +						KFD_CIK_HIQ_QUEUE, &dump, +						&n_regs, xcc_id); +		if (!r) { +			seq_printf( +				m, +				"   Inst %d, HIQ on MEC %d Pipe %d Queue %d\n", +				xcc_id, +				KFD_CIK_HIQ_PIPE / get_pipes_per_mec(dqm) + 1, +				KFD_CIK_HIQ_PIPE % get_pipes_per_mec(dqm), +				KFD_CIK_HIQ_QUEUE); +			seq_reg_dump(m, dump, n_regs); -		kfree(dump); -	} +			kfree(dump); +		} -	for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) { -		int pipe_offset = pipe * get_queues_per_pipe(dqm); +		for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) { +			int pipe_offset = pipe * get_queues_per_pipe(dqm); -		for (queue = 0; queue < get_queues_per_pipe(dqm); queue++) { -			if (!test_bit(pipe_offset + queue, -				      dqm->dev->shared_resources.cp_queue_bitmap)) -				continue; +			for (queue = 0; queue < get_queues_per_pipe(dqm); queue++) { +				if (!test_bit(pipe_offset + queue, +				      dqm->dev->kfd->shared_resources.cp_queue_bitmap)) +					continue; -			r = dqm->dev->kfd2kgd->hqd_dump( -				dqm->dev->adev, pipe, queue, &dump, &n_regs); -			if (r) -				break; +				r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->adev, +								pipe, queue, +								&dump, &n_regs, +								xcc_id); +				if (r) +					break; -			seq_printf(m, "  CP Pipe %d, Queue %d\n", -				  pipe, queue); -			seq_reg_dump(m, dump, n_regs); +				seq_printf(m, +					   " Inst %d,  CP Pipe %d, Queue %d\n", +					   xcc_id, pipe, queue); +				seq_reg_dump(m, dump, n_regs); -			kfree(dump); +				kfree(dump); +			}  		}  	} -	for (pipe = 0; pipe < get_num_all_sdma_engines(dqm); pipe++) { +	sdma_engine_start = dqm->dev->node_id * get_num_all_sdma_engines(dqm); +	for (pipe = sdma_engine_start; +	     pipe < (sdma_engine_start + get_num_all_sdma_engines(dqm)); +	     pipe++) {  		for (queue = 0; -		     queue < dqm->dev->device_info.num_sdma_queues_per_engine; +		     queue < dqm->dev->kfd->device_info.num_sdma_queues_per_engine;  		     queue++) {  			r = dqm->dev->kfd2kgd->hqd_sdma_dump(  				dqm->dev->adev, pipe, queue, &dump, &n_regs); @@ -2526,7 +3240,8 @@ int dqm_debugfs_hang_hws(struct device_queue_manager *dqm)  		return r;  	}  	dqm->active_runlist = true; -	r = execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0); +	r = execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, +				0, USE_DEFAULT_GRACE_PERIOD);  	dqm_unlock(dqm);  	return r; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h index a537b9ef3e16..7dd4b177219d 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h @@ -37,6 +37,7 @@  #define KFD_MES_PROCESS_QUANTUM		100000  #define KFD_MES_GANG_QUANTUM		10000 +#define USE_DEFAULT_GRACE_PERIOD 0xffffffff  struct device_process_node {  	struct qcm_process_device *qpd; @@ -207,7 +208,7 @@ struct device_queue_manager_asic_ops {  				struct queue *q,  				struct qcm_process_device *qpd);  	struct mqd_manager *	(*mqd_manager_init)(enum KFD_MQD_TYPE type, -				 struct kfd_dev *dev); +				 struct kfd_node *dev);  };  /** @@ -228,7 +229,7 @@ struct device_queue_manager {  	struct mqd_manager	*mqd_mgrs[KFD_MQD_TYPE_MAX];  	struct packet_manager	packet_mgr; -	struct kfd_dev		*dev; +	struct kfd_node		*dev;  	struct mutex		lock_hidden; /* use dqm_lock/unlock(dqm) */  	struct list_head	queues;  	unsigned int		saved_flags; @@ -239,8 +240,8 @@ struct device_queue_manager {  	unsigned int		total_queue_count;  	unsigned int		next_pipe_to_allocate;  	unsigned int		*allocated_queues; -	uint64_t		sdma_bitmap; -	uint64_t		xgmi_sdma_bitmap; +	DECLARE_BITMAP(sdma_bitmap, KFD_MAX_SDMA_QUEUES); +	DECLARE_BITMAP(xgmi_sdma_bitmap, KFD_MAX_SDMA_QUEUES);  	/* the pasid mapping for each kfd vmid */  	uint16_t		vmid_pasid[VMID_NUM];  	uint64_t		pipelines_addr; @@ -249,6 +250,7 @@ struct device_queue_manager {  	struct kfd_mem_obj	*fence_mem;  	bool			active_runlist;  	int			sched_policy; +	uint32_t		trap_debug_vmid;  	/* hw exception  */  	bool			is_hws_hang; @@ -256,6 +258,13 @@ struct device_queue_manager {  	struct work_struct	hw_exception_work;  	struct kfd_mem_obj	hiq_sdma_mqd;  	bool			sched_running; + +	/* used for GFX 9.4.3 only */ +	uint32_t		current_logical_xcc_start; + +	uint32_t		wait_times; + +	wait_queue_head_t	destroy_wait;  };  void device_queue_manager_init_cik( @@ -279,6 +288,24 @@ unsigned int get_queues_per_pipe(struct device_queue_manager *dqm);  unsigned int get_pipes_per_mec(struct device_queue_manager *dqm);  unsigned int get_num_sdma_queues(struct device_queue_manager *dqm);  unsigned int get_num_xgmi_sdma_queues(struct device_queue_manager *dqm); +int reserve_debug_trap_vmid(struct device_queue_manager *dqm, +			struct qcm_process_device *qpd); +int release_debug_trap_vmid(struct device_queue_manager *dqm, +			struct qcm_process_device *qpd); +int suspend_queues(struct kfd_process *p, +			uint32_t num_queues, +			uint32_t grace_period, +			uint64_t exception_clear_mask, +			uint32_t *usr_queue_id_array); +int resume_queues(struct kfd_process *p, +		uint32_t num_queues, +		uint32_t *usr_queue_id_array); +void set_queue_snapshot_entry(struct queue *q, +			      uint64_t exception_clear_mask, +			      struct kfd_queue_snapshot_entry *qss_entry); +int debug_lock_and_unmap(struct device_queue_manager *dqm); +int debug_map_and_unlock(struct device_queue_manager *dqm); +int debug_refresh_runlist(struct device_queue_manager *dqm);  static inline unsigned int get_sh_mem_bases_32(struct kfd_process_device *pdd)  { diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c index 8b2dd2670ab7..8af643388768 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_v9.c @@ -24,9 +24,7 @@  #include "kfd_device_queue_manager.h"  #include "vega10_enum.h" -#include "gc/gc_9_0_offset.h" -#include "gc/gc_9_0_sh_mask.h" -#include "sdma0/sdma0_4_0_sh_mask.h" +#include "gc/gc_9_4_3_sh_mask.h"  static int update_qpd_v9(struct device_queue_manager *dqm,  			 struct qcm_process_device *qpd); @@ -62,9 +60,13 @@ static int update_qpd_v9(struct device_queue_manager *dqm,  		qpd->sh_mem_config = SH_MEM_ALIGNMENT_MODE_UNALIGNED <<  					SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT; -		if (dqm->dev->noretry && !dqm->dev->use_iommu_v2) +		if (dqm->dev->kfd->noretry && !dqm->dev->kfd->use_iommu_v2)  			qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT; +		if (KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 3)) +			qpd->sh_mem_config |= +				(1 << SH_MEM_CONFIG__F8_MODE__SHIFT); +  		qpd->sh_mem_ape1_limit = 0;  		qpd->sh_mem_ape1_base = 0;  	} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c index 38c9e1ca6691..6421b620388d 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c @@ -138,7 +138,7 @@ void kfd_doorbell_fini(struct kfd_dev *kfd)  		iounmap(kfd->doorbell_kernel_ptr);  } -int kfd_doorbell_mmap(struct kfd_dev *dev, struct kfd_process *process, +int kfd_doorbell_mmap(struct kfd_node *dev, struct kfd_process *process,  		      struct vm_area_struct *vma)  {  	phys_addr_t address; @@ -148,7 +148,7 @@ int kfd_doorbell_mmap(struct kfd_dev *dev, struct kfd_process *process,  	 * For simplicitly we only allow mapping of the entire doorbell  	 * allocation of a single device & process.  	 */ -	if (vma->vm_end - vma->vm_start != kfd_doorbell_process_slice(dev)) +	if (vma->vm_end - vma->vm_start != kfd_doorbell_process_slice(dev->kfd))  		return -EINVAL;  	pdd = kfd_get_process_device_data(dev, process); @@ -170,13 +170,13 @@ int kfd_doorbell_mmap(struct kfd_dev *dev, struct kfd_process *process,  		 "     vm_flags            == 0x%04lX\n"  		 "     size                == 0x%04lX\n",  		 (unsigned long long) vma->vm_start, address, vma->vm_flags, -		 kfd_doorbell_process_slice(dev)); +		 kfd_doorbell_process_slice(dev->kfd));  	return io_remap_pfn_range(vma,  				vma->vm_start,  				address >> PAGE_SHIFT, -				kfd_doorbell_process_slice(dev), +				kfd_doorbell_process_slice(dev->kfd),  				vma->vm_page_prot);  } @@ -278,14 +278,14 @@ uint64_t kfd_get_number_elems(struct kfd_dev *kfd)  phys_addr_t kfd_get_process_doorbells(struct kfd_process_device *pdd)  {  	if (!pdd->doorbell_index) { -		int r = kfd_alloc_process_doorbells(pdd->dev, +		int r = kfd_alloc_process_doorbells(pdd->dev->kfd,  						    &pdd->doorbell_index);  		if (r < 0)  			return 0;  	} -	return pdd->dev->doorbell_base + -		pdd->doorbell_index * kfd_doorbell_process_slice(pdd->dev); +	return pdd->dev->kfd->doorbell_base + +		pdd->doorbell_index * kfd_doorbell_process_slice(pdd->dev->kfd);  }  int kfd_alloc_process_doorbells(struct kfd_dev *kfd, unsigned int *doorbell_index) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c index c894cf8f7c50..ddca23ee4193 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c @@ -348,7 +348,7 @@ static int kfd_event_page_set(struct kfd_process *p, void *kernel_address,  int kfd_kmap_event_page(struct kfd_process *p, uint64_t event_page_offset)  { -	struct kfd_dev *kfd; +	struct kfd_node *kfd;  	struct kfd_process_device *pdd;  	void *mem, *kern_addr;  	uint64_t size; @@ -1125,7 +1125,7 @@ static void lookup_events_by_type_and_signal(struct kfd_process *p,  }  #ifdef KFD_SUPPORT_IOMMU_V2 -void kfd_signal_iommu_event(struct kfd_dev *dev, u32 pasid, +void kfd_signal_iommu_event(struct kfd_node *dev, u32 pasid,  		unsigned long address, bool is_write_requested,  		bool is_execute_requested)  { @@ -1221,8 +1221,9 @@ void kfd_signal_hw_exception_event(u32 pasid)  	kfd_unref_process(p);  } -void kfd_signal_vm_fault_event(struct kfd_dev *dev, u32 pasid, -				struct kfd_vm_fault_info *info) +void kfd_signal_vm_fault_event(struct kfd_node *dev, u32 pasid, +				struct kfd_vm_fault_info *info, +				struct kfd_hsa_memory_exception_data *data)  {  	struct kfd_event *ev;  	uint32_t id; @@ -1239,19 +1240,24 @@ void kfd_signal_vm_fault_event(struct kfd_dev *dev, u32 pasid,  		return;  	} -	memset(&memory_exception_data, 0, sizeof(memory_exception_data)); -	memory_exception_data.gpu_id = user_gpu_id; -	memory_exception_data.failure.imprecise = true; -	/* Set failure reason */ -	if (info) { -		memory_exception_data.va = (info->page_addr) << PAGE_SHIFT; -		memory_exception_data.failure.NotPresent = -			info->prot_valid ? 1 : 0; -		memory_exception_data.failure.NoExecute = -			info->prot_exec ? 1 : 0; -		memory_exception_data.failure.ReadOnly = -			info->prot_write ? 1 : 0; -		memory_exception_data.failure.imprecise = 0; +	/* SoC15 chips and onwards will pass in data from now on. */ +	if (!data) { +		memset(&memory_exception_data, 0, sizeof(memory_exception_data)); +		memory_exception_data.gpu_id = user_gpu_id; +		memory_exception_data.failure.imprecise = true; + +		/* Set failure reason */ +		if (info) { +			memory_exception_data.va = (info->page_addr) << +								PAGE_SHIFT; +			memory_exception_data.failure.NotPresent = +				info->prot_valid ? 1 : 0; +			memory_exception_data.failure.NoExecute = +				info->prot_exec ? 1 : 0; +			memory_exception_data.failure.ReadOnly = +				info->prot_write ? 1 : 0; +			memory_exception_data.failure.imprecise = 0; +		}  	}  	rcu_read_lock(); @@ -1260,7 +1266,8 @@ void kfd_signal_vm_fault_event(struct kfd_dev *dev, u32 pasid,  	idr_for_each_entry_continue(&p->event_idr, ev, id)  		if (ev->type == KFD_EVENT_TYPE_MEMORY) {  			spin_lock(&ev->lock); -			ev->memory_exception_data = memory_exception_data; +			ev->memory_exception_data = data ? *data : +							memory_exception_data;  			set_event(ev);  			spin_unlock(&ev->lock);  		} @@ -1269,7 +1276,7 @@ void kfd_signal_vm_fault_event(struct kfd_dev *dev, u32 pasid,  	kfd_unref_process(p);  } -void kfd_signal_reset_event(struct kfd_dev *dev) +void kfd_signal_reset_event(struct kfd_node *dev)  {  	struct kfd_hsa_hw_exception_data hw_exception_data;  	struct kfd_hsa_memory_exception_data memory_exception_data; @@ -1325,7 +1332,7 @@ void kfd_signal_reset_event(struct kfd_dev *dev)  	srcu_read_unlock(&kfd_processes_srcu, idx);  } -void kfd_signal_poison_consumed_event(struct kfd_dev *dev, u32 pasid) +void kfd_signal_poison_consumed_event(struct kfd_node *dev, u32 pasid)  {  	struct kfd_process *p = kfd_lookup_process_by_pasid(pasid);  	struct kfd_hsa_memory_exception_data memory_exception_data; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c index 8aebe408c544..da2ca00d79e5 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c @@ -322,21 +322,21 @@ static void kfd_init_apertures_vi(struct kfd_process_device *pdd, uint8_t id)  	pdd->lds_base = MAKE_LDS_APP_BASE_VI();  	pdd->lds_limit = MAKE_LDS_APP_LIMIT(pdd->lds_base); -	if (!pdd->dev->use_iommu_v2) { +	if (!pdd->dev->kfd->use_iommu_v2) {  		/* dGPUs: SVM aperture starting at 0  		 * with small reserved space for kernel.  		 * Set them to CANONICAL addresses.  		 */  		pdd->gpuvm_base = SVM_USER_BASE;  		pdd->gpuvm_limit = -			pdd->dev->shared_resources.gpuvm_size - 1; +			pdd->dev->kfd->shared_resources.gpuvm_size - 1;  	} else {  		/* set them to non CANONICAL addresses, and no SVM is  		 * allocated.  		 */  		pdd->gpuvm_base = MAKE_GPUVM_APP_BASE_VI(id + 1);  		pdd->gpuvm_limit = MAKE_GPUVM_APP_LIMIT(pdd->gpuvm_base, -				pdd->dev->shared_resources.gpuvm_size); +				pdd->dev->kfd->shared_resources.gpuvm_size);  	}  	pdd->scratch_base = MAKE_SCRATCH_APP_BASE_VI(); @@ -356,7 +356,7 @@ static void kfd_init_apertures_v9(struct kfd_process_device *pdd, uint8_t id)  	 */  	pdd->gpuvm_base = SVM_USER_BASE;  	pdd->gpuvm_limit = -		pdd->dev->shared_resources.gpuvm_size - 1; +		pdd->dev->kfd->shared_resources.gpuvm_size - 1;  	pdd->scratch_base = MAKE_SCRATCH_APP_BASE_V9();  	pdd->scratch_limit = MAKE_SCRATCH_APP_LIMIT(pdd->scratch_base); @@ -365,7 +365,7 @@ static void kfd_init_apertures_v9(struct kfd_process_device *pdd, uint8_t id)  int kfd_init_apertures(struct kfd_process *process)  {  	uint8_t id  = 0; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	struct kfd_process_device *pdd;  	/*Iterating over all devices*/ @@ -417,7 +417,7 @@ int kfd_init_apertures(struct kfd_process *process)  				}  			} -			if (!dev->use_iommu_v2) { +			if (!dev->kfd->use_iommu_v2) {  				/* dGPUs: the reserved space for kernel  				 * before SVM  				 */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c new file mode 100644 index 000000000000..c7991e07b6be --- /dev/null +++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c @@ -0,0 +1,405 @@ +/* + * Copyright 2023 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 "kfd_events.h" +#include "kfd_debug.h" +#include "soc15_int.h" +#include "kfd_device_queue_manager.h" + +/* + * GFX10 SQ Interrupts + * + * There are 3 encoding types of interrupts sourced from SQ sent as a 44-bit + * packet to the Interrupt Handler: + * Auto - Generated by the SQG (various cmd overflows, timestamps etc) + * Wave - Generated by S_SENDMSG through a shader program + * Error - HW generated errors (Illegal instructions, Memviols, EDC etc) + * + * The 44-bit packet is mapped as {context_id1[7:0],context_id0[31:0]} plus + * 4-bits for VMID (SOC15_VMID_FROM_IH_ENTRY) as such: + * + * - context_id1[7:6] + * Encoding type (0 = Auto, 1 = Wave, 2 = Error) + * + * - context_id0[24] + * PRIV bit indicates that Wave S_SEND or error occurred within trap + * + * - context_id0[22:0] + * 23-bit data with the following layout per encoding type: + * Auto - only context_id0[8:0] is used, which reports various interrupts + * generated by SQG.  The rest is 0. + * Wave - user data sent from m0 via S_SENDMSG + * Error - Error type (context_id0[22:19]), Error Details (rest of bits) + * + * The other context_id bits show coordinates (SE/SH/CU/SIMD/WGP) for wave + * S_SENDMSG and Errors.  These are 0 for Auto. + */ + +enum SQ_INTERRUPT_WORD_ENCODING { +	SQ_INTERRUPT_WORD_ENCODING_AUTO = 0x0, +	SQ_INTERRUPT_WORD_ENCODING_INST, +	SQ_INTERRUPT_WORD_ENCODING_ERROR, +}; + +enum SQ_INTERRUPT_ERROR_TYPE { +	SQ_INTERRUPT_ERROR_TYPE_EDC_FUE = 0x0, +	SQ_INTERRUPT_ERROR_TYPE_ILLEGAL_INST, +	SQ_INTERRUPT_ERROR_TYPE_MEMVIOL, +	SQ_INTERRUPT_ERROR_TYPE_EDC_FED, +}; + +/* SQ_INTERRUPT_WORD_AUTO_CTXID */ +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE__SHIFT 0 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__WLT__SHIFT 1 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_BUF0_FULL__SHIFT 2 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_BUF1_FULL__SHIFT 3 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_UTC_ERROR__SHIFT 7 +#define SQ_INTERRUPT_WORD_AUTO_CTXID1__SE_ID__SHIFT 4 +#define SQ_INTERRUPT_WORD_AUTO_CTXID1__ENCODING__SHIFT 6 + +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_MASK 0x00000001 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__WLT_MASK 0x00000002 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_BUF0_FULL_MASK 0x00000004 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_BUF1_FULL_MASK 0x00000008 +#define SQ_INTERRUPT_WORD_AUTO_CTXID0__THREAD_TRACE_UTC_ERROR_MASK 0x00000080 +#define SQ_INTERRUPT_WORD_AUTO_CTXID1__SE_ID_MASK 0x030 +#define SQ_INTERRUPT_WORD_AUTO_CTXID1__ENCODING_MASK 0x0c0 + +/* SQ_INTERRUPT_WORD_WAVE_CTXID */ +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__DATA__SHIFT 0 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__SA_ID__SHIFT 23 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__PRIV__SHIFT 24 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__WAVE_ID__SHIFT 25 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__SIMD_ID__SHIFT 30 +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__WGP_ID__SHIFT 0 +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__SE_ID__SHIFT 4 +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__ENCODING__SHIFT 6 + +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__DATA_MASK 0x000007fffff +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__SA_ID_MASK 0x0000800000 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__PRIV_MASK 0x00001000000 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__WAVE_ID_MASK 0x0003e000000 +#define SQ_INTERRUPT_WORD_WAVE_CTXID0__SIMD_ID_MASK 0x000c0000000 +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__WGP_ID_MASK 0x00f +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__SE_ID_MASK 0x030 +#define SQ_INTERRUPT_WORD_WAVE_CTXID1__ENCODING_MASK 0x0c0 + +#define KFD_CTXID0__ERR_TYPE_MASK 0x780000 +#define KFD_CTXID0__ERR_TYPE__SHIFT 19 + +/* GFX10 SQ interrupt ENC type bit (context_id1[7:6]) for wave s_sendmsg */ +#define KFD_CONTEXT_ID1_ENC_TYPE_WAVE_MASK	0x40 +/* GFX10 SQ interrupt PRIV bit (context_id0[24]) for s_sendmsg inside trap */ +#define KFD_CONTEXT_ID0_PRIV_MASK		0x1000000 +/* + * The debugger will send user data(m0) with PRIV=1 to indicate it requires + * notification from the KFD with the following queue id (DOORBELL_ID) and + * trap code (TRAP_CODE). + */ +#define KFD_CONTEXT_ID0_DEBUG_DOORBELL_MASK	0x0003ff +#define KFD_CONTEXT_ID0_DEBUG_TRAP_CODE_SHIFT	10 +#define KFD_CONTEXT_ID0_DEBUG_TRAP_CODE_MASK	0x07fc00 +#define KFD_DEBUG_DOORBELL_ID(ctxid0)	((ctxid0) &	\ +				KFD_CONTEXT_ID0_DEBUG_DOORBELL_MASK) +#define KFD_DEBUG_TRAP_CODE(ctxid0)	(((ctxid0) &	\ +				KFD_CONTEXT_ID0_DEBUG_TRAP_CODE_MASK)	\ +				>> KFD_CONTEXT_ID0_DEBUG_TRAP_CODE_SHIFT) +#define KFD_DEBUG_CP_BAD_OP_ECODE_MASK		0x3fffc00 +#define KFD_DEBUG_CP_BAD_OP_ECODE_SHIFT		10 +#define KFD_DEBUG_CP_BAD_OP_ECODE(ctxid0) (((ctxid0) &			\ +				KFD_DEBUG_CP_BAD_OP_ECODE_MASK)		\ +				>> KFD_DEBUG_CP_BAD_OP_ECODE_SHIFT) + +static void event_interrupt_poison_consumption(struct kfd_node *dev, +				uint16_t pasid, uint16_t client_id) +{ +	int old_poison, ret = -EINVAL; +	struct kfd_process *p = kfd_lookup_process_by_pasid(pasid); + +	if (!p) +		return; + +	/* all queues of a process will be unmapped in one time */ +	old_poison = atomic_cmpxchg(&p->poison, 0, 1); +	kfd_unref_process(p); +	if (old_poison) +		return; + +	switch (client_id) { +	case SOC15_IH_CLIENTID_SE0SH: +	case SOC15_IH_CLIENTID_SE1SH: +	case SOC15_IH_CLIENTID_SE2SH: +	case SOC15_IH_CLIENTID_SE3SH: +	case SOC15_IH_CLIENTID_UTCL2: +		ret = kfd_dqm_evict_pasid(dev->dqm, pasid); +		break; +	case SOC15_IH_CLIENTID_SDMA0: +	case SOC15_IH_CLIENTID_SDMA1: +	case SOC15_IH_CLIENTID_SDMA2: +	case SOC15_IH_CLIENTID_SDMA3: +	case SOC15_IH_CLIENTID_SDMA4: +		break; +	default: +		break; +	} + +	kfd_signal_poison_consumed_event(dev, pasid); + +	/* resetting queue passes, do page retirement without gpu reset +	 * resetting queue fails, fallback to gpu reset solution +	 */ +	if (!ret) { +		dev_warn(dev->adev->dev, +			"RAS poison consumption, unmap queue flow succeeded: client id %d\n", +			client_id); +		amdgpu_amdkfd_ras_poison_consumption_handler(dev->adev, false); +	} else { +		dev_warn(dev->adev->dev, +			"RAS poison consumption, fall back to gpu reset flow: client id %d\n", +			client_id); +		amdgpu_amdkfd_ras_poison_consumption_handler(dev->adev, true); +	} +} + +static bool event_interrupt_isr_v10(struct kfd_node *dev, +					const uint32_t *ih_ring_entry, +					uint32_t *patched_ihre, +					bool *patched_flag) +{ +	uint16_t source_id, client_id, pasid, vmid; +	const uint32_t *data = ih_ring_entry; + +	source_id = SOC15_SOURCE_ID_FROM_IH_ENTRY(ih_ring_entry); +	client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry); + +	/* Only handle interrupts from KFD VMIDs */ +	vmid = SOC15_VMID_FROM_IH_ENTRY(ih_ring_entry); +	if (!KFD_IRQ_IS_FENCE(client_id, source_id) && +	   (vmid < dev->vm_info.first_vmid_kfd || +	    vmid > dev->vm_info.last_vmid_kfd)) +		return false; + +	pasid = SOC15_PASID_FROM_IH_ENTRY(ih_ring_entry); + +	/* Only handle clients we care about */ +	if (client_id != SOC15_IH_CLIENTID_GRBM_CP && +	    client_id != SOC15_IH_CLIENTID_SDMA0 && +	    client_id != SOC15_IH_CLIENTID_SDMA1 && +	    client_id != SOC15_IH_CLIENTID_SDMA2 && +	    client_id != SOC15_IH_CLIENTID_SDMA3 && +	    client_id != SOC15_IH_CLIENTID_SDMA4 && +	    client_id != SOC15_IH_CLIENTID_SDMA5 && +	    client_id != SOC15_IH_CLIENTID_SDMA6 && +	    client_id != SOC15_IH_CLIENTID_SDMA7 && +	    client_id != SOC15_IH_CLIENTID_VMC && +	    client_id != SOC15_IH_CLIENTID_VMC1 && +	    client_id != SOC15_IH_CLIENTID_UTCL2 && +	    client_id != SOC15_IH_CLIENTID_SE0SH && +	    client_id != SOC15_IH_CLIENTID_SE1SH && +	    client_id != SOC15_IH_CLIENTID_SE2SH && +	    client_id != SOC15_IH_CLIENTID_SE3SH) +		return false; + +	pr_debug("client id 0x%x, source id %d, vmid %d, pasid 0x%x. raw data:\n", +		 client_id, source_id, vmid, pasid); +	pr_debug("%8X, %8X, %8X, %8X, %8X, %8X, %8X, %8X.\n", +		 data[0], data[1], data[2], data[3], +		 data[4], data[5], data[6], data[7]); + +	/* If there is no valid PASID, it's likely a bug */ +	if (WARN_ONCE(pasid == 0, "Bug: No PASID in KFD interrupt")) +		return 0; + +	/* Interrupt types we care about: various signals and faults. +	 * They will be forwarded to a work queue (see below). +	 */ +	return source_id == SOC15_INTSRC_CP_END_OF_PIPE || +		source_id == SOC15_INTSRC_SDMA_TRAP || +		source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG || +		source_id == SOC15_INTSRC_CP_BAD_OPCODE || +		client_id == SOC15_IH_CLIENTID_VMC || +		client_id == SOC15_IH_CLIENTID_VMC1 || +		client_id == SOC15_IH_CLIENTID_UTCL2 || +		KFD_IRQ_IS_FENCE(client_id, source_id); +} + +static void event_interrupt_wq_v10(struct kfd_node *dev, +					const uint32_t *ih_ring_entry) +{ +	uint16_t source_id, client_id, pasid, vmid; +	uint32_t context_id0, context_id1; +	uint32_t encoding, sq_intr_err_type; + +	source_id = SOC15_SOURCE_ID_FROM_IH_ENTRY(ih_ring_entry); +	client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry); +	pasid = SOC15_PASID_FROM_IH_ENTRY(ih_ring_entry); +	vmid = SOC15_VMID_FROM_IH_ENTRY(ih_ring_entry); +	context_id0 = SOC15_CONTEXT_ID0_FROM_IH_ENTRY(ih_ring_entry); +	context_id1 = SOC15_CONTEXT_ID1_FROM_IH_ENTRY(ih_ring_entry); + +	if (client_id == SOC15_IH_CLIENTID_GRBM_CP || +	    client_id == SOC15_IH_CLIENTID_SE0SH || +	    client_id == SOC15_IH_CLIENTID_SE1SH || +	    client_id == SOC15_IH_CLIENTID_SE2SH || +	    client_id == SOC15_IH_CLIENTID_SE3SH) { +		if (source_id == SOC15_INTSRC_CP_END_OF_PIPE) +			kfd_signal_event_interrupt(pasid, context_id0, 32); +		else if (source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG) { +			encoding = REG_GET_FIELD(context_id1, +						SQ_INTERRUPT_WORD_WAVE_CTXID1, ENCODING); +			switch (encoding) { +			case SQ_INTERRUPT_WORD_ENCODING_AUTO: +				pr_debug( +					"sq_intr: auto, se %d, ttrace %d, wlt %d, ttrac_buf0_full %d, ttrac_buf1_full %d, ttrace_utc_err %d\n", +					REG_GET_FIELD(context_id1, SQ_INTERRUPT_WORD_AUTO_CTXID1, +							SE_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_AUTO_CTXID0, +							THREAD_TRACE), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_AUTO_CTXID0, +							WLT), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_AUTO_CTXID0, +							THREAD_TRACE_BUF0_FULL), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_AUTO_CTXID0, +							THREAD_TRACE_BUF1_FULL), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_AUTO_CTXID0, +							THREAD_TRACE_UTC_ERROR)); +				break; +			case SQ_INTERRUPT_WORD_ENCODING_INST: +				pr_debug("sq_intr: inst, se %d, data 0x%x, sa %d, priv %d, wave_id %d, simd_id %d, wgp_id %d\n", +					REG_GET_FIELD(context_id1, SQ_INTERRUPT_WORD_WAVE_CTXID1, +							SE_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							DATA), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							SA_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							PRIV), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							WAVE_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							SIMD_ID), +					REG_GET_FIELD(context_id1, SQ_INTERRUPT_WORD_WAVE_CTXID1, +							WGP_ID)); +				if (context_id0 & SQ_INTERRUPT_WORD_WAVE_CTXID0__PRIV_MASK) { +					if (kfd_set_dbg_ev_from_interrupt(dev, pasid, +							KFD_DEBUG_DOORBELL_ID(context_id0), +							KFD_DEBUG_TRAP_CODE(context_id0), +							NULL, 0)) +						return; +				} +				break; +			case SQ_INTERRUPT_WORD_ENCODING_ERROR: +				sq_intr_err_type = REG_GET_FIELD(context_id0, KFD_CTXID0, +								ERR_TYPE); +				pr_warn("sq_intr: error, se %d, data 0x%x, sa %d, priv %d, wave_id %d, simd_id %d, wgp_id %d, err_type %d\n", +					REG_GET_FIELD(context_id1, SQ_INTERRUPT_WORD_WAVE_CTXID1, +							SE_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							DATA), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							SA_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							PRIV), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							WAVE_ID), +					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID0, +							SIMD_ID), +					REG_GET_FIELD(context_id1, SQ_INTERRUPT_WORD_WAVE_CTXID1, +							WGP_ID), +					sq_intr_err_type); +				if (sq_intr_err_type != SQ_INTERRUPT_ERROR_TYPE_ILLEGAL_INST && +					sq_intr_err_type != SQ_INTERRUPT_ERROR_TYPE_MEMVIOL) { +					event_interrupt_poison_consumption(dev, pasid, source_id); +					return; +				} +				break; +			default: +				break; +			} +			kfd_signal_event_interrupt(pasid, context_id0 & 0x7fffff, 23); +		} else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) { +			kfd_set_dbg_ev_from_interrupt(dev, pasid, +				KFD_DEBUG_DOORBELL_ID(context_id0), +				KFD_EC_MASK(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0)), +				NULL, +				0); +		} +	} else if (client_id == SOC15_IH_CLIENTID_SDMA0 || +		   client_id == SOC15_IH_CLIENTID_SDMA1 || +		   client_id == SOC15_IH_CLIENTID_SDMA2 || +		   client_id == SOC15_IH_CLIENTID_SDMA3 || +		   (client_id == SOC15_IH_CLIENTID_SDMA3_Sienna_Cichlid && +		    KFD_GC_VERSION(dev) == IP_VERSION(10, 3, 0)) || +		   client_id == SOC15_IH_CLIENTID_SDMA4 || +		   client_id == SOC15_IH_CLIENTID_SDMA5 || +		   client_id == SOC15_IH_CLIENTID_SDMA6 || +		   client_id == SOC15_IH_CLIENTID_SDMA7) { +		if (source_id == SOC15_INTSRC_SDMA_TRAP) { +			kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28); +		} else if (source_id == SOC15_INTSRC_SDMA_ECC) { +			event_interrupt_poison_consumption(dev, pasid, source_id); +			return; +		} +	} else if (client_id == SOC15_IH_CLIENTID_VMC || +		   client_id == SOC15_IH_CLIENTID_VMC1 || +		   client_id == SOC15_IH_CLIENTID_UTCL2) { +		struct kfd_vm_fault_info info = {0}; +		uint16_t ring_id = SOC15_RING_ID_FROM_IH_ENTRY(ih_ring_entry); +		struct kfd_hsa_memory_exception_data exception_data; + +		if (client_id == SOC15_IH_CLIENTID_UTCL2 && +				amdgpu_amdkfd_ras_query_utcl2_poison_status(dev->adev)) { +			event_interrupt_poison_consumption(dev, pasid, client_id); +			return; +		} + +		info.vmid = vmid; +		info.mc_id = client_id; +		info.page_addr = ih_ring_entry[4] | +			(uint64_t)(ih_ring_entry[5] & 0xf) << 32; +		info.prot_valid = ring_id & 0x08; +		info.prot_read  = ring_id & 0x10; +		info.prot_write = ring_id & 0x20; + +		memset(&exception_data, 0, sizeof(exception_data)); +		exception_data.gpu_id = dev->id; +		exception_data.va = (info.page_addr) << PAGE_SHIFT; +		exception_data.failure.NotPresent = info.prot_valid ? 1 : 0; +		exception_data.failure.NoExecute = info.prot_exec ? 1 : 0; +		exception_data.failure.ReadOnly = info.prot_write ? 1 : 0; +		exception_data.failure.imprecise = 0; + +		kfd_set_dbg_ev_from_interrupt(dev, +						pasid, +						-1, +						KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION), +						&exception_data, +						sizeof(exception_data)); +	} else if (KFD_IRQ_IS_FENCE(client_id, source_id)) { +		kfd_process_close_interrupt_drain(pasid); +	} +} + +const struct kfd_event_interrupt_class event_interrupt_class_v10 = { +	.interrupt_isr = event_interrupt_isr_v10, +	.interrupt_wq = event_interrupt_wq_v10, +}; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c index 0d53f6067422..f933bd231fb9 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c @@ -26,6 +26,7 @@  #include "kfd_device_queue_manager.h"  #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"  #include "kfd_smi_events.h" +#include "kfd_debug.h"  /*   * GFX11 SQ Interrupts @@ -187,7 +188,7 @@ static void print_sq_intr_info_error(uint32_t context_id0, uint32_t context_id1)  		REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_ERROR_CTXID1, WGP_ID));  } -static void event_interrupt_poison_consumption_v11(struct kfd_dev *dev, +static void event_interrupt_poison_consumption_v11(struct kfd_node *dev,  				uint16_t pasid, uint16_t source_id)  {  	int ret = -EINVAL; @@ -225,7 +226,7 @@ static void event_interrupt_poison_consumption_v11(struct kfd_dev *dev,  		amdgpu_amdkfd_ras_poison_consumption_handler(dev->adev, true);  } -static bool event_interrupt_isr_v11(struct kfd_dev *dev, +static bool event_interrupt_isr_v11(struct kfd_node *dev,  					const uint32_t *ih_ring_entry,  					uint32_t *patched_ihre,  					bool *patched_flag) @@ -238,7 +239,7 @@ static bool event_interrupt_isr_v11(struct kfd_dev *dev,  	client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry);  	/* Only handle interrupts from KFD VMIDs */  	vmid = SOC15_VMID_FROM_IH_ENTRY(ih_ring_entry); -	if (/*!KFD_IRQ_IS_FENCE(client_id, source_id) &&*/ +	if (!KFD_IRQ_IS_FENCE(client_id, source_id) &&  	    (vmid < dev->vm_info.first_vmid_kfd ||  	    vmid > dev->vm_info.last_vmid_kfd))  		return false; @@ -267,19 +268,19 @@ static bool event_interrupt_isr_v11(struct kfd_dev *dev,  		source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG ||  		source_id == SOC15_INTSRC_CP_BAD_OPCODE ||  		source_id == SOC21_INTSRC_SDMA_TRAP || -		/* KFD_IRQ_IS_FENCE(client_id, source_id) || */ +		KFD_IRQ_IS_FENCE(client_id, source_id) ||  		(((client_id == SOC21_IH_CLIENTID_VMC) ||  		 ((client_id == SOC21_IH_CLIENTID_GFX) &&  		  (source_id == UTCL2_1_0__SRCID__FAULT))) &&  		  !amdgpu_no_queue_eviction_on_vm_fault);  } -static void event_interrupt_wq_v11(struct kfd_dev *dev, +static void event_interrupt_wq_v11(struct kfd_node *dev,  					const uint32_t *ih_ring_entry)  {  	uint16_t source_id, client_id, ring_id, pasid, vmid;  	uint32_t context_id0, context_id1; -	uint8_t sq_int_enc, sq_int_errtype, sq_int_priv; +	uint8_t sq_int_enc, sq_int_priv, sq_int_errtype;  	struct kfd_vm_fault_info info = {0};  	struct kfd_hsa_memory_exception_data exception_data; @@ -312,9 +313,9 @@ static void event_interrupt_wq_v11(struct kfd_dev *dev,  		exception_data.failure.ReadOnly = info.prot_write ? 1 : 0;  		exception_data.failure.imprecise = 0; -		/*kfd_set_dbg_ev_from_interrupt(dev, pasid, -1, +		kfd_set_dbg_ev_from_interrupt(dev, pasid, -1,  					      KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION), -					      &exception_data, sizeof(exception_data));*/ +					      &exception_data, sizeof(exception_data));  		kfd_smi_event_update_vmfault(dev, pasid);  	/* GRBM, SDMA, SE, PMM */ @@ -324,11 +325,11 @@ static void event_interrupt_wq_v11(struct kfd_dev *dev,  		/* CP */  		if (source_id == SOC15_INTSRC_CP_END_OF_PIPE)  			kfd_signal_event_interrupt(pasid, context_id0, 32); -		/*else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) +		else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE)  			kfd_set_dbg_ev_from_interrupt(dev, pasid,  				KFD_CTXID0_DOORBELL_ID(context_id0),  				KFD_EC_MASK(KFD_CTXID0_CP_BAD_OP_ECODE(context_id0)), -				NULL, 0);*/ +				NULL, 0);  		/* SDMA */  		else if (source_id == SOC21_INTSRC_SDMA_TRAP) @@ -350,11 +351,11 @@ static void event_interrupt_wq_v11(struct kfd_dev *dev,  				print_sq_intr_info_inst(context_id0, context_id1);  				sq_int_priv = REG_GET_FIELD(context_id0,  						SQ_INTERRUPT_WORD_WAVE_CTXID0, PRIV); -				/*if (sq_int_priv && (kfd_set_dbg_ev_from_interrupt(dev, pasid, +				if (sq_int_priv && (kfd_set_dbg_ev_from_interrupt(dev, pasid,  						KFD_CTXID0_DOORBELL_ID(context_id0),  						KFD_CTXID0_TRAP_CODE(context_id0),  						NULL, 0))) -					return;*/ +					return;  				break;  			case SQ_INTERRUPT_WORD_ENCODING_ERROR:  				print_sq_intr_info_error(context_id0, context_id1); @@ -373,8 +374,8 @@ static void event_interrupt_wq_v11(struct kfd_dev *dev,  			kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24);  		} -	/*} else if (KFD_IRQ_IS_FENCE(client_id, source_id)) { -		kfd_process_close_interrupt_drain(pasid);*/ +	} else if (KFD_IRQ_IS_FENCE(client_id, source_id)) { +		kfd_process_close_interrupt_drain(pasid);  	}  } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c index 0b75a37b689b..d5c9f30552e3 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c @@ -23,10 +23,40 @@  #include "kfd_priv.h"  #include "kfd_events.h" +#include "kfd_debug.h"  #include "soc15_int.h"  #include "kfd_device_queue_manager.h"  #include "kfd_smi_events.h" +/* + * GFX9 SQ Interrupts + * + * There are 3 encoding types of interrupts sourced from SQ sent as a 44-bit + * packet to the Interrupt Handler: + * Auto - Generated by the SQG (various cmd overflows, timestamps etc) + * Wave - Generated by S_SENDMSG through a shader program + * Error - HW generated errors (Illegal instructions, Memviols, EDC etc) + * + * The 44-bit packet is mapped as {context_id1[7:0],context_id0[31:0]} plus + * 4-bits for VMID (SOC15_VMID_FROM_IH_ENTRY) as such: + * + * - context_id0[27:26] + * Encoding type (0 = Auto, 1 = Wave, 2 = Error) + * + * - context_id0[13] + * PRIV bit indicates that Wave S_SEND or error occurred within trap + * + * - {context_id1[7:0],context_id0[31:28],context_id0[11:0]} + * 24-bit data with the following layout per encoding type: + * Auto - only context_id0[8:0] is used, which reports various interrupts + * generated by SQG.  The rest is 0. + * Wave - user data sent from m0 via S_SENDMSG + * Error - Error type (context_id1[7:4]), Error Details (rest of bits) + * + * The other context_id bits show coordinates (SE/SH/CU/SIMD/WAVE) for wave + * S_SENDMSG and Errors.  These are 0 for Auto. + */ +  enum SQ_INTERRUPT_WORD_ENCODING {  	SQ_INTERRUPT_WORD_ENCODING_AUTO = 0x0,  	SQ_INTERRUPT_WORD_ENCODING_INST, @@ -84,13 +114,33 @@ enum SQ_INTERRUPT_ERROR_TYPE {  #define SQ_INTERRUPT_WORD_WAVE_CTXID__SE_ID_MASK 0x03000000  #define SQ_INTERRUPT_WORD_WAVE_CTXID__ENCODING_MASK 0x0c000000 +/* GFX9 SQ interrupt 24-bit data from context_id<0,1> */  #define KFD_CONTEXT_ID_GET_SQ_INT_DATA(ctx0, ctx1)                             \  	((ctx0 & 0xfff) | ((ctx0 >> 16) & 0xf000) | ((ctx1 << 16) & 0xff0000))  #define KFD_SQ_INT_DATA__ERR_TYPE_MASK 0xF00000  #define KFD_SQ_INT_DATA__ERR_TYPE__SHIFT 20 -static void event_interrupt_poison_consumption_v9(struct kfd_dev *dev, +/* + * The debugger will send user data(m0) with PRIV=1 to indicate it requires + * notification from the KFD with the following queue id (DOORBELL_ID) and + * trap code (TRAP_CODE). + */ +#define KFD_INT_DATA_DEBUG_DOORBELL_MASK	0x0003ff +#define KFD_INT_DATA_DEBUG_TRAP_CODE_SHIFT	10 +#define KFD_INT_DATA_DEBUG_TRAP_CODE_MASK	0x07fc00 +#define KFD_DEBUG_DOORBELL_ID(sq_int_data)	((sq_int_data) &	\ +				KFD_INT_DATA_DEBUG_DOORBELL_MASK) +#define KFD_DEBUG_TRAP_CODE(sq_int_data)	(((sq_int_data) &	\ +				KFD_INT_DATA_DEBUG_TRAP_CODE_MASK)	\ +				>> KFD_INT_DATA_DEBUG_TRAP_CODE_SHIFT) +#define KFD_DEBUG_CP_BAD_OP_ECODE_MASK		0x3fffc00 +#define KFD_DEBUG_CP_BAD_OP_ECODE_SHIFT		10 +#define KFD_DEBUG_CP_BAD_OP_ECODE(ctxid0)	(((ctxid0) &		\ +				KFD_DEBUG_CP_BAD_OP_ECODE_MASK)		\ +				>> KFD_DEBUG_CP_BAD_OP_ECODE_SHIFT) + +static void event_interrupt_poison_consumption_v9(struct kfd_node *dev,  				uint16_t pasid, uint16_t client_id)  {  	int old_poison, ret = -EINVAL; @@ -160,7 +210,7 @@ static bool context_id_expected(struct kfd_dev *dev)  	}  } -static bool event_interrupt_isr_v9(struct kfd_dev *dev, +static bool event_interrupt_isr_v9(struct kfd_node *dev,  					const uint32_t *ih_ring_entry,  					uint32_t *patched_ihre,  					bool *patched_flag) @@ -168,14 +218,16 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev,  	uint16_t source_id, client_id, pasid, vmid;  	const uint32_t *data = ih_ring_entry; +	source_id = SOC15_SOURCE_ID_FROM_IH_ENTRY(ih_ring_entry); +	client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry); +  	/* Only handle interrupts from KFD VMIDs */  	vmid = SOC15_VMID_FROM_IH_ENTRY(ih_ring_entry); -	if (vmid < dev->vm_info.first_vmid_kfd || -	    vmid > dev->vm_info.last_vmid_kfd) +	if (!KFD_IRQ_IS_FENCE(client_id, source_id) && +	   (vmid < dev->vm_info.first_vmid_kfd || +	    vmid > dev->vm_info.last_vmid_kfd))  		return false; -	source_id = SOC15_SOURCE_ID_FROM_IH_ENTRY(ih_ring_entry); -	client_id = SOC15_CLIENT_ID_FROM_IH_ENTRY(ih_ring_entry);  	pasid = SOC15_PASID_FROM_IH_ENTRY(ih_ring_entry);  	/* Only handle clients we care about */ @@ -194,7 +246,8 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev,  	    client_id != SOC15_IH_CLIENTID_SE0SH &&  	    client_id != SOC15_IH_CLIENTID_SE1SH &&  	    client_id != SOC15_IH_CLIENTID_SE2SH && -	    client_id != SOC15_IH_CLIENTID_SE3SH) +	    client_id != SOC15_IH_CLIENTID_SE3SH && +	    !KFD_IRQ_IS_FENCE(client_id, source_id))  		return false;  	/* This is a known issue for gfx9. Under non HWS, pasid is not set @@ -206,7 +259,7 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev,  		*patched_flag = true;  		memcpy(patched_ihre, ih_ring_entry, -				dev->device_info.ih_ring_entry_size); +				dev->kfd->device_info.ih_ring_entry_size);  		pasid = dev->dqm->vmid_pasid[vmid]; @@ -235,7 +288,7 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev,  		uint32_t context_id =  			SOC15_CONTEXT_ID0_FROM_IH_ENTRY(ih_ring_entry); -		if (context_id == 0 && context_id_expected(dev)) +		if (context_id == 0 && context_id_expected(dev->kfd))  			return false;  	} @@ -247,13 +300,14 @@ static bool event_interrupt_isr_v9(struct kfd_dev *dev,  		source_id == SOC15_INTSRC_SDMA_ECC ||  		source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG ||  		source_id == SOC15_INTSRC_CP_BAD_OPCODE || +		KFD_IRQ_IS_FENCE(client_id, source_id) ||  		((client_id == SOC15_IH_CLIENTID_VMC ||  		client_id == SOC15_IH_CLIENTID_VMC1 ||  		client_id == SOC15_IH_CLIENTID_UTCL2) &&  		!amdgpu_no_queue_eviction_on_vm_fault);  } -static void event_interrupt_wq_v9(struct kfd_dev *dev, +static void event_interrupt_wq_v9(struct kfd_node *dev,  					const uint32_t *ih_ring_entry)  {  	uint16_t source_id, client_id, pasid, vmid; @@ -302,6 +356,13 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev,  					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID, SIMD_ID),  					REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID, CU_ID),  					sq_int_data); +				if (context_id0 & SQ_INTERRUPT_WORD_WAVE_CTXID__PRIV_MASK) { +					if (kfd_set_dbg_ev_from_interrupt(dev, pasid, +							KFD_DEBUG_DOORBELL_ID(sq_int_data), +							KFD_DEBUG_TRAP_CODE(sq_int_data), +							NULL, 0)) +						return; +				}  				break;  			case SQ_INTERRUPT_WORD_ENCODING_ERROR:  				sq_intr_err = REG_GET_FIELD(sq_int_data, KFD_SQ_INT_DATA, ERR_TYPE); @@ -324,8 +385,12 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev,  				break;  			}  			kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24); -		} else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) -			kfd_signal_hw_exception_event(pasid); +		} else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE) { +			kfd_set_dbg_ev_from_interrupt(dev, pasid, +				KFD_DEBUG_DOORBELL_ID(context_id0), +				KFD_EC_MASK(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0)), +				NULL, 0); +		}  	} else if (client_id == SOC15_IH_CLIENTID_SDMA0 ||  		   client_id == SOC15_IH_CLIENTID_SDMA1 ||  		   client_id == SOC15_IH_CLIENTID_SDMA2 || @@ -345,6 +410,7 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev,  		   client_id == SOC15_IH_CLIENTID_UTCL2) {  		struct kfd_vm_fault_info info = {0};  		uint16_t ring_id = SOC15_RING_ID_FROM_IH_ENTRY(ih_ring_entry); +		struct kfd_hsa_memory_exception_data exception_data;  		if (client_id == SOC15_IH_CLIENTID_UTCL2 &&  		    amdgpu_amdkfd_ras_query_utcl2_poison_status(dev->adev)) { @@ -360,9 +426,23 @@ static void event_interrupt_wq_v9(struct kfd_dev *dev,  		info.prot_read  = ring_id & 0x10;  		info.prot_write = ring_id & 0x20; +		memset(&exception_data, 0, sizeof(exception_data)); +		exception_data.gpu_id = dev->id; +		exception_data.va = (info.page_addr) << PAGE_SHIFT; +		exception_data.failure.NotPresent = info.prot_valid ? 1 : 0; +		exception_data.failure.NoExecute = info.prot_exec ? 1 : 0; +		exception_data.failure.ReadOnly = info.prot_write ? 1 : 0; +		exception_data.failure.imprecise = 0; + +		kfd_set_dbg_ev_from_interrupt(dev, +						pasid, +						-1, +						KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION), +						&exception_data, +						sizeof(exception_data));  		kfd_smi_event_update_vmfault(dev, pasid); -		kfd_dqm_evict_pasid(dev->dqm, pasid); -		kfd_signal_vm_fault_event(dev, pasid, &info); +	} else if (KFD_IRQ_IS_FENCE(client_id, source_id)) { +		kfd_process_close_interrupt_drain(pasid);  	}  } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c index 34772fe74296..dd3c43c1ad70 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c @@ -50,29 +50,29 @@  static void interrupt_wq(struct work_struct *); -int kfd_interrupt_init(struct kfd_dev *kfd) +int kfd_interrupt_init(struct kfd_node *node)  {  	int r; -	r = kfifo_alloc(&kfd->ih_fifo, -		KFD_IH_NUM_ENTRIES * kfd->device_info.ih_ring_entry_size, +	r = kfifo_alloc(&node->ih_fifo, +		KFD_IH_NUM_ENTRIES * node->kfd->device_info.ih_ring_entry_size,  		GFP_KERNEL);  	if (r) { -		dev_err(kfd->adev->dev, "Failed to allocate IH fifo\n"); +		dev_err(node->adev->dev, "Failed to allocate IH fifo\n");  		return r;  	} -	kfd->ih_wq = alloc_workqueue("KFD IH", WQ_HIGHPRI, 1); -	if (unlikely(!kfd->ih_wq)) { -		kfifo_free(&kfd->ih_fifo); -		dev_err(kfd->adev->dev, "Failed to allocate KFD IH workqueue\n"); +	node->ih_wq = alloc_workqueue("KFD IH", WQ_HIGHPRI, 1); +	if (unlikely(!node->ih_wq)) { +		kfifo_free(&node->ih_fifo); +		dev_err(node->adev->dev, "Failed to allocate KFD IH workqueue\n");  		return -ENOMEM;  	} -	spin_lock_init(&kfd->interrupt_lock); +	spin_lock_init(&node->interrupt_lock); -	INIT_WORK(&kfd->interrupt_work, interrupt_wq); +	INIT_WORK(&node->interrupt_work, interrupt_wq); -	kfd->interrupts_active = true; +	node->interrupts_active = true;  	/*  	 * After this function returns, the interrupt will be enabled. This @@ -84,7 +84,7 @@ int kfd_interrupt_init(struct kfd_dev *kfd)  	return 0;  } -void kfd_interrupt_exit(struct kfd_dev *kfd) +void kfd_interrupt_exit(struct kfd_node *node)  {  	/*  	 * Stop the interrupt handler from writing to the ring and scheduling @@ -93,31 +93,31 @@ void kfd_interrupt_exit(struct kfd_dev *kfd)  	 */  	unsigned long flags; -	spin_lock_irqsave(&kfd->interrupt_lock, flags); -	kfd->interrupts_active = false; -	spin_unlock_irqrestore(&kfd->interrupt_lock, flags); +	spin_lock_irqsave(&node->interrupt_lock, flags); +	node->interrupts_active = false; +	spin_unlock_irqrestore(&node->interrupt_lock, flags);  	/*  	 * flush_work ensures that there are no outstanding  	 * work-queue items that will access interrupt_ring. New work items  	 * can't be created because we stopped interrupt handling above.  	 */ -	flush_workqueue(kfd->ih_wq); +	flush_workqueue(node->ih_wq); -	kfifo_free(&kfd->ih_fifo); +	kfifo_free(&node->ih_fifo);  }  /*   * Assumption: single reader/writer. This function is not re-entrant   */ -bool enqueue_ih_ring_entry(struct kfd_dev *kfd,	const void *ih_ring_entry) +bool enqueue_ih_ring_entry(struct kfd_node *node, const void *ih_ring_entry)  {  	int count; -	count = kfifo_in(&kfd->ih_fifo, ih_ring_entry, -				kfd->device_info.ih_ring_entry_size); -	if (count != kfd->device_info.ih_ring_entry_size) { -		dev_dbg_ratelimited(kfd->adev->dev, +	count = kfifo_in(&node->ih_fifo, ih_ring_entry, +				node->kfd->device_info.ih_ring_entry_size); +	if (count != node->kfd->device_info.ih_ring_entry_size) { +		dev_dbg_ratelimited(node->adev->dev,  			"Interrupt ring overflow, dropping interrupt %d\n",  			count);  		return false; @@ -129,32 +129,32 @@ bool enqueue_ih_ring_entry(struct kfd_dev *kfd,	const void *ih_ring_entry)  /*   * Assumption: single reader/writer. This function is not re-entrant   */ -static bool dequeue_ih_ring_entry(struct kfd_dev *kfd, void *ih_ring_entry) +static bool dequeue_ih_ring_entry(struct kfd_node *node, void *ih_ring_entry)  {  	int count; -	count = kfifo_out(&kfd->ih_fifo, ih_ring_entry, -				kfd->device_info.ih_ring_entry_size); +	count = kfifo_out(&node->ih_fifo, ih_ring_entry, +				node->kfd->device_info.ih_ring_entry_size); -	WARN_ON(count && count != kfd->device_info.ih_ring_entry_size); +	WARN_ON(count && count != node->kfd->device_info.ih_ring_entry_size); -	return count == kfd->device_info.ih_ring_entry_size; +	return count == node->kfd->device_info.ih_ring_entry_size;  }  static void interrupt_wq(struct work_struct *work)  { -	struct kfd_dev *dev = container_of(work, struct kfd_dev, +	struct kfd_node *dev = container_of(work, struct kfd_node,  						interrupt_work);  	uint32_t ih_ring_entry[KFD_MAX_RING_ENTRY_SIZE];  	unsigned long start_jiffies = jiffies; -	if (dev->device_info.ih_ring_entry_size > sizeof(ih_ring_entry)) { +	if (dev->kfd->device_info.ih_ring_entry_size > sizeof(ih_ring_entry)) {  		dev_err_once(dev->adev->dev, "Ring entry too small\n");  		return;  	}  	while (dequeue_ih_ring_entry(dev, ih_ring_entry)) { -		dev->device_info.event_interrupt_class->interrupt_wq(dev, +		dev->kfd->device_info.event_interrupt_class->interrupt_wq(dev,  								ih_ring_entry);  		if (time_is_before_jiffies(start_jiffies + HZ)) {  			/* If we spent more than a second processing signals, @@ -166,14 +166,14 @@ static void interrupt_wq(struct work_struct *work)  	}  } -bool interrupt_is_wanted(struct kfd_dev *dev, +bool interrupt_is_wanted(struct kfd_node *dev,  			const uint32_t *ih_ring_entry,  			uint32_t *patched_ihre, bool *flag)  {  	/* integer and bitwise OR so there is no boolean short-circuiting */  	unsigned int wanted = 0; -	wanted |= dev->device_info.event_interrupt_class->interrupt_isr(dev, +	wanted |= dev->kfd->device_info.event_interrupt_class->interrupt_isr(dev,  					 ih_ring_entry, patched_ihre, flag);  	return wanted != 0; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c index ec1bf611624e..808ee010520a 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_iommu.c @@ -109,11 +109,11 @@ int kfd_iommu_device_init(struct kfd_dev *kfd)   */  int kfd_iommu_bind_process_to_device(struct kfd_process_device *pdd)  { -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev;  	struct kfd_process *p = pdd->process;  	int err; -	if (!dev->use_iommu_v2 || pdd->bound == PDD_BOUND) +	if (!dev->kfd->use_iommu_v2 || pdd->bound == PDD_BOUND)  		return 0;  	if (unlikely(pdd->bound == PDD_BOUND_SUSPENDED)) { @@ -121,6 +121,12 @@ int kfd_iommu_bind_process_to_device(struct kfd_process_device *pdd)  		return -EINVAL;  	} +	if (!kfd_is_first_node(dev)) { +		dev_warn_once(kfd_device, +				"IOMMU supported only on first node\n"); +		return 0; +	} +  	err = amd_iommu_bind_pasid(dev->adev->pdev, p->pasid, p->lead_thread);  	if (!err)  		pdd->bound = PDD_BOUND; @@ -138,7 +144,8 @@ void kfd_iommu_unbind_process(struct kfd_process *p)  	int i;  	for (i = 0; i < p->n_pdds; i++) -		if (p->pdds[i]->bound == PDD_BOUND) +		if ((p->pdds[i]->bound == PDD_BOUND) && +		    (kfd_is_first_node((p->pdds[i]->dev))))  			amd_iommu_unbind_pasid(p->pdds[i]->dev->adev->pdev,  					       p->pasid);  } @@ -146,7 +153,7 @@ void kfd_iommu_unbind_process(struct kfd_process *p)  /* Callback for process shutdown invoked by the IOMMU driver */  static void iommu_pasid_shutdown_callback(struct pci_dev *pdev, u32 pasid)  { -	struct kfd_dev *dev = kfd_device_by_pci_dev(pdev); +	struct kfd_node *dev = kfd_device_by_pci_dev(pdev);  	struct kfd_process *p;  	struct kfd_process_device *pdd; @@ -182,7 +189,7 @@ static void iommu_pasid_shutdown_callback(struct pci_dev *pdev, u32 pasid)  static int iommu_invalid_ppr_cb(struct pci_dev *pdev, u32 pasid,  				unsigned long address, u16 flags)  { -	struct kfd_dev *dev; +	struct kfd_node *dev;  	dev_warn_ratelimited(kfd_device,  			"Invalid PPR device %x:%x.%x pasid 0x%x address 0x%lX flags 0x%X", @@ -205,7 +212,7 @@ static int iommu_invalid_ppr_cb(struct pci_dev *pdev, u32 pasid,   * Bind processes do the device that have been temporarily unbound   * (PDD_BOUND_SUSPENDED) in kfd_unbind_processes_from_device.   */ -static int kfd_bind_processes_to_device(struct kfd_dev *kfd) +static int kfd_bind_processes_to_device(struct kfd_node *knode)  {  	struct kfd_process_device *pdd;  	struct kfd_process *p; @@ -216,14 +223,14 @@ static int kfd_bind_processes_to_device(struct kfd_dev *kfd)  	hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {  		mutex_lock(&p->mutex); -		pdd = kfd_get_process_device_data(kfd, p); +		pdd = kfd_get_process_device_data(knode, p);  		if (WARN_ON(!pdd) || pdd->bound != PDD_BOUND_SUSPENDED) {  			mutex_unlock(&p->mutex);  			continue;  		} -		err = amd_iommu_bind_pasid(kfd->adev->pdev, p->pasid, +		err = amd_iommu_bind_pasid(knode->adev->pdev, p->pasid,  				p->lead_thread);  		if (err < 0) {  			pr_err("Unexpected pasid 0x%x binding failure\n", @@ -246,7 +253,7 @@ static int kfd_bind_processes_to_device(struct kfd_dev *kfd)   * processes will be restored to PDD_BOUND state in   * kfd_bind_processes_to_device.   */ -static void kfd_unbind_processes_from_device(struct kfd_dev *kfd) +static void kfd_unbind_processes_from_device(struct kfd_node *knode)  {  	struct kfd_process_device *pdd;  	struct kfd_process *p; @@ -256,7 +263,7 @@ static void kfd_unbind_processes_from_device(struct kfd_dev *kfd)  	hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {  		mutex_lock(&p->mutex); -		pdd = kfd_get_process_device_data(kfd, p); +		pdd = kfd_get_process_device_data(knode, p);  		if (WARN_ON(!pdd)) {  			mutex_unlock(&p->mutex); @@ -281,7 +288,7 @@ void kfd_iommu_suspend(struct kfd_dev *kfd)  	if (!kfd->use_iommu_v2)  		return; -	kfd_unbind_processes_from_device(kfd); +	kfd_unbind_processes_from_device(kfd->nodes[0]);  	amd_iommu_set_invalidate_ctx_cb(kfd->adev->pdev, NULL);  	amd_iommu_set_invalid_ppr_cb(kfd->adev->pdev, NULL); @@ -312,7 +319,7 @@ int kfd_iommu_resume(struct kfd_dev *kfd)  	amd_iommu_set_invalid_ppr_cb(kfd->adev->pdev,  				     iommu_invalid_ppr_cb); -	err = kfd_bind_processes_to_device(kfd); +	err = kfd_bind_processes_to_device(kfd->nodes[0]);  	if (err) {  		amd_iommu_set_invalidate_ctx_cb(kfd->adev->pdev, NULL);  		amd_iommu_set_invalid_ppr_cb(kfd->adev->pdev, NULL); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c index bcf7bc3302c9..1bea629c49ca 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c @@ -38,7 +38,7 @@  /* Initialize a kernel queue, including allocations of GART memory   * needed for the queue.   */ -static bool kq_initialize(struct kernel_queue *kq, struct kfd_dev *dev, +static bool kq_initialize(struct kernel_queue *kq, struct kfd_node *dev,  		enum kfd_queue_type type, unsigned int queue_size)  {  	struct queue_properties prop; @@ -75,7 +75,7 @@ static bool kq_initialize(struct kernel_queue *kq, struct kfd_dev *dev,  	if (!kq->mqd_mgr)  		return false; -	prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off); +	prop.doorbell_ptr = kfd_get_kernel_doorbell(dev->kfd, &prop.doorbell_off);  	if (!prop.doorbell_ptr) {  		pr_err("Failed to initialize doorbell"); @@ -112,7 +112,7 @@ static bool kq_initialize(struct kernel_queue *kq, struct kfd_dev *dev,  	kq->rptr_kernel = kq->rptr_mem->cpu_ptr;  	kq->rptr_gpu_addr = kq->rptr_mem->gpu_addr; -	retval = kfd_gtt_sa_allocate(dev, dev->device_info.doorbell_size, +	retval = kfd_gtt_sa_allocate(dev, dev->kfd->device_info.doorbell_size,  					&kq->wptr_mem);  	if (retval != 0) @@ -189,7 +189,7 @@ err_rptr_allocate_vidmem:  err_eop_allocate_vidmem:  	kfd_gtt_sa_free(dev, kq->pq);  err_pq_allocate_vidmem: -	kfd_release_kernel_doorbell(dev, prop.doorbell_ptr); +	kfd_release_kernel_doorbell(dev->kfd, prop.doorbell_ptr);  err_get_kernel_doorbell:  	return false; @@ -220,7 +220,7 @@ static void kq_uninitialize(struct kernel_queue *kq, bool hanging)  	kfd_gtt_sa_free(kq->dev, kq->eop_mem);  	kfd_gtt_sa_free(kq->dev, kq->pq); -	kfd_release_kernel_doorbell(kq->dev, +	kfd_release_kernel_doorbell(kq->dev->kfd,  					kq->queue->properties.doorbell_ptr);  	uninit_queue(kq->queue);  } @@ -298,7 +298,7 @@ void kq_submit_packet(struct kernel_queue *kq)  	}  	pr_debug("\n");  #endif -	if (kq->dev->device_info.doorbell_size == 8) { +	if (kq->dev->kfd->device_info.doorbell_size == 8) {  		*kq->wptr64_kernel = kq->pending_wptr64;  		write_kernel_doorbell64(kq->queue->properties.doorbell_ptr,  					kq->pending_wptr64); @@ -311,7 +311,7 @@ void kq_submit_packet(struct kernel_queue *kq)  void kq_rollback_packet(struct kernel_queue *kq)  { -	if (kq->dev->device_info.doorbell_size == 8) { +	if (kq->dev->kfd->device_info.doorbell_size == 8) {  		kq->pending_wptr64 = *kq->wptr64_kernel;  		kq->pending_wptr = *kq->wptr_kernel %  			(kq->queue->properties.queue_size / 4); @@ -320,7 +320,7 @@ void kq_rollback_packet(struct kernel_queue *kq)  	}  } -struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, +struct kernel_queue *kernel_queue_init(struct kfd_node *dev,  					enum kfd_queue_type type)  {  	struct kernel_queue *kq; @@ -345,7 +345,7 @@ void kernel_queue_uninit(struct kernel_queue *kq, bool hanging)  }  /* FIXME: Can this test be removed? */ -static __attribute__((unused)) void test_kq(struct kfd_dev *dev) +static __attribute__((unused)) void test_kq(struct kfd_node *dev)  {  	struct kernel_queue *kq;  	uint32_t *buffer, i; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h index 383202fd1ea2..9a6244430845 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.h @@ -53,7 +53,7 @@ void kq_rollback_packet(struct kernel_queue *kq);  struct kernel_queue {  	/* data */ -	struct kfd_dev		*dev; +	struct kfd_node		*dev;  	struct mqd_manager	*mqd_mgr;  	struct queue		*queue;  	uint64_t		pending_wptr64; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index 54933903bcb8..58d95fb99595 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c @@ -206,7 +206,7 @@ svm_migrate_copy_done(struct amdgpu_device *adev, struct dma_fence *mfence)  unsigned long  svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr)  { -	return (addr + adev->kfd.dev->pgmap.range.start) >> PAGE_SHIFT; +	return (addr + adev->kfd.pgmap.range.start) >> PAGE_SHIFT;  }  static void @@ -236,7 +236,7 @@ svm_migrate_addr(struct amdgpu_device *adev, struct page *page)  	unsigned long addr;  	addr = page_to_pfn(page) << PAGE_SHIFT; -	return (addr - adev->kfd.dev->pgmap.range.start); +	return (addr - adev->kfd.pgmap.range.start);  }  static struct page * @@ -287,11 +287,12 @@ static unsigned long svm_migrate_unsuccessful_pages(struct migrate_vma *migrate)  }  static int -svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange, +svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,  			 struct migrate_vma *migrate, struct dma_fence **mfence,  			 dma_addr_t *scratch, uint64_t ttm_res_offset)  { -	uint64_t npages = migrate->npages; +	uint64_t npages = migrate->cpages; +	struct amdgpu_device *adev = node->adev;  	struct device *dev = adev->dev;  	struct amdgpu_res_cursor cursor;  	dma_addr_t *src; @@ -321,7 +322,7 @@ svm_migrate_copy_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  					      DMA_TO_DEVICE);  			r = dma_mapping_error(dev, src[i]);  			if (r) { -				dev_err(adev->dev, "%s: fail %d dma_map_page\n", +				dev_err(dev, "%s: fail %d dma_map_page\n",  					__func__, r);  				goto out_free_vram_pages;  			} @@ -390,12 +391,13 @@ out_free_vram_pages:  }  static long -svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange, +svm_migrate_vma_to_vram(struct kfd_node *node, struct svm_range *prange,  			struct vm_area_struct *vma, uint64_t start,  			uint64_t end, uint32_t trigger, uint64_t ttm_res_offset)  {  	struct kfd_process *p = container_of(prange->svms, struct kfd_process, svms);  	uint64_t npages = (end - start) >> PAGE_SHIFT; +	struct amdgpu_device *adev = node->adev;  	struct kfd_process_device *pdd;  	struct dma_fence *mfence = NULL;  	struct migrate_vma migrate = { 0 }; @@ -421,9 +423,9 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  	migrate.dst = migrate.src + npages;  	scratch = (dma_addr_t *)(migrate.dst + npages); -	kfd_smi_event_migration_start(adev->kfd.dev, p->lead_thread->pid, +	kfd_smi_event_migration_start(node, p->lead_thread->pid,  				      start >> PAGE_SHIFT, end >> PAGE_SHIFT, -				      0, adev->kfd.dev->id, prange->prefetch_loc, +				      0, node->id, prange->prefetch_loc,  				      prange->preferred_loc, trigger);  	r = migrate_vma_setup(&migrate); @@ -445,7 +447,7 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  	else  		pr_debug("0x%lx pages migrated\n", cpages); -	r = svm_migrate_copy_to_vram(adev, prange, &migrate, &mfence, scratch, ttm_res_offset); +	r = svm_migrate_copy_to_vram(node, prange, &migrate, &mfence, scratch, ttm_res_offset);  	migrate_vma_pages(&migrate);  	pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n", @@ -454,9 +456,9 @@ svm_migrate_vma_to_vram(struct amdgpu_device *adev, struct svm_range *prange,  	svm_migrate_copy_done(adev, mfence);  	migrate_vma_finalize(&migrate); -	kfd_smi_event_migration_end(adev->kfd.dev, p->lead_thread->pid, +	kfd_smi_event_migration_end(node, p->lead_thread->pid,  				    start >> PAGE_SHIFT, end >> PAGE_SHIFT, -				    0, adev->kfd.dev->id, trigger); +				    0, node->id, trigger);  	svm_range_dma_unmap(adev->dev, scratch, 0, npages);  	svm_range_free_dma_mappings(prange); @@ -465,7 +467,7 @@ out_free:  	kvfree(buf);  out:  	if (!r && cpages) { -		pdd = svm_range_get_pdd_by_adev(prange, adev); +		pdd = svm_range_get_pdd_by_node(prange, node);  		if (pdd)  			WRITE_ONCE(pdd->page_in, pdd->page_in + cpages); @@ -492,8 +494,8 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  {  	unsigned long addr, start, end;  	struct vm_area_struct *vma; -	struct amdgpu_device *adev;  	uint64_t ttm_res_offset; +	struct kfd_node *node;  	unsigned long cpages = 0;  	long r = 0; @@ -503,9 +505,9 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  		return 0;  	} -	adev = svm_range_get_adev_by_id(prange, best_loc); -	if (!adev) { -		pr_debug("failed to get device by id 0x%x\n", best_loc); +	node = svm_range_get_node_by_id(prange, best_loc); +	if (!node) { +		pr_debug("failed to get kfd node by id 0x%x\n", best_loc);  		return -ENODEV;  	} @@ -515,9 +517,9 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  	start = prange->start << PAGE_SHIFT;  	end = (prange->last + 1) << PAGE_SHIFT; -	r = svm_range_vram_node_new(adev, prange, true); +	r = svm_range_vram_node_new(node, prange, true);  	if (r) { -		dev_dbg(adev->dev, "fail %ld to alloc vram\n", r); +		dev_dbg(node->adev->dev, "fail %ld to alloc vram\n", r);  		return r;  	}  	ttm_res_offset = prange->offset << PAGE_SHIFT; @@ -530,7 +532,7 @@ svm_migrate_ram_to_vram(struct svm_range *prange, uint32_t best_loc,  			break;  		next = min(vma->vm_end, end); -		r = svm_migrate_vma_to_vram(adev, prange, vma, addr, next, trigger, ttm_res_offset); +		r = svm_migrate_vma_to_vram(node, prange, vma, addr, next, trigger, ttm_res_offset);  		if (r < 0) {  			pr_debug("failed %ld to migrate\n", r);  			break; @@ -649,11 +651,13 @@ out_oom:  /**   * svm_migrate_vma_to_ram - migrate range inside one vma from device to system   * - * @adev: amdgpu device to migrate from   * @prange: svm range structure   * @vma: vm_area_struct that range [start, end] belongs to   * @start: range start virtual address in pages   * @end: range end virtual address in pages + * @node: kfd node device to migrate from + * @trigger: reason of migration + * @fault_page: is from vmf->page, svm_migrate_to_ram(), this is CPU page fault callback   *   * Context: Process context, caller hold mmap read lock, prange->migrate_mutex   * @@ -663,7 +667,7 @@ out_oom:   *   positive values - partial migration, number of pages not migrated   */  static long -svm_migrate_vma_to_ram(struct amdgpu_device *adev, struct svm_range *prange, +svm_migrate_vma_to_ram(struct kfd_node *node, struct svm_range *prange,  		       struct vm_area_struct *vma, uint64_t start, uint64_t end,  		       uint32_t trigger, struct page *fault_page)  { @@ -671,6 +675,7 @@ svm_migrate_vma_to_ram(struct amdgpu_device *adev, struct svm_range *prange,  	uint64_t npages = (end - start) >> PAGE_SHIFT;  	unsigned long upages = npages;  	unsigned long cpages = 0; +	struct amdgpu_device *adev = node->adev;  	struct kfd_process_device *pdd;  	struct dma_fence *mfence = NULL;  	struct migrate_vma migrate = { 0 }; @@ -699,9 +704,9 @@ svm_migrate_vma_to_ram(struct amdgpu_device *adev, struct svm_range *prange,  	migrate.fault_page = fault_page;  	scratch = (dma_addr_t *)(migrate.dst + npages); -	kfd_smi_event_migration_start(adev->kfd.dev, p->lead_thread->pid, +	kfd_smi_event_migration_start(node, p->lead_thread->pid,  				      start >> PAGE_SHIFT, end >> PAGE_SHIFT, -				      adev->kfd.dev->id, 0, prange->prefetch_loc, +				      node->id, 0, prange->prefetch_loc,  				      prange->preferred_loc, trigger);  	r = migrate_vma_setup(&migrate); @@ -735,9 +740,9 @@ svm_migrate_vma_to_ram(struct amdgpu_device *adev, struct svm_range *prange,  	svm_migrate_copy_done(adev, mfence);  	migrate_vma_finalize(&migrate); -	kfd_smi_event_migration_end(adev->kfd.dev, p->lead_thread->pid, +	kfd_smi_event_migration_end(node, p->lead_thread->pid,  				    start >> PAGE_SHIFT, end >> PAGE_SHIFT, -				    adev->kfd.dev->id, 0, trigger); +				    node->id, 0, trigger);  	svm_range_dma_unmap(adev->dev, scratch, 0, npages); @@ -745,7 +750,7 @@ out_free:  	kvfree(buf);  out:  	if (!r && cpages) { -		pdd = svm_range_get_pdd_by_adev(prange, adev); +		pdd = svm_range_get_pdd_by_node(prange, node);  		if (pdd)  			WRITE_ONCE(pdd->page_out, pdd->page_out + cpages);  	} @@ -757,6 +762,7 @@ out:   * @prange: range structure   * @mm: process mm, use current->mm if NULL   * @trigger: reason of migration + * @fault_page: is from vmf->page, svm_migrate_to_ram(), this is CPU page fault callback   *   * Context: Process context, caller hold mmap read lock, prange->migrate_mutex   * @@ -766,7 +772,7 @@ out:  int svm_migrate_vram_to_ram(struct svm_range *prange, struct mm_struct *mm,  			    uint32_t trigger, struct page *fault_page)  { -	struct amdgpu_device *adev; +	struct kfd_node *node;  	struct vm_area_struct *vma;  	unsigned long addr;  	unsigned long start; @@ -780,13 +786,11 @@ int svm_migrate_vram_to_ram(struct svm_range *prange, struct mm_struct *mm,  		return 0;  	} -	adev = svm_range_get_adev_by_id(prange, prange->actual_loc); -	if (!adev) { -		pr_debug("failed to get device by id 0x%x\n", -			 prange->actual_loc); +	node = svm_range_get_node_by_id(prange, prange->actual_loc); +	if (!node) { +		pr_debug("failed to get kfd node by id 0x%x\n", prange->actual_loc);  		return -ENODEV;  	} -  	pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx] from gpu 0x%x to ram\n",  		 prange->svms, prange, prange->start, prange->last,  		 prange->actual_loc); @@ -805,7 +809,7 @@ int svm_migrate_vram_to_ram(struct svm_range *prange, struct mm_struct *mm,  		}  		next = min(vma->vm_end, end); -		r = svm_migrate_vma_to_ram(adev, prange, vma, addr, next, trigger, +		r = svm_migrate_vma_to_ram(node, prange, vma, addr, next, trigger,  			fault_page);  		if (r < 0) {  			pr_debug("failed %ld to migrate prange %p\n", r, prange); @@ -987,18 +991,21 @@ static const struct dev_pagemap_ops svm_migrate_pgmap_ops = {  /* Each VRAM page uses sizeof(struct page) on system memory */  #define SVM_HMM_PAGE_STRUCT_SIZE(size) ((size)/PAGE_SIZE * sizeof(struct page)) -int svm_migrate_init(struct amdgpu_device *adev) +int kgd2kfd_init_zone_device(struct amdgpu_device *adev)  { -	struct kfd_dev *kfddev = adev->kfd.dev; +	struct amdgpu_kfd_dev *kfddev = &adev->kfd;  	struct dev_pagemap *pgmap;  	struct resource *res = NULL;  	unsigned long size;  	void *r; -	/* Page migration works on Vega10 or newer */ -	if (!KFD_IS_SOC15(kfddev)) +	/* Page migration works on gfx9 or newer */ +	if (adev->ip_versions[GC_HWIP][0] < IP_VERSION(9, 0, 1))  		return -EINVAL; +	if (adev->gmc.is_app_apu) +		return 0; +  	pgmap = &kfddev->pgmap;  	memset(pgmap, 0, sizeof(*pgmap)); @@ -1041,8 +1048,6 @@ int svm_migrate_init(struct amdgpu_device *adev)  	amdgpu_amdkfd_reserve_system_mem(SVM_HMM_PAGE_STRUCT_SIZE(size)); -	svm_range_set_max_pages(adev); -  	pr_info("HMM registered %ldMB device memory\n", size >> 20);  	return 0; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.h b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.h index a5d7e6d22264..487f26368164 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.h @@ -47,15 +47,6 @@ int svm_migrate_vram_to_ram(struct svm_range *prange, struct mm_struct *mm,  unsigned long  svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr); -int svm_migrate_init(struct amdgpu_device *adev); - -#else - -static inline int svm_migrate_init(struct amdgpu_device *adev) -{ -	return 0; -} -  #endif /* IS_ENABLED(CONFIG_HSA_AMD_SVM) */  #endif /* KFD_MIGRATE_H_ */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c index 623ccd227b7d..863cf060af48 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c @@ -46,7 +46,7 @@ int pipe_priority_map[] = {  	KFD_PIPE_PRIORITY_CS_HIGH  }; -struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev, struct queue_properties *q) +struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_node *dev, struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj = NULL; @@ -61,7 +61,7 @@ struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev, struct queue_propertie  	return mqd_mem_obj;  } -struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_dev *dev, +struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_node *dev,  					struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj = NULL; @@ -72,11 +72,12 @@ struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_dev *dev,  		return NULL;  	offset = (q->sdma_engine_id * -		dev->device_info.num_sdma_queues_per_engine + +		dev->kfd->device_info.num_sdma_queues_per_engine +  		q->sdma_queue_id) *  		dev->dqm->mqd_mgrs[KFD_MQD_TYPE_SDMA]->mqd_size; -	offset += dev->dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size; +	offset += dev->dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size * +		  NUM_XCC(dev->xcc_mask);  	mqd_mem_obj->gtt_mem = (void *)((uint64_t)dev->dqm->hiq_sdma_mqd.gtt_mem  				+ offset); @@ -189,7 +190,7 @@ int kfd_hiq_load_mqd_kiq(struct mqd_manager *mm, void *mqd,  		     struct queue_properties *p, struct mm_struct *mms)  {  	return mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, mqd, pipe_id, -					      queue_id, p->doorbell_off); +					      queue_id, p->doorbell_off, 0);  }  int kfd_destroy_mqd_cp(struct mqd_manager *mm, void *mqd, @@ -197,7 +198,7 @@ int kfd_destroy_mqd_cp(struct mqd_manager *mm, void *mqd,  		uint32_t pipe_id, uint32_t queue_id)  {  	return mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, mqd, type, timeout, -						pipe_id, queue_id); +						pipe_id, queue_id, 0);  }  void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd, @@ -216,7 +217,7 @@ bool kfd_is_occupied_cp(struct mqd_manager *mm, void *mqd,  		 uint32_t queue_id)  {  	return mm->dev->kfd2kgd->hqd_is_occupied(mm->dev->adev, queue_address, -						pipe_id, queue_id); +						pipe_id, queue_id, 0);  }  int kfd_load_mqd_sdma(struct mqd_manager *mm, void *mqd, @@ -246,3 +247,28 @@ bool kfd_is_occupied_sdma(struct mqd_manager *mm, void *mqd,  {  	return mm->dev->kfd2kgd->hqd_sdma_is_occupied(mm->dev->adev, mqd);  } + +uint64_t kfd_hiq_mqd_stride(struct kfd_node *dev) +{ +	return dev->dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size; +} + +void kfd_get_hiq_xcc_mqd(struct kfd_node *dev, struct kfd_mem_obj *mqd_mem_obj, +		     uint32_t virtual_xcc_id) +{ +	uint64_t offset; + +	offset = kfd_hiq_mqd_stride(dev) * virtual_xcc_id; + +	mqd_mem_obj->gtt_mem = (virtual_xcc_id == 0) ? +			dev->dqm->hiq_sdma_mqd.gtt_mem : NULL; +	mqd_mem_obj->gpu_addr = dev->dqm->hiq_sdma_mqd.gpu_addr + offset; +	mqd_mem_obj->cpu_ptr = (uint32_t *)((uintptr_t) +				dev->dqm->hiq_sdma_mqd.cpu_ptr + offset); +} + +uint64_t kfd_mqd_stride(struct mqd_manager *mm, +			struct queue_properties *q) +{ +	return mm->mqd_size; +} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h index 57f900ccaa10..23158db7da03 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h @@ -68,7 +68,7 @@   */  extern int pipe_priority_map[];  struct mqd_manager { -	struct kfd_mem_obj*	(*allocate_mqd)(struct kfd_dev *kfd, +	struct kfd_mem_obj*	(*allocate_mqd)(struct kfd_node *kfd,  		struct queue_properties *q);  	void	(*init_mqd)(struct mqd_manager *mm, void **mqd, @@ -97,6 +97,7 @@ struct mqd_manager {  				uint32_t queue_id);  	int	(*get_wave_state)(struct mqd_manager *mm, void *mqd, +				  struct queue_properties *q,  				  void __user *ctl_stack,  				  u32 *ctl_stack_used_size,  				  u32 *save_area_used_size); @@ -119,16 +120,18 @@ struct mqd_manager {  	int	(*debugfs_show_mqd)(struct seq_file *m, void *data);  #endif  	uint32_t (*read_doorbell_id)(void *mqd); +	uint64_t (*mqd_stride)(struct mqd_manager *mm, +				struct queue_properties *p);  	struct mutex	mqd_mutex; -	struct kfd_dev	*dev; +	struct kfd_node	*dev;  	uint32_t mqd_size;  }; -struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev, +struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_node *dev,  				struct queue_properties *q); -struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_dev *dev, +struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_node *dev,  					struct queue_properties *q);  void free_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,  				struct kfd_mem_obj *mqd_mem_obj); @@ -164,4 +167,10 @@ bool kfd_is_occupied_sdma(struct mqd_manager *mm, void *mqd,  		uint64_t queue_address, uint32_t pipe_id,  		uint32_t queue_id); +void kfd_get_hiq_xcc_mqd(struct kfd_node *dev, +		struct kfd_mem_obj *mqd_mem_obj, uint32_t virtual_xcc_id); + +uint64_t kfd_hiq_mqd_stride(struct kfd_node *dev); +uint64_t kfd_mqd_stride(struct mqd_manager *mm, +			struct queue_properties *q);  #endif /* KFD_MQD_MANAGER_H_ */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c index 4889865c725c..65c9f01a1f86 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c @@ -48,8 +48,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,  	struct cik_mqd *m;  	uint32_t se_mask[4] = {0}; /* 4 is the max # of SEs */ -	if (!minfo || (minfo->update_flag != UPDATE_FLAG_CU_MASK) || -	    !minfo->cu_mask.ptr) +	if (!minfo || !minfo->cu_mask.ptr)  		return;  	mqd_symmetrically_map_cu_mask(mm, @@ -74,7 +73,7 @@ static void set_priority(struct cik_mqd *m, struct queue_properties *q)  	m->cp_hqd_queue_priority = q->priority;  } -static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd, +static struct kfd_mem_obj *allocate_mqd(struct kfd_node *kfd,  					struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj; @@ -167,7 +166,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd, uint32_t pipe_id,  	return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id,  					  (uint32_t __user *)p->write_ptr, -					  wptr_shift, wptr_mask, mms); +					  wptr_shift, wptr_mask, mms, 0);  }  static void __update_mqd(struct mqd_manager *mm, void *mqd, @@ -390,7 +389,7 @@ static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)  struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev) +		struct kfd_node *dev)  {  	struct mqd_manager *mqd; @@ -428,6 +427,7 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,  		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct cik_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -442,6 +442,7 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,  		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct cik_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -457,6 +458,7 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,  		mqd->checkpoint_mqd = checkpoint_mqd_sdma;  		mqd->restore_mqd = restore_mqd_sdma;  		mqd->mqd_size = sizeof(struct cik_sdma_rlc_registers); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;  #endif @@ -470,7 +472,7 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,  }  struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type, -			struct kfd_dev *dev) +			struct kfd_node *dev)  {  	struct mqd_manager *mqd; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c index d3e2b6a599a4..94c0fc2e57b7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v10.c @@ -48,8 +48,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,  	struct v10_compute_mqd *m;  	uint32_t se_mask[4] = {0}; /* 4 is the max # of SEs */ -	if (!minfo || (minfo->update_flag != UPDATE_FLAG_CU_MASK) || -	    !minfo->cu_mask.ptr) +	if (!minfo || !minfo->cu_mask.ptr)  		return;  	mqd_symmetrically_map_cu_mask(mm, @@ -74,7 +73,7 @@ static void set_priority(struct v10_compute_mqd *m, struct queue_properties *q)  	m->cp_hqd_queue_priority = q->priority;  } -static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd, +static struct kfd_mem_obj *allocate_mqd(struct kfd_node *kfd,  		struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj; @@ -117,12 +116,17 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  			1 << CP_HQD_QUANTUM__QUANTUM_SCALE__SHIFT |  			1 << CP_HQD_QUANTUM__QUANTUM_DURATION__SHIFT; +	/* Set cp_hqd_hq_scheduler0 bit 14 to 1 to have the CP set up the +	 * DISPATCH_PTR.  This is required for the kfd debugger +	 */ +	m->cp_hqd_hq_scheduler0 = 1 << 14; +  	if (q->format == KFD_QUEUE_FORMAT_AQL) {  		m->cp_hqd_aql_control =  			1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;  	} -	if (mm->dev->cwsr_enabled) { +	if (mm->dev->kfd->cwsr_enabled) {  		m->cp_hqd_persistent_state |=  			(1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT);  		m->cp_hqd_ctx_save_base_addr_lo = @@ -151,7 +155,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,  	r = mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id,  					  (uint32_t __user *)p->write_ptr, -					  wptr_shift, 0, mms); +					  wptr_shift, 0, mms, 0);  	return r;  } @@ -210,7 +214,7 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,  		m->cp_hqd_pq_doorbell_control |=  			1 << CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT;  	} -	if (mm->dev->cwsr_enabled) +	if (mm->dev->kfd->cwsr_enabled)  		m->cp_hqd_ctx_save_control = 0;  	update_cu_mask(mm, mqd, minfo); @@ -227,11 +231,13 @@ static uint32_t read_doorbell_id(void *mqd)  }  static int get_wave_state(struct mqd_manager *mm, void *mqd, +			  struct queue_properties *q,  			  void __user *ctl_stack,  			  u32 *ctl_stack_used_size,  			  u32 *save_area_used_size)  {  	struct v10_compute_mqd *m; +	struct kfd_context_save_area_header header;  	m = get_mqd(mqd); @@ -250,6 +256,15 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,  	 * accessible to user mode  	 */ +	header.wave_state.control_stack_size = *ctl_stack_used_size; +	header.wave_state.wave_state_size = *save_area_used_size; + +	header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; +	header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; + +	if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state))) +		return -EFAULT; +  	return 0;  } @@ -405,7 +420,7 @@ static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)  #endif  struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev) +		struct kfd_node *dev)  {  	struct mqd_manager *mqd; @@ -432,6 +447,7 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,  		mqd->get_wave_state = get_wave_state;  		mqd->checkpoint_mqd = checkpoint_mqd;  		mqd->restore_mqd = restore_mqd; +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -447,6 +463,7 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,  		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct v10_compute_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -478,6 +495,7 @@ struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type,  		mqd->checkpoint_mqd = checkpoint_mqd_sdma;  		mqd->restore_mqd = restore_mqd_sdma;  		mqd->mqd_size = sizeof(struct v10_sdma_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;  #endif diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c index 5aa75f72caa1..31fec5e70d13 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c @@ -46,15 +46,33 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,  {  	struct v11_compute_mqd *m;  	uint32_t se_mask[KFD_MAX_NUM_SE] = {0}; +	bool has_wa_flag = minfo && (minfo->update_flag & (UPDATE_FLAG_DBG_WA_ENABLE | +			UPDATE_FLAG_DBG_WA_DISABLE)); -	if (!minfo || (minfo->update_flag != UPDATE_FLAG_CU_MASK) || -	    !minfo->cu_mask.ptr) +	if (!minfo || !(has_wa_flag || minfo->cu_mask.ptr))  		return; +	m = get_mqd(mqd); + +	if (has_wa_flag) { +		uint32_t wa_mask = minfo->update_flag == UPDATE_FLAG_DBG_WA_ENABLE ? +						0xffff : 0xffffffff; + +		m->compute_static_thread_mgmt_se0 = wa_mask; +		m->compute_static_thread_mgmt_se1 = wa_mask; +		m->compute_static_thread_mgmt_se2 = wa_mask; +		m->compute_static_thread_mgmt_se3 = wa_mask; +		m->compute_static_thread_mgmt_se4 = wa_mask; +		m->compute_static_thread_mgmt_se5 = wa_mask; +		m->compute_static_thread_mgmt_se6 = wa_mask; +		m->compute_static_thread_mgmt_se7 = wa_mask; + +		return; +	} +  	mqd_symmetrically_map_cu_mask(mm,  		minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask); -	m = get_mqd(mqd);  	m->compute_static_thread_mgmt_se0 = se_mask[0];  	m->compute_static_thread_mgmt_se1 = se_mask[1];  	m->compute_static_thread_mgmt_se2 = se_mask[2]; @@ -81,7 +99,7 @@ static void set_priority(struct v11_compute_mqd *m, struct queue_properties *q)  	m->cp_hqd_queue_priority = q->priority;  } -static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd, +static struct kfd_mem_obj *allocate_mqd(struct kfd_node *node,  		struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj; @@ -91,12 +109,12 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,  	 * MES write to areas beyond MQD size. So allocate  	 * 1 PAGE_SIZE memory for MQD is MES is enabled.  	 */ -	if (kfd->shared_resources.enable_mes) +	if (node->kfd->shared_resources.enable_mes)  		size = PAGE_SIZE;  	else  		size = sizeof(struct v11_compute_mqd); -	if (kfd_gtt_sa_allocate(kfd, size, &mqd_mem_obj)) +	if (kfd_gtt_sa_allocate(node, size, &mqd_mem_obj))  		return NULL;  	return mqd_mem_obj; @@ -109,11 +127,12 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  	uint64_t addr;  	struct v11_compute_mqd *m;  	int size; +	uint32_t wa_mask = q->is_dbg_wa ? 0xffff : 0xffffffff;  	m = (struct v11_compute_mqd *) mqd_mem_obj->cpu_ptr;  	addr = mqd_mem_obj->gpu_addr; -	if (mm->dev->shared_resources.enable_mes) +	if (mm->dev->kfd->shared_resources.enable_mes)  		size = PAGE_SIZE;  	else  		size = sizeof(struct v11_compute_mqd); @@ -122,14 +141,15 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  	m->header = 0xC0310800;  	m->compute_pipelinestat_enable = 1; -	m->compute_static_thread_mgmt_se0 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se1 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se2 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se3 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se4 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se5 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se6 = 0xFFFFFFFF; -	m->compute_static_thread_mgmt_se7 = 0xFFFFFFFF; + +	m->compute_static_thread_mgmt_se0 = wa_mask; +	m->compute_static_thread_mgmt_se1 = wa_mask; +	m->compute_static_thread_mgmt_se2 = wa_mask; +	m->compute_static_thread_mgmt_se3 = wa_mask; +	m->compute_static_thread_mgmt_se4 = wa_mask; +	m->compute_static_thread_mgmt_se5 = wa_mask; +	m->compute_static_thread_mgmt_se6 = wa_mask; +	m->compute_static_thread_mgmt_se7 = wa_mask;  	m->cp_hqd_persistent_state = CP_HQD_PERSISTENT_STATE__PRELOAD_REQ_MASK |  			0x55 << CP_HQD_PERSISTENT_STATE__PRELOAD_SIZE__SHIFT; @@ -143,6 +163,11 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  			1 << CP_HQD_QUANTUM__QUANTUM_SCALE__SHIFT |  			1 << CP_HQD_QUANTUM__QUANTUM_DURATION__SHIFT; +	/* Set cp_hqd_hq_scheduler0 bit 14 to 1 to have the CP set up the +	 * DISPATCH_PTR.  This is required for the kfd debugger +	 */ +	m->cp_hqd_hq_status0 = 1 << 14; +  	/*  	 * GFX11 RS64 CPFW version >= 509 supports PCIe atomics support  	 * acknowledgment. @@ -155,7 +180,7 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  			1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT;  	} -	if (mm->dev->cwsr_enabled) { +	if (mm->dev->kfd->cwsr_enabled) {  		m->cp_hqd_persistent_state |=  			(1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT);  		m->cp_hqd_ctx_save_base_addr_lo = @@ -184,7 +209,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,  	r = mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id,  					  (uint32_t __user *)p->write_ptr, -					  wptr_shift, 0, mms); +					  wptr_shift, 0, mms, 0);  	return r;  } @@ -243,7 +268,7 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,  		m->cp_hqd_pq_doorbell_control |=  			1 << CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT;  	} -	if (mm->dev->cwsr_enabled) +	if (mm->dev->kfd->cwsr_enabled)  		m->cp_hqd_ctx_save_control = 0;  	update_cu_mask(mm, mqd, minfo); @@ -260,12 +285,13 @@ static uint32_t read_doorbell_id(void *mqd)  }  static int get_wave_state(struct mqd_manager *mm, void *mqd, +			  struct queue_properties *q,  			  void __user *ctl_stack,  			  u32 *ctl_stack_used_size,  			  u32 *save_area_used_size)  {  	struct v11_compute_mqd *m; -	/*struct mqd_user_context_save_area_header header;*/ +	struct kfd_context_save_area_header header;  	m = get_mqd(mqd); @@ -283,16 +309,15 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,  	 * it's part of the context save area that is already  	 * accessible to user mode  	 */ -/* -	header.control_stack_size = *ctl_stack_used_size; -	header.wave_state_size = *save_area_used_size; +	header.wave_state.control_stack_size = *ctl_stack_used_size; +	header.wave_state.wave_state_size = *save_area_used_size; -	header.wave_state_offset = m->cp_hqd_wg_state_offset; -	header.control_stack_offset = m->cp_hqd_cntl_stack_offset; +	header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; +	header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; -	if (copy_to_user(ctl_stack, &header, sizeof(header))) +	if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state)))  		return -EFAULT; -*/ +  	return 0;  } @@ -319,7 +344,7 @@ static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,  	m = (struct v11_sdma_mqd *) mqd_mem_obj->cpu_ptr; -	if (mm->dev->shared_resources.enable_mes) +	if (mm->dev->kfd->shared_resources.enable_mes)  		size = PAGE_SIZE;  	else  		size = sizeof(struct v11_sdma_mqd); @@ -387,7 +412,7 @@ static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)  #endif  struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev) +		struct kfd_node *dev)  {  	struct mqd_manager *mqd; @@ -463,7 +488,7 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type,  		 * To allocate SDMA MQDs by generic functions  		 * when MES is enabled.  		 */ -		if (dev->shared_resources.enable_mes) { +		if (dev->kfd->shared_resources.enable_mes) {  			mqd->allocate_mqd = allocate_mqd;  			mqd->free_mqd = kfd_free_mqd_cp;  		} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c index fdbfd725841f..601bb9f68048 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c @@ -32,6 +32,22 @@  #include "gc/gc_9_0_sh_mask.h"  #include "sdma0/sdma0_4_0_sh_mask.h"  #include "amdgpu_amdkfd.h" +#include "kfd_device_queue_manager.h" + +static void update_mqd(struct mqd_manager *mm, void *mqd, +		       struct queue_properties *q, +		       struct mqd_update_info *minfo); + +static uint64_t mqd_stride_v9(struct mqd_manager *mm, +				struct queue_properties *q) +{ +	if (mm->dev->kfd->cwsr_enabled && +	    q->type == KFD_QUEUE_TYPE_COMPUTE) +		return ALIGN(q->ctl_stack_size, PAGE_SIZE) + +			ALIGN(sizeof(struct v9_mqd), PAGE_SIZE); + +	return mm->mqd_size; +}  static inline struct v9_mqd *get_mqd(void *mqd)  { @@ -49,8 +65,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,  	struct v9_mqd *m;  	uint32_t se_mask[KFD_MAX_NUM_SE] = {0}; -	if (!minfo || (minfo->update_flag != UPDATE_FLAG_CU_MASK) || -	    !minfo->cu_mask.ptr) +	if (!minfo || !minfo->cu_mask.ptr)  		return;  	mqd_symmetrically_map_cu_mask(mm, @@ -83,7 +98,7 @@ static void set_priority(struct v9_mqd *m, struct queue_properties *q)  	m->cp_hqd_queue_priority = q->priority;  } -static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd, +static struct kfd_mem_obj *allocate_mqd(struct kfd_node *node,  		struct queue_properties *q)  {  	int retval; @@ -105,28 +120,30 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,  	 * pass a special bo flag AMDGPU_GEM_CREATE_CP_MQD_GFX9 to instruct  	 * amdgpu memory functions to do so.  	 */ -	if (kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) { +	if (node->kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) {  		mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);  		if (!mqd_mem_obj)  			return NULL; -		retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->adev, -			ALIGN(q->ctl_stack_size, PAGE_SIZE) + -				ALIGN(sizeof(struct v9_mqd), PAGE_SIZE), +		retval = amdgpu_amdkfd_alloc_gtt_mem(node->adev, +			(ALIGN(q->ctl_stack_size, PAGE_SIZE) + +			ALIGN(sizeof(struct v9_mqd), PAGE_SIZE)) * +			NUM_XCC(node->xcc_mask),  			&(mqd_mem_obj->gtt_mem),  			&(mqd_mem_obj->gpu_addr),  			(void *)&(mqd_mem_obj->cpu_ptr), true); + +		if (retval) { +			kfree(mqd_mem_obj); +			return NULL; +		}  	} else { -		retval = kfd_gtt_sa_allocate(kfd, sizeof(struct v9_mqd), +		retval = kfd_gtt_sa_allocate(node, sizeof(struct v9_mqd),  				&mqd_mem_obj); -	} - -	if (retval) { -		kfree(mqd_mem_obj); -		return NULL; +		if (retval) +			return NULL;  	}  	return mqd_mem_obj; -  }  static void init_mqd(struct mqd_manager *mm, void **mqd, @@ -135,7 +152,6 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  {  	uint64_t addr;  	struct v9_mqd *m; -	struct amdgpu_device *adev = (struct amdgpu_device *)mm->dev->adev;  	m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr;  	addr = mqd_mem_obj->gpu_addr; @@ -165,31 +181,21 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  			1 << CP_HQD_QUANTUM__QUANTUM_SCALE__SHIFT |  			1 << CP_HQD_QUANTUM__QUANTUM_DURATION__SHIFT; -	if (q->format == KFD_QUEUE_FORMAT_AQL) { +	/* Set cp_hqd_hq_scheduler0 bit 14 to 1 to have the CP set up the +	 * DISPATCH_PTR.  This is required for the kfd debugger +	 */ +	m->cp_hqd_hq_status0 = 1 << 14; + +	if (q->format == KFD_QUEUE_FORMAT_AQL)  		m->cp_hqd_aql_control =  			1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT; -		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) { -			/* On GC 9.4.3, DW 41 is re-purposed as -			 * compute_tg_chunk_size. -			 * TODO: review this setting when active CUs in the -			 * partition play a role -			 */ -			m->compute_static_thread_mgmt_se6 = 1; -		} -	} else { -		/* PM4 queue */ -		if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(9, 4, 3)) { -			m->compute_static_thread_mgmt_se6 = 0; -			/* TODO: program pm4_target_xcc */ -		} -	}  	if (q->tba_addr) {  		m->compute_pgm_rsrc2 |=  			(1 << COMPUTE_PGM_RSRC2__TRAP_PRESENT__SHIFT);  	} -	if (mm->dev->cwsr_enabled && q->ctx_save_restore_area_address) { +	if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) {  		m->cp_hqd_persistent_state |=  			(1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT);  		m->cp_hqd_ctx_save_base_addr_lo = @@ -205,7 +211,7 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  	*mqd = m;  	if (gart_addr)  		*gart_addr = addr; -	mm->update_mqd(mm, m, q, NULL); +	update_mqd(mm, m, q, NULL);  }  static int load_mqd(struct mqd_manager *mm, void *mqd, @@ -217,14 +223,13 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,  	return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id,  					  (uint32_t __user *)p->write_ptr, -					  wptr_shift, 0, mms); +					  wptr_shift, 0, mms, 0);  }  static void update_mqd(struct mqd_manager *mm, void *mqd,  			struct queue_properties *q,  			struct mqd_update_info *minfo)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)mm->dev->adev;  	struct v9_mqd *m;  	m = get_mqd(mqd); @@ -257,9 +262,14 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,  	 * Limit is 0xFF EOP entries (= 0x7F8 dwords). CP will not submit  	 * more than (EOP entry count - 1) so a queue size of 0x800 dwords  	 * is safe, giving a maximum field value of 0xA. +	 * +	 * Also, do calculation only if EOP is used (size > 0), otherwise +	 * the order_base_2 calculation provides incorrect result. +	 *  	 */ -	m->cp_hqd_eop_control = min(0xA, -		order_base_2(q->eop_ring_buffer_size / 4) - 1); +	m->cp_hqd_eop_control = q->eop_ring_buffer_size ? +		min(0xA, order_base_2(q->eop_ring_buffer_size / 4) - 1) : 0; +  	m->cp_hqd_eop_base_addr_lo =  			lower_32_bits(q->eop_ring_buffer_address >> 8);  	m->cp_hqd_eop_base_addr_hi = @@ -270,17 +280,14 @@ static void update_mqd(struct mqd_manager *mm, void *mqd,  	m->cp_hqd_vmid = q->vmid;  	if (q->format == KFD_QUEUE_FORMAT_AQL) { -		m->cp_hqd_pq_control |= +		m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK |  				2 << CP_HQD_PQ_CONTROL__SLOT_BASED_WPTR__SHIFT |  				1 << CP_HQD_PQ_CONTROL__QUEUE_FULL_EN__SHIFT |  				1 << CP_HQD_PQ_CONTROL__WPP_CLAMP_EN__SHIFT; -		if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 3)) -			m->cp_hqd_pq_control |= -				 CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK;  		m->cp_hqd_pq_doorbell_control |= 1 <<  			CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT;  	} -	if (mm->dev->cwsr_enabled && q->ctx_save_restore_area_address) +	if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address)  		m->cp_hqd_ctx_save_control = 0;  	update_cu_mask(mm, mqd, minfo); @@ -298,11 +305,13 @@ static uint32_t read_doorbell_id(void *mqd)  }  static int get_wave_state(struct mqd_manager *mm, void *mqd, +			  struct queue_properties *q,  			  void __user *ctl_stack,  			  u32 *ctl_stack_used_size,  			  u32 *save_area_used_size)  {  	struct v9_mqd *m; +	struct kfd_context_save_area_header header;  	/* Control stack is located one page after MQD. */  	void *mqd_ctl_stack = (void *)((uintptr_t)mqd + PAGE_SIZE); @@ -314,7 +323,18 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,  	*save_area_used_size = m->cp_hqd_wg_state_offset -  		m->cp_hqd_cntl_stack_size; -	if (copy_to_user(ctl_stack, mqd_ctl_stack, m->cp_hqd_cntl_stack_size)) +	header.wave_state.control_stack_size = *ctl_stack_used_size; +	header.wave_state.wave_state_size = *save_area_used_size; + +	header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; +	header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; + +	if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state))) +		return -EFAULT; + +	if (copy_to_user(ctl_stack + m->cp_hqd_cntl_stack_offset, +				mqd_ctl_stack + m->cp_hqd_cntl_stack_offset, +				*ctl_stack_used_size))  		return -EFAULT;  	return 0; @@ -467,6 +487,288 @@ static void restore_mqd_sdma(struct mqd_manager *mm, void **mqd,  	qp->is_active = 0;  } +static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd, +			struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, +			struct queue_properties *q) +{ +	struct v9_mqd *m; +	int xcc = 0; +	struct kfd_mem_obj xcc_mqd_mem_obj; +	uint64_t xcc_gart_addr = 0; + +	memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); + +	for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { +		kfd_get_hiq_xcc_mqd(mm->dev, &xcc_mqd_mem_obj, xcc); + +		init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); + +		m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | +					1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT | +					1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT; +		m->cp_mqd_stride_size = kfd_hiq_mqd_stride(mm->dev); +		if (xcc == 0) { +			/* Set no_update_rptr = 0 in Master XCC */ +			m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; + +			/* Set the MQD pointer and gart address to XCC0 MQD */ +			*mqd = m; +			*gart_addr = xcc_gart_addr; +		} +	} +} + +static int hiq_load_mqd_kiq_v9_4_3(struct mqd_manager *mm, void *mqd, +			uint32_t pipe_id, uint32_t queue_id, +			struct queue_properties *p, struct mm_struct *mms) +{ +	uint32_t xcc_mask = mm->dev->xcc_mask; +	int xcc_id, err, inst = 0; +	void *xcc_mqd; +	uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); + +	for_each_inst(xcc_id, xcc_mask) { +		xcc_mqd = mqd + hiq_mqd_size * inst; +		err = mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, xcc_mqd, +						     pipe_id, queue_id, +						     p->doorbell_off, xcc_id); +		if (err) { +			pr_debug("Failed to load HIQ MQD for XCC: %d\n", inst); +			break; +		} +		++inst; +	} + +	return err; +} + +static int destroy_hiq_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, +			enum kfd_preempt_type type, unsigned int timeout, +			uint32_t pipe_id, uint32_t queue_id) +{ +	uint32_t xcc_mask = mm->dev->xcc_mask; +	int xcc_id, err, inst = 0; +	void *xcc_mqd; +	uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); + +	for_each_inst(xcc_id, xcc_mask) { +		xcc_mqd = mqd + hiq_mqd_size * inst; +		err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd, +						    type, timeout, pipe_id, +						    queue_id, xcc_id); +		if (err) { +			pr_debug("Destroy MQD failed for xcc: %d\n", inst); +			break; +		} +		++inst; +	} + +	return err; +} + +static void get_xcc_mqd(struct kfd_mem_obj *mqd_mem_obj, +			       struct kfd_mem_obj *xcc_mqd_mem_obj, +			       uint64_t offset) +{ +	xcc_mqd_mem_obj->gtt_mem = (offset == 0) ? +					mqd_mem_obj->gtt_mem : NULL; +	xcc_mqd_mem_obj->gpu_addr = mqd_mem_obj->gpu_addr + offset; +	xcc_mqd_mem_obj->cpu_ptr = (uint32_t *)((uintptr_t)mqd_mem_obj->cpu_ptr +						+ offset); +} + +static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, +			struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, +			struct queue_properties *q) +{ +	struct v9_mqd *m; +	int xcc = 0; +	struct kfd_mem_obj xcc_mqd_mem_obj; +	uint64_t xcc_gart_addr = 0; +	uint64_t xcc_ctx_save_restore_area_address; +	uint64_t offset = mm->mqd_stride(mm, q); +	uint32_t local_xcc_start = mm->dev->dqm->current_logical_xcc_start++; + +	memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); +	for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { +		get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset*xcc); + +		init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); + +		m->cp_mqd_stride_size = offset; + +		/* +		 * Update the CWSR address for each XCC if CWSR is enabled +		 * and CWSR area is allocated in thunk +		 */ +		if (mm->dev->kfd->cwsr_enabled && +		    q->ctx_save_restore_area_address) { +			xcc_ctx_save_restore_area_address = +				q->ctx_save_restore_area_address + +				(xcc * q->ctx_save_restore_area_size); + +			m->cp_hqd_ctx_save_base_addr_lo = +				lower_32_bits(xcc_ctx_save_restore_area_address); +			m->cp_hqd_ctx_save_base_addr_hi = +				upper_32_bits(xcc_ctx_save_restore_area_address); +		} + +		if (q->format == KFD_QUEUE_FORMAT_AQL) { +			m->compute_tg_chunk_size = 1; +			m->compute_current_logic_xcc_id = +					(local_xcc_start + xcc) % +					NUM_XCC(mm->dev->xcc_mask); + +			switch (xcc) { +			case 0: +				/* Master XCC */ +				m->cp_hqd_pq_control &= +					~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; +				break; +			default: +				break; +			} +		} else { +			/* PM4 Queue */ +			m->compute_current_logic_xcc_id = 0; +			m->compute_tg_chunk_size = 0; +			m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; +		} + +		if (xcc == 0) { +			/* Set the MQD pointer and gart address to XCC0 MQD */ +			*mqd = m; +			*gart_addr = xcc_gart_addr; +		} +	} +} + +static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, +		      struct queue_properties *q, struct mqd_update_info *minfo) +{ +	struct v9_mqd *m; +	int xcc = 0; +	uint64_t size = mm->mqd_stride(mm, q); + +	for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { +		m = get_mqd(mqd + size * xcc); +		update_mqd(mm, m, q, minfo); + +		if (q->format == KFD_QUEUE_FORMAT_AQL) { +			switch (xcc) { +			case 0: +				/* Master XCC */ +				m->cp_hqd_pq_control &= +					~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; +				break; +			default: +				break; +			} +			m->compute_tg_chunk_size = 1; +		} else { +			/* PM4 Queue */ +			m->compute_current_logic_xcc_id = 0; +			m->compute_tg_chunk_size = 0; +			m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; +		} +	} +} + +static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, +		   enum kfd_preempt_type type, unsigned int timeout, +		   uint32_t pipe_id, uint32_t queue_id) +{ +	uint32_t xcc_mask = mm->dev->xcc_mask; +	int xcc_id, err, inst = 0; +	void *xcc_mqd; +	struct v9_mqd *m; +	uint64_t mqd_offset; + +	m = get_mqd(mqd); +	mqd_offset = m->cp_mqd_stride_size; + +	for_each_inst(xcc_id, xcc_mask) { +		xcc_mqd = mqd + mqd_offset * inst; +		err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd, +						    type, timeout, pipe_id, +						    queue_id, xcc_id); +		if (err) { +			pr_debug("Destroy MQD failed for xcc: %d\n", inst); +			break; +		} +		++inst; +	} + +	return err; +} + +static int load_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, +			uint32_t pipe_id, uint32_t queue_id, +			struct queue_properties *p, struct mm_struct *mms) +{ +	/* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ +	uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); +	uint32_t xcc_mask = mm->dev->xcc_mask; +	int xcc_id, err, inst = 0; +	void *xcc_mqd; +	uint64_t mqd_stride_size = mm->mqd_stride(mm, p); + +	for_each_inst(xcc_id, xcc_mask) { +		xcc_mqd = mqd + mqd_stride_size * inst; +		err = mm->dev->kfd2kgd->hqd_load( +			mm->dev->adev, xcc_mqd, pipe_id, queue_id, +			(uint32_t __user *)p->write_ptr, wptr_shift, 0, mms, +			xcc_id); +		if (err) { +			pr_debug("Load MQD failed for xcc: %d\n", inst); +			break; +		} +		++inst; +	} + +	return err; +} + +static int get_wave_state_v9_4_3(struct mqd_manager *mm, void *mqd, +				 struct queue_properties *q, +				 void __user *ctl_stack, +				 u32 *ctl_stack_used_size, +				 u32 *save_area_used_size) +{ +	int xcc, err = 0; +	void *xcc_mqd; +	void __user *xcc_ctl_stack; +	uint64_t mqd_stride_size = mm->mqd_stride(mm, q); +	u32 tmp_ctl_stack_used_size = 0, tmp_save_area_used_size = 0; + +	for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { +		xcc_mqd = mqd + mqd_stride_size * xcc; +		xcc_ctl_stack = (void __user *)((uintptr_t)ctl_stack + +					q->ctx_save_restore_area_size * xcc); + +		err = get_wave_state(mm, xcc_mqd, q, xcc_ctl_stack, +				     &tmp_ctl_stack_used_size, +				     &tmp_save_area_used_size); +		if (err) +			break; + +		/* +		 * Set the ctl_stack_used_size and save_area_used_size to +		 * ctl_stack_used_size and save_area_used_size of XCC 0 when +		 * passing the info the user-space. +		 * For multi XCC, user-space would have to look at the header +		 * info of each Control stack area to determine the control +		 * stack size and save area used. +		 */ +		if (xcc == 0) { +			*ctl_stack_used_size = tmp_ctl_stack_used_size; +			*save_area_used_size = tmp_save_area_used_size; +		} +	} + +	return err; +} +  #if defined(CONFIG_DEBUG_FS)  static int debugfs_show_mqd(struct seq_file *m, void *data) @@ -486,7 +788,7 @@ static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)  #endif  struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev) +		struct kfd_node *dev)  {  	struct mqd_manager *mqd; @@ -502,34 +804,50 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,  	switch (type) {  	case KFD_MQD_TYPE_CP:  		mqd->allocate_mqd = allocate_mqd; -		mqd->init_mqd = init_mqd;  		mqd->free_mqd = kfd_free_mqd_cp; -		mqd->load_mqd = load_mqd; -		mqd->update_mqd = update_mqd; -		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp; -		mqd->get_wave_state = get_wave_state;  		mqd->get_checkpoint_info = get_checkpoint_info;  		mqd->checkpoint_mqd = checkpoint_mqd;  		mqd->restore_mqd = restore_mqd;  		mqd->mqd_size = sizeof(struct v9_mqd); +		mqd->mqd_stride = mqd_stride_v9;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif +		if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3)) { +			mqd->init_mqd = init_mqd_v9_4_3; +			mqd->load_mqd = load_mqd_v9_4_3; +			mqd->update_mqd = update_mqd_v9_4_3; +			mqd->destroy_mqd = destroy_mqd_v9_4_3; +			mqd->get_wave_state = get_wave_state_v9_4_3; +		} else { +			mqd->init_mqd = init_mqd; +			mqd->load_mqd = load_mqd; +			mqd->update_mqd = update_mqd; +			mqd->destroy_mqd = kfd_destroy_mqd_cp; +			mqd->get_wave_state = get_wave_state; +		}  		break;  	case KFD_MQD_TYPE_HIQ:  		mqd->allocate_mqd = allocate_hiq_mqd; -		mqd->init_mqd = init_mqd_hiq;  		mqd->free_mqd = free_mqd_hiq_sdma; -		mqd->load_mqd = kfd_hiq_load_mqd_kiq;  		mqd->update_mqd = update_mqd; -		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct v9_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif  		mqd->read_doorbell_id = read_doorbell_id; +		if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3)) { +			mqd->init_mqd = init_mqd_hiq_v9_4_3; +			mqd->load_mqd = hiq_load_mqd_kiq_v9_4_3; +			mqd->destroy_mqd = destroy_hiq_mqd_v9_4_3; +		} else { +			mqd->init_mqd = init_mqd_hiq; +			mqd->load_mqd = kfd_hiq_load_mqd_kiq; +			mqd->destroy_mqd = kfd_destroy_mqd_cp; +		}  		break;  	case KFD_MQD_TYPE_DIQ:  		mqd->allocate_mqd = allocate_mqd; @@ -555,6 +873,7 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,  		mqd->checkpoint_mqd = checkpoint_mqd_sdma;  		mqd->restore_mqd = restore_mqd_sdma;  		mqd->mqd_size = sizeof(struct v9_sdma_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;  #endif diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c index 530ba6f5b57e..d1e962da51dd 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c @@ -51,8 +51,7 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,  	struct vi_mqd *m;  	uint32_t se_mask[4] = {0}; /* 4 is the max # of SEs */ -	if (!minfo || (minfo->update_flag != UPDATE_FLAG_CU_MASK) || -	    !minfo->cu_mask.ptr) +	if (!minfo || !minfo->cu_mask.ptr)  		return;  	mqd_symmetrically_map_cu_mask(mm, @@ -77,7 +76,7 @@ static void set_priority(struct vi_mqd *m, struct queue_properties *q)  	m->cp_hqd_queue_priority = q->priority;  } -static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd, +static struct kfd_mem_obj *allocate_mqd(struct kfd_node *kfd,  					struct queue_properties *q)  {  	struct kfd_mem_obj *mqd_mem_obj; @@ -136,7 +135,7 @@ static void init_mqd(struct mqd_manager *mm, void **mqd,  			(1 << COMPUTE_PGM_RSRC2__TRAP_PRESENT__SHIFT);  	} -	if (mm->dev->cwsr_enabled && q->ctx_save_restore_area_address) { +	if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) {  		m->cp_hqd_persistent_state |=  			(1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT);  		m->cp_hqd_ctx_save_base_addr_lo = @@ -165,7 +164,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,  	return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id,  					  (uint32_t __user *)p->write_ptr, -					  wptr_shift, wptr_mask, mms); +					  wptr_shift, wptr_mask, mms, 0);  }  static void __update_mqd(struct mqd_manager *mm, void *mqd, @@ -227,7 +226,7 @@ static void __update_mqd(struct mqd_manager *mm, void *mqd,  				2 << CP_HQD_PQ_CONTROL__SLOT_BASED_WPTR__SHIFT;  	} -	if (mm->dev->cwsr_enabled && q->ctx_save_restore_area_address) +	if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address)  		m->cp_hqd_ctx_save_control =  			atc_bit << CP_HQD_CTX_SAVE_CONTROL__ATC__SHIFT |  			mtype << CP_HQD_CTX_SAVE_CONTROL__MTYPE__SHIFT; @@ -261,6 +260,7 @@ static void update_mqd_tonga(struct mqd_manager *mm, void *mqd,  }  static int get_wave_state(struct mqd_manager *mm, void *mqd, +			  struct queue_properties *q,  			  void __user *ctl_stack,  			  u32 *ctl_stack_used_size,  			  u32 *save_area_used_size) @@ -446,7 +446,7 @@ static int debugfs_show_mqd_sdma(struct seq_file *m, void *data)  #endif  struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev) +		struct kfd_node *dev)  {  	struct mqd_manager *mqd; @@ -486,6 +486,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,  		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct vi_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -500,6 +501,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,  		mqd->destroy_mqd = kfd_destroy_mqd_cp;  		mqd->is_occupied = kfd_is_occupied_cp;  		mqd->mqd_size = sizeof(struct vi_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd;  #endif @@ -515,6 +517,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,  		mqd->checkpoint_mqd = checkpoint_mqd_sdma;  		mqd->restore_mqd = restore_mqd_sdma;  		mqd->mqd_size = sizeof(struct vi_sdma_mqd); +		mqd->mqd_stride = kfd_mqd_stride;  #if defined(CONFIG_DEBUG_FS)  		mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;  #endif @@ -528,7 +531,7 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,  }  struct mqd_manager *mqd_manager_init_vi_tonga(enum KFD_MQD_TYPE type, -			struct kfd_dev *dev) +			struct kfd_node *dev)  {  	struct mqd_manager *mqd; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c index f612325241aa..401096c103b2 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c @@ -45,7 +45,7 @@ static void pm_calc_rlib_size(struct packet_manager *pm,  	unsigned int process_count, queue_count, compute_queue_count, gws_queue_count;  	unsigned int map_queue_size;  	unsigned int max_proc_per_quantum = 1; -	struct kfd_dev *dev = pm->dqm->dev; +	struct kfd_node *dev = pm->dqm->dev;  	process_count = pm->dqm->processes_count;  	queue_count = pm->dqm->active_queue_count; @@ -370,6 +370,38 @@ out:  	return retval;  } +int pm_update_grace_period(struct packet_manager *pm, uint32_t grace_period) +{ +	int retval = 0; +	uint32_t *buffer, size; + +	size = pm->pmf->set_grace_period_size; + +	mutex_lock(&pm->lock); + +	if (size) { +		kq_acquire_packet_buffer(pm->priv_queue, +			size / sizeof(uint32_t), +			(unsigned int **)&buffer); + +		if (!buffer) { +			pr_err("Failed to allocate buffer on kernel queue\n"); +			retval = -ENOMEM; +			goto out; +		} + +		retval = pm->pmf->set_grace_period(pm, buffer, grace_period); +		if (!retval) +			kq_submit_packet(pm->priv_queue); +		else +			kq_rollback_packet(pm->priv_queue); +	} + +out: +	mutex_unlock(&pm->lock); +	return retval; +} +  int pm_send_unmap_queue(struct packet_manager *pm,  			enum kfd_unmap_queues_filter filter,  			uint32_t filter_param, bool reset) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c index 18250845a989..29a2d0499b67 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_v9.c @@ -34,6 +34,9 @@ static int pm_map_process_v9(struct packet_manager *pm,  {  	struct pm4_mes_map_process *packet;  	uint64_t vm_page_table_base_addr = qpd->page_table_base; +	struct kfd_node *kfd = pm->dqm->dev; +	struct kfd_process_device *pdd = +			container_of(qpd, struct kfd_process_device, qpd);  	packet = (struct pm4_mes_map_process *)buffer;  	memset(buffer, 0, sizeof(struct pm4_mes_map_process)); @@ -49,6 +52,12 @@ static int pm_map_process_v9(struct packet_manager *pm,  	packet->bitfields14.sdma_enable = 1;  	packet->bitfields14.num_queues = (qpd->is_debug) ? 0 : qpd->queue_count; +	if (kfd->dqm->trap_debug_vmid && pdd->process->debug_trap_enabled && +			pdd->process->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED) { +		packet->bitfields2.debug_vmid = kfd->dqm->trap_debug_vmid; +		packet->bitfields2.new_debug = 1; +	} +  	packet->sh_mem_config = qpd->sh_mem_config;  	packet->sh_mem_bases = qpd->sh_mem_bases;  	if (qpd->tba_addr) { @@ -79,6 +88,10 @@ static int pm_map_process_aldebaran(struct packet_manager *pm,  {  	struct pm4_mes_map_process_aldebaran *packet;  	uint64_t vm_page_table_base_addr = qpd->page_table_base; +	struct kfd_dev *kfd = pm->dqm->dev->kfd; +	struct kfd_process_device *pdd = +			container_of(qpd, struct kfd_process_device, qpd); +	int i;  	packet = (struct pm4_mes_map_process_aldebaran *)buffer;  	memset(buffer, 0, sizeof(struct pm4_mes_map_process_aldebaran)); @@ -93,6 +106,16 @@ static int pm_map_process_aldebaran(struct packet_manager *pm,  	packet->bitfields14.num_oac = qpd->num_oac;  	packet->bitfields14.sdma_enable = 1;  	packet->bitfields14.num_queues = (qpd->is_debug) ? 0 : qpd->queue_count; +	packet->spi_gdbg_per_vmid_cntl = pdd->spi_dbg_override | +						pdd->spi_dbg_launch_mode; + +	if (pdd->process->debug_trap_enabled) { +		for (i = 0; i < kfd->device_info.num_of_watch_points; i++) +			packet->tcp_watch_cntl[i] = pdd->watch_points[i]; + +		packet->bitfields2.single_memops = +				!!(pdd->process->dbg_flags & KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP); +	}  	packet->sh_mem_config = qpd->sh_mem_config;  	packet->sh_mem_bases = qpd->sh_mem_bases; @@ -119,7 +142,7 @@ static int pm_runlist_v9(struct packet_manager *pm, uint32_t *buffer,  	struct pm4_mes_runlist *packet;  	int concurrent_proc_cnt = 0; -	struct kfd_dev *kfd = pm->dqm->dev; +	struct kfd_node *kfd = pm->dqm->dev;  	/* Determine the number of processes to map together to HW:  	 * it can not exceed the number of VMIDs available to the @@ -220,13 +243,24 @@ static int pm_map_queues_v9(struct packet_manager *pm, uint32_t *buffer,  	case KFD_QUEUE_TYPE_SDMA:  	case KFD_QUEUE_TYPE_SDMA_XGMI:  		use_static = false; /* no static queues under SDMA */ -		if (q->properties.sdma_engine_id < 2 && !pm_use_ext_eng(q->device)) +		if (q->properties.sdma_engine_id < 2 && +		    !pm_use_ext_eng(q->device->kfd))  			packet->bitfields2.engine_sel = q->properties.sdma_engine_id +  				engine_sel__mes_map_queues__sdma0_vi;  		else { -			packet->bitfields2.extended_engine_sel = -				extended_engine_sel__mes_map_queues__sdma0_to_7_sel; -			packet->bitfields2.engine_sel = q->properties.sdma_engine_id; +			/* +			 * For GFX9.4.3, SDMA engine id can be greater than 8. +			 * For such cases, set extended_engine_sel to 2 and +			 * ensure engine_sel lies between 0-7. +			 */ +			if (q->properties.sdma_engine_id >= 8) +				packet->bitfields2.extended_engine_sel = +					extended_engine_sel__mes_map_queues__sdma8_to_15_sel; +			else +				packet->bitfields2.extended_engine_sel = +					extended_engine_sel__mes_map_queues__sdma0_to_7_sel; + +			packet->bitfields2.engine_sel = q->properties.sdma_engine_id % 8;  		}  		break;  	default: @@ -251,6 +285,41 @@ static int pm_map_queues_v9(struct packet_manager *pm, uint32_t *buffer,  	return 0;  } +static int pm_set_grace_period_v9(struct packet_manager *pm, +		uint32_t *buffer, +		uint32_t grace_period) +{ +	struct pm4_mec_write_data_mmio *packet; +	uint32_t reg_offset = 0; +	uint32_t reg_data = 0; + +	pm->dqm->dev->kfd2kgd->build_grace_period_packet_info( +			pm->dqm->dev->adev, +			pm->dqm->wait_times, +			grace_period, +			®_offset, +			®_data); + +	if (grace_period == USE_DEFAULT_GRACE_PERIOD) +		reg_data = pm->dqm->wait_times; + +	packet = (struct pm4_mec_write_data_mmio *)buffer; +	memset(buffer, 0, sizeof(struct pm4_mec_write_data_mmio)); + +	packet->header.u32All = pm_build_pm4_header(IT_WRITE_DATA, +					sizeof(struct pm4_mec_write_data_mmio)); + +	packet->bitfields2.dst_sel  = dst_sel___write_data__mem_mapped_register; +	packet->bitfields2.addr_incr = +			addr_incr___write_data__do_not_increment_address; + +	packet->bitfields3.dst_mmreg_addr = reg_offset; + +	packet->data = reg_data; + +	return 0; +} +  static int pm_unmap_queues_v9(struct packet_manager *pm, uint32_t *buffer,  			enum kfd_unmap_queues_filter filter,  			uint32_t filter_param, bool reset) @@ -263,7 +332,8 @@ static int pm_unmap_queues_v9(struct packet_manager *pm, uint32_t *buffer,  	packet->header.u32All = pm_build_pm4_header(IT_UNMAP_QUEUES,  					sizeof(struct pm4_mes_unmap_queues)); -	packet->bitfields2.extended_engine_sel = pm_use_ext_eng(pm->dqm->dev) ? +	packet->bitfields2.extended_engine_sel = +				pm_use_ext_eng(pm->dqm->dev->kfd) ?  		extended_engine_sel__mes_unmap_queues__sdma0_to_7_sel :  		extended_engine_sel__mes_unmap_queues__legacy_engine_sel; @@ -333,6 +403,7 @@ const struct packet_manager_funcs kfd_v9_pm_funcs = {  	.set_resources		= pm_set_resources_v9,  	.map_queues		= pm_map_queues_v9,  	.unmap_queues		= pm_unmap_queues_v9, +	.set_grace_period       = pm_set_grace_period_v9,  	.query_status		= pm_query_status_v9,  	.release_mem		= NULL,  	.map_process_size	= sizeof(struct pm4_mes_map_process), @@ -340,6 +411,7 @@ const struct packet_manager_funcs kfd_v9_pm_funcs = {  	.set_resources_size	= sizeof(struct pm4_mes_set_resources),  	.map_queues_size	= sizeof(struct pm4_mes_map_queues),  	.unmap_queues_size	= sizeof(struct pm4_mes_unmap_queues), +	.set_grace_period_size  = sizeof(struct pm4_mec_write_data_mmio),  	.query_status_size	= sizeof(struct pm4_mes_query_status),  	.release_mem_size	= 0,  }; @@ -350,6 +422,7 @@ const struct packet_manager_funcs kfd_aldebaran_pm_funcs = {  	.set_resources		= pm_set_resources_v9,  	.map_queues		= pm_map_queues_v9,  	.unmap_queues		= pm_unmap_queues_v9, +	.set_grace_period       = pm_set_grace_period_v9,  	.query_status		= pm_query_status_v9,  	.release_mem		= NULL,  	.map_process_size	= sizeof(struct pm4_mes_map_process_aldebaran), @@ -357,6 +430,7 @@ const struct packet_manager_funcs kfd_aldebaran_pm_funcs = {  	.set_resources_size	= sizeof(struct pm4_mes_set_resources),  	.map_queues_size	= sizeof(struct pm4_mes_map_queues),  	.unmap_queues_size	= sizeof(struct pm4_mes_unmap_queues), +	.set_grace_period_size  = sizeof(struct pm4_mec_write_data_mmio),  	.query_status_size	= sizeof(struct pm4_mes_query_status),  	.release_mem_size	= 0,  }; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_vi.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_vi.c index 4f951eaa6ee8..c1199d06d131 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_vi.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager_vi.c @@ -77,7 +77,7 @@ static int pm_runlist_vi(struct packet_manager *pm, uint32_t *buffer,  {  	struct pm4_mes_runlist *packet;  	int concurrent_proc_cnt = 0; -	struct kfd_dev *kfd = pm->dqm->dev; +	struct kfd_node *kfd = pm->dqm->dev;  	if (WARN_ON(!ib))  		return -EFAULT; @@ -303,6 +303,7 @@ const struct packet_manager_funcs kfd_vi_pm_funcs = {  	.set_resources		= pm_set_resources_vi,  	.map_queues		= pm_map_queues_vi,  	.unmap_queues		= pm_unmap_queues_vi, +	.set_grace_period	= NULL,  	.query_status		= pm_query_status_vi,  	.release_mem		= pm_release_mem_vi,  	.map_process_size	= sizeof(struct pm4_mes_map_process), @@ -310,6 +311,7 @@ const struct packet_manager_funcs kfd_vi_pm_funcs = {  	.set_resources_size	= sizeof(struct pm4_mes_set_resources),  	.map_queues_size	= sizeof(struct pm4_mes_map_queues),  	.unmap_queues_size	= sizeof(struct pm4_mes_unmap_queues), +	.set_grace_period_size	= 0,  	.query_status_size	= sizeof(struct pm4_mes_query_status),  	.release_mem_size	= sizeof(struct pm4_mec_release_mem)  }; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h b/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h index a666710ed403..8b6b2bd5c148 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_pm4_headers_ai.h @@ -146,7 +146,10 @@ struct pm4_mes_map_process {  	union {  		struct {  			uint32_t pasid:16; -			uint32_t reserved1:8; +			uint32_t reserved1:2; +			uint32_t debug_vmid:4; +			uint32_t new_debug:1; +			uint32_t reserved2:1;  			uint32_t diq_enable:1;  			uint32_t process_quantum:7;  		} bitfields2; @@ -263,7 +266,8 @@ enum mes_map_queues_engine_sel_enum {  enum mes_map_queues_extended_engine_sel_enum {  	extended_engine_sel__mes_map_queues__legacy_engine_sel = 0, -	extended_engine_sel__mes_map_queues__sdma0_to_7_sel = 1 +	extended_engine_sel__mes_map_queues__sdma0_to_7_sel  = 1, +	extended_engine_sel__mes_map_queues__sdma8_to_15_sel = 2  };  struct pm4_mes_map_queues { @@ -583,6 +587,71 @@ struct pm4_mec_release_mem {  #endif +#ifndef PM4_MEC_WRITE_DATA_DEFINED +#define PM4_MEC_WRITE_DATA_DEFINED + +enum WRITE_DATA_dst_sel_enum { +	dst_sel___write_data__mem_mapped_register = 0, +	dst_sel___write_data__tc_l2 = 2, +	dst_sel___write_data__gds = 3, +	dst_sel___write_data__memory = 5, +	dst_sel___write_data__memory_mapped_adc_persistent_state = 6, +}; + +enum WRITE_DATA_addr_incr_enum { +	addr_incr___write_data__increment_address = 0, +	addr_incr___write_data__do_not_increment_address = 1 +}; + +enum WRITE_DATA_wr_confirm_enum { +	wr_confirm___write_data__do_not_wait_for_write_confirmation = 0, +	wr_confirm___write_data__wait_for_write_confirmation = 1 +}; + +enum WRITE_DATA_cache_policy_enum { +	cache_policy___write_data__lru = 0, +	cache_policy___write_data__stream = 1 +}; + + +struct pm4_mec_write_data_mmio { +	union { +		union PM4_MES_TYPE_3_HEADER header;     /*header */ +		unsigned int ordinal1; +	}; + +	union { +		struct { +			unsigned int reserved1:8; +			unsigned int dst_sel:4; +			unsigned int reserved2:4; +			unsigned int addr_incr:1; +			unsigned int reserved3:2; +			unsigned int resume_vf:1; +			unsigned int wr_confirm:1; +			unsigned int reserved4:4; +			unsigned int cache_policy:2; +			unsigned int reserved5:5; +		} bitfields2; +		unsigned int ordinal2; +	}; + +	union { +		struct { +			unsigned int dst_mmreg_addr:18; +			unsigned int reserved6:14; +		} bitfields3; +		unsigned int ordinal3; +	}; + +	uint32_t reserved7; + +	uint32_t data; + +}; + +#endif +  enum {  	CACHE_FLUSH_AND_INV_TS_EVENT = 0x00000014  }; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index 94a438956868..7364a5d77c6e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -113,6 +113,8 @@  #define KFD_UNMAP_LATENCY_MS	(4000) +#define KFD_MAX_SDMA_QUEUES	128 +  /*   * 512 = 0x200   * The doorbell index distance between SDMA RLC (2*i) and (2*i+1) in the @@ -199,6 +201,8 @@ extern int amdgpu_no_queue_eviction_on_vm_fault;  /* Enable eviction debug messages */  extern bool debug_evictions; +extern struct mutex kfd_processes_mutex; +  enum cache_policy {  	cache_policy_coherent,  	cache_policy_noncoherent @@ -210,11 +214,13 @@ enum cache_policy {  	((KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2)) ||	\  	 (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3))) +struct kfd_node; +  struct kfd_event_interrupt_class { -	bool (*interrupt_isr)(struct kfd_dev *dev, +	bool (*interrupt_isr)(struct kfd_node *dev,  			const uint32_t *ih_ring_entry, uint32_t *patched_ihre,  			bool *patched_flag); -	void (*interrupt_wq)(struct kfd_dev *dev, +	void (*interrupt_wq)(struct kfd_node *dev,  			const uint32_t *ih_ring_entry);  }; @@ -233,11 +239,11 @@ struct kfd_device_info {  	uint32_t no_atomic_fw_version;  	unsigned int num_sdma_queues_per_engine;  	unsigned int num_reserved_sdma_queues_per_engine; -	uint64_t reserved_sdma_queues_bitmap; +	DECLARE_BITMAP(reserved_sdma_queues_bitmap, KFD_MAX_SDMA_QUEUES);  }; -unsigned int kfd_get_num_sdma_engines(struct kfd_dev *kdev); -unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_dev *kdev); +unsigned int kfd_get_num_sdma_engines(struct kfd_node *kdev); +unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_node *kdev);  struct kfd_mem_obj {  	uint32_t range_start; @@ -253,13 +259,70 @@ struct kfd_vmid_info {  	uint32_t vmid_num_kfd;  }; +#define MAX_KFD_NODES	8 + +struct kfd_dev; + +struct kfd_node { +	unsigned int node_id; +	struct amdgpu_device *adev;     /* Duplicated here along with keeping +					 * a copy in kfd_dev to save a hop +					 */ +	const struct kfd2kgd_calls *kfd2kgd; /* Duplicated here along with +					      * keeping a copy in kfd_dev to +					      * save a hop +					      */ +	struct kfd_vmid_info vm_info; +	unsigned int id;                /* topology stub index */ +	uint32_t xcc_mask; /* Instance mask of XCCs present */ +	struct amdgpu_xcp *xcp; + +	/* Interrupts */ +	struct kfifo ih_fifo; +	struct workqueue_struct *ih_wq; +	struct work_struct interrupt_work; +	spinlock_t interrupt_lock; + +	/* +	 * Interrupts of interest to KFD are copied +	 * from the HW ring into a SW ring. +	 */ +	bool interrupts_active; +	uint32_t interrupt_bitmap; /* Only used for GFX 9.4.3 */ + +	/* QCM Device instance */ +	struct device_queue_manager *dqm; + +	/* Global GWS resource shared between processes */ +	void *gws; +	bool gws_debug_workaround; + +	/* Clients watching SMI events */ +	struct list_head smi_clients; +	spinlock_t smi_lock; +	uint32_t reset_seq_num; + +	/* SRAM ECC flag */ +	atomic_t sram_ecc_flag; + +	/*spm process id */ +	unsigned int spm_pasid; + +	/* Maximum process number mapped to HW scheduler */ +	unsigned int max_proc_per_quantum; + +	unsigned int compute_vmid_bitmap; + +	struct kfd_local_mem_info local_mem_info; + +	struct kfd_dev *kfd; +}; +  struct kfd_dev {  	struct amdgpu_device *adev;  	struct kfd_device_info device_info; -	unsigned int id;		/* topology stub index */ -  	phys_addr_t doorbell_base;	/* Start of actual doorbells used by  					 * KFD. It is aligned for mapping  					 * into user mode @@ -274,8 +337,6 @@ struct kfd_dev {  					   */  	struct kgd2kfd_shared_resources shared_resources; -	struct kfd_vmid_info vm_info; -	struct kfd_local_mem_info local_mem_info;  	const struct kfd2kgd_calls *kfd2kgd;  	struct mutex doorbell_mutex; @@ -290,30 +351,13 @@ struct kfd_dev {  	unsigned int gtt_sa_chunk_size;  	unsigned int gtt_sa_num_of_chunks; -	/* Interrupts */ -	struct kfifo ih_fifo; -	struct workqueue_struct *ih_wq; -	struct work_struct interrupt_work; -	spinlock_t interrupt_lock; - -	/* QCM Device instance */ -	struct device_queue_manager *dqm; -  	bool init_complete; -	/* -	 * Interrupts of interest to KFD are copied -	 * from the HW ring into a SW ring. -	 */ -	bool interrupts_active;  	/* Firmware versions */  	uint16_t mec_fw_version;  	uint16_t mec2_fw_version;  	uint16_t sdma_fw_version; -	/* Maximum process number mapped to HW scheduler */ -	unsigned int max_proc_per_quantum; -  	/* CWSR */  	bool cwsr_enabled;  	const void *cwsr_isa; @@ -327,28 +371,20 @@ struct kfd_dev {  	/* Use IOMMU v2 flag */  	bool use_iommu_v2; -	/* SRAM ECC flag */ -	atomic_t sram_ecc_flag; -  	/* Compute Profile ref. count */  	atomic_t compute_profile; -	/* Global GWS resource shared between processes */ -	void *gws; - -	/* Clients watching SMI events */ -	struct list_head smi_clients; -	spinlock_t smi_lock; - -	uint32_t reset_seq_num; -  	struct ida doorbell_ida;  	unsigned int max_doorbell_slices;  	int noretry; -	/* HMM page migration MEMORY_DEVICE_PRIVATE mapping */ -	struct dev_pagemap pgmap; +	struct kfd_node *nodes[MAX_KFD_NODES]; +	unsigned int num_nodes; + +	/* Track per device allocated watch points */ +	uint32_t alloc_watch_ids; +	spinlock_t watch_points_lock;  };  enum kfd_mempool { @@ -478,8 +514,13 @@ struct queue_properties {  	uint32_t doorbell_off;  	bool is_interop;  	bool is_evicted; +	bool is_suspended; +	bool is_being_destroyed;  	bool is_active;  	bool is_gws; +	uint32_t pm4_target_xcc; +	bool is_dbg_wa; +	bool is_user_cu_masked;  	/* Not relevant for user mode queues in cp scheduling */  	unsigned int vmid;  	/* Relevant only for sdma queues*/ @@ -494,15 +535,18 @@ struct queue_properties {  	uint32_t ctl_stack_size;  	uint64_t tba_addr;  	uint64_t tma_addr; +	uint64_t exception_status;  };  #define QUEUE_IS_ACTIVE(q) ((q).queue_size > 0 &&	\  			    (q).queue_address != 0 &&	\  			    (q).queue_percent > 0 &&	\ -			    !(q).is_evicted) +			    !(q).is_evicted &&		\ +			    !(q).is_suspended)  enum mqd_update_flag { -	UPDATE_FLAG_CU_MASK = 0, +	UPDATE_FLAG_DBG_WA_ENABLE = 1, +	UPDATE_FLAG_DBG_WA_DISABLE = 2,  };  struct mqd_update_info { @@ -563,7 +607,7 @@ struct queue {  	unsigned int doorbell_id;  	struct kfd_process	*process; -	struct kfd_dev		*device; +	struct kfd_node		*device;  	void *gws;  	/* procfs */ @@ -697,7 +741,7 @@ enum kfd_pdd_bound {  /* Data that is per-process-per device. */  struct kfd_process_device {  	/* The device that owns this data. */ -	struct kfd_dev *dev; +	struct kfd_node *dev;  	/* The process that owns this kfd_process_device. */  	struct kfd_process *process; @@ -783,6 +827,18 @@ struct kfd_process_device {  	uint64_t faults;  	uint64_t page_in;  	uint64_t page_out; + +	/* Exception code status*/ +	uint64_t exception_status; +	void *vm_fault_exc_data; +	size_t vm_fault_exc_data_size; + +	/* Tracks debug per-vmid request settings */ +	uint32_t spi_dbg_override; +	uint32_t spi_dbg_launch_mode; +	uint32_t watch_points[4]; +	uint32_t alloc_watch_ids; +  	/*  	 * If this process has been checkpointed before, then the user  	 * application will use the original gpu_id on the @@ -887,19 +943,57 @@ struct kfd_process {  	 */  	unsigned long last_restore_timestamp; +	/* Indicates device process is debug attached with reserved vmid. */ +	bool debug_trap_enabled; + +	/* per-process-per device debug event fd file */ +	struct file *dbg_ev_file; + +	/* If the process is a kfd debugger, we need to know so we can clean +	 * up at exit time.  If a process enables debugging on itself, it does +	 * its own clean-up, so we don't set the flag here.  We track this by +	 * counting the number of processes this process is debugging. +	 */ +	atomic_t debugged_process_count; + +	/* If the process is a debugged, this is the debugger process */ +	struct kfd_process *debugger_process; +  	/* Kobj for our procfs */  	struct kobject *kobj;  	struct kobject *kobj_queues;  	struct attribute attr_pasid; +	/* Keep track cwsr init */ +	bool has_cwsr; + +	/* Exception code enable mask and status */ +	uint64_t exception_enable_mask; +	uint64_t exception_status; + +	/* Used to drain stale interrupts */ +	wait_queue_head_t wait_irq_drain; +	bool irq_drain_is_open; +  	/* shared virtual memory registered by this process */  	struct svm_range_list svms;  	bool xnack_enabled; +	/* Work area for debugger event writer worker. */ +	struct work_struct debug_event_workarea; + +	/* Tracks debug per-vmid request for debug flags */ +	bool dbg_flags; +  	atomic_t poison;  	/* Queues are in paused stated because we are in the process of doing a CRIU checkpoint */  	bool queues_paused; + +	/* Tracks runtime enable status */ +	struct semaphore runtime_enable_sema; +	bool is_runtime_retry; +	struct kfd_runtime_info runtime_info;  };  #define KFD_PROCESS_TABLE_SIZE 5 /* bits: 32 entries */ @@ -925,20 +1019,19 @@ struct amdkfd_ioctl_desc {  	unsigned int cmd_drv;  	const char *name;  }; -bool kfd_dev_is_large_bar(struct kfd_dev *dev); +bool kfd_dev_is_large_bar(struct kfd_node *dev);  int kfd_process_create_wq(void);  void kfd_process_destroy_wq(void);  void kfd_cleanup_processes(void); -struct kfd_process *kfd_create_process(struct file *filep); +struct kfd_process *kfd_create_process(struct task_struct *thread);  struct kfd_process *kfd_get_process(const struct task_struct *task);  struct kfd_process *kfd_lookup_process_by_pasid(u32 pasid);  struct kfd_process *kfd_lookup_process_by_mm(const struct mm_struct *mm);  int kfd_process_gpuidx_from_gpuid(struct kfd_process *p, uint32_t gpu_id); -int kfd_process_gpuid_from_adev(struct kfd_process *p, -			       struct amdgpu_device *adev, uint32_t *gpuid, -			       uint32_t *gpuidx); +int kfd_process_gpuid_from_node(struct kfd_process *p, struct kfd_node *node, +				uint32_t *gpuid, uint32_t *gpuidx);  static inline int kfd_process_gpuid_from_gpuidx(struct kfd_process *p,  				uint32_t gpuidx, uint32_t *gpuid) {  	return gpuidx < p->n_pdds ? p->pdds[gpuidx]->dev->id : -EINVAL; @@ -961,16 +1054,16 @@ int kfd_process_get_user_gpu_id(struct kfd_process *p, uint32_t actual_gpu_id);  int kfd_process_device_init_vm(struct kfd_process_device *pdd,  			       struct file *drm_file); -struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev, +struct kfd_process_device *kfd_bind_process_to_device(struct kfd_node *dev,  						struct kfd_process *p); -struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev, +struct kfd_process_device *kfd_get_process_device_data(struct kfd_node *dev,  							struct kfd_process *p); -struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev, +struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,  							struct kfd_process *p);  bool kfd_process_xnack_mode(struct kfd_process *p, bool supported); -int kfd_reserved_mem_mmap(struct kfd_dev *dev, struct kfd_process *process, +int kfd_reserved_mem_mmap(struct kfd_node *dev, struct kfd_process *process,  			  struct vm_area_struct *vma);  /* KFD process API for creating and translating handles */ @@ -994,7 +1087,7 @@ void kfd_pasid_free(u32 pasid);  size_t kfd_doorbell_process_slice(struct kfd_dev *kfd);  int kfd_doorbell_init(struct kfd_dev *kfd);  void kfd_doorbell_fini(struct kfd_dev *kfd); -int kfd_doorbell_mmap(struct kfd_dev *dev, struct kfd_process *process, +int kfd_doorbell_mmap(struct kfd_node *dev, struct kfd_process *process,  		      struct vm_area_struct *vma);  void __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,  					unsigned int *doorbell_off); @@ -1012,10 +1105,10 @@ void kfd_free_process_doorbells(struct kfd_dev *kfd,  				unsigned int doorbell_index);  /* GTT Sub-Allocator */ -int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int size, +int kfd_gtt_sa_allocate(struct kfd_node *node, unsigned int size,  			struct kfd_mem_obj **mem_obj); -int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj); +int kfd_gtt_sa_free(struct kfd_node *node, struct kfd_mem_obj *mem_obj);  extern struct device *kfd_device; @@ -1028,27 +1121,53 @@ void kfd_procfs_del_queue(struct queue *q);  /* Topology */  int kfd_topology_init(void);  void kfd_topology_shutdown(void); -int kfd_topology_add_device(struct kfd_dev *gpu); -int kfd_topology_remove_device(struct kfd_dev *gpu); +int kfd_topology_add_device(struct kfd_node *gpu); +int kfd_topology_remove_device(struct kfd_node *gpu);  struct kfd_topology_device *kfd_topology_device_by_proximity_domain(  						uint32_t proximity_domain);  struct kfd_topology_device *kfd_topology_device_by_proximity_domain_no_lock(  						uint32_t proximity_domain);  struct kfd_topology_device *kfd_topology_device_by_id(uint32_t gpu_id); -struct kfd_dev *kfd_device_by_id(uint32_t gpu_id); -struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); -struct kfd_dev *kfd_device_by_adev(const struct amdgpu_device *adev); -int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev); +struct kfd_node *kfd_device_by_id(uint32_t gpu_id); +struct kfd_node *kfd_device_by_pci_dev(const struct pci_dev *pdev); +static inline bool kfd_irq_is_from_node(struct kfd_node *node, uint32_t node_id, +					uint32_t vmid) +{ +	return (node->interrupt_bitmap & (1 << node_id)) != 0 && +	       (node->compute_vmid_bitmap & (1 << vmid)) != 0; +} +static inline struct kfd_node *kfd_node_by_irq_ids(struct amdgpu_device *adev, +					uint32_t node_id, uint32_t vmid) { +	struct kfd_dev *dev = adev->kfd.dev; +	uint32_t i; + +	if (adev->ip_versions[GC_HWIP][0] != IP_VERSION(9, 4, 3)) +		return dev->nodes[0]; + +	for (i = 0; i < dev->num_nodes; i++) +		if (kfd_irq_is_from_node(dev->nodes[i], node_id, vmid)) +			return dev->nodes[i]; + +	return NULL; +} +int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_node **kdev);  int kfd_numa_node_to_apic_id(int numa_node_id);  void kfd_double_confirm_iommu_support(struct kfd_dev *gpu);  /* Interrupts */ -int kfd_interrupt_init(struct kfd_dev *dev); -void kfd_interrupt_exit(struct kfd_dev *dev); -bool enqueue_ih_ring_entry(struct kfd_dev *kfd,	const void *ih_ring_entry); -bool interrupt_is_wanted(struct kfd_dev *dev, +#define	KFD_IRQ_FENCE_CLIENTID	0xff +#define	KFD_IRQ_FENCE_SOURCEID	0xff +#define	KFD_IRQ_IS_FENCE(client, source)				\ +				((client) == KFD_IRQ_FENCE_CLIENTID &&	\ +				(source) == KFD_IRQ_FENCE_SOURCEID) +int kfd_interrupt_init(struct kfd_node *dev); +void kfd_interrupt_exit(struct kfd_node *dev); +bool enqueue_ih_ring_entry(struct kfd_node *kfd, const void *ih_ring_entry); +bool interrupt_is_wanted(struct kfd_node *dev,  				const uint32_t *ih_ring_entry,  				uint32_t *patched_ihre, bool *flag); +int kfd_process_drain_interrupts(struct kfd_process_device *pdd); +void kfd_process_close_interrupt_drain(unsigned int pasid);  /* amdkfd Apertures */  int kfd_init_apertures(struct kfd_process *process); @@ -1056,6 +1175,11 @@ int kfd_init_apertures(struct kfd_process *process);  void kfd_process_set_trap_handler(struct qcm_process_device *qpd,  				  uint64_t tba_addr,  				  uint64_t tma_addr); +void kfd_process_set_trap_debug_flag(struct qcm_process_device *qpd, +				     bool enabled); + +/* CWSR initialization */ +int kfd_process_init_cwsr_apu(struct kfd_process *process, struct file *filep);  /* CRIU */  /* @@ -1174,22 +1298,22 @@ void print_queue_properties(struct queue_properties *q);  void print_queue(struct queue *q);  struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_cik_hawaii(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_vi_tonga(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_v10(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); +		struct kfd_node *dev);  struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type, -		struct kfd_dev *dev); -struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev); +		struct kfd_node *dev); +struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev);  void device_queue_manager_uninit(struct device_queue_manager *dqm); -struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, +struct kernel_queue *kernel_queue_init(struct kfd_node *dev,  					enum kfd_queue_type type);  void kernel_queue_uninit(struct kernel_queue *kq, bool hanging);  int kfd_dqm_evict_pasid(struct device_queue_manager *dqm, u32 pasid); @@ -1206,7 +1330,7 @@ void kfd_process_dequeue_from_all_devices(struct kfd_process *p);  int pqm_init(struct process_queue_manager *pqm, struct kfd_process *p);  void pqm_uninit(struct process_queue_manager *pqm);  int pqm_create_queue(struct process_queue_manager *pqm, -			    struct kfd_dev *dev, +			    struct kfd_node *dev,  			    struct file *f,  			    struct queue_properties *properties,  			    unsigned int *qid, @@ -1231,6 +1355,11 @@ int pqm_get_wave_state(struct process_queue_manager *pqm,  		       void __user *ctl_stack,  		       u32 *ctl_stack_used_size,  		       u32 *save_area_used_size); +int pqm_get_queue_snapshot(struct process_queue_manager *pqm, +			   uint64_t exception_clear_mask, +			   void __user *buf, +			   int *num_qss_entries, +			   uint32_t *entry_size);  int amdkfd_fence_wait_timeout(uint64_t *fence_addr,  			      uint64_t fence_value, @@ -1270,6 +1399,8 @@ struct packet_manager_funcs {  	int (*unmap_queues)(struct packet_manager *pm, uint32_t *buffer,  			enum kfd_unmap_queues_filter mode,  			uint32_t filter_param, bool reset); +	int (*set_grace_period)(struct packet_manager *pm, uint32_t *buffer, +			uint32_t grace_period);  	int (*query_status)(struct packet_manager *pm, uint32_t *buffer,  			uint64_t fence_address,	uint64_t fence_value);  	int (*release_mem)(uint64_t gpu_addr, uint32_t *buffer); @@ -1280,6 +1411,7 @@ struct packet_manager_funcs {  	int set_resources_size;  	int map_queues_size;  	int unmap_queues_size; +	int set_grace_period_size;  	int query_status_size;  	int release_mem_size;  }; @@ -1302,6 +1434,8 @@ int pm_send_unmap_queue(struct packet_manager *pm,  void pm_release_ib(struct packet_manager *pm); +int pm_update_grace_period(struct packet_manager *pm, uint32_t grace_period); +  /* Following PM funcs can be shared among VI and AI */  unsigned int pm_build_pm4_header(unsigned int opcode, size_t packet_size); @@ -1310,6 +1444,7 @@ uint64_t kfd_get_number_elems(struct kfd_dev *kfd);  /* Events */  extern const struct kfd_event_interrupt_class event_interrupt_class_cik;  extern const struct kfd_event_interrupt_class event_interrupt_class_v9; +extern const struct kfd_event_interrupt_class event_interrupt_class_v10;  extern const struct kfd_event_interrupt_class event_interrupt_class_v11;  extern const struct kfd_device_global_init_class device_global_init_class_cik; @@ -1323,7 +1458,7 @@ int kfd_wait_on_events(struct kfd_process *p,  		       uint32_t *wait_result);  void kfd_signal_event_interrupt(u32 pasid, uint32_t partial_id,  				uint32_t valid_id_bits); -void kfd_signal_iommu_event(struct kfd_dev *dev, +void kfd_signal_iommu_event(struct kfd_node *dev,  			    u32 pasid, unsigned long address,  			    bool is_write_requested, bool is_execute_requested);  void kfd_signal_hw_exception_event(u32 pasid); @@ -1339,32 +1474,36 @@ int kfd_event_create(struct file *devkfd, struct kfd_process *p,  int kfd_get_num_events(struct kfd_process *p);  int kfd_event_destroy(struct kfd_process *p, uint32_t event_id); -void kfd_signal_vm_fault_event(struct kfd_dev *dev, u32 pasid, -				struct kfd_vm_fault_info *info); +void kfd_signal_vm_fault_event(struct kfd_node *dev, u32 pasid, +				struct kfd_vm_fault_info *info, +				struct kfd_hsa_memory_exception_data *data); -void kfd_signal_reset_event(struct kfd_dev *dev); +void kfd_signal_reset_event(struct kfd_node *dev); -void kfd_signal_poison_consumed_event(struct kfd_dev *dev, u32 pasid); +void kfd_signal_poison_consumed_event(struct kfd_node *dev, u32 pasid);  void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type);  static inline bool kfd_flush_tlb_after_unmap(struct kfd_dev *dev)  { -	return KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2) || -	       (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) && -	       dev->adev->sdma.instance[0].fw_version >= 18) || +	return KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || +	       KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 2) || +	       (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 1) && dev->sdma_fw_version >= 18) ||  	       KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 0);  } +int kfd_send_exception_to_runtime(struct kfd_process *p, +				unsigned int queue_id, +				uint64_t error_reason);  bool kfd_is_locked(void);  /* Compute profile */ -void kfd_inc_compute_active(struct kfd_dev *dev); -void kfd_dec_compute_active(struct kfd_dev *dev); +void kfd_inc_compute_active(struct kfd_node *dev); +void kfd_dec_compute_active(struct kfd_node *dev);  /* Cgroup Support */  /* Check with device cgroup if @kfd device is accessible */ -static inline int kfd_devcgroup_check_permission(struct kfd_dev *kfd) +static inline int kfd_devcgroup_check_permission(struct kfd_node *kfd)  {  #if defined(CONFIG_CGROUP_DEVICE) || defined(CONFIG_CGROUP_BPF)  	struct drm_device *ddev = adev_to_drm(kfd->adev); @@ -1377,6 +1516,11 @@ static inline int kfd_devcgroup_check_permission(struct kfd_dev *kfd)  #endif  } +static inline bool kfd_is_first_node(struct kfd_node *node) +{ +	return (node == node->kfd->nodes[0]); +} +  /* Debugfs */  #if defined(CONFIG_DEBUG_FS) @@ -1389,7 +1533,7 @@ int dqm_debugfs_hqds(struct seq_file *m, void *data);  int kfd_debugfs_rls_by_device(struct seq_file *m, void *data);  int pm_debugfs_runlist(struct seq_file *m, void *data); -int kfd_debugfs_hang_hws(struct kfd_dev *dev); +int kfd_debugfs_hang_hws(struct kfd_node *dev);  int pm_debugfs_hang_hws(struct packet_manager *pm);  int dqm_debugfs_hang_hws(struct device_queue_manager *dqm); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index 07a9eaf9b7d8..3d3611705d41 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -44,13 +44,14 @@ struct mm_struct;  #include "kfd_iommu.h"  #include "kfd_svm.h"  #include "kfd_smi_events.h" +#include "kfd_debug.h"  /*   * List of struct kfd_process (field kfd_process).   * Unique/indexed by mm_struct*   */  DEFINE_HASHTABLE(kfd_processes_table, KFD_PROCESS_TABLE_SIZE); -static DEFINE_MUTEX(kfd_processes_mutex); +DEFINE_MUTEX(kfd_processes_mutex);  DEFINE_SRCU(kfd_processes_srcu); @@ -69,7 +70,6 @@ static struct kfd_process *find_process(const struct task_struct *thread,  					bool ref);  static void kfd_process_ref_release(struct kref *ref);  static struct kfd_process *create_process(const struct task_struct *thread); -static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep);  static void evict_process_worker(struct work_struct *work);  static void restore_process_worker(struct work_struct *work); @@ -269,7 +269,7 @@ static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)  	int cu_cnt;  	int wave_cnt;  	int max_waves_per_cu; -	struct kfd_dev *dev = NULL; +	struct kfd_node *dev = NULL;  	struct kfd_process *proc = NULL;  	struct kfd_process_device *pdd = NULL; @@ -290,7 +290,7 @@ static int kfd_get_cu_occupancy(struct attribute *attr, char *buffer)  	wave_cnt = 0;  	max_waves_per_cu = 0;  	dev->kfd2kgd->get_cu_occupancy(dev->adev, proc->pasid, &wave_cnt, -			&max_waves_per_cu); +			&max_waves_per_cu, 0);  	/* Translate wave count to number of compute units */  	cu_cnt = (wave_cnt + (max_waves_per_cu - 1)) / max_waves_per_cu; @@ -691,7 +691,7 @@ void kfd_process_destroy_wq(void)  static void kfd_process_free_gpuvm(struct kgd_mem *mem,  			struct kfd_process_device *pdd, void **kptr)  { -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev;  	if (kptr && *kptr) {  		amdgpu_amdkfd_gpuvm_unmap_gtt_bo_from_kernel(mem); @@ -713,7 +713,7 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,  				   uint64_t gpu_va, uint32_t size,  				   uint32_t flags, struct kgd_mem **mem, void **kptr)  { -	struct kfd_dev *kdev = pdd->dev; +	struct kfd_node *kdev = pdd->dev;  	int err;  	err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(kdev->adev, gpu_va, size, @@ -798,18 +798,19 @@ static void kfd_process_device_destroy_ib_mem(struct kfd_process_device *pdd)  	kfd_process_free_gpuvm(qpd->ib_mem, pdd, &qpd->ib_kaddr);  } -struct kfd_process *kfd_create_process(struct file *filep) +struct kfd_process *kfd_create_process(struct task_struct *thread)  {  	struct kfd_process *process; -	struct task_struct *thread = current;  	int ret; -	if (!thread->mm) +	if (!(thread->mm && mmget_not_zero(thread->mm)))  		return ERR_PTR(-EINVAL);  	/* Only the pthreads threading model is supported. */ -	if (thread->group_leader->mm != thread->mm) +	if (thread->group_leader->mm != thread->mm) { +		mmput(thread->mm);  		return ERR_PTR(-EINVAL); +	}  	/*  	 * take kfd processes mutex before starting of process creation @@ -818,6 +819,12 @@ struct kfd_process *kfd_create_process(struct file *filep)  	 */  	mutex_lock(&kfd_processes_mutex); +	if (kfd_is_locked()) { +		mutex_unlock(&kfd_processes_mutex); +		pr_debug("KFD is locked! Cannot create process"); +		return ERR_PTR(-EINVAL); +	} +  	/* A prior open of /dev/kfd could have already created the process. */  	process = find_process(thread, false);  	if (process) { @@ -827,10 +834,6 @@ struct kfd_process *kfd_create_process(struct file *filep)  		if (IS_ERR(process))  			goto out; -		ret = kfd_process_init_cwsr_apu(process, filep); -		if (ret) -			goto out_destroy; -  		if (!procfs.kobj)  			goto out; @@ -859,21 +862,16 @@ struct kfd_process *kfd_create_process(struct file *filep)  		kfd_procfs_add_sysfs_stats(process);  		kfd_procfs_add_sysfs_files(process);  		kfd_procfs_add_sysfs_counters(process); + +		init_waitqueue_head(&process->wait_irq_drain);  	}  out:  	if (!IS_ERR(process))  		kref_get(&process->ref);  	mutex_unlock(&kfd_processes_mutex); +	mmput(thread->mm);  	return process; - -out_destroy: -	hash_del_rcu(&process->kfd_processes); -	mutex_unlock(&kfd_processes_mutex); -	synchronize_srcu(&kfd_processes_srcu); -	/* kfd_process_free_notifier will trigger the cleanup */ -	mmu_notifier_put(&process->mmu_notifier); -	return ERR_PTR(ret);  }  struct kfd_process *kfd_get_process(const struct task_struct *thread) @@ -982,7 +980,7 @@ static void kfd_process_device_free_bos(struct kfd_process_device *pdd)  static void kfd_process_kunmap_signal_bo(struct kfd_process *p)  {  	struct kfd_process_device *pdd; -	struct kfd_dev *kdev; +	struct kfd_node *kdev;  	void *mem;  	kdev = kfd_device_by_id(GET_GPU_ID(p->signal_handle)); @@ -1040,9 +1038,9 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)  		bitmap_free(pdd->qpd.doorbell_bitmap);  		idr_destroy(&pdd->alloc_idr); -		kfd_free_process_doorbells(pdd->dev, pdd->doorbell_index); +		kfd_free_process_doorbells(pdd->dev->kfd, pdd->doorbell_index); -		if (pdd->dev->shared_resources.enable_mes) +		if (pdd->dev->kfd->shared_resources.enable_mes)  			amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,  						   pdd->proc_ctx_bo);  		/* @@ -1169,11 +1167,40 @@ static void kfd_process_free_notifier(struct mmu_notifier *mn)  static void kfd_process_notifier_release_internal(struct kfd_process *p)  { +	int i; +  	cancel_delayed_work_sync(&p->eviction_work);  	cancel_delayed_work_sync(&p->restore_work); +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; + +		/* re-enable GFX OFF since runtime enable with ttmp setup disabled it. */ +		if (!kfd_dbg_is_rlc_restore_supported(pdd->dev) && p->runtime_info.ttmp_setup) +			amdgpu_gfx_off_ctrl(pdd->dev->adev, true); +	} +  	/* Indicate to other users that MM is no longer valid */  	p->mm = NULL; +	kfd_dbg_trap_disable(p); + +	if (atomic_read(&p->debugged_process_count) > 0) { +		struct kfd_process *target; +		unsigned int temp; +		int idx = srcu_read_lock(&kfd_processes_srcu); + +		hash_for_each_rcu(kfd_processes_table, temp, target, kfd_processes) { +			if (target->debugger_process && target->debugger_process == p) { +				mutex_lock_nested(&target->mutex, 1); +				kfd_dbg_trap_disable(target); +				mutex_unlock(&target->mutex); +				if (atomic_read(&p->debugged_process_count) == 0) +					break; +			} +		} + +		srcu_read_unlock(&kfd_processes_srcu, idx); +	}  	mmu_notifier_put(&p->mmu_notifier);  } @@ -1253,16 +1280,19 @@ void kfd_cleanup_processes(void)  	mmu_notifier_synchronize();  } -static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep) +int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep)  {  	unsigned long  offset;  	int i; +	if (p->has_cwsr) +		return 0; +  	for (i = 0; i < p->n_pdds; i++) { -		struct kfd_dev *dev = p->pdds[i]->dev; +		struct kfd_node *dev = p->pdds[i]->dev;  		struct qcm_process_device *qpd = &p->pdds[i]->qpd; -		if (!dev->cwsr_enabled || qpd->cwsr_kaddr || qpd->cwsr_base) +		if (!dev->kfd->cwsr_enabled || qpd->cwsr_kaddr || qpd->cwsr_base)  			continue;  		offset = KFD_MMAP_TYPE_RESERVED_MEM | KFD_MMAP_GPU_ID(dev->id); @@ -1279,19 +1309,23 @@ static int kfd_process_init_cwsr_apu(struct kfd_process *p, struct file *filep)  			return err;  		} -		memcpy(qpd->cwsr_kaddr, dev->cwsr_isa, dev->cwsr_isa_size); +		memcpy(qpd->cwsr_kaddr, dev->kfd->cwsr_isa, dev->kfd->cwsr_isa_size); + +		kfd_process_set_trap_debug_flag(qpd, p->debug_trap_enabled);  		qpd->tma_addr = qpd->tba_addr + KFD_CWSR_TMA_OFFSET;  		pr_debug("set tba :0x%llx, tma:0x%llx, cwsr_kaddr:%p for pqm.\n",  			qpd->tba_addr, qpd->tma_addr, qpd->cwsr_kaddr);  	} +	p->has_cwsr = true; +  	return 0;  }  static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)  { -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev;  	struct qcm_process_device *qpd = &pdd->qpd;  	uint32_t flags = KFD_IOC_ALLOC_MEM_FLAGS_GTT  			| KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE @@ -1300,7 +1334,7 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)  	void *kaddr;  	int ret; -	if (!dev->cwsr_enabled || qpd->cwsr_kaddr || !qpd->cwsr_base) +	if (!dev->kfd->cwsr_enabled || qpd->cwsr_kaddr || !qpd->cwsr_base)  		return 0;  	/* cwsr_base is only set for dGPU */ @@ -1313,7 +1347,10 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)  	qpd->cwsr_kaddr = kaddr;  	qpd->tba_addr = qpd->cwsr_base; -	memcpy(qpd->cwsr_kaddr, dev->cwsr_isa, dev->cwsr_isa_size); +	memcpy(qpd->cwsr_kaddr, dev->kfd->cwsr_isa, dev->kfd->cwsr_isa_size); + +	kfd_process_set_trap_debug_flag(&pdd->qpd, +					pdd->process->debug_trap_enabled);  	qpd->tma_addr = qpd->tba_addr + KFD_CWSR_TMA_OFFSET;  	pr_debug("set tba :0x%llx, tma:0x%llx, cwsr_kaddr:%p for pqm.\n", @@ -1324,10 +1361,10 @@ static int kfd_process_device_init_cwsr_dgpu(struct kfd_process_device *pdd)  static void kfd_process_device_destroy_cwsr_dgpu(struct kfd_process_device *pdd)  { -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev;  	struct qcm_process_device *qpd = &pdd->qpd; -	if (!dev->cwsr_enabled || !qpd->cwsr_kaddr || !qpd->cwsr_base) +	if (!dev->kfd->cwsr_enabled || !qpd->cwsr_kaddr || !qpd->cwsr_base)  		return;  	kfd_process_free_gpuvm(qpd->cwsr_mem, pdd, &qpd->cwsr_kaddr); @@ -1371,7 +1408,7 @@ bool kfd_process_xnack_mode(struct kfd_process *p, bool supported)  	 * support retry.  	 */  	for (i = 0; i < p->n_pdds; i++) { -		struct kfd_dev *dev = p->pdds[i]->dev; +		struct kfd_node *dev = p->pdds[i]->dev;  		/* Only consider GFXv9 and higher GPUs. Older GPUs don't  		 * support the SVM APIs and don't need to be considered @@ -1394,13 +1431,23 @@ bool kfd_process_xnack_mode(struct kfd_process *p, bool supported)  		if (KFD_GC_VERSION(dev) >= IP_VERSION(10, 1, 1))  			return false; -		if (dev->noretry) +		if (dev->kfd->noretry)  			return false;  	}  	return true;  } +void kfd_process_set_trap_debug_flag(struct qcm_process_device *qpd, +				     bool enabled) +{ +	if (qpd->cwsr_kaddr) { +		uint64_t *tma = +			(uint64_t *)(qpd->cwsr_kaddr + KFD_CWSR_TMA_OFFSET); +		tma[2] = enabled; +	} +} +  /*   * On return the kfd_process is fully operational and will be freed when the   * mm is released @@ -1428,6 +1475,11 @@ static struct kfd_process *create_process(const struct task_struct *thread)  	if (err)  		goto err_event_init;  	process->is_32bit_user_mode = in_compat_syscall(); +	process->debug_trap_enabled = false; +	process->debugger_process = NULL; +	process->exception_enable_mask = 0; +	atomic_set(&process->debugged_process_count, 0); +	sema_init(&process->runtime_enable_sema, 0);  	process->pasid = kfd_pasid_alloc();  	if (process->pasid == 0) { @@ -1475,6 +1527,8 @@ static struct kfd_process *create_process(const struct task_struct *thread)  	kfd_unref_process(process);  	get_task_struct(process->lead_thread); +	INIT_WORK(&process->debug_event_workarea, debug_event_write_work_handler); +  	return process;  err_register_notifier: @@ -1528,7 +1582,7 @@ static int init_doorbell_bitmap(struct qcm_process_device *qpd,  	return 0;  } -struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev, +struct kfd_process_device *kfd_get_process_device_data(struct kfd_node *dev,  							struct kfd_process *p)  {  	int i; @@ -1540,7 +1594,7 @@ struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,  	return NULL;  } -struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev, +struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev,  							struct kfd_process *p)  {  	struct kfd_process_device *pdd = NULL; @@ -1552,7 +1606,7 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev,  	if (!pdd)  		return NULL; -	if (init_doorbell_bitmap(&pdd->qpd, dev)) { +	if (init_doorbell_bitmap(&pdd->qpd, dev->kfd)) {  		pr_err("Failed to init doorbell for process\n");  		goto err_free_pdd;  	} @@ -1573,7 +1627,7 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev,  	pdd->user_gpu_id = dev->id;  	atomic64_set(&pdd->evict_duration_counter, 0); -	if (dev->shared_resources.enable_mes) { +	if (dev->kfd->shared_resources.enable_mes) {  		retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev,  						AMDGPU_MES_PROC_CTX_SIZE,  						&pdd->proc_ctx_bo, @@ -1588,6 +1642,11 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev,  	}  	p->pdds[p->n_pdds++] = pdd; +	if (kfd_dbg_is_per_vmid_supported(pdd->dev)) +		pdd->spi_dbg_override = pdd->dev->kfd2kgd->disable_debug_trap( +							pdd->dev->adev, +							false, +							0);  	/* Init idr used for memory handle translation */  	idr_init(&pdd->alloc_idr); @@ -1619,7 +1678,7 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,  	struct amdgpu_fpriv *drv_priv;  	struct amdgpu_vm *avm;  	struct kfd_process *p; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	int ret;  	if (!drm_file) @@ -1679,7 +1738,7 @@ err_reserve_ib_mem:   *   * Assumes that the process lock is held.   */ -struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev, +struct kfd_process_device *kfd_bind_process_to_device(struct kfd_node *dev,  							struct kfd_process *p)  {  	struct kfd_process_device *pdd; @@ -1885,13 +1944,13 @@ int kfd_process_gpuidx_from_gpuid(struct kfd_process *p, uint32_t gpu_id)  }  int -kfd_process_gpuid_from_adev(struct kfd_process *p, struct amdgpu_device *adev, -			   uint32_t *gpuid, uint32_t *gpuidx) +kfd_process_gpuid_from_node(struct kfd_process *p, struct kfd_node *node, +			    uint32_t *gpuid, uint32_t *gpuidx)  {  	int i;  	for (i = 0; i < p->n_pdds; i++) -		if (p->pdds[i] && p->pdds[i]->dev->adev == adev) { +		if (p->pdds[i] && p->pdds[i]->dev == node) {  			*gpuid = p->pdds[i]->user_gpu_id;  			*gpuidx = i;  			return 0; @@ -1961,8 +2020,10 @@ static void restore_process_worker(struct work_struct *work)  	 */  	p->last_restore_timestamp = get_jiffies_64(); -	ret = amdgpu_amdkfd_gpuvm_restore_process_bos(p->kgd_process_info, -						     &p->ef); +	/* VMs may not have been acquired yet during debugging. */ +	if (p->kgd_process_info) +		ret = amdgpu_amdkfd_gpuvm_restore_process_bos(p->kgd_process_info, +							     &p->ef);  	if (ret) {  		pr_debug("Failed to restore BOs of pasid 0x%x, retry after %d ms\n",  			 p->pasid, PROCESS_BACK_OFF_TIME_MS); @@ -1988,7 +2049,7 @@ void kfd_suspend_all_processes(void)  	WARN(debug_evictions, "Evicting all processes");  	hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {  		cancel_delayed_work_sync(&p->eviction_work); -		cancel_delayed_work_sync(&p->restore_work); +		flush_delayed_work(&p->restore_work);  		if (kfd_process_evict_queues(p, KFD_QUEUE_EVICTION_TRIGGER_SUSPEND))  			pr_err("Failed to suspend process 0x%x\n", p->pasid); @@ -2016,7 +2077,7 @@ int kfd_resume_all_processes(void)  	return ret;  } -int kfd_reserved_mem_mmap(struct kfd_dev *dev, struct kfd_process *process, +int kfd_reserved_mem_mmap(struct kfd_node *dev, struct kfd_process *process,  			  struct vm_area_struct *vma)  {  	struct kfd_process_device *pdd; @@ -2051,7 +2112,9 @@ void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type)  {  	struct amdgpu_vm *vm = drm_priv_to_vm(pdd->drm_priv);  	uint64_t tlb_seq = amdgpu_vm_tlb_seq(vm); -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev; +	uint32_t xcc_mask = dev->xcc_mask; +	int xcc = 0;  	/*  	 * It can be that we race and lose here, but that is extremely unlikely @@ -2069,11 +2132,126 @@ void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type)  			amdgpu_amdkfd_flush_gpu_tlb_vmid(dev->adev,  							pdd->qpd.vmid);  	} else { -		amdgpu_amdkfd_flush_gpu_tlb_pasid(dev->adev, -					pdd->process->pasid, type); +		for_each_inst(xcc, xcc_mask) +			amdgpu_amdkfd_flush_gpu_tlb_pasid( +				dev->adev, pdd->process->pasid, type, xcc);  	}  } +/* assumes caller holds process lock. */ +int kfd_process_drain_interrupts(struct kfd_process_device *pdd) +{ +	uint32_t irq_drain_fence[8]; +	int r = 0; + +	if (!KFD_IS_SOC15(pdd->dev)) +		return 0; + +	pdd->process->irq_drain_is_open = true; + +	memset(irq_drain_fence, 0, sizeof(irq_drain_fence)); +	irq_drain_fence[0] = (KFD_IRQ_FENCE_SOURCEID << 8) | +							KFD_IRQ_FENCE_CLIENTID; +	irq_drain_fence[3] = pdd->process->pasid; + +	/* ensure stale irqs scheduled KFD interrupts and send drain fence. */ +	if (amdgpu_amdkfd_send_close_event_drain_irq(pdd->dev->adev, +						     irq_drain_fence)) { +		pdd->process->irq_drain_is_open = false; +		return 0; +	} + +	r = wait_event_interruptible(pdd->process->wait_irq_drain, +				     !READ_ONCE(pdd->process->irq_drain_is_open)); +	if (r) +		pdd->process->irq_drain_is_open = false; + +	return r; +} + +void kfd_process_close_interrupt_drain(unsigned int pasid) +{ +	struct kfd_process *p; + +	p = kfd_lookup_process_by_pasid(pasid); + +	if (!p) +		return; + +	WRITE_ONCE(p->irq_drain_is_open, false); +	wake_up_all(&p->wait_irq_drain); +	kfd_unref_process(p); +} + +struct send_exception_work_handler_workarea { +	struct work_struct work; +	struct kfd_process *p; +	unsigned int queue_id; +	uint64_t error_reason; +}; + +static void send_exception_work_handler(struct work_struct *work) +{ +	struct send_exception_work_handler_workarea *workarea; +	struct kfd_process *p; +	struct queue *q; +	struct mm_struct *mm; +	struct kfd_context_save_area_header __user *csa_header; +	uint64_t __user *err_payload_ptr; +	uint64_t cur_err; +	uint32_t ev_id; + +	workarea = container_of(work, +				struct send_exception_work_handler_workarea, +				work); +	p = workarea->p; + +	mm = get_task_mm(p->lead_thread); + +	if (!mm) +		return; + +	kthread_use_mm(mm); + +	q = pqm_get_user_queue(&p->pqm, workarea->queue_id); + +	if (!q) +		goto out; + +	csa_header = (void __user *)q->properties.ctx_save_restore_area_address; + +	get_user(err_payload_ptr, (uint64_t __user **)&csa_header->err_payload_addr); +	get_user(cur_err, err_payload_ptr); +	cur_err |= workarea->error_reason; +	put_user(cur_err, err_payload_ptr); +	get_user(ev_id, &csa_header->err_event_id); + +	kfd_set_event(p, ev_id); + +out: +	kthread_unuse_mm(mm); +	mmput(mm); +} + +int kfd_send_exception_to_runtime(struct kfd_process *p, +			unsigned int queue_id, +			uint64_t error_reason) +{ +	struct send_exception_work_handler_workarea worker; + +	INIT_WORK_ONSTACK(&worker.work, send_exception_work_handler); + +	worker.p = p; +	worker.queue_id = queue_id; +	worker.error_reason = error_reason; + +	schedule_work(&worker.work); +	flush_work(&worker.work); +	destroy_work_on_stack(&worker.work); + +	return 0; +} +  struct kfd_process_device *kfd_process_device_data_by_id(struct kfd_process *p, uint32_t gpu_id)  {  	int i; @@ -2133,4 +2311,3 @@ int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data)  }  #endif - diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c index 4236539d9f93..9ad1a2186a24 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c @@ -81,7 +81,7 @@ static int find_available_queue_slot(struct process_queue_manager *pqm,  void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)  { -	struct kfd_dev *dev = pdd->dev; +	struct kfd_node *dev = pdd->dev;  	if (pdd->already_dequeued)  		return; @@ -93,7 +93,7 @@ void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)  int pqm_set_gws(struct process_queue_manager *pqm, unsigned int qid,  			void *gws)  { -	struct kfd_dev *dev = NULL; +	struct kfd_node *dev = NULL;  	struct process_queue_node *pqn;  	struct kfd_process_device *pdd;  	struct kgd_mem *mem = NULL; @@ -178,7 +178,7 @@ void pqm_uninit(struct process_queue_manager *pqm)  }  static int init_user_queue(struct process_queue_manager *pqm, -				struct kfd_dev *dev, struct queue **q, +				struct kfd_node *dev, struct queue **q,  				struct queue_properties *q_properties,  				struct file *f, struct amdgpu_bo *wptr_bo,  				unsigned int qid) @@ -187,6 +187,7 @@ static int init_user_queue(struct process_queue_manager *pqm,  	/* Doorbell initialized in user space*/  	q_properties->doorbell_ptr = NULL; +	q_properties->exception_status = KFD_EC_MASK(EC_QUEUE_NEW);  	/* let DQM handle it*/  	q_properties->vmid = 0; @@ -199,7 +200,7 @@ static int init_user_queue(struct process_queue_manager *pqm,  	(*q)->device = dev;  	(*q)->process = pqm->process; -	if (dev->shared_resources.enable_mes) { +	if (dev->kfd->shared_resources.enable_mes) {  		retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev,  						AMDGPU_MES_GANG_CTX_SIZE,  						&(*q)->gang_ctx_bo, @@ -224,7 +225,7 @@ cleanup:  }  int pqm_create_queue(struct process_queue_manager *pqm, -			    struct kfd_dev *dev, +			    struct kfd_node *dev,  			    struct file *f,  			    struct queue_properties *properties,  			    unsigned int *qid, @@ -242,6 +243,13 @@ int pqm_create_queue(struct process_queue_manager *pqm,  	enum kfd_queue_type type = properties->type;  	unsigned int max_queues = 127; /* HWS limit */ +	/* +	 * On GFX 9.4.3, increase the number of queues that +	 * can be created to 255. No HWS limit on GFX 9.4.3. +	 */ +	if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3)) +		max_queues = 255; +  	q = NULL;  	kq = NULL; @@ -258,7 +266,7 @@ int pqm_create_queue(struct process_queue_manager *pqm,  	 * Hence we also check the type as well  	 */  	if ((pdd->qpd.is_debug) || (type == KFD_QUEUE_TYPE_DIQ)) -		max_queues = dev->device_info.max_no_of_hqd/2; +		max_queues = dev->kfd->device_info.max_no_of_hqd/2;  	if (pdd->qpd.queue_count >= max_queues)  		return -ENOSPC; @@ -330,6 +338,10 @@ int pqm_create_queue(struct process_queue_manager *pqm,  		kq->queue->properties.queue_id = *qid;  		pqn->kq = kq;  		pqn->q = NULL; +		retval = kfd_process_drain_interrupts(pdd); +		if (retval) +			break; +  		retval = dev->dqm->ops.create_kernel_queue(dev->dqm,  							kq, &pdd->qpd);  		break; @@ -354,7 +366,7 @@ int pqm_create_queue(struct process_queue_manager *pqm,  		 */  		*p_doorbell_offset_in_process =  			(q->properties.doorbell_off * sizeof(uint32_t)) & -			(kfd_doorbell_process_slice(dev) - 1); +			(kfd_doorbell_process_slice(dev->kfd) - 1);  	pr_debug("PQM After DQM create queue\n"); @@ -387,7 +399,7 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)  	struct process_queue_node *pqn;  	struct kfd_process_device *pdd;  	struct device_queue_manager *dqm; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	int retval;  	dqm = NULL; @@ -439,7 +451,7 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)  			pdd->qpd.num_gws = 0;  		} -		if (dev->shared_resources.enable_mes) { +		if (dev->kfd->shared_resources.enable_mes) {  			amdgpu_amdkfd_free_gtt_mem(dev->adev,  						   pqn->q->gang_ctx_bo);  			if (pqn->q->wptr_bo) @@ -477,6 +489,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm,  	pqn->q->properties.queue_size = p->queue_size;  	pqn->q->properties.queue_percent = p->queue_percent;  	pqn->q->properties.priority = p->priority; +	pqn->q->properties.pm4_target_xcc = p->pm4_target_xcc;  	retval = pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,  							pqn->q, NULL); @@ -498,8 +511,12 @@ int pqm_update_mqd(struct process_queue_manager *pqm,  		return -EFAULT;  	} +	/* CUs are masked for debugger requirements so deny user mask  */ +	if (pqn->q->properties.is_dbg_wa && minfo && minfo->cu_mask.ptr) +		return -EBUSY; +  	/* ASICs that have WGPs must enforce pairwise enabled mask checks. */ -	if (minfo && minfo->update_flag == UPDATE_FLAG_CU_MASK && minfo->cu_mask.ptr && +	if (minfo && minfo->cu_mask.ptr &&  			KFD_GC_VERSION(pqn->q->device) >= IP_VERSION(10, 0, 0)) {  		int i; @@ -518,6 +535,9 @@ int pqm_update_mqd(struct process_queue_manager *pqm,  	if (retval != 0)  		return retval; +	if (minfo && minfo->cu_mask.ptr) +		pqn->q->properties.is_user_cu_masked = true; +  	return 0;  } @@ -565,6 +585,46 @@ int pqm_get_wave_state(struct process_queue_manager *pqm,  						       save_area_used_size);  } +int pqm_get_queue_snapshot(struct process_queue_manager *pqm, +			   uint64_t exception_clear_mask, +			   void __user *buf, +			   int *num_qss_entries, +			   uint32_t *entry_size) +{ +	struct process_queue_node *pqn; +	struct kfd_queue_snapshot_entry src; +	uint32_t tmp_entry_size = *entry_size, tmp_qss_entries = *num_qss_entries; +	int r = 0; + +	*num_qss_entries = 0; +	if (!(*entry_size)) +		return -EINVAL; + +	*entry_size = min_t(size_t, *entry_size, sizeof(struct kfd_queue_snapshot_entry)); +	mutex_lock(&pqm->process->event_mutex); + +	memset(&src, 0, sizeof(src)); + +	list_for_each_entry(pqn, &pqm->queues, process_queue_list) { +		if (!pqn->q) +			continue; + +		if (*num_qss_entries < tmp_qss_entries) { +			set_queue_snapshot_entry(pqn->q, exception_clear_mask, &src); + +			if (copy_to_user(buf, &src, *entry_size)) { +				r = -EFAULT; +				break; +			} +			buf += tmp_entry_size; +		} +		*num_qss_entries += 1; +	} + +	mutex_unlock(&pqm->process->event_mutex); +	return r; +} +  static int get_queue_data_sizes(struct kfd_process_device *pdd,  				struct queue *q,  				uint32_t *mqd_size, @@ -859,7 +919,7 @@ int kfd_criu_restore_queue(struct kfd_process *p,  	}  	if (!pdd->doorbell_index && -	    kfd_alloc_process_doorbells(pdd->dev, &pdd->doorbell_index) < 0) { +	    kfd_alloc_process_doorbells(pdd->dev->kfd, &pdd->doorbell_index) < 0) {  		ret = -ENOMEM;  		goto exit;  	} @@ -927,7 +987,9 @@ int pqm_debugfs_mqds(struct seq_file *m, void *data)  	struct queue *q;  	enum KFD_MQD_TYPE mqd_type;  	struct mqd_manager *mqd_mgr; -	int r = 0; +	int r = 0, xcc, num_xccs = 1; +	void *mqd; +	uint64_t size = 0;  	list_for_each_entry(pqn, &pqm->queues, process_queue_list) {  		if (pqn->q) { @@ -943,6 +1005,7 @@ int pqm_debugfs_mqds(struct seq_file *m, void *data)  				seq_printf(m, "  Compute queue on device %x\n",  					   q->device->id);  				mqd_type = KFD_MQD_TYPE_CP; +				num_xccs = NUM_XCC(q->device->xcc_mask);  				break;  			default:  				seq_printf(m, @@ -951,6 +1014,8 @@ int pqm_debugfs_mqds(struct seq_file *m, void *data)  				continue;  			}  			mqd_mgr = q->device->dqm->mqd_mgrs[mqd_type]; +			size = mqd_mgr->mqd_stride(mqd_mgr, +							&q->properties);  		} else if (pqn->kq) {  			q = pqn->kq->queue;  			mqd_mgr = pqn->kq->mqd_mgr; @@ -972,9 +1037,12 @@ int pqm_debugfs_mqds(struct seq_file *m, void *data)  			continue;  		} -		r = mqd_mgr->debugfs_show_mqd(m, q->mqd); -		if (r != 0) -			break; +		for (xcc = 0; xcc < num_xccs; xcc++) { +			mqd = q->mqd + size * xcc; +			r = mqd_mgr->debugfs_show_mqd(m, mqd); +			if (r != 0) +				break; +		}  	}  	return r; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c index 0472b56de245..d9953c2b2661 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c @@ -36,7 +36,7 @@ struct kfd_smi_client {  	wait_queue_head_t wait_queue;  	/* events enabled */  	uint64_t events; -	struct kfd_dev *dev; +	struct kfd_node *dev;  	spinlock_t lock;  	struct rcu_head rcu;  	pid_t pid; @@ -149,7 +149,7 @@ static void kfd_smi_ev_client_free(struct rcu_head *p)  static int kfd_smi_ev_release(struct inode *inode, struct file *filep)  {  	struct kfd_smi_client *client = filep->private_data; -	struct kfd_dev *dev = client->dev; +	struct kfd_node *dev = client->dev;  	spin_lock(&dev->smi_lock);  	list_del_rcu(&client->list); @@ -171,7 +171,7 @@ static bool kfd_smi_ev_enabled(pid_t pid, struct kfd_smi_client *client,  	return events & KFD_SMI_EVENT_MASK_FROM_INDEX(event);  } -static void add_event_to_kfifo(pid_t pid, struct kfd_dev *dev, +static void add_event_to_kfifo(pid_t pid, struct kfd_node *dev,  			       unsigned int smi_event, char *event_msg, int len)  {  	struct kfd_smi_client *client; @@ -196,7 +196,7 @@ static void add_event_to_kfifo(pid_t pid, struct kfd_dev *dev,  }  __printf(4, 5) -static void kfd_smi_event_add(pid_t pid, struct kfd_dev *dev, +static void kfd_smi_event_add(pid_t pid, struct kfd_node *dev,  			      unsigned int event, char *fmt, ...)  {  	char fifo_in[KFD_SMI_EVENT_MSG_SIZE]; @@ -215,7 +215,7 @@ static void kfd_smi_event_add(pid_t pid, struct kfd_dev *dev,  	add_event_to_kfifo(pid, dev, event, fifo_in, len);  } -void kfd_smi_event_update_gpu_reset(struct kfd_dev *dev, bool post_reset) +void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset)  {  	unsigned int event; @@ -228,7 +228,7 @@ void kfd_smi_event_update_gpu_reset(struct kfd_dev *dev, bool post_reset)  	kfd_smi_event_add(0, dev, event, "%x\n", dev->reset_seq_num);  } -void kfd_smi_event_update_thermal_throttling(struct kfd_dev *dev, +void kfd_smi_event_update_thermal_throttling(struct kfd_node *dev,  					     uint64_t throttle_bitmask)  {  	kfd_smi_event_add(0, dev, KFD_SMI_EVENT_THERMAL_THROTTLE, "%llx:%llx\n", @@ -236,7 +236,7 @@ void kfd_smi_event_update_thermal_throttling(struct kfd_dev *dev,  			  amdgpu_dpm_get_thermal_throttling_counter(dev->adev));  } -void kfd_smi_event_update_vmfault(struct kfd_dev *dev, uint16_t pasid) +void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid)  {  	struct amdgpu_task_info task_info; @@ -250,58 +250,58 @@ void kfd_smi_event_update_vmfault(struct kfd_dev *dev, uint16_t pasid)  			  task_info.pid, task_info.task_name);  } -void kfd_smi_event_page_fault_start(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_page_fault_start(struct kfd_node *node, pid_t pid,  				    unsigned long address, bool write_fault,  				    ktime_t ts)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_PAGE_FAULT_START, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_PAGE_FAULT_START,  			  "%lld -%d @%lx(%x) %c\n", ktime_to_ns(ts), pid, -			  address, dev->id, write_fault ? 'W' : 'R'); +			  address, node->id, write_fault ? 'W' : 'R');  } -void kfd_smi_event_page_fault_end(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_page_fault_end(struct kfd_node *node, pid_t pid,  				  unsigned long address, bool migration)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_PAGE_FAULT_END, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_PAGE_FAULT_END,  			  "%lld -%d @%lx(%x) %c\n", ktime_get_boottime_ns(), -			  pid, address, dev->id, migration ? 'M' : 'U'); +			  pid, address, node->id, migration ? 'M' : 'U');  } -void kfd_smi_event_migration_start(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid,  				   unsigned long start, unsigned long end,  				   uint32_t from, uint32_t to,  				   uint32_t prefetch_loc, uint32_t preferred_loc,  				   uint32_t trigger)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_MIGRATE_START, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_START,  			  "%lld -%d @%lx(%lx) %x->%x %x:%x %d\n",  			  ktime_get_boottime_ns(), pid, start, end - start,  			  from, to, prefetch_loc, preferred_loc, trigger);  } -void kfd_smi_event_migration_end(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,  				 unsigned long start, unsigned long end,  				 uint32_t from, uint32_t to, uint32_t trigger)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_MIGRATE_END, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_END,  			  "%lld -%d @%lx(%lx) %x->%x %d\n",  			  ktime_get_boottime_ns(), pid, start, end - start,  			  from, to, trigger);  } -void kfd_smi_event_queue_eviction(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,  				  uint32_t trigger)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_QUEUE_EVICTION, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_QUEUE_EVICTION,  			  "%lld -%d %x %d\n", ktime_get_boottime_ns(), pid, -			  dev->id, trigger); +			  node->id, trigger);  } -void kfd_smi_event_queue_restore(struct kfd_dev *dev, pid_t pid) +void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_QUEUE_RESTORE, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_QUEUE_RESTORE,  			  "%lld -%d %x\n", ktime_get_boottime_ns(), pid, -			  dev->id); +			  node->id);  }  void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm) @@ -324,16 +324,16 @@ void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm)  	kfd_unref_process(p);  } -void kfd_smi_event_unmap_from_gpu(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid,  				  unsigned long address, unsigned long last,  				  uint32_t trigger)  { -	kfd_smi_event_add(pid, dev, KFD_SMI_EVENT_UNMAP_FROM_GPU, +	kfd_smi_event_add(pid, node, KFD_SMI_EVENT_UNMAP_FROM_GPU,  			  "%lld -%d @%lx(%lx) %x %d\n", ktime_get_boottime_ns(), -			  pid, address, last - address + 1, dev->id, trigger); +			  pid, address, last - address + 1, node->id, trigger);  } -int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd) +int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd)  {  	struct kfd_smi_client *client;  	int ret; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h index 76fe4e0ec2d2..fa95c2dfd587 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h @@ -24,29 +24,29 @@  #ifndef KFD_SMI_EVENTS_H_INCLUDED  #define KFD_SMI_EVENTS_H_INCLUDED -int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd); -void kfd_smi_event_update_vmfault(struct kfd_dev *dev, uint16_t pasid); -void kfd_smi_event_update_thermal_throttling(struct kfd_dev *dev, +int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd); +void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid); +void kfd_smi_event_update_thermal_throttling(struct kfd_node *dev,  					     uint64_t throttle_bitmask); -void kfd_smi_event_update_gpu_reset(struct kfd_dev *dev, bool post_reset); -void kfd_smi_event_page_fault_start(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset); +void kfd_smi_event_page_fault_start(struct kfd_node *node, pid_t pid,  				    unsigned long address, bool write_fault,  				    ktime_t ts); -void kfd_smi_event_page_fault_end(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_page_fault_end(struct kfd_node *node, pid_t pid,  				  unsigned long address, bool migration); -void kfd_smi_event_migration_start(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid,  			     unsigned long start, unsigned long end,  			     uint32_t from, uint32_t to,  			     uint32_t prefetch_loc, uint32_t preferred_loc,  			     uint32_t trigger); -void kfd_smi_event_migration_end(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,  			     unsigned long start, unsigned long end,  			     uint32_t from, uint32_t to, uint32_t trigger); -void kfd_smi_event_queue_eviction(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,  				  uint32_t trigger); -void kfd_smi_event_queue_restore(struct kfd_dev *dev, pid_t pid); +void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid);  void kfd_smi_event_queue_restore_rescheduled(struct mm_struct *mm); -void kfd_smi_event_unmap_from_gpu(struct kfd_dev *dev, pid_t pid, +void kfd_smi_event_unmap_from_gpu(struct kfd_node *node, pid_t pid,  				  unsigned long address, unsigned long last,  				  uint32_t trigger);  #endif diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index 96a138a39515..5ff1a5a89d96 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -170,12 +170,11 @@ svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange,  		page = hmm_pfn_to_page(hmm_pfns[i]);  		if (is_zone_device_page(page)) { -			struct amdgpu_device *bo_adev = -					amdgpu_ttm_adev(prange->svm_bo->bo->tbo.bdev); +			struct amdgpu_device *bo_adev = prange->svm_bo->node->adev;  			addr[i] = (hmm_pfns[i] << PAGE_SHIFT) +  				   bo_adev->vm_manager.vram_base_offset - -				   bo_adev->kfd.dev->pgmap.range.start; +				   bo_adev->kfd.pgmap.range.start;  			addr[i] |= SVM_RANGE_VRAM_DOMAIN;  			pr_debug_ratelimited("vram address: 0x%llx\n", addr[i]);  			continue; @@ -281,7 +280,7 @@ static void svm_range_free(struct svm_range *prange, bool update_mem_usage)  	if (update_mem_usage && !p->xnack_enabled) {  		pr_debug("unreserve prange 0x%p size: 0x%llx\n", prange, size);  		amdgpu_amdkfd_unreserve_mem_limit(NULL, size, -					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  	}  	mutex_destroy(&prange->lock);  	mutex_destroy(&prange->migrate_mutex); @@ -314,7 +313,7 @@ svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,  	p = container_of(svms, struct kfd_process, svms);  	if (!p->xnack_enabled && update_mem_usage &&  	    amdgpu_amdkfd_reserve_mem_limit(NULL, size << PAGE_SHIFT, -					    KFD_IOC_ALLOC_MEM_FLAGS_USERPTR)) { +				    KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0)) {  		pr_info("SVM mapping failed, exceeds resident system memory limit\n");  		kfree(prange);  		return NULL; @@ -424,10 +423,8 @@ static void svm_range_bo_unref(struct svm_range_bo *svm_bo)  }  static bool -svm_range_validate_svm_bo(struct amdgpu_device *adev, struct svm_range *prange) +svm_range_validate_svm_bo(struct kfd_node *node, struct svm_range *prange)  { -	struct amdgpu_device *bo_adev; -  	mutex_lock(&prange->lock);  	if (!prange->svm_bo) {  		mutex_unlock(&prange->lock); @@ -440,12 +437,11 @@ svm_range_validate_svm_bo(struct amdgpu_device *adev, struct svm_range *prange)  	}  	if (svm_bo_ref_unless_zero(prange->svm_bo)) {  		/* -		 * Migrate from GPU to GPU, remove range from source bo_adev -		 * svm_bo range list, and return false to allocate svm_bo from -		 * destination adev. +		 * Migrate from GPU to GPU, remove range from source svm_bo->node +		 * range list, and return false to allocate svm_bo from destination +		 * node.  		 */ -		bo_adev = amdgpu_ttm_adev(prange->svm_bo->bo->tbo.bdev); -		if (bo_adev != adev) { +		if (prange->svm_bo->node != node) {  			mutex_unlock(&prange->lock);  			spin_lock(&prange->svm_bo->list_lock); @@ -513,7 +509,7 @@ static struct svm_range_bo *svm_range_bo_new(void)  }  int -svm_range_vram_node_new(struct amdgpu_device *adev, struct svm_range *prange, +svm_range_vram_node_new(struct kfd_node *node, struct svm_range *prange,  			bool clear)  {  	struct amdgpu_bo_param bp; @@ -528,7 +524,7 @@ svm_range_vram_node_new(struct amdgpu_device *adev, struct svm_range *prange,  	pr_debug("pasid: %x svms 0x%p [0x%lx 0x%lx]\n", p->pasid, prange->svms,  		 prange->start, prange->last); -	if (svm_range_validate_svm_bo(adev, prange)) +	if (svm_range_validate_svm_bo(node, prange))  		return 0;  	svm_bo = svm_range_bo_new(); @@ -542,6 +538,7 @@ svm_range_vram_node_new(struct amdgpu_device *adev, struct svm_range *prange,  		kfree(svm_bo);  		return -ESRCH;  	} +	svm_bo->node = node;  	svm_bo->eviction_fence =  		amdgpu_amdkfd_fence_create(dma_fence_context_alloc(1),  					   mm, @@ -558,13 +555,20 @@ svm_range_vram_node_new(struct amdgpu_device *adev, struct svm_range *prange,  	bp.flags |= AMDGPU_GEM_CREATE_DISCARDABLE;  	bp.type = ttm_bo_type_device;  	bp.resv = NULL; +	if (node->xcp) +		bp.xcp_id_plus1 = node->xcp->id + 1; -	r = amdgpu_bo_create_user(adev, &bp, &ubo); +	r = amdgpu_bo_create_user(node->adev, &bp, &ubo);  	if (r) {  		pr_debug("failed %d to create bo\n", r);  		goto create_bo_failed;  	}  	bo = &ubo->bo; + +	pr_debug("alloc bo at offset 0x%lx size 0x%lx on partition %d\n", +		 bo->tbo.resource->start << PAGE_SHIFT, bp.size, +		 bp.xcp_id_plus1 - 1); +  	r = amdgpu_bo_reserve(bo, true);  	if (r) {  		pr_debug("failed %d to reserve bo\n", r); @@ -617,45 +621,30 @@ void svm_range_vram_node_free(struct svm_range *prange)  	prange->ttm_res = NULL;  } -struct amdgpu_device * -svm_range_get_adev_by_id(struct svm_range *prange, uint32_t gpu_id) +struct kfd_node * +svm_range_get_node_by_id(struct svm_range *prange, uint32_t gpu_id)  { -	struct kfd_process_device *pdd;  	struct kfd_process *p; -	int32_t gpu_idx; +	struct kfd_process_device *pdd;  	p = container_of(prange->svms, struct kfd_process, svms); - -	gpu_idx = kfd_process_gpuidx_from_gpuid(p, gpu_id); -	if (gpu_idx < 0) { -		pr_debug("failed to get device by id 0x%x\n", gpu_id); -		return NULL; -	} -	pdd = kfd_process_device_from_gpuidx(p, gpu_idx); +	pdd = kfd_process_device_data_by_id(p, gpu_id);  	if (!pdd) { -		pr_debug("failed to get device by idx 0x%x\n", gpu_idx); +		pr_debug("failed to get kfd process device by id 0x%x\n", gpu_id);  		return NULL;  	} -	return pdd->dev->adev; +	return pdd->dev;  }  struct kfd_process_device * -svm_range_get_pdd_by_adev(struct svm_range *prange, struct amdgpu_device *adev) +svm_range_get_pdd_by_node(struct svm_range *prange, struct kfd_node *node)  {  	struct kfd_process *p; -	int32_t gpu_idx, gpuid; -	int r;  	p = container_of(prange->svms, struct kfd_process, svms); -	r = kfd_process_gpuid_from_adev(p, adev, &gpuid, &gpu_idx); -	if (r) { -		pr_debug("failed to get device id by adev %p\n", adev); -		return NULL; -	} - -	return kfd_process_device_from_gpuidx(p, gpu_idx); +	return kfd_get_process_device_data(node, p);  }  static int svm_range_bo_validate(void *param, struct amdgpu_bo *bo) @@ -735,7 +724,9 @@ svm_range_apply_attrs(struct kfd_process *p, struct svm_range *prange,  		case KFD_IOCTL_SVM_ATTR_ACCESS:  		case KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:  		case KFD_IOCTL_SVM_ATTR_NO_ACCESS: -			*update_mapping = true; +			if (!p->xnack_enabled) +				*update_mapping = true; +  			gpuidx = kfd_process_gpuidx_from_gpuid(p,  							       attrs[i].value);  			if (attrs[i].type == KFD_IOCTL_SVM_ATTR_NO_ACCESS) { @@ -818,7 +809,7 @@ svm_range_is_same_attrs(struct kfd_process *p, struct svm_range *prange,  		}  	} -	return true; +	return !prange->is_error_flag;  }  /** @@ -1146,31 +1137,39 @@ svm_range_split_by_granularity(struct kfd_process *p, struct mm_struct *mm,  	}  	return 0;  } +static bool +svm_nodes_in_same_hive(struct kfd_node *node_a, struct kfd_node *node_b) +{ +	return (node_a->adev == node_b->adev || +		amdgpu_xgmi_same_hive(node_a->adev, node_b->adev)); +}  static uint64_t -svm_range_get_pte_flags(struct amdgpu_device *adev, struct svm_range *prange, -			int domain) +svm_range_get_pte_flags(struct kfd_node *node, +			struct svm_range *prange, int domain)  { -	struct amdgpu_device *bo_adev; +	struct kfd_node *bo_node;  	uint32_t flags = prange->flags;  	uint32_t mapping_flags = 0;  	uint64_t pte_flags;  	bool snoop = (domain != SVM_RANGE_VRAM_DOMAIN);  	bool coherent = flags & KFD_IOCTL_SVM_FLAG_COHERENT; +	bool uncached = false; /*flags & KFD_IOCTL_SVM_FLAG_UNCACHED;*/ +	unsigned int mtype_local;  	if (domain == SVM_RANGE_VRAM_DOMAIN) -		bo_adev = amdgpu_ttm_adev(prange->svm_bo->bo->tbo.bdev); +		bo_node = prange->svm_bo->node; -	switch (KFD_GC_VERSION(adev->kfd.dev)) { +	switch (node->adev->ip_versions[GC_HWIP][0]) {  	case IP_VERSION(9, 4, 1):  		if (domain == SVM_RANGE_VRAM_DOMAIN) { -			if (bo_adev == adev) { +			if (bo_node == node) {  				mapping_flags |= coherent ?  					AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;  			} else {  				mapping_flags |= coherent ?  					AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC; -				if (amdgpu_xgmi_same_hive(adev, bo_adev)) +				if (svm_nodes_in_same_hive(node, bo_node))  					snoop = true;  			}  		} else { @@ -1180,15 +1179,15 @@ svm_range_get_pte_flags(struct amdgpu_device *adev, struct svm_range *prange,  		break;  	case IP_VERSION(9, 4, 2):  		if (domain == SVM_RANGE_VRAM_DOMAIN) { -			if (bo_adev == adev) { +			if (bo_node == node) {  				mapping_flags |= coherent ?  					AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW; -				if (adev->gmc.xgmi.connected_to_cpu) +				if (node->adev->gmc.xgmi.connected_to_cpu)  					snoop = true;  			} else {  				mapping_flags |= coherent ?  					AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC; -				if (amdgpu_xgmi_same_hive(adev, bo_adev)) +				if (svm_nodes_in_same_hive(node, bo_node))  					snoop = true;  			}  		} else { @@ -1196,6 +1195,37 @@ svm_range_get_pte_flags(struct amdgpu_device *adev, struct svm_range *prange,  				AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;  		}  		break; +	case IP_VERSION(9, 4, 3): +		mtype_local = amdgpu_mtype_local == 1 ? AMDGPU_VM_MTYPE_NC : +			     (amdgpu_mtype_local == 2 ? AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW); +		snoop = true; +		if (uncached) { +			mapping_flags |= AMDGPU_VM_MTYPE_UC; +		} else if (domain == SVM_RANGE_VRAM_DOMAIN) { +			/* local HBM region close to partition */ +			if (bo_node->adev == node->adev && +			    (!bo_node->xcp || !node->xcp || bo_node->xcp->mem_id == node->xcp->mem_id)) +				mapping_flags |= mtype_local; +			/* local HBM region far from partition or remote XGMI GPU */ +			else if (svm_nodes_in_same_hive(bo_node, node)) +				mapping_flags |= AMDGPU_VM_MTYPE_NC; +			/* PCIe P2P */ +			else +				mapping_flags |= AMDGPU_VM_MTYPE_UC; +		/* system memory accessed by the APU */ +		} else if (node->adev->flags & AMD_IS_APU) { +			/* On NUMA systems, locality is determined per-page +			 * in amdgpu_gmc_override_vm_pte_flags +			 */ +			if (num_possible_nodes() <= 1) +				mapping_flags |= mtype_local; +			else +				mapping_flags |= AMDGPU_VM_MTYPE_NC; +		/* system memory accessed by the dGPU */ +		} else { +			mapping_flags |= AMDGPU_VM_MTYPE_UC; +		} +		break;  	default:  		mapping_flags |= coherent ?  			AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC; @@ -1212,7 +1242,7 @@ svm_range_get_pte_flags(struct amdgpu_device *adev, struct svm_range *prange,  	pte_flags |= (domain == SVM_RANGE_VRAM_DOMAIN) ? 0 : AMDGPU_PTE_SYSTEM;  	pte_flags |= snoop ? AMDGPU_PTE_SNOOPED : 0; -	pte_flags |= amdgpu_gem_va_map_flags(adev, mapping_flags); +	pte_flags |= amdgpu_gem_va_map_flags(node->adev, mapping_flags);  	return pte_flags;  } @@ -1319,7 +1349,7 @@ svm_range_map_to_gpu(struct kfd_process_device *pdd, struct svm_range *prange,  		pr_debug("Mapping range [0x%lx 0x%llx] on domain: %s\n",  			 last_start, prange->start + i, last_domain ? "GPU" : "CPU"); -		pte_flags = svm_range_get_pte_flags(adev, prange, last_domain); +		pte_flags = svm_range_get_pte_flags(pdd->dev, prange, last_domain);  		if (readonly)  			pte_flags &= ~AMDGPU_PTE_WRITEABLE; @@ -1328,6 +1358,10 @@ svm_range_map_to_gpu(struct kfd_process_device *pdd, struct svm_range *prange,  			 (last_domain == SVM_RANGE_VRAM_DOMAIN) ? 1 : 0,  			 pte_flags); +		/* For dGPU mode, we use same vm_manager to allocate VRAM for +		 * different memory partition based on fpfn/lpfn, we should use +		 * same vm_manager.vram_base_offset regardless memory partition. +		 */  		r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb, NULL,  					   last_start, prange->start + i,  					   pte_flags, @@ -1365,16 +1399,14 @@ svm_range_map_to_gpus(struct svm_range *prange, unsigned long offset,  		      unsigned long *bitmap, bool wait, bool flush_tlb)  {  	struct kfd_process_device *pdd; -	struct amdgpu_device *bo_adev; +	struct amdgpu_device *bo_adev = NULL;  	struct kfd_process *p;  	struct dma_fence *fence = NULL;  	uint32_t gpuidx;  	int r = 0;  	if (prange->svm_bo && prange->ttm_res) -		bo_adev = amdgpu_ttm_adev(prange->svm_bo->bo->tbo.bdev); -	else -		bo_adev = NULL; +		bo_adev = prange->svm_bo->node->adev;  	p = container_of(prange->svms, struct kfd_process, svms);  	for_each_set_bit(gpuidx, bitmap, MAX_GPU_INSTANCE) { @@ -1522,48 +1554,54 @@ static int svm_range_validate_and_map(struct mm_struct *mm,  				      struct svm_range *prange, int32_t gpuidx,  				      bool intr, bool wait, bool flush_tlb)  { -	struct svm_validate_context ctx; +	struct svm_validate_context *ctx;  	unsigned long start, end, addr;  	struct kfd_process *p;  	void *owner;  	int32_t idx;  	int r = 0; -	ctx.process = container_of(prange->svms, struct kfd_process, svms); -	ctx.prange = prange; -	ctx.intr = intr; +	ctx = kzalloc(sizeof(struct svm_validate_context), GFP_KERNEL); +	if (!ctx) +		return -ENOMEM; +	ctx->process = container_of(prange->svms, struct kfd_process, svms); +	ctx->prange = prange; +	ctx->intr = intr;  	if (gpuidx < MAX_GPU_INSTANCE) { -		bitmap_zero(ctx.bitmap, MAX_GPU_INSTANCE); -		bitmap_set(ctx.bitmap, gpuidx, 1); -	} else if (ctx.process->xnack_enabled) { -		bitmap_copy(ctx.bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE); +		bitmap_zero(ctx->bitmap, MAX_GPU_INSTANCE); +		bitmap_set(ctx->bitmap, gpuidx, 1); +	} else if (ctx->process->xnack_enabled) { +		bitmap_copy(ctx->bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE);  		/* If prefetch range to GPU, or GPU retry fault migrate range to  		 * GPU, which has ACCESS attribute to the range, create mapping  		 * on that GPU.  		 */  		if (prange->actual_loc) { -			gpuidx = kfd_process_gpuidx_from_gpuid(ctx.process, +			gpuidx = kfd_process_gpuidx_from_gpuid(ctx->process,  							prange->actual_loc);  			if (gpuidx < 0) {  				WARN_ONCE(1, "failed get device by id 0x%x\n",  					 prange->actual_loc); -				return -EINVAL; +				r = -EINVAL; +				goto free_ctx;  			}  			if (test_bit(gpuidx, prange->bitmap_access)) -				bitmap_set(ctx.bitmap, gpuidx, 1); +				bitmap_set(ctx->bitmap, gpuidx, 1);  		}  	} else { -		bitmap_or(ctx.bitmap, prange->bitmap_access, +		bitmap_or(ctx->bitmap, prange->bitmap_access,  			  prange->bitmap_aip, MAX_GPU_INSTANCE);  	} -	if (bitmap_empty(ctx.bitmap, MAX_GPU_INSTANCE)) { -		if (!prange->mapped_to_gpu) -			return 0; +	if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) { +		if (!prange->mapped_to_gpu) { +			r = 0; +			goto free_ctx; +		} -		bitmap_copy(ctx.bitmap, prange->bitmap_access, MAX_GPU_INSTANCE); +		bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);  	}  	if (prange->actual_loc && !prange->ttm_res) { @@ -1571,15 +1609,16 @@ static int svm_range_validate_and_map(struct mm_struct *mm,  		 * svm_migrate_ram_to_vram after allocating a BO.  		 */  		WARN_ONCE(1, "VRAM BO missing during validation\n"); -		return -EINVAL; +		r = -EINVAL; +		goto free_ctx;  	} -	svm_range_reserve_bos(&ctx); +	svm_range_reserve_bos(ctx);  	p = container_of(prange->svms, struct kfd_process, svms); -	owner = kfd_svm_page_owner(p, find_first_bit(ctx.bitmap, +	owner = kfd_svm_page_owner(p, find_first_bit(ctx->bitmap,  						MAX_GPU_INSTANCE)); -	for_each_set_bit(idx, ctx.bitmap, MAX_GPU_INSTANCE) { +	for_each_set_bit(idx, ctx->bitmap, MAX_GPU_INSTANCE) {  		if (kfd_svm_page_owner(p, idx) != owner) {  			owner = NULL;  			break; @@ -1616,7 +1655,7 @@ static int svm_range_validate_and_map(struct mm_struct *mm,  		}  		offset = (addr - start) >> PAGE_SHIFT; -		r = svm_range_dma_map(prange, ctx.bitmap, offset, npages, +		r = svm_range_dma_map(prange, ctx->bitmap, offset, npages,  				      hmm_range->hmm_pfns);  		if (r) {  			pr_debug("failed %d to dma map range\n", r); @@ -1636,7 +1675,7 @@ static int svm_range_validate_and_map(struct mm_struct *mm,  		}  		r = svm_range_map_to_gpus(prange, offset, npages, readonly, -					  ctx.bitmap, wait, flush_tlb); +					  ctx->bitmap, wait, flush_tlb);  unlock_out:  		svm_range_unlock(prange); @@ -1650,11 +1689,15 @@ unlock_out:  	}  unreserve_out: -	svm_range_unreserve_bos(&ctx); +	svm_range_unreserve_bos(ctx); +	prange->is_error_flag = !!r;  	if (!r)  		prange->validate_timestamp = ktime_get_boottime(); +free_ctx: +	kfree(ctx); +  	return r;  } @@ -1783,6 +1826,7 @@ out_reschedule:   * @mm: current process mm_struct   * @start: starting process queue number   * @last: last process queue number + * @event: mmu notifier event when range is evicted or migrated   *   * Stop all queues of the process to ensure GPU doesn't access the memory, then   * return to let CPU evict the buffer and proceed CPU pagetable update. @@ -1906,14 +1950,23 @@ void svm_range_set_max_pages(struct amdgpu_device *adev)  {  	uint64_t max_pages;  	uint64_t pages, _pages; +	uint64_t min_pages = 0; +	int i, id; + +	for (i = 0; i < adev->kfd.dev->num_nodes; i++) { +		if (adev->kfd.dev->nodes[i]->xcp) +			id = adev->kfd.dev->nodes[i]->xcp->id; +		else +			id = -1; +		pages = KFD_XCP_MEMORY_SIZE(adev, id) >> 17; +		pages = clamp(pages, 1ULL << 9, 1ULL << 18); +		pages = rounddown_pow_of_two(pages); +		min_pages = min_not_zero(min_pages, pages); +	} -	/* 1/32 VRAM size in pages */ -	pages = adev->gmc.real_vram_size >> 17; -	pages = clamp(pages, 1ULL << 9, 1ULL << 18); -	pages = rounddown_pow_of_two(pages);  	do {  		max_pages = READ_ONCE(max_svm_range_pages); -		_pages = min_not_zero(max_pages, pages); +		_pages = min_not_zero(max_pages, min_pages);  	} while (cmpxchg(&max_svm_range_pages, max_pages, _pages) != max_pages);  } @@ -2507,29 +2560,31 @@ svm_range_from_addr(struct svm_range_list *svms, unsigned long addr,   */  static int32_t  svm_range_best_restore_location(struct svm_range *prange, -				struct amdgpu_device *adev, +				struct kfd_node *node,  				int32_t *gpuidx)  { -	struct amdgpu_device *bo_adev, *preferred_adev; +	struct kfd_node *bo_node, *preferred_node;  	struct kfd_process *p;  	uint32_t gpuid;  	int r;  	p = container_of(prange->svms, struct kfd_process, svms); -	r = kfd_process_gpuid_from_adev(p, adev, &gpuid, gpuidx); +	r = kfd_process_gpuid_from_node(p, node, &gpuid, gpuidx);  	if (r < 0) {  		pr_debug("failed to get gpuid from kgd\n");  		return -1;  	} +	if (node->adev->gmc.is_app_apu) +		return 0; +  	if (prange->preferred_loc == gpuid ||  	    prange->preferred_loc == KFD_IOCTL_SVM_LOCATION_SYSMEM) {  		return prange->preferred_loc;  	} else if (prange->preferred_loc != KFD_IOCTL_SVM_LOCATION_UNDEFINED) { -		preferred_adev = svm_range_get_adev_by_id(prange, -							prange->preferred_loc); -		if (amdgpu_xgmi_same_hive(adev, preferred_adev)) +		preferred_node = svm_range_get_node_by_id(prange, prange->preferred_loc); +		if (preferred_node && svm_nodes_in_same_hive(node, preferred_node))  			return prange->preferred_loc;  		/* fall through */  	} @@ -2541,8 +2596,8 @@ svm_range_best_restore_location(struct svm_range *prange,  		if (!prange->actual_loc)  			return 0; -		bo_adev = svm_range_get_adev_by_id(prange, prange->actual_loc); -		if (amdgpu_xgmi_same_hive(adev, bo_adev)) +		bo_node = svm_range_get_node_by_id(prange, prange->actual_loc); +		if (bo_node && svm_nodes_in_same_hive(node, bo_node))  			return prange->actual_loc;  		else  			return 0; @@ -2659,7 +2714,7 @@ svm_range_check_vm_userptr(struct kfd_process *p, uint64_t start, uint64_t last,  }  static struct -svm_range *svm_range_create_unregistered_range(struct amdgpu_device *adev, +svm_range *svm_range_create_unregistered_range(struct kfd_node *node,  						struct kfd_process *p,  						struct mm_struct *mm,  						int64_t addr) @@ -2694,7 +2749,7 @@ svm_range *svm_range_create_unregistered_range(struct amdgpu_device *adev,  		pr_debug("Failed to create prange in address [0x%llx]\n", addr);  		return NULL;  	} -	if (kfd_process_gpuid_from_adev(p, adev, &gpuid, &gpuidx)) { +	if (kfd_process_gpuid_from_node(p, node, &gpuid, &gpuidx)) {  		pr_debug("failed to get gpuid from kgd\n");  		svm_range_free(prange, true);  		return NULL; @@ -2748,7 +2803,7 @@ static bool svm_range_skip_recover(struct svm_range *prange)  }  static void -svm_range_count_fault(struct amdgpu_device *adev, struct kfd_process *p, +svm_range_count_fault(struct kfd_node *node, struct kfd_process *p,  		      int32_t gpuidx)  {  	struct kfd_process_device *pdd; @@ -2761,7 +2816,7 @@ svm_range_count_fault(struct amdgpu_device *adev, struct kfd_process *p,  		uint32_t gpuid;  		int r; -		r = kfd_process_gpuid_from_adev(p, adev, &gpuid, &gpuidx); +		r = kfd_process_gpuid_from_node(p, node, &gpuid, &gpuidx);  		if (r < 0)  			return;  	} @@ -2789,6 +2844,7 @@ svm_fault_allowed(struct vm_area_struct *vma, bool write_fault)  int  svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid, +			uint32_t vmid, uint32_t node_id,  			uint64_t addr, bool write_fault)  {  	struct mm_struct *mm = NULL; @@ -2796,6 +2852,7 @@ svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,  	struct svm_range *prange;  	struct kfd_process *p;  	ktime_t timestamp = ktime_get_boottime(); +	struct kfd_node *node;  	int32_t best_loc;  	int32_t gpuidx = MAX_GPU_INSTANCE;  	bool write_locked = false; @@ -2803,7 +2860,7 @@ svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,  	bool migration = false;  	int r = 0; -	if (!KFD_IS_SVM_API_SUPPORTED(adev->kfd.dev)) { +	if (!KFD_IS_SVM_API_SUPPORTED(adev)) {  		pr_debug("device does not support SVM\n");  		return -EFAULT;  	} @@ -2839,6 +2896,13 @@ svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,  		goto out;  	} +	node = kfd_node_by_irq_ids(adev, node_id, vmid); +	if (!node) { +		pr_debug("kfd node does not exist node_id: %d, vmid: %d\n", node_id, +			 vmid); +		r = -EFAULT; +		goto out; +	}  	mmap_read_lock(mm);  retry_write_locked:  	mutex_lock(&svms->lock); @@ -2857,7 +2921,7 @@ retry_write_locked:  			write_locked = true;  			goto retry_write_locked;  		} -		prange = svm_range_create_unregistered_range(adev, p, mm, addr); +		prange = svm_range_create_unregistered_range(node, p, mm, addr);  		if (!prange) {  			pr_debug("failed to create unregistered range svms 0x%p address [0x%llx]\n",  				 svms, addr); @@ -2872,7 +2936,7 @@ retry_write_locked:  	mutex_lock(&prange->migrate_mutex);  	if (svm_range_skip_recover(prange)) { -		amdgpu_gmc_filter_faults_remove(adev, addr, pasid); +		amdgpu_gmc_filter_faults_remove(node->adev, addr, pasid);  		r = 0;  		goto out_unlock_range;  	} @@ -2903,7 +2967,7 @@ retry_write_locked:  		goto out_unlock_range;  	} -	best_loc = svm_range_best_restore_location(prange, adev, &gpuidx); +	best_loc = svm_range_best_restore_location(prange, node, &gpuidx);  	if (best_loc == -1) {  		pr_debug("svms %p failed get best restore loc [0x%lx 0x%lx]\n",  			 svms, prange->start, prange->last); @@ -2915,7 +2979,7 @@ retry_write_locked:  		 svms, prange->start, prange->last, best_loc,  		 prange->actual_loc); -	kfd_smi_event_page_fault_start(adev->kfd.dev, p->lead_thread->pid, addr, +	kfd_smi_event_page_fault_start(node, p->lead_thread->pid, addr,  				       write_fault, timestamp);  	if (prange->actual_loc != best_loc) { @@ -2953,7 +3017,7 @@ retry_write_locked:  		pr_debug("failed %d to map svms 0x%p [0x%lx 0x%lx] to gpus\n",  			 r, svms, prange->start, prange->last); -	kfd_smi_event_page_fault_end(adev->kfd.dev, p->lead_thread->pid, addr, +	kfd_smi_event_page_fault_end(node, p->lead_thread->pid, addr,  				     migration);  out_unlock_range: @@ -2962,7 +3026,7 @@ out_unlock_svms:  	mutex_unlock(&svms->lock);  	mmap_read_unlock(mm); -	svm_range_count_fault(adev, p, gpuidx); +	svm_range_count_fault(node, p, gpuidx);  	mmput(mm);  out: @@ -2970,7 +3034,7 @@ out:  	if (r == -EAGAIN) {  		pr_debug("recover vm fault later\n"); -		amdgpu_gmc_filter_faults_remove(adev, addr, pasid); +		amdgpu_gmc_filter_faults_remove(node->adev, addr, pasid);  		r = 0;  	}  	return r; @@ -2994,10 +3058,10 @@ svm_range_switch_xnack_reserve_mem(struct kfd_process *p, bool xnack_enabled)  			size = (pchild->last - pchild->start + 1) << PAGE_SHIFT;  			if (xnack_enabled) {  				amdgpu_amdkfd_unreserve_mem_limit(NULL, size, -						KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  			} else {  				r = amdgpu_amdkfd_reserve_mem_limit(NULL, size, -						KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  				if (r)  					goto out_unlock;  				reserved_size += size; @@ -3007,10 +3071,10 @@ svm_range_switch_xnack_reserve_mem(struct kfd_process *p, bool xnack_enabled)  		size = (prange->last - prange->start + 1) << PAGE_SHIFT;  		if (xnack_enabled) {  			amdgpu_amdkfd_unreserve_mem_limit(NULL, size, -						KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  		} else {  			r = amdgpu_amdkfd_reserve_mem_limit(NULL, size, -						KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  			if (r)  				goto out_unlock;  			reserved_size += size; @@ -3023,7 +3087,7 @@ out_unlock:  	if (r)  		amdgpu_amdkfd_unreserve_mem_limit(NULL, reserved_size, -						KFD_IOC_ALLOC_MEM_FLAGS_USERPTR); +					KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);  	else  		/* Change xnack mode must be inside svms lock, to avoid race with  		 * svm_range_deferred_list_work unreserve memory in parallel. @@ -3081,7 +3145,7 @@ int svm_range_list_init(struct kfd_process *p)  	spin_lock_init(&svms->deferred_list_lock);  	for (i = 0; i < p->n_pdds; i++) -		if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev)) +		if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))  			bitmap_set(svms->bitmap_supported, i, 1);  	return 0; @@ -3212,7 +3276,7 @@ svm_range_best_prefetch_location(struct svm_range *prange)  	DECLARE_BITMAP(bitmap, MAX_GPU_INSTANCE);  	uint32_t best_loc = prange->prefetch_loc;  	struct kfd_process_device *pdd; -	struct amdgpu_device *bo_adev; +	struct kfd_node *bo_node;  	struct kfd_process *p;  	uint32_t gpuidx; @@ -3221,9 +3285,14 @@ svm_range_best_prefetch_location(struct svm_range *prange)  	if (!best_loc || best_loc == KFD_IOCTL_SVM_LOCATION_UNDEFINED)  		goto out; -	bo_adev = svm_range_get_adev_by_id(prange, best_loc); -	if (!bo_adev) { -		WARN_ONCE(1, "failed to get device by id 0x%x\n", best_loc); +	bo_node = svm_range_get_node_by_id(prange, best_loc); +	if (!bo_node) { +		WARN_ONCE(1, "failed to get valid kfd node at id%x\n", best_loc); +		best_loc = 0; +		goto out; +	} + +	if (bo_node->adev->gmc.is_app_apu) {  		best_loc = 0;  		goto out;  	} @@ -3241,10 +3310,10 @@ svm_range_best_prefetch_location(struct svm_range *prange)  			continue;  		} -		if (pdd->dev->adev == bo_adev) +		if (pdd->dev->adev == bo_node->adev)  			continue; -		if (!amdgpu_xgmi_same_hive(pdd->dev->adev, bo_adev)) { +		if (!svm_nodes_in_same_hive(pdd->dev, bo_node)) {  			best_loc = 0;  			break;  		} diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.h b/drivers/gpu/drm/amd/amdkfd/kfd_svm.h index 7a33b93f9df6..21b14510882b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.h @@ -48,6 +48,7 @@ struct svm_range_bo {  	struct work_struct		eviction_work;  	uint32_t			evicting;  	struct work_struct		release_work; +	struct kfd_node			*node;  };  enum svm_work_list_ops { @@ -133,6 +134,7 @@ struct svm_range {  	DECLARE_BITMAP(bitmap_aip, MAX_GPU_INSTANCE);  	bool				validated_once;  	bool				mapped_to_gpu; +	bool				is_error_flag;  };  static inline void svm_range_lock(struct svm_range *prange) @@ -163,16 +165,17 @@ int svm_ioctl(struct kfd_process *p, enum kfd_ioctl_svm_op op, uint64_t start,  struct svm_range *svm_range_from_addr(struct svm_range_list *svms,  				      unsigned long addr,  				      struct svm_range **parent); -struct amdgpu_device *svm_range_get_adev_by_id(struct svm_range *prange, -					       uint32_t id); -int svm_range_vram_node_new(struct amdgpu_device *adev, -			    struct svm_range *prange, bool clear); +struct kfd_node *svm_range_get_node_by_id(struct svm_range *prange, +					  uint32_t gpu_id); +int svm_range_vram_node_new(struct kfd_node *node, struct svm_range *prange, +			    bool clear);  void svm_range_vram_node_free(struct svm_range *prange);  int svm_range_split_by_granularity(struct kfd_process *p, struct mm_struct *mm,  			       unsigned long addr, struct svm_range *parent,  			       struct svm_range *prange); -int svm_range_restore_pages(struct amdgpu_device *adev, -			    unsigned int pasid, uint64_t addr, bool write_fault); +int svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid, +			    uint32_t vmid, uint32_t node_id, uint64_t addr, +			    bool write_fault);  int svm_range_schedule_evict_svm_bo(struct amdgpu_amdkfd_fence *fence);  void svm_range_add_list_work(struct svm_range_list *svms,  			     struct svm_range *prange, struct mm_struct *mm, @@ -192,13 +195,14 @@ int kfd_criu_restore_svm(struct kfd_process *p,  			 uint64_t max_priv_data_size);  int kfd_criu_resume_svm(struct kfd_process *p);  struct kfd_process_device * -svm_range_get_pdd_by_adev(struct svm_range *prange, struct amdgpu_device *adev); +svm_range_get_pdd_by_node(struct svm_range *prange, struct kfd_node *node);  void svm_range_list_lock_and_flush_work(struct svm_range_list *svms, struct mm_struct *mm);  /* SVM API and HMM page migration work together, device memory type   * is initialized to not 0 when page migration register device memory.   */ -#define KFD_IS_SVM_API_SUPPORTED(dev) ((dev)->pgmap.type != 0) +#define KFD_IS_SVM_API_SUPPORTED(adev) ((adev)->kfd.pgmap.type != 0 ||\ +					(adev)->gmc.is_app_apu)  void svm_range_bo_unref_async(struct svm_range_bo *svm_bo); @@ -219,8 +223,9 @@ static inline void svm_range_list_fini(struct kfd_process *p)  }  static inline int svm_range_restore_pages(struct amdgpu_device *adev, -					  unsigned int pasid, uint64_t addr, -					  bool write_fault) +					  unsigned int pasid, +					  uint32_t client_id, uint32_t node_id, +					  uint64_t addr, bool write_fault)  {  	return -EFAULT;  } @@ -261,6 +266,10 @@ static inline int kfd_criu_resume_svm(struct kfd_process *p)  	return 0;  } +static inline void svm_range_set_max_pages(struct amdgpu_device *adev) +{ +} +  #define KFD_IS_SVM_API_SUPPORTED(dev) false  #endif /* IS_ENABLED(CONFIG_HSA_AMD_SVM) */ diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 8e4124dcb6e4..90b86a6ac7bd 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c @@ -96,7 +96,7 @@ struct kfd_topology_device *kfd_topology_device_by_id(uint32_t gpu_id)  	return ret;  } -struct kfd_dev *kfd_device_by_id(uint32_t gpu_id) +struct kfd_node *kfd_device_by_id(uint32_t gpu_id)  {  	struct kfd_topology_device *top_dev; @@ -107,10 +107,10 @@ struct kfd_dev *kfd_device_by_id(uint32_t gpu_id)  	return top_dev->gpu;  } -struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev) +struct kfd_node *kfd_device_by_pci_dev(const struct pci_dev *pdev)  {  	struct kfd_topology_device *top_dev; -	struct kfd_dev *device = NULL; +	struct kfd_node *device = NULL;  	down_read(&topology_lock); @@ -125,24 +125,6 @@ struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev)  	return device;  } -struct kfd_dev *kfd_device_by_adev(const struct amdgpu_device *adev) -{ -	struct kfd_topology_device *top_dev; -	struct kfd_dev *device = NULL; - -	down_read(&topology_lock); - -	list_for_each_entry(top_dev, &topology_device_list, list) -		if (top_dev->gpu && top_dev->gpu->adev == adev) { -			device = top_dev->gpu; -			break; -		} - -	up_read(&topology_lock); - -	return device; -} -  /* Called with write topology_lock acquired */  static void kfd_release_topology_device(struct kfd_topology_device *dev)  { @@ -468,7 +450,8 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,  	sysfs_show_32bit_prop(buffer, offs, "cpu_cores_count",  			      dev->node_props.cpu_cores_count);  	sysfs_show_32bit_prop(buffer, offs, "simd_count", -			      dev->gpu ? dev->node_props.simd_count : 0); +			      dev->gpu ? (dev->node_props.simd_count * +					  NUM_XCC(dev->gpu->xcc_mask)) : 0);  	sysfs_show_32bit_prop(buffer, offs, "mem_banks_count",  			      dev->node_props.mem_banks_count);  	sysfs_show_32bit_prop(buffer, offs, "caches_count", @@ -492,7 +475,8 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,  	sysfs_show_32bit_prop(buffer, offs, "wave_front_size",  			      dev->node_props.wave_front_size);  	sysfs_show_32bit_prop(buffer, offs, "array_count", -			      dev->node_props.array_count); +			      dev->gpu ? (dev->node_props.array_count * +					  NUM_XCC(dev->gpu->xcc_mask)) : 0);  	sysfs_show_32bit_prop(buffer, offs, "simd_arrays_per_engine",  			      dev->node_props.simd_arrays_per_engine);  	sysfs_show_32bit_prop(buffer, offs, "cu_per_simd_array", @@ -526,7 +510,7 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,  	if (dev->gpu) {  		log_max_watch_addr = -			__ilog2_u32(dev->gpu->device_info.num_of_watch_points); +			__ilog2_u32(dev->gpu->kfd->device_info.num_of_watch_points);  		if (log_max_watch_addr) {  			dev->node_props.capability |= @@ -548,14 +532,17 @@ static ssize_t node_show(struct kobject *kobj, struct attribute *attr,  		sysfs_show_64bit_prop(buffer, offs, "local_mem_size", 0ULL);  		sysfs_show_32bit_prop(buffer, offs, "fw_version", -				      dev->gpu->mec_fw_version); +				      dev->gpu->kfd->mec_fw_version);  		sysfs_show_32bit_prop(buffer, offs, "capability",  				      dev->node_props.capability); +		sysfs_show_64bit_prop(buffer, offs, "debug_prop", +				      dev->node_props.debug_prop);  		sysfs_show_32bit_prop(buffer, offs, "sdma_fw_version", -				      dev->gpu->sdma_fw_version); +				      dev->gpu->kfd->sdma_fw_version);  		sysfs_show_64bit_prop(buffer, offs, "unique_id",  				      dev->gpu->adev->unique_id); - +		sysfs_show_32bit_prop(buffer, offs, "num_xcc", +				      NUM_XCC(dev->gpu->xcc_mask));  	}  	return sysfs_show_32bit_prop(buffer, offs, "max_engine_clk_ccompute", @@ -1157,10 +1144,10 @@ void kfd_topology_shutdown(void)  	up_write(&topology_lock);  } -static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu) +static uint32_t kfd_generate_gpu_id(struct kfd_node *gpu)  {  	uint32_t hashout; -	uint32_t buf[7]; +	uint32_t buf[8];  	uint64_t local_mem_size;  	int i; @@ -1177,8 +1164,9 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)  	buf[4] = gpu->adev->pdev->bus->number;  	buf[5] = lower_32_bits(local_mem_size);  	buf[6] = upper_32_bits(local_mem_size); +	buf[7] = (ffs(gpu->xcc_mask) - 1) | (NUM_XCC(gpu->xcc_mask) << 16); -	for (i = 0, hashout = 0; i < 7; i++) +	for (i = 0, hashout = 0; i < 8; i++)  		hashout ^= hash_32(buf[i], KFD_GPU_ID_HASH_WIDTH);  	return hashout; @@ -1188,7 +1176,7 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)   *		list then return NULL. This means a new topology device has to   *		be created for this GPU.   */ -static struct kfd_topology_device *kfd_assign_gpu(struct kfd_dev *gpu) +static struct kfd_topology_device *kfd_assign_gpu(struct kfd_node *gpu)  {  	struct kfd_topology_device *dev;  	struct kfd_topology_device *out_dev = NULL; @@ -1201,7 +1189,7 @@ static struct kfd_topology_device *kfd_assign_gpu(struct kfd_dev *gpu)  		/* Discrete GPUs need their own topology device list  		 * entries. Don't assign them to CPU/APU nodes.  		 */ -		if (!gpu->use_iommu_v2 && +		if (!gpu->kfd->use_iommu_v2 &&  		    dev->node_props.cpu_cores_count)  			continue; @@ -1248,7 +1236,8 @@ static void kfd_fill_mem_clk_max_info(struct kfd_topology_device *dev)  	 * for APUs - If CRAT from ACPI reports more than one bank, then  	 *	all the banks will report the same mem_clk_max information  	 */ -	amdgpu_amdkfd_get_local_mem_info(dev->gpu->adev, &local_mem_info); +	amdgpu_amdkfd_get_local_mem_info(dev->gpu->adev, &local_mem_info, +					 dev->gpu->xcp);  	list_for_each_entry(mem, &dev->mem_props, list)  		mem->mem_clk_max = local_mem_info.mem_clk_max; @@ -1275,7 +1264,7 @@ static void kfd_set_iolink_no_atomics(struct kfd_topology_device *dev,  				CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT;  	/* set gpu (dev) flags. */  	} else { -		if (!dev->gpu->pci_atomic_requested || +		if (!dev->gpu->kfd->pci_atomic_requested ||  				dev->gpu->adev->asic_type == CHIP_HAWAII)  			link->flags |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT |  				CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT; @@ -1323,10 +1312,16 @@ static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev)  			continue;  		/* Include the CPU peer in GPU hive if connected over xGMI. */ -		if (!peer_dev->gpu && !peer_dev->node_props.hive_id && -				dev->node_props.hive_id && -				dev->gpu->adev->gmc.xgmi.connected_to_cpu) +		if (!peer_dev->gpu && +		    link->iolink_type == CRAT_IOLINK_TYPE_XGMI) { +			/* +			 * If the GPU is not part of a GPU hive, use its pci +			 * device location as the hive ID to bind with the CPU. +			 */ +			if (!dev->node_props.hive_id) +				dev->node_props.hive_id = pci_dev_id(dev->gpu->adev->pdev);  			peer_dev->node_props.hive_id = dev->node_props.hive_id; +		}  		list_for_each_entry(inbound_link, &peer_dev->io_link_props,  									list) { @@ -1569,8 +1564,8 @@ static int kfd_dev_create_p2p_links(void)  		if (dev == new_dev)  			break;  		if (!dev->gpu || !dev->gpu->adev || -		    (dev->gpu->hive_id && -		     dev->gpu->hive_id == new_dev->gpu->hive_id)) +		    (dev->gpu->kfd->hive_id && +		     dev->gpu->kfd->hive_id == new_dev->gpu->kfd->hive_id))  			goto next;  		/* check if node(s) is/are peer accessible in one direction or bi-direction */ @@ -1590,7 +1585,6 @@ out:  	return ret;  } -  /* Helper function. See kfd_fill_gpu_cache_info for parameter description */  static int fill_in_l1_pcache(struct kfd_cache_properties **props_ext,  				struct kfd_gpu_cache_info *pcache_info, @@ -1723,7 +1717,7 @@ static int fill_in_l2_l3_pcache(struct kfd_cache_properties **props_ext,  /* kfd_fill_cache_non_crat_info - Fill GPU cache info using kfd_gpu_cache_info   * tables   */ -static void kfd_fill_cache_non_crat_info(struct kfd_topology_device *dev, struct kfd_dev *kdev) +static void kfd_fill_cache_non_crat_info(struct kfd_topology_device *dev, struct kfd_node *kdev)  {  	struct kfd_gpu_cache_info *pcache_info = NULL;  	int i, j, k; @@ -1805,7 +1799,7 @@ static void kfd_fill_cache_non_crat_info(struct kfd_topology_device *dev, struct  	pr_debug("Added [%d] GPU cache entries\n", num_of_entries);  } -static int kfd_topology_add_device_locked(struct kfd_dev *gpu, uint32_t gpu_id, +static int kfd_topology_add_device_locked(struct kfd_node *gpu, uint32_t gpu_id,  					  struct kfd_topology_device **dev)  {  	int proximity_domain = ++topology_crat_proximity_domain; @@ -1865,7 +1859,103 @@ err:  	return res;  } -int kfd_topology_add_device(struct kfd_dev *gpu) +static void kfd_topology_set_dbg_firmware_support(struct kfd_topology_device *dev) +{ +	bool firmware_supported = true; + +	if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(11, 0, 0) && +			KFD_GC_VERSION(dev->gpu) < IP_VERSION(12, 0, 0)) { +		uint32_t mes_api_rev = (dev->gpu->adev->mes.sched_version & +						AMDGPU_MES_API_VERSION_MASK) >> +						AMDGPU_MES_API_VERSION_SHIFT; +		uint32_t mes_rev = dev->gpu->adev->mes.sched_version & +						AMDGPU_MES_VERSION_MASK; + +		firmware_supported = (mes_api_rev >= 14) && (mes_rev >= 64); +		goto out; +	} + +	/* +	 * Note: Any unlisted devices here are assumed to support exception handling. +	 * Add additional checks here as needed. +	 */ +	switch (KFD_GC_VERSION(dev->gpu)) { +	case IP_VERSION(9, 0, 1): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 459 + 32768; +		break; +	case IP_VERSION(9, 1, 0): +	case IP_VERSION(9, 2, 1): +	case IP_VERSION(9, 2, 2): +	case IP_VERSION(9, 3, 0): +	case IP_VERSION(9, 4, 0): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 459; +		break; +	case IP_VERSION(9, 4, 1): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 60; +		break; +	case IP_VERSION(9, 4, 2): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 51; +		break; +	case IP_VERSION(10, 1, 10): +	case IP_VERSION(10, 1, 2): +	case IP_VERSION(10, 1, 1): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 144; +		break; +	case IP_VERSION(10, 3, 0): +	case IP_VERSION(10, 3, 2): +	case IP_VERSION(10, 3, 1): +	case IP_VERSION(10, 3, 4): +	case IP_VERSION(10, 3, 5): +		firmware_supported = dev->gpu->kfd->mec_fw_version >= 89; +		break; +	case IP_VERSION(10, 1, 3): +	case IP_VERSION(10, 3, 3): +		firmware_supported = false; +		break; +	default: +		break; +	} + +out: +	if (firmware_supported) +		dev->node_props.capability |= HSA_CAP_TRAP_DEBUG_FIRMWARE_SUPPORTED; +} + +static void kfd_topology_set_capabilities(struct kfd_topology_device *dev) +{ +	dev->node_props.capability |= ((HSA_CAP_DOORBELL_TYPE_2_0 << +				HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT) & +				HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); + +	dev->node_props.capability |= HSA_CAP_TRAP_DEBUG_SUPPORT | +			HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_TRAP_OVERRIDE_SUPPORTED | +			HSA_CAP_TRAP_DEBUG_WAVE_LAUNCH_MODE_SUPPORTED; + +	if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(10, 0, 0)) { +		dev->node_props.debug_prop |= HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX9 | +						HSA_DBG_WATCH_ADDR_MASK_HI_BIT; + +		if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(9, 4, 2)) +			dev->node_props.debug_prop |= +				HSA_DBG_DISPATCH_INFO_ALWAYS_VALID; +		else +			dev->node_props.capability |= +				HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED; +	} else { +		dev->node_props.debug_prop |= HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX10 | +					HSA_DBG_WATCH_ADDR_MASK_HI_BIT; + +		if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(11, 0, 0)) +			dev->node_props.debug_prop |= HSA_DBG_DISPATCH_INFO_ALWAYS_VALID; +		else +			dev->node_props.capability |= +				HSA_CAP_TRAP_DEBUG_PRECISE_MEMORY_OPERATIONS_SUPPORTED; +	} + +	kfd_topology_set_dbg_firmware_support(dev); +} + +int kfd_topology_add_device(struct kfd_node *gpu)  {  	uint32_t gpu_id;  	struct kfd_topology_device *dev; @@ -1916,28 +2006,37 @@ int kfd_topology_add_device(struct kfd_dev *gpu)  	dev->node_props.simd_arrays_per_engine =  		cu_info.num_shader_arrays_per_engine; -	dev->node_props.gfx_target_version = gpu->device_info.gfx_target_version; +	dev->node_props.gfx_target_version = +				gpu->kfd->device_info.gfx_target_version;  	dev->node_props.vendor_id = gpu->adev->pdev->vendor;  	dev->node_props.device_id = gpu->adev->pdev->device;  	dev->node_props.capability |=  		((dev->gpu->adev->rev_id << HSA_CAP_ASIC_REVISION_SHIFT) &  			HSA_CAP_ASIC_REVISION_MASK); +  	dev->node_props.location_id = pci_dev_id(gpu->adev->pdev); +	if (KFD_GC_VERSION(dev->gpu->kfd) == IP_VERSION(9, 4, 3)) +		dev->node_props.location_id |= dev->gpu->node_id; +  	dev->node_props.domain = pci_domain_nr(gpu->adev->pdev->bus);  	dev->node_props.max_engine_clk_fcompute =  		amdgpu_amdkfd_get_max_engine_clock_in_mhz(dev->gpu->adev);  	dev->node_props.max_engine_clk_ccompute =  		cpufreq_quick_get_max(0) / 1000; -	dev->node_props.drm_render_minor = -		gpu->shared_resources.drm_render_minor; -	dev->node_props.hive_id = gpu->hive_id; +	if (gpu->xcp) +		dev->node_props.drm_render_minor = gpu->xcp->ddev->render->index; +	else +		dev->node_props.drm_render_minor = +				gpu->kfd->shared_resources.drm_render_minor; + +	dev->node_props.hive_id = gpu->kfd->hive_id;  	dev->node_props.num_sdma_engines = kfd_get_num_sdma_engines(gpu);  	dev->node_props.num_sdma_xgmi_engines =  					kfd_get_num_xgmi_sdma_engines(gpu);  	dev->node_props.num_sdma_queues_per_engine = -				gpu->device_info.num_sdma_queues_per_engine - -				gpu->device_info.num_reserved_sdma_queues_per_engine; +				gpu->kfd->device_info.num_sdma_queues_per_engine - +				gpu->kfd->device_info.num_reserved_sdma_queues_per_engine;  	dev->node_props.num_gws = (dev->gpu->gws &&  		dev->gpu->dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) ?  		dev->gpu->adev->gds.gws_size : 0; @@ -1966,20 +2065,18 @@ int kfd_topology_add_device(struct kfd_dev *gpu)  			HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK);  		break;  	default: -		if (KFD_GC_VERSION(dev->gpu) >= IP_VERSION(9, 0, 1)) -			dev->node_props.capability |= ((HSA_CAP_DOORBELL_TYPE_2_0 << -				HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT) & -				HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); -		else +		if (KFD_GC_VERSION(dev->gpu) < IP_VERSION(9, 0, 1))  			WARN(1, "Unexpected ASIC family %u",  			     dev->gpu->adev->asic_type); +		else +			kfd_topology_set_capabilities(dev);  	}  	/*  	 * Overwrite ATS capability according to needs_iommu_device to fix  	 * potential missing corresponding bit in CRAT of BIOS.  	 */ -	if (dev->gpu->use_iommu_v2) +	if (dev->gpu->kfd->use_iommu_v2)  		dev->node_props.capability |= HSA_CAP_ATS_PRESENT;  	else  		dev->node_props.capability &= ~HSA_CAP_ATS_PRESENT; @@ -2007,7 +2104,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu)  		dev->node_props.capability |= (dev->gpu->adev->ras_enabled != 0) ?  			HSA_CAP_RASEVENTNOTIFY : 0; -	if (KFD_IS_SVM_API_SUPPORTED(dev->gpu->adev->kfd.dev)) +	if (KFD_IS_SVM_API_SUPPORTED(dev->gpu->adev))  		dev->node_props.capability |= HSA_CAP_SVMAPI_SUPPORTED;  	kfd_debug_print_topology(); @@ -2079,7 +2176,7 @@ static void kfd_topology_update_io_links(int proximity_domain)  	}  } -int kfd_topology_remove_device(struct kfd_dev *gpu) +int kfd_topology_remove_device(struct kfd_node *gpu)  {  	struct kfd_topology_device *dev, *tmp;  	uint32_t gpu_id; @@ -2119,7 +2216,7 @@ int kfd_topology_remove_device(struct kfd_dev *gpu)   * Return -	0: On success (@kdev will be NULL for non GPU nodes)   *		-1: If end of list   */ -int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev) +int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_node **kdev)  {  	struct kfd_topology_device *top_dev; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h index fca30d00a9bb..cba2cd5ed9d1 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h @@ -31,6 +31,11 @@  #define KFD_TOPOLOGY_PUBLIC_NAME_SIZE 32 +#define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX9	6 +#define HSA_DBG_WATCH_ADDR_MASK_LO_BIT_GFX10	7 +#define HSA_DBG_WATCH_ADDR_MASK_HI_BIT  \ +			(29 << HSA_DBG_WATCH_ADDR_MASK_HI_BIT_SHIFT) +  struct kfd_node_properties {  	uint64_t hive_id;  	uint32_t cpu_cores_count; @@ -42,6 +47,7 @@ struct kfd_node_properties {  	uint32_t cpu_core_id_base;  	uint32_t simd_id_base;  	uint32_t capability; +	uint64_t debug_prop;  	uint32_t max_waves_per_simd;  	uint32_t lds_size_in_kb;  	uint32_t gds_size_in_kb; @@ -75,7 +81,7 @@ struct kfd_mem_properties {  	uint32_t		flags;  	uint32_t		width;  	uint32_t		mem_clk_max; -	struct kfd_dev		*gpu; +	struct kfd_node		*gpu;  	struct kobject		*kobj;  	struct attribute	attr;  }; @@ -93,7 +99,7 @@ struct kfd_cache_properties {  	uint32_t		cache_latency;  	uint32_t		cache_type;  	uint8_t			sibling_map[CACHE_SIBLINGMAP_SIZE]; -	struct kfd_dev		*gpu; +	struct kfd_node		*gpu;  	struct kobject		*kobj;  	struct attribute	attr;  	uint32_t		sibling_map_size; @@ -113,7 +119,7 @@ struct kfd_iolink_properties {  	uint32_t		max_bandwidth;  	uint32_t		rec_transfer_size;  	uint32_t		flags; -	struct kfd_dev		*gpu; +	struct kfd_node		*gpu;  	struct kobject		*kobj;  	struct attribute	attr;  }; @@ -135,7 +141,7 @@ struct kfd_topology_device {  	struct list_head		io_link_props;  	struct list_head		p2p_link_props;  	struct list_head		perf_props; -	struct kfd_dev			*gpu; +	struct kfd_node			*gpu;  	struct kobject			*kobj_node;  	struct kobject			*kobj_mem;  	struct kobject			*kobj_cache; diff --git a/drivers/gpu/drm/amd/amdxcp/Makefile b/drivers/gpu/drm/amd/amdxcp/Makefile new file mode 100644 index 000000000000..870501a4bb8c --- /dev/null +++ b/drivers/gpu/drm/amd/amdxcp/Makefile @@ -0,0 +1,25 @@ +# +# Copyright 2023 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. +# + +amdxcp-y := amdgpu_xcp_drv.o + +obj-$(CONFIG_DRM_AMDGPU) += amdxcp.o diff --git a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c new file mode 100644 index 000000000000..353597fc908d --- /dev/null +++ b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c @@ -0,0 +1,110 @@ +/* + * Copyright 2023 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 <linux/init.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <drm/drm_drv.h> + +#include "amdgpu_xcp_drv.h" + +#define MAX_XCP_PLATFORM_DEVICE 64 + +struct xcp_device { +	struct drm_device drm; +	struct platform_device *pdev; +}; + +static const struct drm_driver amdgpu_xcp_driver = { +	.driver_features = DRIVER_GEM | DRIVER_RENDER, +	.name = "amdgpu_xcp_drv", +	.major = 1, +	.minor = 0, +}; + +static int pdev_num; +static struct xcp_device *xcp_dev[MAX_XCP_PLATFORM_DEVICE]; + +int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev) +{ +	struct platform_device *pdev; +	struct xcp_device *pxcp_dev; +	int ret; + +	if (pdev_num >= MAX_XCP_PLATFORM_DEVICE) +		return -ENODEV; + +	pdev = platform_device_register_simple("amdgpu_xcp", pdev_num, NULL, 0); +	if (IS_ERR(pdev)) +		return PTR_ERR(pdev); + +	if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) { +		ret = -ENOMEM; +		goto out_unregister; +	} + +	pxcp_dev = devm_drm_dev_alloc(&pdev->dev, &amdgpu_xcp_driver, struct xcp_device, drm); +	if (IS_ERR(pxcp_dev)) { +		ret = PTR_ERR(pxcp_dev); +		goto out_devres; +	} + +	xcp_dev[pdev_num] = pxcp_dev; +	xcp_dev[pdev_num]->pdev = pdev; +	*ddev = &pxcp_dev->drm; +	pdev_num++; + +	return 0; + +out_devres: +	devres_release_group(&pdev->dev, NULL); +out_unregister: +	platform_device_unregister(pdev); + +	return ret; +} +EXPORT_SYMBOL(amdgpu_xcp_drm_dev_alloc); + +void amdgpu_xcp_drv_release(void) +{ +	for (--pdev_num; pdev_num >= 0; --pdev_num) { +		devres_release_group(&xcp_dev[pdev_num]->pdev->dev, NULL); +		platform_device_unregister(xcp_dev[pdev_num]->pdev); +		xcp_dev[pdev_num]->pdev = NULL; +		xcp_dev[pdev_num] = NULL; +	} +	pdev_num = 0; +} +EXPORT_SYMBOL(amdgpu_xcp_drv_release); + +static void __exit amdgpu_xcp_drv_exit(void) +{ +	amdgpu_xcp_drv_release(); +} + +module_exit(amdgpu_xcp_drv_exit); + +MODULE_AUTHOR("AMD linux driver team"); +MODULE_DESCRIPTION("AMD XCP PLATFORM DEVICES"); +MODULE_LICENSE("GPL and additional rights"); diff --git a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h new file mode 100644 index 000000000000..c1c4b679bf95 --- /dev/null +++ b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.h @@ -0,0 +1,29 @@ +/* + * Copyright 2023 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. + * + */ + +#ifndef _AMDGPU_XCP_DRV_H_ +#define _AMDGPU_XCP_DRV_H_ + +int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev); +void amdgpu_xcp_drv_release(void); +#endif /* _AMDGPU_XCP_DRV_H_ */ diff --git a/drivers/gpu/drm/amd/display/Kconfig b/drivers/gpu/drm/amd/display/Kconfig index 2d8e55e29637..bf0a655d009e 100644 --- a/drivers/gpu/drm/amd/display/Kconfig +++ b/drivers/gpu/drm/amd/display/Kconfig @@ -8,7 +8,7 @@ config DRM_AMD_DC  	depends on BROKEN || !CC_IS_CLANG || X86_64 || SPARC64 || ARM64  	select SND_HDA_COMPONENT if SND_HDA_CORE  	# !CC_IS_CLANG: https://github.com/ClangBuiltLinux/linux/issues/1752 -	select DRM_AMD_DC_FP if (X86 || (PPC64 && ALTIVEC) || (ARM64 && KERNEL_MODE_NEON && !CC_IS_CLANG)) +	select DRM_AMD_DC_FP if (X86 || LOONGARCH || (PPC64 && ALTIVEC) || (ARM64 && KERNEL_MODE_NEON && !CC_IS_CLANG))  	help  	  Choose this option if you want to use the new display engine  	  support for AMDGPU. This adds required support for Vega and @@ -42,16 +42,13 @@ config DEBUG_KERNEL_DC  	  Choose this option if you want to hit kdgb_break in assert.  config DRM_AMD_SECURE_DISPLAY -        bool "Enable secure display support" -        depends on DEBUG_FS -        depends on DRM_AMD_DC_FP -        help -            Choose this option if you want to -            support secure display - -            This option enables the calculation -            of crc of specific region via debugfs. -            Cooperate with specific DMCU FW. +	bool "Enable secure display support" +	depends on DEBUG_FS +	depends on DRM_AMD_DC_FP +	help +	  Choose this option if you want to support secure display +	  This option enables the calculation of crc of specific region via +	  debugfs. Cooperate with specific DMCU FW.  endmenu diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 8b4b186c57f5..b6bef202b6bb 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -365,6 +365,14 @@ static inline void reverse_planes_order(struct dc_surface_update *array_of_surfa   * adjustments and preparation before calling it. This function is a wrapper   * for the dc_update_planes_and_stream that does any required configuration   * before passing control to DC. + * + * @dc: Display Core control structure + * @update_type: specify whether it is FULL/MEDIUM/FAST update + * @planes_count: planes count to update + * @stream: stream state + * @stream_update: stream update + * @array_of_surface_update: dc surface update pointer + *   */  static inline bool update_planes_and_stream_adapter(struct dc *dc,  						    int update_type, @@ -1646,11 +1654,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)  	if (amdgpu_dc_feature_mask & DC_DISABLE_LTTPR_DP2_0)  		init_data.flags.allow_lttpr_non_transparent_mode.bits.DP2_0 = true; -	/* Disable SubVP + DRR config by default */ -	init_data.flags.disable_subvp_drr = true; -	if (amdgpu_dc_feature_mask & DC_ENABLE_SUBVP_DRR) -		init_data.flags.disable_subvp_drr = false; -  	init_data.flags.seamless_boot_edp_requested = false;  	if (check_seamless_boot_capability(adev)) { @@ -1672,9 +1675,11 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)  	adev->dm.dc = dc_create(&init_data);  	if (adev->dm.dc) { -		DRM_INFO("Display Core initialized with v%s!\n", DC_VER); +		DRM_INFO("Display Core v%s initialized on %s\n", DC_VER, +			 dce_version_to_string(adev->dm.dc->ctx->dce_version));  	} else { -		DRM_INFO("Display Core failed to initialize with v%s!\n", DC_VER); +		DRM_INFO("Display Core v%s failed to initialize on %s\n", DC_VER, +			 dce_version_to_string(adev->dm.dc->ctx->dce_version));  		goto error;  	} @@ -1776,12 +1781,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)  		dc_init_callbacks(adev->dm.dc, &init_params);  	} -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) -	adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev); -	if (!adev->dm.secure_display_ctxs) { -		DRM_ERROR("amdgpu: failed to initialize secure_display_ctxs.\n"); -	} -#endif  	if (dc_is_dmub_outbox_supported(adev->dm.dc)) {  		init_completion(&adev->dm.dmub_aux_transfer_done);  		adev->dm.dmub_notify = kzalloc(sizeof(struct dmub_notification), GFP_KERNEL); @@ -1840,6 +1839,11 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)  		goto error;  	} +#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) +	adev->dm.secure_display_ctxs = amdgpu_dm_crtc_secure_display_create_contexts(adev); +	if (!adev->dm.secure_display_ctxs) +		DRM_ERROR("amdgpu: failed to initialize secure display contexts.\n"); +#endif  	DRM_DEBUG_DRIVER("KMS initialized.\n"); @@ -2479,20 +2483,25 @@ static void dm_gpureset_toggle_interrupts(struct amdgpu_device *adev,  		if (acrtc && state->stream_status[i].plane_count != 0) {  			irq_source = IRQ_TYPE_PFLIP + acrtc->otg_inst;  			rc = dc_interrupt_set(adev->dm.dc, irq_source, enable) ? 0 : -EBUSY; -			DRM_DEBUG_VBL("crtc %d - vupdate irq %sabling: r=%d\n", -				      acrtc->crtc_id, enable ? "en" : "dis", rc);  			if (rc)  				DRM_WARN("Failed to %s pflip interrupts\n",  					 enable ? "enable" : "disable");  			if (enable) { -				rc = amdgpu_dm_crtc_enable_vblank(&acrtc->base); -				if (rc) -					DRM_WARN("Failed to enable vblank interrupts\n"); -			} else { -				amdgpu_dm_crtc_disable_vblank(&acrtc->base); -			} +				if (amdgpu_dm_crtc_vrr_active(to_dm_crtc_state(acrtc->base.state))) +					rc = amdgpu_dm_crtc_set_vupdate_irq(&acrtc->base, true); +			} else +				rc = amdgpu_dm_crtc_set_vupdate_irq(&acrtc->base, false); + +			if (rc) +				DRM_WARN("Failed to %sable vupdate interrupt\n", enable ? "en" : "dis"); +			irq_source = IRQ_TYPE_VBLANK + acrtc->otg_inst; +			/* During gpu-reset we disable and then enable vblank irq, so +			 * don't use amdgpu_irq_get/put() to avoid refcount change. +			 */ +			if (!dc_interrupt_set(adev->dm.dc, irq_source, enable)) +				DRM_WARN("Failed to %sable vblank interrupt\n", enable ? "en" : "dis");  		}  	} @@ -2852,7 +2861,7 @@ static int dm_resume(void *handle)  		 * this is the case when traversing through already created  		 * MST connectors, should be skipped  		 */ -		if (aconnector->dc_link->type == dc_connection_mst_branch) +		if (aconnector && aconnector->mst_root)  			continue;  		mutex_lock(&aconnector->hpd_lock); @@ -5326,21 +5335,44 @@ get_aspect_ratio(const struct drm_display_mode *mode_in)  }  static enum dc_color_space -get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing) +get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing, +		       const struct drm_connector_state *connector_state)  {  	enum dc_color_space color_space = COLOR_SPACE_SRGB; -	switch (dc_crtc_timing->pixel_encoding)	{ -	case PIXEL_ENCODING_YCBCR422: -	case PIXEL_ENCODING_YCBCR444: -	case PIXEL_ENCODING_YCBCR420: -	{ +	switch (connector_state->colorspace) { +	case DRM_MODE_COLORIMETRY_BT601_YCC: +		if (dc_crtc_timing->flags.Y_ONLY) +			color_space = COLOR_SPACE_YCBCR601_LIMITED; +		else +			color_space = COLOR_SPACE_YCBCR601; +		break; +	case DRM_MODE_COLORIMETRY_BT709_YCC: +		if (dc_crtc_timing->flags.Y_ONLY) +			color_space = COLOR_SPACE_YCBCR709_LIMITED; +		else +			color_space = COLOR_SPACE_YCBCR709; +		break; +	case DRM_MODE_COLORIMETRY_OPRGB: +		color_space = COLOR_SPACE_ADOBERGB; +		break; +	case DRM_MODE_COLORIMETRY_BT2020_RGB: +	case DRM_MODE_COLORIMETRY_BT2020_YCC: +		if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) +			color_space = COLOR_SPACE_2020_RGB_FULLRANGE; +		else +			color_space = COLOR_SPACE_2020_YCBCR; +		break; +	case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601 +	default: +		if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) { +			color_space = COLOR_SPACE_SRGB;  		/*  		 * 27030khz is the separation point between HDTV and SDTV  		 * according to HDMI spec, we use YCbCr709 and YCbCr601  		 * respectively  		 */ -		if (dc_crtc_timing->pix_clk_100hz > 270300) { +		} else if (dc_crtc_timing->pix_clk_100hz > 270300) {  			if (dc_crtc_timing->flags.Y_ONLY)  				color_space =  					COLOR_SPACE_YCBCR709_LIMITED; @@ -5353,15 +5385,6 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)  			else  				color_space = COLOR_SPACE_YCBCR601;  		} - -	} -	break; -	case PIXEL_ENCODING_RGB: -		color_space = COLOR_SPACE_SRGB; -		break; - -	default: -		WARN_ON(1);  		break;  	} @@ -5500,7 +5523,7 @@ static void fill_stream_properties_from_drm_display_mode(  		}  	} -	stream->output_color_space = get_output_color_space(timing_out); +	stream->output_color_space = get_output_color_space(timing_out, connector_state);  }  static void fill_audio_info(struct audio_info *audio_info, @@ -5942,15 +5965,14 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  {  	struct drm_display_mode *preferred_mode = NULL;  	struct drm_connector *drm_connector; -	const struct drm_connector_state *con_state = -		dm_state ? &dm_state->base : NULL; +	const struct drm_connector_state *con_state = &dm_state->base;  	struct dc_stream_state *stream = NULL;  	struct drm_display_mode mode;  	struct drm_display_mode saved_mode;  	struct drm_display_mode *freesync_mode = NULL;  	bool native_mode_found = false;  	bool recalculate_timing = false; -	bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false; +	bool scale = dm_state->scaling != RMX_OFF;  	int mode_refresh;  	int preferred_refresh = 0;  	enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN; @@ -6013,8 +6035,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  		 */  		DRM_DEBUG_DRIVER("No preferred mode found\n");  	} else { -		recalculate_timing = amdgpu_freesync_vid_mode && -				 is_freesync_video_mode(&mode, aconnector); +		recalculate_timing = is_freesync_video_mode(&mode, aconnector);  		if (recalculate_timing) {  			freesync_mode = get_highest_refresh_rate_mode(aconnector, false);  			drm_mode_copy(&saved_mode, &mode); @@ -6029,7 +6050,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,  	if (recalculate_timing)  		drm_mode_set_crtcinfo(&saved_mode, 0); -	else if (!dm_state) +	else  		drm_mode_set_crtcinfo(&mode, 0);  	/* @@ -6342,6 +6363,31 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)  	return 0;  } +static void amdgpu_dm_connector_funcs_force(struct drm_connector *connector) +{ +	struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); +	struct dc_link *dc_link = aconnector->dc_link; +	struct dc_sink *dc_em_sink = aconnector->dc_em_sink; +	struct edid *edid; + +	if (!connector->edid_override) +		return; + +	drm_edid_override_connector_update(&aconnector->base); +	edid = aconnector->base.edid_blob_ptr->data; +	aconnector->edid = edid; + +	/* Update emulated (virtual) sink's EDID */ +	if (dc_em_sink && dc_link) { +		memset(&dc_em_sink->edid_caps, 0, sizeof(struct dc_edid_caps)); +		memmove(dc_em_sink->dc_edid.raw_edid, edid, (edid->extensions + 1) * EDID_LENGTH); +		dm_helpers_parse_edid_caps( +			dc_link, +			&dc_em_sink->dc_edid, +			&dc_em_sink->edid_caps); +	} +} +  static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {  	.reset = amdgpu_dm_connector_funcs_reset,  	.detect = amdgpu_dm_connector_detect, @@ -6352,7 +6398,8 @@ static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {  	.atomic_set_property = amdgpu_dm_connector_atomic_set_property,  	.atomic_get_property = amdgpu_dm_connector_atomic_get_property,  	.late_register = amdgpu_dm_connector_late_register, -	.early_unregister = amdgpu_dm_connector_unregister +	.early_unregister = amdgpu_dm_connector_unregister, +	.force = amdgpu_dm_connector_funcs_force  };  static int get_modes(struct drm_connector *connector) @@ -6369,11 +6416,19 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector)  	struct edid *edid;  	if (!aconnector->base.edid_blob_ptr) { -		DRM_ERROR("No EDID firmware found on connector: %s ,forcing to OFF!\n", -				aconnector->base.name); +		/* if connector->edid_override valid, pass +		 * it to edid_override to edid_blob_ptr +		 */ -		aconnector->base.force = DRM_FORCE_OFF; -		return; +		drm_edid_override_connector_update(&aconnector->base); + +		if (!aconnector->base.edid_blob_ptr) { +			DRM_ERROR("No EDID firmware found on connector: %s ,forcing to OFF!\n", +					aconnector->base.name); + +			aconnector->base.force = DRM_FORCE_OFF; +			return; +		}  	}  	edid = (struct edid *) aconnector->base.edid_blob_ptr->data; @@ -6558,7 +6613,9 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec  		goto fail;  	} -	stream = create_validate_stream_for_sink(aconnector, mode, NULL, NULL); +	stream = create_validate_stream_for_sink(aconnector, mode, +						 to_dm_connector_state(connector->state), +						 NULL);  	if (stream) {  		dc_stream_release(stream);  		result = MODE_OK; @@ -6652,6 +6709,14 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn,  	if (!crtc)  		return 0; +	if (new_con_state->colorspace != old_con_state->colorspace) { +		new_crtc_state = drm_atomic_get_crtc_state(state, crtc); +		if (IS_ERR(new_crtc_state)) +			return PTR_ERR(new_crtc_state); + +		new_crtc_state->mode_changed = true; +	} +  	if (!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state)) {  		struct dc_info_packet hdr_infopacket; @@ -6674,7 +6739,7 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn,  		 * set is permissible, however. So only force a  		 * modeset if we're entering or exiting HDR.  		 */ -		new_crtc_state->mode_changed = +		new_crtc_state->mode_changed = new_crtc_state->mode_changed ||  			!old_con_state->hdr_output_metadata ||  			!new_con_state->hdr_output_metadata;  	} @@ -6737,7 +6802,7 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,  	int clock, bpp = 0;  	bool is_y420 = false; -	if (!aconnector->mst_output_port || !aconnector->dc_sink) +	if (!aconnector->mst_output_port)  		return 0;  	mst_port = aconnector->mst_output_port; @@ -7163,7 +7228,7 @@ static void amdgpu_dm_connector_add_freesync_modes(struct drm_connector *connect  	struct amdgpu_dm_connector *amdgpu_dm_connector =  		to_amdgpu_dm_connector(connector); -	if (!(amdgpu_freesync_vid_mode && edid)) +	if (!edid)  		return;  	if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10) @@ -7199,6 +7264,12 @@ static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)  	return amdgpu_dm_connector->num_modes;  } +static const u32 supported_colorspaces = +	BIT(DRM_MODE_COLORIMETRY_BT709_YCC) | +	BIT(DRM_MODE_COLORIMETRY_OPRGB) | +	BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) | +	BIT(DRM_MODE_COLORIMETRY_BT2020_YCC); +  void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,  				     struct amdgpu_dm_connector *aconnector,  				     int connector_type, @@ -7279,6 +7350,15 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,  				adev->mode_info.abm_level_property, 0);  	} +	if (connector_type == DRM_MODE_CONNECTOR_HDMIA) { +		if (!drm_mode_create_hdmi_colorspace_property(&aconnector->base, supported_colorspaces)) +			drm_connector_attach_colorspace_property(&aconnector->base); +	} else if (connector_type == DRM_MODE_CONNECTOR_DisplayPort || +		   connector_type == DRM_MODE_CONNECTOR_eDP) { +		if (!drm_mode_create_dp_colorspace_property(&aconnector->base, supported_colorspaces)) +			drm_connector_attach_colorspace_property(&aconnector->base); +	} +  	if (connector_type == DRM_MODE_CONNECTOR_HDMIA ||  	    connector_type == DRM_MODE_CONNECTOR_DisplayPort ||  	    connector_type == DRM_MODE_CONNECTOR_eDP) { @@ -9208,8 +9288,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,  		 * TODO: Refactor this function to allow this check to work  		 * in all conditions.  		 */ -		if (amdgpu_freesync_vid_mode && -		    dm_new_crtc_state->stream && +		if (dm_new_crtc_state->stream &&  		    is_timing_unchanged_for_freesync(new_crtc_state, old_crtc_state))  			goto skip_modeset; @@ -9251,7 +9330,9 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,  		}  		/* Now check if we should set freesync video mode */ -		if (amdgpu_freesync_vid_mode && dm_new_crtc_state->stream && +		if (dm_new_crtc_state->stream && +		    dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) && +		    dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream) &&  		    is_timing_unchanged_for_freesync(new_crtc_state,  						     old_crtc_state)) {  			new_crtc_state->mode_changed = false; @@ -9263,7 +9344,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,  			set_freesync_fixed_config(dm_new_crtc_state);  			goto skip_modeset; -		} else if (amdgpu_freesync_vid_mode && aconnector && +		} else if (aconnector &&  			   is_freesync_video_mode(&new_crtc_state->mode,  						  aconnector)) {  			struct drm_display_mode *high_mode; @@ -10323,7 +10404,7 @@ static bool dm_edid_parser_send_cea(struct amdgpu_display_manager *dm,  	input->cea_total_length = total_length;  	memcpy(input->payload, data, length); -	res = dc_dmub_srv_cmd_with_reply_data(dm->dc->ctx->dmub_srv, &cmd); +	res = dm_execute_dmub_cmd(dm->dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);  	if (!res) {  		DRM_ERROR("EDID CEA parser failed\n");  		return false; @@ -10773,3 +10854,13 @@ bool check_seamless_boot_capability(struct amdgpu_device *adev)  	return false;  } + +bool dm_execute_dmub_cmd(const struct dc_context *ctx, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type) +{ +	return dc_dmub_srv_cmd_run(ctx->dmub_srv, cmd, wait_type); +} + +bool dm_execute_dmub_cmd_list(const struct dc_context *ctx, unsigned int count, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type) +{ +	return dc_dmub_srv_cmd_run_list(ctx->dmub_srv, count, cmd, wait_type); +} diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 2e2413fd73a4..4561f55afa99 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -661,10 +661,6 @@ struct amdgpu_dm_connector {  	struct mutex hpd_lock;  	bool fake_enable; -#ifdef CONFIG_DEBUG_FS -	uint32_t debugfs_dpcd_address; -	uint32_t debugfs_dpcd_size; -#endif  	bool force_yuv420_output;  	struct dsc_preferred_settings dsc_settings;  	union dp_downstream_port_present mst_downstream_port_present; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c index 27711743c22c..0802f8e8fac5 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c @@ -83,12 +83,15 @@ const char *const *amdgpu_dm_crtc_get_crc_sources(struct drm_crtc *crtc,  }  #ifdef CONFIG_DRM_AMD_SECURE_DISPLAY -static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc) +static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc, struct dc_stream_state *stream)  {  	struct drm_device *drm_dev = crtc->dev; +	struct amdgpu_display_manager *dm = &drm_to_adev(drm_dev)->dm;  	struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); +	bool was_activated;  	spin_lock_irq(&drm_dev->event_lock); +	was_activated = acrtc->dm_irq_params.window_param.activated;  	acrtc->dm_irq_params.window_param.x_start = 0;  	acrtc->dm_irq_params.window_param.y_start = 0;  	acrtc->dm_irq_params.window_param.x_end = 0; @@ -97,6 +100,14 @@ static void amdgpu_dm_set_crc_window_default(struct drm_crtc *crtc)  	acrtc->dm_irq_params.window_param.update_win = false;  	acrtc->dm_irq_params.window_param.skip_frame_cnt = 0;  	spin_unlock_irq(&drm_dev->event_lock); + +	/* Disable secure_display if it was enabled */ +	if (was_activated) { +		/* stop ROI update on this crtc */ +		flush_work(&dm->secure_display_ctxs[crtc->index].notify_ta_work); +		flush_work(&dm->secure_display_ctxs[crtc->index].forward_roi_work); +		dc_stream_forward_crc_window(stream, NULL, true); +	}  }  static void amdgpu_dm_crtc_notify_ta_to_read(struct work_struct *work) @@ -204,9 +215,6 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,  					struct dm_crtc_state *dm_crtc_state,  					enum amdgpu_dm_pipe_crc_source source)  { -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) -	int i; -#endif  	struct amdgpu_device *adev = drm_to_adev(crtc->dev);  	struct dc_stream_state *stream_state = dm_crtc_state->stream;  	bool enable = amdgpu_dm_is_valid_crc_source(source); @@ -220,19 +228,6 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,  	/* Enable or disable CRTC CRC generation */  	if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) { -#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) -		/* Disable secure_display if it was enabled */ -		if (!enable) { -			for (i = 0; i < adev->mode_info.num_crtc; i++) { -				if (adev->dm.secure_display_ctxs[i].crtc == crtc) { -					/* stop ROI update on this crtc */ -					flush_work(&adev->dm.secure_display_ctxs[i].notify_ta_work); -					flush_work(&adev->dm.secure_display_ctxs[i].forward_roi_work); -					dc_stream_forward_crc_window(stream_state, NULL, true); -				} -			} -		} -#endif  		if (!dc_stream_configure_crc(stream_state->ctx->dc,  					     stream_state, NULL, enable, enable)) {  			ret = -EINVAL; @@ -363,7 +358,7 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)  #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)  	/* Reset secure_display when we change crc source from debugfs */ -	amdgpu_dm_set_crc_window_default(crtc); +	amdgpu_dm_set_crc_window_default(crtc, crtc_state->stream);  #endif  	if (amdgpu_dm_crtc_configure_crc_source(crtc, crtc_state, source)) { diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h index 935adca6f048..748e80ef40d0 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.h @@ -100,7 +100,7 @@ struct secure_display_context *amdgpu_dm_crtc_secure_display_create_contexts(  #else  #define amdgpu_dm_crc_window_is_activated(x)  #define amdgpu_dm_crtc_handle_crc_window_irq(x) -#define amdgpu_dm_crtc_secure_display_create_contexts() +#define amdgpu_dm_crtc_secure_display_create_contexts(x)  #endif  #endif /* AMD_DAL_DEV_AMDGPU_DM_AMDGPU_DM_CRC_H_ */ diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c index e3762e806617..440fc0869a34 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c @@ -146,7 +146,6 @@ static void vblank_control_worker(struct work_struct *work)  static inline int dm_set_vblank(struct drm_crtc *crtc, bool enable)  { -	enum dc_irq_source irq_source;  	struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);  	struct amdgpu_device *adev = drm_to_adev(crtc->dev);  	struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); @@ -169,18 +168,9 @@ static inline int dm_set_vblank(struct drm_crtc *crtc, bool enable)  	if (rc)  		return rc; -	if (amdgpu_in_reset(adev)) { -		irq_source = IRQ_TYPE_VBLANK + acrtc->otg_inst; -		/* During gpu-reset we disable and then enable vblank irq, so -		 * don't use amdgpu_irq_get/put() to avoid refcount change. -		 */ -		if (!dc_interrupt_set(adev->dm.dc, irq_source, enable)) -			rc = -EBUSY; -	} else { -		rc = (enable) -			? amdgpu_irq_get(adev, &adev->crtc_irq, acrtc->crtc_id) -			: amdgpu_irq_put(adev, &adev->crtc_irq, acrtc->crtc_id); -	} +	rc = (enable) +		? amdgpu_irq_get(adev, &adev->crtc_irq, acrtc->crtc_id) +		: amdgpu_irq_put(adev, &adev->crtc_irq, acrtc->crtc_id);  	if (rc)  		return rc; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index 827fcb4fb3b3..caf13b2e8cb6 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -907,6 +907,61 @@ unlock:  DEFINE_SHOW_ATTRIBUTE(amdgpu_current_bpc);  /* + * Returns the current colorspace for the crtc. + * Example usage: cat /sys/kernel/debug/dri/0/crtc-0/amdgpu_current_colorspace + */ +static int amdgpu_current_colorspace_show(struct seq_file *m, void *data) +{ +	struct drm_crtc *crtc = m->private; +	struct drm_device *dev = crtc->dev; +	struct dm_crtc_state *dm_crtc_state = NULL; +	int res = -ENODEV; + +	mutex_lock(&dev->mode_config.mutex); +	drm_modeset_lock(&crtc->mutex, NULL); +	if (crtc->state == NULL) +		goto unlock; + +	dm_crtc_state = to_dm_crtc_state(crtc->state); +	if (dm_crtc_state->stream == NULL) +		goto unlock; + +	switch (dm_crtc_state->stream->output_color_space) { +	case COLOR_SPACE_SRGB: +		seq_printf(m, "sRGB"); +		break; +	case COLOR_SPACE_YCBCR601: +	case COLOR_SPACE_YCBCR601_LIMITED: +		seq_printf(m, "BT601_YCC"); +		break; +	case COLOR_SPACE_YCBCR709: +	case COLOR_SPACE_YCBCR709_LIMITED: +		seq_printf(m, "BT709_YCC"); +		break; +	case COLOR_SPACE_ADOBERGB: +		seq_printf(m, "opRGB"); +		break; +	case COLOR_SPACE_2020_RGB_FULLRANGE: +		seq_printf(m, "BT2020_RGB"); +		break; +	case COLOR_SPACE_2020_YCBCR: +		seq_printf(m, "BT2020_YCC"); +		break; +	default: +		goto unlock; +	} +	res = 0; + +unlock: +	drm_modeset_unlock(&crtc->mutex); +	mutex_unlock(&dev->mode_config.mutex); + +	return res; +} +DEFINE_SHOW_ATTRIBUTE(amdgpu_current_colorspace); + + +/*   * Example usage:   * Disable dsc passthrough, i.e.,: have dsc decoding at converver, not external RX   *   echo 1 /sys/kernel/debug/dri/0/DP-1/dsc_disable_passthrough @@ -1039,88 +1094,6 @@ static ssize_t dp_sdp_message_debugfs_write(struct file *f, const char __user *b  	return write_size;  } -static ssize_t dp_dpcd_address_write(struct file *f, const char __user *buf, -				 size_t size, loff_t *pos) -{ -	int r; -	struct amdgpu_dm_connector *connector = file_inode(f)->i_private; - -	if (size < sizeof(connector->debugfs_dpcd_address)) -		return -EINVAL; - -	r = copy_from_user(&connector->debugfs_dpcd_address, -			buf, sizeof(connector->debugfs_dpcd_address)); - -	return size - r; -} - -static ssize_t dp_dpcd_size_write(struct file *f, const char __user *buf, -				 size_t size, loff_t *pos) -{ -	int r; -	struct amdgpu_dm_connector *connector = file_inode(f)->i_private; - -	if (size < sizeof(connector->debugfs_dpcd_size)) -		return -EINVAL; - -	r = copy_from_user(&connector->debugfs_dpcd_size, -			buf, sizeof(connector->debugfs_dpcd_size)); - -	if (connector->debugfs_dpcd_size > 256) -		connector->debugfs_dpcd_size = 0; - -	return size - r; -} - -static ssize_t dp_dpcd_data_write(struct file *f, const char __user *buf, -				 size_t size, loff_t *pos) -{ -	int r; -	char *data; -	struct amdgpu_dm_connector *connector = file_inode(f)->i_private; -	struct dc_link *link = connector->dc_link; -	uint32_t write_size = connector->debugfs_dpcd_size; - -	if (!write_size || size < write_size) -		return -EINVAL; - -	data = kzalloc(write_size, GFP_KERNEL); -	if (!data) -		return 0; - -	r = copy_from_user(data, buf, write_size); - -	dm_helpers_dp_write_dpcd(link->ctx, link, -			connector->debugfs_dpcd_address, data, write_size - r); -	kfree(data); -	return write_size - r; -} - -static ssize_t dp_dpcd_data_read(struct file *f, char __user *buf, -				 size_t size, loff_t *pos) -{ -	int r; -	char *data; -	struct amdgpu_dm_connector *connector = file_inode(f)->i_private; -	struct dc_link *link = connector->dc_link; -	uint32_t read_size = connector->debugfs_dpcd_size; - -	if (!read_size || size < read_size) -		return 0; - -	data = kzalloc(read_size, GFP_KERNEL); -	if (!data) -		return 0; - -	dm_helpers_dp_read_dpcd(link->ctx, link, -			connector->debugfs_dpcd_address, data, read_size); - -	r = copy_to_user(buf, data, read_size); - -	kfree(data); -	return read_size - r; -} -  /* function: Read link's DSC & FEC capabilities   *   * @@ -2682,25 +2655,6 @@ static const struct file_operations sdp_message_fops = {  	.llseek = default_llseek  }; -static const struct file_operations dp_dpcd_address_debugfs_fops = { -	.owner = THIS_MODULE, -	.write = dp_dpcd_address_write, -	.llseek = default_llseek -}; - -static const struct file_operations dp_dpcd_size_debugfs_fops = { -	.owner = THIS_MODULE, -	.write = dp_dpcd_size_write, -	.llseek = default_llseek -}; - -static const struct file_operations dp_dpcd_data_debugfs_fops = { -	.owner = THIS_MODULE, -	.read = dp_dpcd_data_read, -	.write = dp_dpcd_data_write, -	.llseek = default_llseek -}; -  static const struct file_operations dp_max_bpc_debugfs_fops = {  	.owner = THIS_MODULE,  	.read = dp_max_bpc_read, @@ -2724,9 +2678,6 @@ static const struct {  		{"test_pattern", &dp_phy_test_pattern_fops},  		{"hdcp_sink_capability", &hdcp_sink_capability_fops},  		{"sdp_message", &sdp_message_fops}, -		{"aux_dpcd_address", &dp_dpcd_address_debugfs_fops}, -		{"aux_dpcd_size", &dp_dpcd_size_debugfs_fops}, -		{"aux_dpcd_data", &dp_dpcd_data_debugfs_fops},  		{"dsc_clock_en", &dp_dsc_clock_en_debugfs_fops},  		{"dsc_slice_width", &dp_dsc_slice_width_debugfs_fops},  		{"dsc_slice_height", &dp_dsc_slice_height_debugfs_fops}, @@ -3025,9 +2976,6 @@ void connector_debugfs_init(struct amdgpu_dm_connector *connector)  				    connector_debugfs_entries[i].fops);  	} -	connector->debugfs_dpcd_address = 0; -	connector->debugfs_dpcd_size = 0; -  	if (connector->base.connector_type == DRM_MODE_CONNECTOR_HDMIA) {  		for (i = 0; i < ARRAY_SIZE(hdmi_debugfs_entries); i++) {  			debugfs_create_file(hdmi_debugfs_entries[i].name, @@ -3246,6 +3194,8 @@ void crtc_debugfs_init(struct drm_crtc *crtc)  #endif  	debugfs_create_file("amdgpu_current_bpc", 0644, crtc->debugfs_entry,  			    crtc, &amdgpu_current_bpc_fops); +	debugfs_create_file("amdgpu_current_colorspace", 0644, crtc->debugfs_entry, +			    crtc, &amdgpu_current_colorspace_fops);  }  /* diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c index c6ce2b7123b7..09e056a64708 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c @@ -885,10 +885,34 @@ enum dc_edid_status dm_helpers_read_local_edid(  		DRM_ERROR("EDID err: %d, on connector: %s",  				edid_status,  				aconnector->base.name); +	if (link->aux_mode) { +		union test_request test_request = {0}; +		union test_response test_response = {0}; -	/* DP Compliance Test 4.2.2.3 */ -	if (link->aux_mode) -		drm_dp_send_real_edid_checksum(&aconnector->dm_dp_aux.aux, sink->dc_edid.raw_edid[sink->dc_edid.length-1]); +		dm_helpers_dp_read_dpcd(ctx, +					link, +					DP_TEST_REQUEST, +					&test_request.raw, +					sizeof(union test_request)); + +		if (!test_request.bits.EDID_READ) +			return edid_status; + +		test_response.bits.EDID_CHECKSUM_WRITE = 1; + +		dm_helpers_dp_write_dpcd(ctx, +					link, +					DP_TEST_EDID_CHECKSUM, +					&sink->dc_edid.raw_edid[sink->dc_edid.length-1], +					1); + +		dm_helpers_dp_write_dpcd(ctx, +					link, +					DP_TEST_RESPONSE, +					&test_response.raw, +					sizeof(test_response)); + +	}  	return edid_status;  } diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 810ab682f424..46d0a8f57e55 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -45,8 +45,7 @@  #endif  #include "dc/dcn20/dcn20_resource.h" -bool is_timing_changed(struct dc_stream_state *cur_stream, -		       struct dc_stream_state *new_stream); +  #define PEAK_FACTOR_X1000 1006  static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, @@ -1422,7 +1421,7 @@ int pre_validate_dsc(struct drm_atomic_state *state,  		struct dc_stream_state *stream = dm_state->context->streams[i];  		if (local_dc_state->streams[i] && -		    is_timing_changed(stream, local_dc_state->streams[i])) { +		    dc_is_timing_changed(stream, local_dc_state->streams[i])) {  			DRM_INFO_ONCE("crtc[%d] needs mode_changed\n", i);  		} else {  			int ind = find_crtc_index_in_state_by_stream(state, stream); diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c index c42aa947c969..172aa10a8800 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c @@ -33,6 +33,8 @@  #include <asm/cputable.h>  #elif defined(CONFIG_ARM64)  #include <asm/neon.h> +#elif defined(CONFIG_LOONGARCH) +#include <asm/fpu.h>  #endif  /** @@ -88,7 +90,7 @@ void dc_fpu_begin(const char *function_name, const int line)  	*pcpu += 1;  	if (*pcpu == 1) { -#if defined(CONFIG_X86) +#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)  		migrate_disable();  		kernel_fpu_begin();  #elif defined(CONFIG_PPC64) @@ -128,7 +130,7 @@ void dc_fpu_end(const char *function_name, const int line)  	pcpu = get_cpu_ptr(&fpu_recursion_depth);  	*pcpu -= 1;  	if (*pcpu <= 0) { -#if defined(CONFIG_X86) +#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)  		kernel_fpu_end();  		migrate_enable();  #elif defined(CONFIG_PPC64) diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c index 1ef9e4053bb7..90a02d7bd3da 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c @@ -123,9 +123,7 @@ static void encoder_control_dmcub(  		sizeof(cmd.digx_encoder_control.header);  	cmd.digx_encoder_control.encoder_control.dig.stream_param = *dig; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result encoder_control_digx_v1_5( @@ -261,9 +259,7 @@ static void transmitter_control_dmcub(  		sizeof(cmd.dig1_transmitter_control.header);  	cmd.dig1_transmitter_control.transmitter_control.dig = *dig; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result transmitter_control_v1_6( @@ -325,9 +321,7 @@ static void transmitter_control_dmcub_v1_7(  		sizeof(cmd.dig1_transmitter_control.header);  	cmd.dig1_transmitter_control.transmitter_control.dig_v1_7 = *dig; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result transmitter_control_v1_7( @@ -435,9 +429,7 @@ static void set_pixel_clock_dmcub(  		sizeof(cmd.set_pixel_clock.header);  	cmd.set_pixel_clock.pixel_clock.clk = *clk; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result set_pixel_clock_v7( @@ -804,9 +796,7 @@ static void enable_disp_power_gating_dmcub(  		sizeof(cmd.enable_disp_power_gating.header);  	cmd.enable_disp_power_gating.power_gating.pwr = *pwr; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result enable_disp_power_gating_v2_1( @@ -1016,10 +1006,7 @@ static void enable_lvtma_control_dmcub(  			panel_instance;  	cmd.lvtma_control.data.bypass_panel_control_wait =  			bypass_panel_control_wait; -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	dc_dmub_srv_cmd_execute(dmcub); -	dc_dmub_srv_wait_idle(dmcub); - +	dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static enum bp_result enable_lvtma_control( diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c index 934e6423dc1a..1f36ad8a7de4 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dce112/dce112_clk_mgr.c @@ -111,12 +111,10 @@ int dce112_set_clock(struct clk_mgr *clk_mgr_base, int requested_clk_khz)  	bp->funcs->set_dce_clock(bp, &dce_clk_params); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { -			if (clk_mgr_dce->dfs_bypass_disp_clk != actual_clock) -				dmcu->funcs->set_psr_wait_loop(dmcu, -						actual_clock / 1000 / 7); -		} +	if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { +		if (clk_mgr_dce->dfs_bypass_disp_clk != actual_clock) +			dmcu->funcs->set_psr_wait_loop(dmcu, +					actual_clock / 1000 / 7);  	}  	clk_mgr_dce->dfs_bypass_disp_clk = actual_clock; @@ -153,12 +151,10 @@ int dce112_set_dispclk(struct clk_mgr_internal *clk_mgr, int requested_clk_khz)  		clk_mgr->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL; -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { -			if (clk_mgr->dfs_bypass_disp_clk != actual_clock) -				dmcu->funcs->set_psr_wait_loop(dmcu, -						actual_clock / 1000 / 7); -		} +	if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { +		if (clk_mgr->dfs_bypass_disp_clk != actual_clock) +			dmcu->funcs->set_psr_wait_loop(dmcu, +					actual_clock / 1000 / 7);  	}  	clk_mgr->dfs_bypass_disp_clk = actual_clock; diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.c index 450eaead4f20..89b79dd39628 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.c @@ -135,12 +135,10 @@ int rv1_vbios_smu_set_dispclk(struct clk_mgr_internal *clk_mgr, int requested_di  			VBIOSSMC_MSG_SetDispclkFreq,  			khz_to_mhz_ceil(requested_dispclk_khz)); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { -			if (clk_mgr->dfs_bypass_disp_clk != actual_dispclk_set_mhz) -				dmcu->funcs->set_psr_wait_loop(dmcu, -						actual_dispclk_set_mhz / 7); -		} +	if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { +		if (clk_mgr->dfs_bypass_disp_clk != actual_dispclk_set_mhz) +			dmcu->funcs->set_psr_wait_loop(dmcu, +					actual_dispclk_set_mhz / 7);  	}  	return actual_dispclk_set_mhz * 1000; diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c index 650f3b4b562e..c435f7632e8e 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c @@ -531,6 +531,11 @@ void dcn20_clk_mgr_construct(  		struct pp_smu_funcs *pp_smu,  		struct dccg *dccg)  { +	int dprefclk_did; +	int target_div; +	uint32_t pll_req_reg; +	struct fixed31_32 pll_req; +  	clk_mgr->base.ctx = ctx;  	clk_mgr->pp_smu = pp_smu;  	clk_mgr->base.funcs = &dcn2_funcs; @@ -547,42 +552,34 @@ void dcn20_clk_mgr_construct(  	clk_mgr->base.dprefclk_khz = 700000; // 700 MHz planned if VCO is 3.85 GHz, will be retrieved -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		dcn2_funcs.update_clocks = dcn2_update_clocks_fpga; -		clk_mgr->base.dentist_vco_freq_khz = 3850000; - -	} else { -		/* DFS Slice 2 should be used for DPREFCLK */ -		int dprefclk_did = REG_READ(CLK3_CLK2_DFS_CNTL); -		/* Convert DPREFCLK DFS Slice DID to actual divider*/ -		int target_div = dentist_get_divider_from_did(dprefclk_did); - -		/* get FbMult value */ -		uint32_t pll_req_reg = REG_READ(CLK3_CLK_PLL_REQ); -		struct fixed31_32 pll_req; +	/* DFS Slice 2 should be used for DPREFCLK */ +	dprefclk_did = REG_READ(CLK3_CLK2_DFS_CNTL); +	/* Convert DPREFCLK DFS Slice DID to actual divider */ +	target_div = dentist_get_divider_from_did(dprefclk_did); +	/* get FbMult value */ +	pll_req_reg = REG_READ(CLK3_CLK_PLL_REQ); -		/* set up a fixed-point number -		 * this works because the int part is on the right edge of the register -		 * and the frac part is on the left edge -		 */ +	/* set up a fixed-point number +	 * this works because the int part is on the right edge of the register +	 * and the frac part is on the left edge +	 */ -		pll_req = dc_fixpt_from_int(pll_req_reg & clk_mgr->clk_mgr_mask->FbMult_int); -		pll_req.value |= pll_req_reg & clk_mgr->clk_mgr_mask->FbMult_frac; +	pll_req = dc_fixpt_from_int(pll_req_reg & clk_mgr->clk_mgr_mask->FbMult_int); +	pll_req.value |= pll_req_reg & clk_mgr->clk_mgr_mask->FbMult_frac; -		/* multiply by REFCLK period */ -		pll_req = dc_fixpt_mul_int(pll_req, 100000); +	/* multiply by REFCLK period */ +	pll_req = dc_fixpt_mul_int(pll_req, 100000); -		/* integer part is now VCO frequency in kHz */ -		clk_mgr->base.dentist_vco_freq_khz = dc_fixpt_floor(pll_req); +	/* integer part is now VCO frequency in kHz */ +	clk_mgr->base.dentist_vco_freq_khz = dc_fixpt_floor(pll_req); -		/* in case we don't get a value from the register, use default */ -		if (clk_mgr->base.dentist_vco_freq_khz == 0) -			clk_mgr->base.dentist_vco_freq_khz = 3850000; +	/* in case we don't get a value from the register, use default */ +	if (clk_mgr->base.dentist_vco_freq_khz == 0) +		clk_mgr->base.dentist_vco_freq_khz = 3850000; -		/* Calculate the DPREFCLK in kHz.*/ -		clk_mgr->base.dprefclk_khz = (DENTIST_DIVIDER_RANGE_SCALE_FACTOR -			* clk_mgr->base.dentist_vco_freq_khz) / target_div; -	} +	/* Calculate the DPREFCLK in kHz.*/ +	clk_mgr->base.dprefclk_khz = (DENTIST_DIVIDER_RANGE_SCALE_FACTOR +		* clk_mgr->base.dentist_vco_freq_khz) / target_div;  	//Integrated_info table does not exist on dGPU projects so should not be referenced  	//anywhere in code for dGPUs.  	//Also there is no plan for now that DFS BYPASS will be used on NV10/12/14. @@ -590,4 +587,3 @@ void dcn20_clk_mgr_construct(  	dce_clock_read_ss_info(clk_mgr);  } - diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c index 811720749faf..694fe4271b4d 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn201/dcn201_clk_mgr.c @@ -190,23 +190,17 @@ void dcn201_clk_mgr_construct(struct dc_context *ctx,  	clk_mgr->dprefclk_ss_divider = 1000;  	clk_mgr->ss_on_dprefclk = false; -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		dcn201_funcs.update_clocks = dcn2_update_clocks_fpga; -		clk_mgr->base.dprefclk_khz = 600000; -		clk_mgr->base.dentist_vco_freq_khz = 3000000; -	} else { -		clk_mgr->base.dprefclk_khz = REG_READ(CLK4_CLK2_CURRENT_CNT); -		clk_mgr->base.dprefclk_khz *= 100; +	clk_mgr->base.dprefclk_khz = REG_READ(CLK4_CLK2_CURRENT_CNT); +	clk_mgr->base.dprefclk_khz *= 100; -		if (clk_mgr->base.dprefclk_khz == 0) -			clk_mgr->base.dprefclk_khz = 600000; +	if (clk_mgr->base.dprefclk_khz == 0) +		clk_mgr->base.dprefclk_khz = 600000; -		REG_GET(CLK4_CLK_PLL_REQ, FbMult_int, &clk_mgr->base.dentist_vco_freq_khz); -		clk_mgr->base.dentist_vco_freq_khz *= 100000; +	REG_GET(CLK4_CLK_PLL_REQ, FbMult_int, &clk_mgr->base.dentist_vco_freq_khz); +	clk_mgr->base.dentist_vco_freq_khz *= 100000; -		if (clk_mgr->base.dentist_vco_freq_khz == 0) -			clk_mgr->base.dentist_vco_freq_khz = 3000000; -	} +	if (clk_mgr->base.dentist_vco_freq_khz == 0) +		clk_mgr->base.dentist_vco_freq_khz = 3000000;  	if (!debug->disable_dfs_bypass && bp->integrated_info)  		if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c index bd9fd0b54f46..0c6a4ab72b1d 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c @@ -705,6 +705,7 @@ void rn_clk_mgr_construct(  	struct dpm_clocks clock_table = { 0 };  	enum pp_smu_status status = 0;  	int is_green_sardine = 0; +	struct clk_log_info log_info = {0};  #if defined(CONFIG_DRM_AMD_DC_FP)  	is_green_sardine = ASICREV_IS_GREEN_SARDINE(ctx->asic_id.hw_internal_rev); @@ -725,48 +726,41 @@ void rn_clk_mgr_construct(  	clk_mgr->smu_ver = rn_vbios_smu_get_smu_version(clk_mgr); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		dcn21_funcs.update_clocks = dcn2_update_clocks_fpga; -		clk_mgr->base.dentist_vco_freq_khz = 3600000; -	} else { -		struct clk_log_info log_info = {0}; - -		clk_mgr->periodic_retraining_disabled = rn_vbios_smu_is_periodic_retraining_disabled(clk_mgr); +	clk_mgr->periodic_retraining_disabled = rn_vbios_smu_is_periodic_retraining_disabled(clk_mgr); -		/* SMU Version 55.51.0 and up no longer have an issue -		 * that needs to limit minimum dispclk */ -		if (clk_mgr->smu_ver >= SMU_VER_55_51_0) -			debug->min_disp_clk_khz = 0; +	/* SMU Version 55.51.0 and up no longer have an issue +	 * that needs to limit minimum dispclk */ +	if (clk_mgr->smu_ver >= SMU_VER_55_51_0) +		debug->min_disp_clk_khz = 0; -		/* TODO: Check we get what we expect during bringup */ -		clk_mgr->base.dentist_vco_freq_khz = get_vco_frequency_from_reg(clk_mgr); +	/* TODO: Check we get what we expect during bringup */ +	clk_mgr->base.dentist_vco_freq_khz = get_vco_frequency_from_reg(clk_mgr); -		/* in case we don't get a value from the register, use default */ -		if (clk_mgr->base.dentist_vco_freq_khz == 0) -			clk_mgr->base.dentist_vco_freq_khz = 3600000; +	/* in case we don't get a value from the register, use default */ +	if (clk_mgr->base.dentist_vco_freq_khz == 0) +		clk_mgr->base.dentist_vco_freq_khz = 3600000; -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr4MemType) { -			if (clk_mgr->periodic_retraining_disabled) { -				rn_bw_params.wm_table = lpddr4_wm_table_with_disabled_ppt; -			} else { -				if (is_green_sardine) -					rn_bw_params.wm_table = lpddr4_wm_table_gs; -				else -					rn_bw_params.wm_table = lpddr4_wm_table_rn; -			} +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr4MemType) { +		if (clk_mgr->periodic_retraining_disabled) { +			rn_bw_params.wm_table = lpddr4_wm_table_with_disabled_ppt;  		} else {  			if (is_green_sardine) -				rn_bw_params.wm_table = ddr4_wm_table_gs; -			else { -				if (ctx->dc->config.is_single_rank_dimm) -					rn_bw_params.wm_table = ddr4_1R_wm_table_rn; -				else -					rn_bw_params.wm_table = ddr4_wm_table_rn; -			} +				rn_bw_params.wm_table = lpddr4_wm_table_gs; +			else +				rn_bw_params.wm_table = lpddr4_wm_table_rn; +		} +	} else { +		if (is_green_sardine) +			rn_bw_params.wm_table = ddr4_wm_table_gs; +		else { +			if (ctx->dc->config.is_single_rank_dimm) +				rn_bw_params.wm_table = ddr4_1R_wm_table_rn; +			else +				rn_bw_params.wm_table = ddr4_wm_table_rn;  		} -		/* Saved clocks configured at boot for debug purposes */ -		rn_dump_clk_registers(&clk_mgr->base.boot_snapshot, &clk_mgr->base, &log_info);  	} +	/* Saved clocks configured at boot for debug purposes */ +	rn_dump_clk_registers(&clk_mgr->base.boot_snapshot, &clk_mgr->base, &log_info);  	clk_mgr->base.dprefclk_khz = 600000;  	dce_clock_read_ss_info(clk_mgr); @@ -786,9 +780,8 @@ void rn_clk_mgr_construct(  		}  	} -	if (!IS_FPGA_MAXIMUS_DC(ctx->dce_environment) && clk_mgr->smu_ver >= 0x00371500) { -		/* enable powerfeatures when displaycount goes to 0 */ +	/* enable powerfeatures when displaycount goes to 0 */ +	if (clk_mgr->smu_ver >= 0x00371500)  		rn_vbios_smu_enable_48mhz_tmdp_refclk_pwrdwn(clk_mgr, !debug->disable_48mhz_pwrdwn); -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c index 27fbe906682f..8c9d45e5b13b 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c @@ -147,17 +147,14 @@ int rn_vbios_smu_set_dispclk(struct clk_mgr_internal *clk_mgr, int requested_dis  			VBIOSSMC_MSG_SetDispclkFreq,  			khz_to_mhz_ceil(requested_dispclk_khz)); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { -			if (clk_mgr->dfs_bypass_disp_clk != actual_dispclk_set_mhz) -				dmcu->funcs->set_psr_wait_loop(dmcu, -						actual_dispclk_set_mhz / 7); -		} +	if (dmcu && dmcu->funcs->is_dmcu_initialized(dmcu)) { +		if (clk_mgr->dfs_bypass_disp_clk != actual_dispclk_set_mhz) +			dmcu->funcs->set_psr_wait_loop(dmcu, +					actual_dispclk_set_mhz / 7);  	}  	// pmfw always set clock more than or equal requested clock -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) -		ASSERT(actual_dispclk_set_mhz >= khz_to_mhz_ceil(requested_dispclk_khz)); +	ASSERT(actual_dispclk_set_mhz >= khz_to_mhz_ceil(requested_dispclk_khz));  	return actual_dispclk_set_mhz * 1000;  } @@ -221,15 +218,13 @@ void rn_vbios_smu_set_phyclk(struct clk_mgr_internal *clk_mgr, int requested_phy  int rn_vbios_smu_set_dppclk(struct clk_mgr_internal *clk_mgr, int requested_dpp_khz)  {  	int actual_dppclk_set_mhz = -1; -	struct dc *dc = clk_mgr->base.ctx->dc;  	actual_dppclk_set_mhz = rn_vbios_smu_send_msg_with_param(  			clk_mgr,  			VBIOSSMC_MSG_SetDppclkFreq,  			khz_to_mhz_ceil(requested_dpp_khz)); -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) -		ASSERT(actual_dppclk_set_mhz >= khz_to_mhz_ceil(requested_dpp_khz)); +	ASSERT(actual_dppclk_set_mhz >= khz_to_mhz_ceil(requested_dpp_khz));  	return actual_dppclk_set_mhz * 1000;  } diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c index 694a9d3d92ae..3271c8c7905d 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c @@ -206,7 +206,6 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,  	bool force_reset = false;  	bool update_uclk = false;  	bool p_state_change_support; -	int total_plane_count;  	if (dc->work_arounds.skip_clock_update || !clk_mgr->smu_present)  		return; @@ -247,8 +246,7 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,  		clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;  	clk_mgr_base->clks.prev_p_state_change_support = clk_mgr_base->clks.p_state_change_support; -	total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context); -	p_state_change_support = new_clocks->p_state_change_support || (total_plane_count == 0); +	p_state_change_support = new_clocks->p_state_change_support;  	// invalidate the current P-State forced min in certain dc_mode_softmax situations  	if (dc->clk_mgr->dc_mode_softmax_enabled && safe_to_lower && !p_state_change_support) { @@ -523,6 +521,8 @@ void dcn3_clk_mgr_construct(  		struct pp_smu_funcs *pp_smu,  		struct dccg *dccg)  { +	struct clk_state_registers_and_bypass s = { 0 }; +  	clk_mgr->base.ctx = ctx;  	clk_mgr->base.funcs = &dcn3_funcs;  	clk_mgr->regs = &clk_mgr_regs; @@ -539,27 +539,19 @@ void dcn3_clk_mgr_construct(  	clk_mgr->base.dprefclk_khz = 730000; // 700 MHz planned if VCO is 3.85 GHz, will be retrieved -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		clk_mgr->base.funcs  = &dcn3_fpga_funcs; -		clk_mgr->base.dentist_vco_freq_khz = 3650000; - -	} else { -		struct clk_state_registers_and_bypass s = { 0 }; +	/* integer part is now VCO frequency in kHz */ +	clk_mgr->base.dentist_vco_freq_khz = dcn30_get_vco_frequency_from_reg(clk_mgr); -		/* integer part is now VCO frequency in kHz */ -		clk_mgr->base.dentist_vco_freq_khz = dcn30_get_vco_frequency_from_reg(clk_mgr); - -		/* in case we don't get a value from the register, use default */ -		if (clk_mgr->base.dentist_vco_freq_khz == 0) -			clk_mgr->base.dentist_vco_freq_khz = 3650000; -		/* Convert dprefclk units from MHz to KHz */ -		/* Value already divided by 10, some resolution lost */ +	/* in case we don't get a value from the register, use default */ +	if (clk_mgr->base.dentist_vco_freq_khz == 0) +		clk_mgr->base.dentist_vco_freq_khz = 3650000; +	/* Convert dprefclk units from MHz to KHz */ +	/* Value already divided by 10, some resolution lost */ -		/*TODO: uncomment assert once dcn3_dump_clk_registers is implemented */ -		//ASSERT(s.dprefclk != 0); -		if (s.dprefclk != 0) -			clk_mgr->base.dprefclk_khz = s.dprefclk * 1000; -	} +	/*TODO: uncomment assert once dcn3_dump_clk_registers is implemented */ +	//ASSERT(s.dprefclk != 0); +	if (s.dprefclk != 0) +		clk_mgr->base.dprefclk_khz = s.dprefclk * 1000;  	clk_mgr->dfs_bypass_enabled = false; diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c index 1fbf1c105dc1..bdbf18306698 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.c @@ -312,6 +312,9 @@ void dcn30_smu_set_display_refresh_from_mall(struct clk_mgr_internal *clk_mgr, b  	/* bits 8:7 for cache timer scale, bits 6:1 for cache timer delay, bit 0 = 1 for enable, = 0 for disable */  	uint32_t param = (cache_timer_scale << 7) | (cache_timer_delay << 1) | (enable ? 1 : 0); +	smu_print("SMU Set display refresh from mall: enable = %d, cache_timer_delay = %d, cache_timer_scale = %d\n", +		enable, cache_timer_delay, cache_timer_scale); +  	dcn30_smu_send_msg_with_param(clk_mgr,  			DALSMC_MSG_SetDisplayRefreshFromMall, param, NULL);  } diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c index 01383aac6b41..a5489fe6875f 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn301/vg_clk_mgr.c @@ -117,7 +117,7 @@ static void vg_update_clocks(struct clk_mgr *clk_mgr_base,  			display_count = vg_get_active_display_cnt_wa(dc, context);  			/* if we can go lower, go lower */ -			if (display_count == 0 && !IS_DIAG_DC(dc->ctx->dce_environment)) { +			if (display_count == 0) {  				union display_idle_optimization_u idle_info = { 0 };  				idle_info.idle_info.df_request_disabled = 1; @@ -151,10 +151,8 @@ static void vg_update_clocks(struct clk_mgr *clk_mgr_base,  	}  	// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (new_clocks->dppclk_khz < 100000) -			new_clocks->dppclk_khz = 100000; -	} +	if (new_clocks->dppclk_khz < 100000) +		new_clocks->dppclk_khz = 100000;  	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {  		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) @@ -664,6 +662,7 @@ void vg_clk_mgr_construct(  		struct dccg *dccg)  {  	struct smu_dpm_clks smu_dpm_clks = { 0 }; +	struct clk_log_info log_info = {0};  	clk_mgr->base.base.ctx = ctx;  	clk_mgr->base.base.funcs = &vg_funcs; @@ -703,32 +702,25 @@ void vg_clk_mgr_construct(  	ASSERT(smu_dpm_clks.dpm_clks); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		vg_funcs.update_clocks = dcn2_update_clocks_fpga; -		clk_mgr->base.base.dentist_vco_freq_khz = 3600000; -	} else { -		struct clk_log_info log_info = {0}; +	clk_mgr->base.smu_ver = dcn301_smu_get_smu_version(&clk_mgr->base); -		clk_mgr->base.smu_ver = dcn301_smu_get_smu_version(&clk_mgr->base); +	if (clk_mgr->base.smu_ver) +		clk_mgr->base.smu_present = true; -		if (clk_mgr->base.smu_ver) -			clk_mgr->base.smu_present = true; +	/* TODO: Check we get what we expect during bringup */ +	clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); -		/* TODO: Check we get what we expect during bringup */ -		clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); - -		/* in case we don't get a value from the register, use default */ -		if (clk_mgr->base.base.dentist_vco_freq_khz == 0) -			clk_mgr->base.base.dentist_vco_freq_khz = 3600000; +	/* in case we don't get a value from the register, use default */ +	if (clk_mgr->base.base.dentist_vco_freq_khz == 0) +		clk_mgr->base.base.dentist_vco_freq_khz = 3600000; -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { -			vg_bw_params.wm_table = lpddr5_wm_table; -		} else { -			vg_bw_params.wm_table = ddr4_wm_table; -		} -		/* Saved clocks configured at boot for debug purposes */ -		vg_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, &clk_mgr->base.base, &log_info); +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { +		vg_bw_params.wm_table = lpddr5_wm_table; +	} else { +		vg_bw_params.wm_table = ddr4_wm_table;  	} +	/* Saved clocks configured at boot for debug purposes */ +	vg_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, &clk_mgr->base.base, &log_info);  	clk_mgr->base.base.dprefclk_khz = 600000;  	dce_clock_read_ss_info(&clk_mgr->base); @@ -746,12 +738,6 @@ void vg_clk_mgr_construct(  	if (smu_dpm_clks.dpm_clks && smu_dpm_clks.mc_address.quad_part != 0)  		dm_helpers_free_gpu_mem(clk_mgr->base.base.ctx, DC_MEM_ALLOC_TYPE_FRAME_BUFFER,  				smu_dpm_clks.dpm_clks); -/* -	if (!IS_FPGA_MAXIMUS_DC(ctx->dce_environment) && clk_mgr->base.smu_ver) { -		 enable powerfeatures when displaycount goes to 0 -		dcn301_smu_enable_phy_refclk_pwrdwn(clk_mgr, !debug->disable_48mhz_pwrdwn); -	} -*/  }  void vg_clk_mgr_destroy(struct clk_mgr_internal *clk_mgr_int) diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c index f9e2e0c3095e..7ccd96959256 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c @@ -205,10 +205,8 @@ void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,  	}  	// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (new_clocks->dppclk_khz < 100000) -			new_clocks->dppclk_khz = 100000; -	} +	if (new_clocks->dppclk_khz < 100000) +		new_clocks->dppclk_khz = 100000;  	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {  		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) @@ -250,9 +248,7 @@ void dcn31_update_clocks(struct clk_mgr *clk_mgr_base,  	cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;  	cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr) @@ -674,6 +670,7 @@ void dcn31_clk_mgr_construct(  		struct dccg *dccg)  {  	struct dcn31_smu_dpm_clks smu_dpm_clks = { 0 }; +	struct clk_log_info log_info = {0};  	clk_mgr->base.base.ctx = ctx;  	clk_mgr->base.base.funcs = &dcn31_funcs; @@ -713,29 +710,22 @@ void dcn31_clk_mgr_construct(  	ASSERT(smu_dpm_clks.dpm_clks); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		clk_mgr->base.base.funcs = &dcn3_fpga_funcs; -	} else { -		struct clk_log_info log_info = {0}; - -		clk_mgr->base.smu_ver = dcn31_smu_get_smu_version(&clk_mgr->base); +	clk_mgr->base.smu_ver = dcn31_smu_get_smu_version(&clk_mgr->base); -		if (clk_mgr->base.smu_ver) -			clk_mgr->base.smu_present = true; +	if (clk_mgr->base.smu_ver) +		clk_mgr->base.smu_present = true; -		/* TODO: Check we get what we expect during bringup */ -		clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); - -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { -			dcn31_bw_params.wm_table = lpddr5_wm_table; -		} else { -			dcn31_bw_params.wm_table = ddr5_wm_table; -		} -		/* Saved clocks configured at boot for debug purposes */ -		dcn31_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, -					 &clk_mgr->base.base, &log_info); +	/* TODO: Check we get what we expect during bringup */ +	clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { +		dcn31_bw_params.wm_table = lpddr5_wm_table; +	} else { +		dcn31_bw_params.wm_table = ddr5_wm_table;  	} +	/* Saved clocks configured at boot for debug purposes */ +	dcn31_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, +				 &clk_mgr->base.base, &log_info);  	clk_mgr->base.base.dprefclk_khz = 600000;  	clk_mgr->base.base.clks.ref_dtbclk_khz = 600000; diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c index 0827c7df2855..32279c5db724 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn31/dcn31_smu.c @@ -130,7 +130,7 @@ static int dcn31_smu_send_msg_with_param(struct clk_mgr_internal *clk_mgr,  	if (result == VBIOSSMC_Result_Failed) {  		if (msg_id == VBIOSSMC_MSG_TransferTableDram2Smu &&  		    param == TABLE_WATERMARKS) -			DC_LOG_WARNING("Watermarks table not configured properly by SMU"); +			DC_LOG_DEBUG("Watermarks table not configured properly by SMU");  		else  			ASSERT(0);  		REG_WRITE(MP1_SMN_C2PMSG_91, VBIOSSMC_Result_OK); diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c index 5cb44f838bde..2f7c8996b19d 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c @@ -241,10 +241,8 @@ void dcn314_update_clocks(struct clk_mgr *clk_mgr_base,  	}  	// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (new_clocks->dppclk_khz < 100000) -			new_clocks->dppclk_khz = 100000; -	} +	if (new_clocks->dppclk_khz < 100000) +		new_clocks->dppclk_khz = 100000;  	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {  		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) @@ -286,9 +284,7 @@ void dcn314_update_clocks(struct clk_mgr *clk_mgr_base,  	cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;  	cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr) @@ -405,32 +401,32 @@ static struct wm_table lpddr5_wm_table = {  			.wm_inst = WM_A,  			.wm_type = WM_TYPE_PSTATE_CHG,  			.pstate_latency_us = 11.65333, -			.sr_exit_time_us = 16.5, -			.sr_enter_plus_exit_time_us = 18.5, +			.sr_exit_time_us = 30.0, +			.sr_enter_plus_exit_time_us = 32.0,  			.valid = true,  		},  		{  			.wm_inst = WM_B,  			.wm_type = WM_TYPE_PSTATE_CHG,  			.pstate_latency_us = 11.65333, -			.sr_exit_time_us = 16.5, -			.sr_enter_plus_exit_time_us = 18.5, +			.sr_exit_time_us = 30.0, +			.sr_enter_plus_exit_time_us = 32.0,  			.valid = true,  		},  		{  			.wm_inst = WM_C,  			.wm_type = WM_TYPE_PSTATE_CHG,  			.pstate_latency_us = 11.65333, -			.sr_exit_time_us = 16.5, -			.sr_enter_plus_exit_time_us = 18.5, +			.sr_exit_time_us = 30.0, +			.sr_enter_plus_exit_time_us = 32.0,  			.valid = true,  		},  		{  			.wm_inst = WM_D,  			.wm_type = WM_TYPE_PSTATE_CHG,  			.pstate_latency_us = 11.65333, -			.sr_exit_time_us = 16.5, -			.sr_enter_plus_exit_time_us = 18.5, +			.sr_exit_time_us = 30.0, +			.sr_enter_plus_exit_time_us = 32.0,  			.valid = true,  		},  	} @@ -726,6 +722,7 @@ void dcn314_clk_mgr_construct(  		struct dccg *dccg)  {  	struct dcn314_smu_dpm_clks smu_dpm_clks = { 0 }; +	struct clk_log_info log_info = {0};  	clk_mgr->base.base.ctx = ctx;  	clk_mgr->base.base.funcs = &dcn314_funcs; @@ -765,29 +762,22 @@ void dcn314_clk_mgr_construct(  	ASSERT(smu_dpm_clks.dpm_clks); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		clk_mgr->base.base.funcs = &dcn3_fpga_funcs; -	} else { -		struct clk_log_info log_info = {0}; - -		clk_mgr->base.smu_ver = dcn314_smu_get_smu_version(&clk_mgr->base); +	clk_mgr->base.smu_ver = dcn314_smu_get_smu_version(&clk_mgr->base); -		if (clk_mgr->base.smu_ver) -			clk_mgr->base.smu_present = true; +	if (clk_mgr->base.smu_ver) +		clk_mgr->base.smu_present = true; -		/* TODO: Check we get what we expect during bringup */ -		clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); +	/* TODO: Check we get what we expect during bringup */ +	clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) -			dcn314_bw_params.wm_table = lpddr5_wm_table; -		else -			dcn314_bw_params.wm_table = ddr5_wm_table; +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) +		dcn314_bw_params.wm_table = lpddr5_wm_table; +	else +		dcn314_bw_params.wm_table = ddr5_wm_table; -		/* Saved clocks configured at boot for debug purposes */ -		dcn314_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, -					  &clk_mgr->base.base, &log_info); - -	} +	/* Saved clocks configured at boot for debug purposes */ +	dcn314_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, +				  &clk_mgr->base.base, &log_info);  	clk_mgr->base.base.dprefclk_khz = 600000;  	clk_mgr->base.base.clks.ref_dtbclk_khz = 600000; diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c index 0765334f0825..07baa10a8647 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_smu.c @@ -145,7 +145,7 @@ static int dcn314_smu_send_msg_with_param(struct clk_mgr_internal *clk_mgr,  	if (result == VBIOSSMC_Result_Failed) {  		if (msg_id == VBIOSSMC_MSG_TransferTableDram2Smu &&  		    param == TABLE_WATERMARKS) -			DC_LOG_WARNING("Watermarks table not configured properly by SMU"); +			DC_LOG_DEBUG("Watermarks table not configured properly by SMU");  		else if (msg_id == VBIOSSMC_MSG_SetHardMinDcfclkByFreq ||  			 msg_id == VBIOSSMC_MSG_SetMinDeepSleepDcfclk)  			DC_LOG_WARNING("DCFCLK_DPM is not enabled by BIOS"); diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c index b737cbc468f5..b2c4f97afc8b 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c @@ -184,12 +184,10 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,  	}  	// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (new_clocks->dppclk_khz < MIN_DPP_DISP_CLK) -			new_clocks->dppclk_khz = MIN_DPP_DISP_CLK; -		if (new_clocks->dispclk_khz < MIN_DPP_DISP_CLK) -			new_clocks->dispclk_khz = MIN_DPP_DISP_CLK; -	} +	if (new_clocks->dppclk_khz < MIN_DPP_DISP_CLK) +		new_clocks->dppclk_khz = MIN_DPP_DISP_CLK; +	if (new_clocks->dispclk_khz < MIN_DPP_DISP_CLK) +		new_clocks->dispclk_khz = MIN_DPP_DISP_CLK;  	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {  		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) @@ -234,9 +232,7 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,  	cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;  	cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static void dcn315_dump_clk_registers(struct clk_state_registers_and_bypass *regs_and_bypass, @@ -602,6 +598,7 @@ void dcn315_clk_mgr_construct(  		struct dccg *dccg)  {  	struct dcn315_smu_dpm_clks smu_dpm_clks = { 0 }; +	struct clk_log_info log_info = {0};  	clk_mgr->base.base.ctx = ctx;  	clk_mgr->base.base.funcs = &dcn315_funcs; @@ -641,26 +638,19 @@ void dcn315_clk_mgr_construct(  	ASSERT(smu_dpm_clks.dpm_clks); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		clk_mgr->base.base.funcs = &dcn3_fpga_funcs; -	} else { -		struct clk_log_info log_info = {0}; - -		clk_mgr->base.smu_ver = dcn315_smu_get_smu_version(&clk_mgr->base); +	clk_mgr->base.smu_ver = dcn315_smu_get_smu_version(&clk_mgr->base); -		if (clk_mgr->base.smu_ver > 0) -			clk_mgr->base.smu_present = true; - -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { -			dcn315_bw_params.wm_table = lpddr5_wm_table; -		} else { -			dcn315_bw_params.wm_table = ddr5_wm_table; -		} -		/* Saved clocks configured at boot for debug purposes */ -		dcn315_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, -					  &clk_mgr->base.base, &log_info); +	if (clk_mgr->base.smu_ver > 0) +		clk_mgr->base.smu_present = true; +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { +		dcn315_bw_params.wm_table = lpddr5_wm_table; +	} else { +		dcn315_bw_params.wm_table = ddr5_wm_table;  	} +	/* Saved clocks configured at boot for debug purposes */ +	dcn315_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, +				  &clk_mgr->base.base, &log_info);  	clk_mgr->base.base.dprefclk_khz = 600000;  	clk_mgr->base.base.dprefclk_khz = dcn315_smu_get_dpref_clk(&clk_mgr->base); diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c index 93db4dbee713..d7de756301cf 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn316/dcn316_clk_mgr.c @@ -207,12 +207,10 @@ static void dcn316_update_clocks(struct clk_mgr *clk_mgr_base,  	}  	// workaround: Limit dppclk to 100Mhz to avoid lower eDP panel switch to plus 4K monitor underflow. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (new_clocks->dppclk_khz < 100000) -			new_clocks->dppclk_khz = 100000; -		if (new_clocks->dispclk_khz < 100000) -			new_clocks->dispclk_khz = 100000; -	} +	if (new_clocks->dppclk_khz < 100000) +		new_clocks->dppclk_khz = 100000; +	if (new_clocks->dispclk_khz < 100000) +		new_clocks->dispclk_khz = 100000;  	if (should_set_clock(safe_to_lower, new_clocks->dppclk_khz, clk_mgr->base.clks.dppclk_khz)) {  		if (clk_mgr->base.clks.dppclk_khz > new_clocks->dppclk_khz) @@ -254,9 +252,7 @@ static void dcn316_update_clocks(struct clk_mgr *clk_mgr_base,  	cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;  	cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static void dcn316_dump_clk_registers(struct clk_state_registers_and_bypass *regs_and_bypass, @@ -618,6 +614,7 @@ void dcn316_clk_mgr_construct(  		struct dccg *dccg)  {  	struct dcn316_smu_dpm_clks smu_dpm_clks = { 0 }; +	struct clk_log_info log_info = {0};  	clk_mgr->base.base.ctx = ctx;  	clk_mgr->base.base.funcs = &dcn316_funcs; @@ -657,35 +654,27 @@ void dcn316_clk_mgr_construct(  	ASSERT(smu_dpm_clks.dpm_clks); -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		clk_mgr->base.base.funcs = &dcn3_fpga_funcs; -		clk_mgr->base.base.dentist_vco_freq_khz = 2500000; -	} else { -		struct clk_log_info log_info = {0}; - -		clk_mgr->base.smu_ver = dcn316_smu_get_smu_version(&clk_mgr->base); +	clk_mgr->base.smu_ver = dcn316_smu_get_smu_version(&clk_mgr->base); -		if (clk_mgr->base.smu_ver > 0) -			clk_mgr->base.smu_present = true; +	if (clk_mgr->base.smu_ver > 0) +		clk_mgr->base.smu_present = true; -		// Skip this for now as it did not work on DCN315, renable during bring up -		clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); +	// Skip this for now as it did not work on DCN315, renable during bring up +	clk_mgr->base.base.dentist_vco_freq_khz = get_vco_frequency_from_reg(&clk_mgr->base); -		/* in case we don't get a value from the register, use default */ -		if (clk_mgr->base.base.dentist_vco_freq_khz == 0) -			clk_mgr->base.base.dentist_vco_freq_khz = 2500000; /* 2400MHz */ +	/* in case we don't get a value from the register, use default */ +	if (clk_mgr->base.base.dentist_vco_freq_khz == 0) +		clk_mgr->base.base.dentist_vco_freq_khz = 2500000; /* 2400MHz */ -		if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { -			dcn316_bw_params.wm_table = lpddr5_wm_table; -		} else { -			dcn316_bw_params.wm_table = ddr4_wm_table; -		} -		/* Saved clocks configured at boot for debug purposes */ -		dcn316_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, -					  &clk_mgr->base.base, &log_info); - +	if (ctx->dc_bios->integrated_info->memory_type == LpDdr5MemType) { +		dcn316_bw_params.wm_table = lpddr5_wm_table; +	} else { +		dcn316_bw_params.wm_table = ddr4_wm_table;  	} +	/* Saved clocks configured at boot for debug purposes */ +	dcn316_dump_clk_registers(&clk_mgr->base.base.boot_snapshot, +				  &clk_mgr->base.base, &log_info);  	clk_mgr->base.base.dprefclk_khz = 600000;  	clk_mgr->base.base.dprefclk_khz = dcn316_smu_get_dpref_clk(&clk_mgr->base); diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c index 8d9444db092a..6a811755e2e6 100644 --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c @@ -182,23 +182,32 @@ void dcn32_init_clocks(struct clk_mgr *clk_mgr_base)  	dcn32_init_single_clock(clk_mgr, PPCLK_DCFCLK,  			&clk_mgr_base->bw_params->clk_table.entries[0].dcfclk_mhz,  			&num_entries_per_clk->num_dcfclk_levels); +	clk_mgr_base->bw_params->dc_mode_limit.dcfclk_mhz = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_DCFCLK);  	/* SOCCLK */  	dcn32_init_single_clock(clk_mgr, PPCLK_SOCCLK,  					&clk_mgr_base->bw_params->clk_table.entries[0].socclk_mhz,  					&num_entries_per_clk->num_socclk_levels); +	clk_mgr_base->bw_params->dc_mode_limit.socclk_mhz = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_SOCCLK);  	/* DTBCLK */ -	if (!clk_mgr->base.ctx->dc->debug.disable_dtb_ref_clk_switch) +	if (!clk_mgr->base.ctx->dc->debug.disable_dtb_ref_clk_switch) {  		dcn32_init_single_clock(clk_mgr, PPCLK_DTBCLK,  				&clk_mgr_base->bw_params->clk_table.entries[0].dtbclk_mhz,  				&num_entries_per_clk->num_dtbclk_levels); +		clk_mgr_base->bw_params->dc_mode_limit.dtbclk_mhz = +				dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_DTBCLK); +	}  	/* DISPCLK */  	dcn32_init_single_clock(clk_mgr, PPCLK_DISPCLK,  			&clk_mgr_base->bw_params->clk_table.entries[0].dispclk_mhz,  			&num_entries_per_clk->num_dispclk_levels);  	num_levels = num_entries_per_clk->num_dispclk_levels; +	clk_mgr_base->bw_params->dc_mode_limit.dispclk_mhz = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_DISPCLK); +	//HW recommends limit of 1950 MHz in display clock for all DCN3.2.x +	if (clk_mgr_base->bw_params->dc_mode_limit.dispclk_mhz > 1950) +		clk_mgr_base->bw_params->dc_mode_limit.dispclk_mhz = 1950;  	if (num_entries_per_clk->num_dcfclk_levels &&  			num_entries_per_clk->num_dtbclk_levels && @@ -233,6 +242,32 @@ void dcn32_init_clocks(struct clk_mgr *clk_mgr_base)  	DC_FP_END();  } +static void dcn32_update_clocks_update_dtb_dto(struct clk_mgr_internal *clk_mgr, +			struct dc_state *context, +			int ref_dtbclk_khz) +{ +	struct dccg *dccg = clk_mgr->dccg; +	uint32_t tg_mask = 0; +	int i; + +	for (i = 0; i < clk_mgr->base.ctx->dc->res_pool->pipe_count; i++) { +		struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; +		struct dtbclk_dto_params dto_params = {0}; + +		/* use mask to program DTO once per tg */ +		if (pipe_ctx->stream_res.tg && +				!(tg_mask & (1 << pipe_ctx->stream_res.tg->inst))) { +			tg_mask |= (1 << pipe_ctx->stream_res.tg->inst); + +			dto_params.otg_inst = pipe_ctx->stream_res.tg->inst; +			dto_params.ref_dtbclk_khz = ref_dtbclk_khz; + +			dccg->funcs->set_dtbclk_dto(clk_mgr->dccg, &dto_params); +			//dccg->funcs->set_audio_dtbclk_dto(clk_mgr->dccg, &dto_params); +		} +	} +} +  /* Since DPPCLK request to PMFW needs to be exact (due to DPP DTO programming),   * update DPPCLK to be the exact frequency that will be set after the DPPCLK   * divider is updated. This will prevent rounding issues that could cause DPP @@ -433,10 +468,6 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  	bool update_uclk = false, update_fclk = false;  	bool p_state_change_support;  	bool fclk_p_state_change_support; -	int total_plane_count; - -	if (dc->work_arounds.skip_clock_update) -		return;  	if (clk_mgr_base->clks.dispclk_khz == 0 ||  			(dc->debug.force_clock_mode & 0x1)) { @@ -462,10 +493,10 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  		clk_mgr_base->clks.fclk_prev_p_state_change_support = clk_mgr_base->clks.fclk_p_state_change_support; -		total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context); -		fclk_p_state_change_support = new_clocks->fclk_p_state_change_support || (total_plane_count == 0); +		fclk_p_state_change_support = new_clocks->fclk_p_state_change_support; -		if (should_update_pstate_support(safe_to_lower, fclk_p_state_change_support, clk_mgr_base->clks.fclk_p_state_change_support)) { +		if (should_update_pstate_support(safe_to_lower, fclk_p_state_change_support, clk_mgr_base->clks.fclk_p_state_change_support) && +				!dc->work_arounds.clock_update_disable_mask.fclk) {  			clk_mgr_base->clks.fclk_p_state_change_support = fclk_p_state_change_support;  			/* To enable FCLK P-state switching, send FCLK_PSTATE_SUPPORTED message to PMFW */ @@ -479,12 +510,14 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  			new_clocks->dcfclk_khz = (new_clocks->dcfclk_khz > (dc->debug.force_min_dcfclk_mhz * 1000)) ?  					new_clocks->dcfclk_khz : (dc->debug.force_min_dcfclk_mhz * 1000); -		if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr_base->clks.dcfclk_khz)) { +		if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr_base->clks.dcfclk_khz) && +				!dc->work_arounds.clock_update_disable_mask.dcfclk) {  			clk_mgr_base->clks.dcfclk_khz = new_clocks->dcfclk_khz;  			dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_DCFCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_khz));  		} -		if (should_set_clock(safe_to_lower, new_clocks->dcfclk_deep_sleep_khz, clk_mgr_base->clks.dcfclk_deep_sleep_khz)) { +		if (should_set_clock(safe_to_lower, new_clocks->dcfclk_deep_sleep_khz, clk_mgr_base->clks.dcfclk_deep_sleep_khz) && +				!dc->work_arounds.clock_update_disable_mask.dcfclk_ds) {  			clk_mgr_base->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;  			dcn30_smu_set_min_deep_sleep_dcef_clk(clk_mgr, khz_to_mhz_ceil(clk_mgr_base->clks.dcfclk_deep_sleep_khz));  		} @@ -502,9 +535,9 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  			dcn32_smu_send_cab_for_uclk_message(clk_mgr, clk_mgr_base->clks.num_ways);  		} - -		p_state_change_support = new_clocks->p_state_change_support || (total_plane_count == 0); -		if (should_update_pstate_support(safe_to_lower, p_state_change_support, clk_mgr_base->clks.p_state_change_support)) { +		p_state_change_support = new_clocks->p_state_change_support; +		if (should_update_pstate_support(safe_to_lower, p_state_change_support, clk_mgr_base->clks.p_state_change_support) && +				!dc->work_arounds.clock_update_disable_mask.uclk) {  			clk_mgr_base->clks.p_state_change_support = p_state_change_support;  			/* to disable P-State switching, set UCLK min = max */ @@ -518,20 +551,23 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  			update_fclk = true;  		} -		if (clk_mgr_base->ctx->dce_version != DCN_VERSION_3_21 && !clk_mgr_base->clks.fclk_p_state_change_support && update_fclk) { +		if (clk_mgr_base->ctx->dce_version != DCN_VERSION_3_21 && !clk_mgr_base->clks.fclk_p_state_change_support && update_fclk && +				!dc->work_arounds.clock_update_disable_mask.fclk) {  			/* Handle code for sending a message to PMFW that FCLK P-state change is not supported */  			dcn32_smu_send_fclk_pstate_message(clk_mgr, FCLK_PSTATE_NOTSUPPORTED);  		}  		/* Always update saved value, even if new value not set due to P-State switching unsupported */ -		if (should_set_clock(safe_to_lower, new_clocks->dramclk_khz, clk_mgr_base->clks.dramclk_khz)) { +		if (should_set_clock(safe_to_lower, new_clocks->dramclk_khz, clk_mgr_base->clks.dramclk_khz) && +				!dc->work_arounds.clock_update_disable_mask.uclk) {  			clk_mgr_base->clks.dramclk_khz = new_clocks->dramclk_khz;  			update_uclk = true;  		}  		/* set UCLK to requested value if P-State switching is supported, or to re-enable P-State switching */  		if (clk_mgr_base->clks.p_state_change_support && -				(update_uclk || !clk_mgr_base->clks.prev_p_state_change_support)) +				(update_uclk || !clk_mgr_base->clks.prev_p_state_change_support) && +				!dc->work_arounds.clock_update_disable_mask.uclk)  			dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz));  		if (clk_mgr_base->clks.num_ways != new_clocks->num_ways && @@ -570,6 +606,7 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,  		/* DCCG requires KHz precision for DTBCLK */  		clk_mgr_base->clks.ref_dtbclk_khz =  				dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_DTBCLK, khz_to_mhz_ceil(new_clocks->ref_dtbclk_khz)); +		dcn32_update_clocks_update_dtb_dto(clk_mgr, context, clk_mgr_base->clks.ref_dtbclk_khz);  	}  	if (dc->config.forced_clocks == false || (force_reset && safe_to_lower)) { @@ -789,6 +826,7 @@ static void dcn32_get_memclk_states_from_smu(struct clk_mgr *clk_mgr_base)  	dcn32_init_single_clock(clk_mgr, PPCLK_UCLK,  			&clk_mgr_base->bw_params->clk_table.entries[0].memclk_mhz,  			&num_entries_per_clk->num_memclk_levels); +	clk_mgr_base->bw_params->dc_mode_limit.memclk_mhz = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_UCLK);  	/* memclk must have at least one level */  	num_entries_per_clk->num_memclk_levels = num_entries_per_clk->num_memclk_levels ? num_entries_per_clk->num_memclk_levels : 1; @@ -796,6 +834,7 @@ static void dcn32_get_memclk_states_from_smu(struct clk_mgr *clk_mgr_base)  	dcn32_init_single_clock(clk_mgr, PPCLK_FCLK,  			&clk_mgr_base->bw_params->clk_table.entries[0].fclk_mhz,  			&num_entries_per_clk->num_fclk_levels); +	clk_mgr_base->bw_params->dc_mode_limit.fclk_mhz = dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_FCLK);  	if (num_entries_per_clk->num_memclk_levels >= num_entries_per_clk->num_fclk_levels) {  		num_levels = num_entries_per_clk->num_memclk_levels; diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index 52564b93f7eb..be72e03cdf92 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -515,8 +515,7 @@ dc_stream_forward_dmub_crc_window(struct dc_dmub_srv *dmub_srv,  		cmd.secure_display.roi_info.y_end = rect->y + rect->height;  	} -	dc_dmub_srv_cmd_queue(dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); +	dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);  }  static inline void @@ -858,7 +857,6 @@ static bool dc_construct_ctx(struct dc *dc,  		const struct dc_init_data *init_params)  {  	struct dc_context *dc_ctx; -	enum dce_version dc_version = DCE_VERSION_UNKNOWN;  	dc_ctx = kzalloc(sizeof(*dc_ctx), GFP_KERNEL);  	if (!dc_ctx) @@ -876,8 +874,7 @@ static bool dc_construct_ctx(struct dc *dc,  	/* Create logger */ -	dc_version = resource_parse_asic_id(init_params->asic_id); -	dc_ctx->dce_version = dc_version; +	dc_ctx->dce_version = resource_parse_asic_id(init_params->asic_id);  	dc_ctx->perf_trace = dc_perf_trace_create();  	if (!dc_ctx->perf_trace) { @@ -1120,6 +1117,33 @@ static void phantom_pipe_blank(  		hws->funcs.wait_for_blank_complete(opp);  } +static void dc_update_viusal_confirm_color(struct dc *dc, struct dc_state *context, struct pipe_ctx *pipe_ctx) +{ +	if (dc->ctx->dce_version >= DCN_VERSION_1_0) { +		memset(&pipe_ctx->visual_confirm_color, 0, sizeof(struct tg_color)); + +		if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) +			get_hdr_visual_confirm_color(pipe_ctx, &(pipe_ctx->visual_confirm_color)); +		else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) +			get_surface_visual_confirm_color(pipe_ctx, &(pipe_ctx->visual_confirm_color)); +		else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SWIZZLE) +			get_surface_tile_visual_confirm_color(pipe_ctx, &(pipe_ctx->visual_confirm_color)); +		else { +			if (dc->ctx->dce_version < DCN_VERSION_2_0) +				color_space_to_black_color( +					dc, pipe_ctx->stream->output_color_space, &(pipe_ctx->visual_confirm_color)); +		} +		if (dc->ctx->dce_version >= DCN_VERSION_2_0) { +			if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) +				get_mpctree_visual_confirm_color(pipe_ctx, &(pipe_ctx->visual_confirm_color)); +			else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SUBVP) +				get_subvp_visual_confirm_color(dc, context, pipe_ctx, &(pipe_ctx->visual_confirm_color)); +			else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MCLK_SWITCH) +				get_mclk_switch_visual_confirm_color(dc, context, pipe_ctx, &(pipe_ctx->visual_confirm_color)); +		} +	} +} +  static void disable_dangling_plane(struct dc *dc, struct dc_state *context)  {  	int i, j; @@ -1190,6 +1214,9 @@ static void disable_dangling_plane(struct dc *dc, struct dc_state *context)  			dc_rem_all_planes_for_stream(dc, old_stream, dangling_context);  			disable_all_writeback_pipes_for_stream(dc, old_stream, dangling_context); +			if (pipe->stream && pipe->plane_state) +				dc_update_viusal_confirm_color(dc, context, pipe); +  			if (dc->hwss.apply_ctx_for_surface) {  				apply_ctx_interdependent_lock(dc, dc->current_state, old_stream, true);  				dc->hwss.apply_ctx_for_surface(dc, old_stream, 0, dangling_context); @@ -1269,7 +1296,7 @@ static void disable_vbios_mode_if_required(  					if (pix_clk_100hz != requested_pix_clk_100hz) {  						dc->link_srv->set_dpms_off(pipe); -						pipe->stream->dpms_off = false; +						pipe->stream->dpms_off = true;  					}  				}  			} @@ -1981,6 +2008,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c  	return result;  } +static bool commit_minimal_transition_state(struct dc *dc, +		struct dc_state *transition_base_context); +  /**   * dc_commit_streams - Commit current stream state   * @@ -2002,6 +2032,8 @@ enum dc_status dc_commit_streams(struct dc *dc,  	struct dc_state *context;  	enum dc_status res = DC_OK;  	struct dc_validation_set set[MAX_STREAMS] = {0}; +	struct pipe_ctx *pipe; +	bool handle_exit_odm2to1 = false;  	if (dc->ctx->dce_environment == DCE_ENV_VIRTUAL_HW)  		return res; @@ -2026,6 +2058,22 @@ enum dc_status dc_commit_streams(struct dc *dc,  		}  	} +	/* Check for case where we are going from odm 2:1 to max +	 *  pipe scenario.  For these cases, we will call +	 *  commit_minimal_transition_state() to exit out of odm 2:1 +	 *  first before processing new streams +	 */ +	if (stream_count == dc->res_pool->pipe_count) { +		for (i = 0; i < dc->res_pool->pipe_count; i++) { +			pipe = &dc->current_state->res_ctx.pipe_ctx[i]; +			if (pipe->next_odm_pipe) +				handle_exit_odm2to1 = true; +		} +	} + +	if (handle_exit_odm2to1) +		res = commit_minimal_transition_state(dc, dc->current_state); +  	context = dc_create_state(dc);  	if (!context)  		goto context_alloc_fail; @@ -2483,9 +2531,6 @@ static enum surface_update_type det_surface_update(const struct dc *dc,  	enum surface_update_type overall_type = UPDATE_TYPE_FAST;  	union surface_update_flags *update_flags = &u->surface->update_flags; -	if (u->flip_addr) -		update_flags->bits.addr_update = 1; -  	if (!is_surface_in_context(context, u->surface) || u->surface->force_full_update) {  		update_flags->raw = 0xFFFFFFFF;  		return UPDATE_TYPE_FULL; @@ -2544,15 +2589,19 @@ static enum surface_update_type det_surface_update(const struct dc *dc,  		elevate_update_type(&overall_type, type);  	} -	if (update_flags->bits.input_csc_change -			|| update_flags->bits.coeff_reduction_change -			|| update_flags->bits.lut_3d -			|| update_flags->bits.gamma_change -			|| update_flags->bits.gamut_remap_change) { +	if (update_flags->bits.lut_3d) {  		type = UPDATE_TYPE_FULL;  		elevate_update_type(&overall_type, type);  	} +	if (dc->debug.enable_legacy_fast_update && +			(update_flags->bits.gamma_change || +			update_flags->bits.gamut_remap_change || +			update_flags->bits.input_csc_change || +			update_flags->bits.coeff_reduction_change)) { +		type = UPDATE_TYPE_FULL; +		elevate_update_type(&overall_type, type); +	}  	return overall_type;  } @@ -2585,7 +2634,7 @@ static enum surface_update_type check_update_surfaces_for_stream(  			stream_update->integer_scaling_update)  			su_flags->bits.scaling = 1; -		if (stream_update->out_transfer_func) +		if (dc->debug.enable_legacy_fast_update && stream_update->out_transfer_func)  			su_flags->bits.out_tf = 1;  		if (stream_update->abm_level) @@ -2605,14 +2654,23 @@ static enum surface_update_type check_update_surfaces_for_stream(  		if (stream_update->mst_bw_update)  			su_flags->bits.mst_bw = 1; -		if (stream_update->crtc_timing_adjust && dc_extended_blank_supported(dc)) -			su_flags->bits.crtc_timing_adjust = 1; + +		if (stream_update->stream && stream_update->stream->freesync_on_desktop && +			(stream_update->vrr_infopacket || stream_update->allow_freesync || +				stream_update->vrr_active_variable || stream_update->vrr_active_fixed)) +			su_flags->bits.fams_changed = 1;  		if (su_flags->raw != 0)  			overall_type = UPDATE_TYPE_FULL;  		if (stream_update->output_csc_transform || stream_update->output_color_space)  			su_flags->bits.out_csc = 1; + +		/* Output transfer function changes do not require bandwidth recalculation, +		 * so don't trigger a full update +		 */ +		if (!dc->debug.enable_legacy_fast_update && stream_update->out_transfer_func) +			su_flags->bits.out_tf = 1;  	}  	for (i = 0 ; i < surface_count; i++) { @@ -2965,6 +3023,9 @@ static void copy_stream_update_to_stream(struct dc *dc,  	if (update->vrr_active_variable)  		stream->vrr_active_variable = *update->vrr_active_variable; +	if (update->vrr_active_fixed) +		stream->vrr_active_fixed = *update->vrr_active_fixed; +  	if (update->crtc_timing_adjust)  		stream->adjust = *update->crtc_timing_adjust; @@ -3269,6 +3330,13 @@ static void commit_planes_do_stream_update(struct dc *dc,  						dc->hwss.prepare_bandwidth(dc, dc->current_state);  					dc->link_srv->set_dpms_on(dc->current_state, pipe_ctx);  				} +			} else if (pipe_ctx->stream->link->wa_flags.blank_stream_on_ocs_change && stream_update->output_color_space +					&& !stream->dpms_off && dc_is_dp_signal(pipe_ctx->stream->signal)) { +				/* +				 * Workaround for firmware issue in some receivers where they don't pick up +				 * correct output color space unless DP link is disabled/re-enabled +				 */ +				dc->link_srv->set_dpms_on(dc->current_state, pipe_ctx);  			}  			if (stream_update->abm_level && pipe_ctx->stream_res.abm) { @@ -3309,7 +3377,6 @@ void dc_dmub_update_dirty_rect(struct dc *dc,  			       struct dc_state *context)  {  	union dmub_rb_cmd cmd; -	struct dc_context *dc_ctx = dc->ctx;  	struct dmub_cmd_update_dirty_rect_data *update_dirty_rect;  	unsigned int i, j;  	unsigned int panel_inst = 0; @@ -3350,12 +3417,170 @@ void dc_dmub_update_dirty_rect(struct dc *dc,  			update_dirty_rect->panel_inst = panel_inst;  			update_dirty_rect->pipe_idx = j; -			dc_dmub_srv_cmd_queue(dc_ctx->dmub_srv, &cmd); -			dc_dmub_srv_cmd_execute(dc_ctx->dmub_srv); +			dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT); +		} +	} +} + +static void build_dmub_update_dirty_rect( +		struct dc *dc, +		int surface_count, +		struct dc_stream_state *stream, +		struct dc_surface_update *srf_updates, +		struct dc_state *context, +		struct dc_dmub_cmd dc_dmub_cmd[], +		unsigned int *dmub_cmd_count) +{ +	union dmub_rb_cmd cmd; +	struct dmub_cmd_update_dirty_rect_data *update_dirty_rect; +	unsigned int i, j; +	unsigned int panel_inst = 0; + +	if (!dc_dmub_should_send_dirty_rect_cmd(dc, stream)) +		return; + +	if (!dc_get_edp_link_panel_inst(dc, stream->link, &panel_inst)) +		return; + +	memset(&cmd, 0x0, sizeof(cmd)); +	cmd.update_dirty_rect.header.type = DMUB_CMD__UPDATE_DIRTY_RECT; +	cmd.update_dirty_rect.header.sub_type = 0; +	cmd.update_dirty_rect.header.payload_bytes = +		sizeof(cmd.update_dirty_rect) - +		sizeof(cmd.update_dirty_rect.header); +	update_dirty_rect = &cmd.update_dirty_rect.update_dirty_rect_data; +	for (i = 0; i < surface_count; i++) { +		struct dc_plane_state *plane_state = srf_updates[i].surface; +		const struct dc_flip_addrs *flip_addr = srf_updates[i].flip_addr; + +		if (!srf_updates[i].surface || !flip_addr) +			continue; +		/* Do not send in immediate flip mode */ +		if (srf_updates[i].surface->flip_immediate) +			continue; +		update_dirty_rect->cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1; +		update_dirty_rect->dirty_rect_count = flip_addr->dirty_rect_count; +		memcpy(update_dirty_rect->src_dirty_rects, flip_addr->dirty_rects, +				sizeof(flip_addr->dirty_rects)); +		for (j = 0; j < dc->res_pool->pipe_count; j++) { +			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; + +			if (pipe_ctx->stream != stream) +				continue; +			if (pipe_ctx->plane_state != plane_state) +				continue; +			update_dirty_rect->panel_inst = panel_inst; +			update_dirty_rect->pipe_idx = j; +			dc_dmub_cmd[*dmub_cmd_count].dmub_cmd = cmd; +			dc_dmub_cmd[*dmub_cmd_count].wait_type = DM_DMUB_WAIT_TYPE_NO_WAIT; +			(*dmub_cmd_count)++;  		}  	}  } + +/** + * ************************************************************************************************ + * build_dmub_cmd_list: Build an array of DMCUB commands to be sent to DMCUB + * + * @param [in]: dc: Current DC state + * @param [in]: srf_updates: Array of surface updates + * @param [in]: surface_count: Number of surfaces that have an updated + * @param [in]: stream: Correponding stream to be updated in the current flip + * @param [in]: context: New DC state to be programmed + * + * @param [out]: dc_dmub_cmd: Array of DMCUB commands to be sent to DMCUB + * @param [out]: dmub_cmd_count: Count indicating the number of DMCUB commands in dc_dmub_cmd array + * + * This function builds an array of DMCUB commands to be sent to DMCUB. This function is required + * to build an array of commands and have them sent while the OTG lock is acquired. + * + * @return: void + * ************************************************************************************************ + */ +static void build_dmub_cmd_list(struct dc *dc, +		struct dc_surface_update *srf_updates, +		int surface_count, +		struct dc_stream_state *stream, +		struct dc_state *context, +		struct dc_dmub_cmd dc_dmub_cmd[], +		unsigned int *dmub_cmd_count) +{ +	// Initialize cmd count to 0 +	*dmub_cmd_count = 0; +	build_dmub_update_dirty_rect(dc, surface_count, stream, srf_updates, context, dc_dmub_cmd, dmub_cmd_count); +} + +static void commit_planes_for_stream_fast(struct dc *dc, +		struct dc_surface_update *srf_updates, +		int surface_count, +		struct dc_stream_state *stream, +		struct dc_stream_update *stream_update, +		enum surface_update_type update_type, +		struct dc_state *context) +{ +	int i, j; +	struct pipe_ctx *top_pipe_to_program = NULL; +	dc_z10_restore(dc); + +	for (j = 0; j < dc->res_pool->pipe_count; j++) { +		struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; + +		if (!pipe_ctx->top_pipe && +			!pipe_ctx->prev_odm_pipe && +			pipe_ctx->stream && +			pipe_ctx->stream == stream) { +			top_pipe_to_program = pipe_ctx; +		} +	} + +	if (dc->debug.visual_confirm) { +		for (i = 0; i < dc->res_pool->pipe_count; i++) { +			struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i]; + +			if (pipe->stream && pipe->plane_state) +				dc_update_viusal_confirm_color(dc, context, pipe); +		} +	} + +	for (i = 0; i < surface_count; i++) { +		struct dc_plane_state *plane_state = srf_updates[i].surface; +		/*set logical flag for lock/unlock use*/ +		for (j = 0; j < dc->res_pool->pipe_count; j++) { +			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; + +			if (!pipe_ctx->plane_state) +				continue; +			if (should_update_pipe_for_plane(context, pipe_ctx, plane_state)) +				continue; +			pipe_ctx->plane_state->triplebuffer_flips = false; +			if (update_type == UPDATE_TYPE_FAST && +			    dc->hwss.program_triplebuffer && +			    !pipe_ctx->plane_state->flip_immediate && dc->debug.enable_tri_buf) { +				/*triple buffer for VUpdate  only*/ +				pipe_ctx->plane_state->triplebuffer_flips = true; +			} +		} +	} + +	build_dmub_cmd_list(dc, +			srf_updates, +			surface_count, +			stream, +			context, +			context->dc_dmub_cmd, +			&(context->dmub_cmd_count)); +	hwss_build_fast_sequence(dc, +			context->dc_dmub_cmd, +			context->dmub_cmd_count, +			context->block_sequence, +			&(context->block_sequence_steps), +			top_pipe_to_program); +	hwss_execute_sequence(dc, +			context->block_sequence, +			context->block_sequence_steps); +} +  static void commit_planes_for_stream(struct dc *dc,  		struct dc_surface_update *srf_updates,  		int surface_count, @@ -3393,21 +3618,6 @@ static void commit_planes_for_stream(struct dc *dc,  		}  	} -	if (get_seamless_boot_stream_count(context) > 0 && surface_count > 0) { -		/* Optimize seamless boot flag keeps clocks and watermarks high until -		 * first flip. After first flip, optimization is required to lower -		 * bandwidth. Important to note that it is expected UEFI will -		 * only light up a single display on POST, therefore we only expect -		 * one stream with seamless boot flag set. -		 */ -		if (stream->apply_seamless_boot_optimization) { -			stream->apply_seamless_boot_optimization = false; - -			if (get_seamless_boot_stream_count(context) == 0) -				dc->optimized_required = true; -		} -	} -  	if (update_type == UPDATE_TYPE_FULL) {  		dc_allow_idle_optimizations(dc, false); @@ -3449,6 +3659,14 @@ static void commit_planes_for_stream(struct dc *dc,  		}  	} +	if (dc->debug.visual_confirm) +		for (i = 0; i < dc->res_pool->pipe_count; i++) { +			struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i]; + +			if (pipe->stream && pipe->plane_state) +				dc_update_viusal_confirm_color(dc, context, pipe); +		} +  	if (stream->test_pattern.type != DP_TEST_PATTERN_VIDEO_MODE) {  		struct pipe_ctx *mpcc_pipe;  		struct pipe_ctx *odm_pipe; @@ -3532,43 +3750,40 @@ static void commit_planes_for_stream(struct dc *dc,  		for (j = 0; j < dc->res_pool->pipe_count; j++) {  			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; -			if (dc->debug.visual_confirm == VISUAL_CONFIRM_SUBVP && +			if ((dc->debug.visual_confirm == VISUAL_CONFIRM_SUBVP || +				dc->debug.visual_confirm == VISUAL_CONFIRM_MCLK_SWITCH) &&  				pipe_ctx->stream && pipe_ctx->plane_state) { -				/* Only update visual confirm for SUBVP here. +				/* Only update visual confirm for SUBVP and Mclk switching here.  				 * The bar appears on all pipes, so we need to update the bar on all displays,  				 * so the information doesn't get stale.  				 */ -				struct mpcc_blnd_cfg blnd_cfg = { 0 }; - -				dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, +				dc->hwss.update_visual_confirm_color(dc, pipe_ctx,  						pipe_ctx->plane_res.hubp->inst);  			}  		}  	} -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		for (i = 0; i < surface_count; i++) { -			struct dc_plane_state *plane_state = srf_updates[i].surface; -			/*set logical flag for lock/unlock use*/ -			for (j = 0; j < dc->res_pool->pipe_count; j++) { -				struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; -				if (!pipe_ctx->plane_state) -					continue; -				if (should_update_pipe_for_plane(context, pipe_ctx, plane_state)) -					continue; -				pipe_ctx->plane_state->triplebuffer_flips = false; -				if (update_type == UPDATE_TYPE_FAST && -					dc->hwss.program_triplebuffer != NULL && -					!pipe_ctx->plane_state->flip_immediate && dc->debug.enable_tri_buf) { -						/*triple buffer for VUpdate  only*/ -						pipe_ctx->plane_state->triplebuffer_flips = true; -				} -			} -			if (update_type == UPDATE_TYPE_FULL) { -				/* force vsync flip when reconfiguring pipes to prevent underflow */ -				plane_state->flip_immediate = false; +	for (i = 0; i < surface_count; i++) { +		struct dc_plane_state *plane_state = srf_updates[i].surface; +		/*set logical flag for lock/unlock use*/ +		for (j = 0; j < dc->res_pool->pipe_count; j++) { +			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j]; +			if (!pipe_ctx->plane_state) +				continue; +			if (should_update_pipe_for_plane(context, pipe_ctx, plane_state)) +				continue; +			pipe_ctx->plane_state->triplebuffer_flips = false; +			if (update_type == UPDATE_TYPE_FAST && +				dc->hwss.program_triplebuffer != NULL && +				!pipe_ctx->plane_state->flip_immediate && dc->debug.enable_tri_buf) { +					/*triple buffer for VUpdate  only*/ +					pipe_ctx->plane_state->triplebuffer_flips = true;  			}  		} +		if (update_type == UPDATE_TYPE_FULL) { +			/* force vsync flip when reconfiguring pipes to prevent underflow */ +			plane_state->flip_immediate = false; +		}  	}  	// Update Type FULL, Surface updates @@ -3872,6 +4087,7 @@ static bool commit_minimal_transition_state(struct dc *dc,  	unsigned int i, j;  	unsigned int pipe_in_use = 0;  	bool subvp_in_use = false; +	bool odm_in_use = false;  	if (!transition_context)  		return false; @@ -3900,6 +4116,18 @@ static bool commit_minimal_transition_state(struct dc *dc,  		}  	} +	/* If ODM is enabled and we are adding or removing planes from any ODM +	 * pipe, we must use the minimal transition. +	 */ +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +		if (pipe->stream && pipe->next_odm_pipe) { +			odm_in_use = true; +			break; +		} +	} +  	/* When the OS add a new surface if we have been used all of pipes with odm combine  	 * and mpc split feature, it need use commit_minimal_transition_state to transition safely.  	 * After OS exit MPO, it will back to use odm and mpc split with all of pipes, we need @@ -3908,7 +4136,7 @@ static bool commit_minimal_transition_state(struct dc *dc,  	 * Reduce the scenarios to use dc_commit_state_no_check in the stage of flip. Especially  	 * enter/exit MPO when DCN still have enough resources.  	 */ -	if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use) { +	if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use && !odm_in_use) {  		dc_release_state(transition_context);  		return true;  	} @@ -3972,6 +4200,43 @@ static bool commit_minimal_transition_state(struct dc *dc,  	return true;  } +/** + * ******************************************************************************* + * update_seamless_boot_flags: Helper function for updating seamless boot flags + * + * @param [in]: dc: Current DC state + * @param [in]: context: New DC state to be programmed + * @param [in]: surface_count: Number of surfaces that have an updated + * @param [in]: stream: Correponding stream to be updated in the current flip + * + * Updating seamless boot flags do not need to be part of the commit sequence. This + * helper function will update the seamless boot flags on each flip (if required) + * outside of the HW commit sequence (fast or slow). + * + * @return: void + * ******************************************************************************* + */ +static void update_seamless_boot_flags(struct dc *dc, +		struct dc_state *context, +		int surface_count, +		struct dc_stream_state *stream) +{ +	if (get_seamless_boot_stream_count(context) > 0 && surface_count > 0) { +		/* Optimize seamless boot flag keeps clocks and watermarks high until +		 * first flip. After first flip, optimization is required to lower +		 * bandwidth. Important to note that it is expected UEFI will +		 * only light up a single display on POST, therefore we only expect +		 * one stream with seamless boot flag set. +		 */ +		if (stream->apply_seamless_boot_optimization) { +			stream->apply_seamless_boot_optimization = false; + +			if (get_seamless_boot_stream_count(context) == 0) +				dc->optimized_required = true; +		} +	} +} +  bool dc_update_planes_and_stream(struct dc *dc,  		struct dc_surface_update *srf_updates, int surface_count,  		struct dc_stream_state *stream, @@ -4038,14 +4303,25 @@ bool dc_update_planes_and_stream(struct dc *dc,  		update_type = UPDATE_TYPE_FULL;  	} -	commit_planes_for_stream( -			dc, -			srf_updates, -			surface_count, -			stream, -			stream_update, -			update_type, -			context); +	update_seamless_boot_flags(dc, context, surface_count, stream); +	if (!dc->debug.enable_legacy_fast_update && update_type == UPDATE_TYPE_FAST) { +		commit_planes_for_stream_fast(dc, +				srf_updates, +				surface_count, +				stream, +				stream_update, +				update_type, +				context); +	} else { +		commit_planes_for_stream( +				dc, +				srf_updates, +				surface_count, +				stream, +				stream_update, +				update_type, +				context); +	}  	if (dc->current_state != context) { @@ -4170,7 +4446,17 @@ void dc_commit_updates_for_stream(struct dc *dc,  	TRACE_DC_PIPE_STATE(pipe_ctx, i, MAX_PIPES); -	commit_planes_for_stream( +	update_seamless_boot_flags(dc, context, surface_count, stream); +	if (!dc->debug.enable_legacy_fast_update && update_type == UPDATE_TYPE_FAST) { +		commit_planes_for_stream_fast(dc, +				srf_updates, +				surface_count, +				stream, +				stream_update, +				update_type, +				context); +	} else { +		commit_planes_for_stream(  				dc,  				srf_updates,  				surface_count, @@ -4178,6 +4464,7 @@ void dc_commit_updates_for_stream(struct dc *dc,  				stream_update,  				update_type,  				context); +	}  	/*update current_State*/  	if (dc->current_state != context) { @@ -4264,9 +4551,6 @@ void dc_set_power_state(  		dc_z10_restore(dc); -		if (dc->ctx->dmub_srv) -			dc_dmub_srv_wait_phy_init(dc->ctx->dmub_srv); -  		dc->hwss.init_hw(dc);  		if (dc->hwss.init_sys_ctx != NULL && @@ -4606,7 +4890,6 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,  {  	uint8_t action;  	union dmub_rb_cmd cmd = {0}; -	struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;  	ASSERT(payload->length <= 16); @@ -4654,9 +4937,7 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,  			);  	} -	dc_dmub_srv_cmd_queue(dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); -	dc_dmub_srv_wait_idle(dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } @@ -4700,7 +4981,6 @@ bool dc_process_dmub_set_config_async(struct dc *dc,  				struct dmub_notification *notify)  {  	union dmub_rb_cmd cmd = {0}; -	struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;  	bool is_cmd_complete = true;  	/* prepare SET_CONFIG command */ @@ -4711,7 +4991,7 @@ bool dc_process_dmub_set_config_async(struct dc *dc,  	cmd.set_config_access.set_config_control.cmd_pkt.msg_type = payload->msg_type;  	cmd.set_config_access.set_config_control.cmd_pkt.msg_data = payload->msg_data; -	if (!dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd)) { +	if (!dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY)) {  		/* command is not processed by dmub */  		notify->sc_status = SET_CONFIG_UNKNOWN_ERROR;  		return is_cmd_complete; @@ -4746,7 +5026,6 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,  				uint8_t *mst_slots_in_use)  {  	union dmub_rb_cmd cmd = {0}; -	struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;  	/* prepare MST_ALLOC_SLOTS command */  	cmd.set_mst_alloc_slots.header.type = DMUB_CMD__DPIA; @@ -4755,7 +5034,7 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,  	cmd.set_mst_alloc_slots.mst_slots_control.instance = dc->links[link_index]->ddc_hw_inst;  	cmd.set_mst_alloc_slots.mst_slots_control.mst_alloc_slots = mst_alloc_slots; -	if (!dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd)) +	if (!dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))  		/* command is not processed by dmub */  		return DC_ERROR_UNEXPECTED; @@ -4789,19 +5068,28 @@ void dc_process_dmub_dpia_hpd_int_enable(const struct dc *dc,  				uint32_t hpd_int_enable)  {  	union dmub_rb_cmd cmd = {0}; -	struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;  	cmd.dpia_hpd_int_enable.header.type = DMUB_CMD__DPIA_HPD_INT_ENABLE;  	cmd.dpia_hpd_int_enable.enable = hpd_int_enable; -	dc_dmub_srv_cmd_queue(dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); -	dc_dmub_srv_wait_idle(dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	DC_LOG_DEBUG("%s: hpd_int_enable(%d)\n", __func__, hpd_int_enable);  }  /** + * dc_print_dmub_diagnostic_data - Print DMUB diagnostic data for debugging + * + * @dc: [in] dc structure + * + * + */ +void dc_print_dmub_diagnostic_data(const struct dc *dc) +{ +	dc_dmub_srv_log_diagnostic_data(dc->ctx->dmub_srv); +} + +/**   * dc_disable_accelerated_mode - disable accelerated mode   * @dc: dc structure   */ @@ -4860,21 +5148,3 @@ void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, bo  	if (pipe->stream_res.abm && pipe->stream_res.abm->funcs->set_abm_pause)  		pipe->stream_res.abm->funcs->set_abm_pause(pipe->stream_res.abm, !enable, i, pipe->stream_res.tg->inst);  } - -/** - * dc_extended_blank_supported - Decide whether extended blank is supported - * - * @dc: [in] Current DC state - * - * Extended blank is a freesync optimization feature to be enabled in the - * future.  During the extra vblank period gained from freesync, we have the - * ability to enter z9/z10. - * - * Return: - * Indicate whether extended blank is supported (%true or %false) - */ -bool dc_extended_blank_supported(struct dc *dc) -{ -	return dc->debug.extended_blank_optimization && !dc->debug.disable_z10 -		&& dc->caps.zstate_support && dc->caps.is_apu; -} diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c index 2acbf692193f..182c42c63bc5 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c @@ -27,6 +27,8 @@  #include "core_types.h"  #include "timing_generator.h"  #include "hw_sequencer.h" +#include "hw_sequencer_private.h" +#include "basics/dc_common.h"  #define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0])) @@ -421,6 +423,7 @@ void get_hdr_visual_confirm_color(  void get_subvp_visual_confirm_color(  		struct dc *dc, +		struct dc_state *context,  		struct pipe_ctx *pipe_ctx,  		struct tg_color *color)  { @@ -428,15 +431,17 @@ void get_subvp_visual_confirm_color(  	bool enable_subvp = false;  	int i; -	if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx) +	if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx || !context)  		return;  	for (i = 0; i < dc->res_pool->pipe_count; i++) { -		struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i]; +		struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];  		if (pipe->stream && pipe->stream->mall_stream_config.paired_stream &&  		    pipe->stream->mall_stream_config.type == SUBVP_MAIN) {  			/* SubVP enable - red */ +			color->color_g_y = 0; +			color->color_b_cb = 0;  			color->color_r_cr = color_value;  			enable_subvp = true; @@ -448,12 +453,304 @@ void get_subvp_visual_confirm_color(  	if (enable_subvp && pipe_ctx->stream->mall_stream_config.type == SUBVP_NONE) {  		color->color_r_cr = 0; -		if (pipe_ctx->stream->ignore_msa_timing_param == 1) +		if (pipe_ctx->stream->allow_freesync == 1) {  			/* SubVP enable and DRR on - green */ +			color->color_b_cb = 0;  			color->color_g_y = color_value; -		else +		} else {  			/* SubVP enable and No DRR - blue */ +			color->color_g_y = 0; +			color->color_b_cb = color_value; +		} +	} +} + +void hwss_build_fast_sequence(struct dc *dc, +		struct dc_dmub_cmd *dc_dmub_cmd, +		unsigned int dmub_cmd_count, +		struct block_sequence block_sequence[], +		int *num_steps, +		struct pipe_ctx *pipe_ctx) +{ +	struct dc_plane_state *plane = pipe_ctx->plane_state; +	struct dc_stream_state *stream = pipe_ctx->stream; +	struct dce_hwseq *hws = dc->hwseq; +	struct pipe_ctx *current_pipe = NULL; +	struct pipe_ctx *current_mpc_pipe = NULL; +	unsigned int i = 0; + +	*num_steps = 0; // Initialize to 0 + +	if (!plane || !stream) +		return; + +	if (dc->hwss.subvp_pipe_control_lock_fast) { +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.dc = dc; +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.lock = true; +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.pipe_ctx = pipe_ctx; +		block_sequence[*num_steps].func = DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST; +		(*num_steps)++; +	} +	if (dc->hwss.pipe_control_lock) { +		block_sequence[*num_steps].params.pipe_control_lock_params.dc = dc; +		block_sequence[*num_steps].params.pipe_control_lock_params.lock = true; +		block_sequence[*num_steps].params.pipe_control_lock_params.pipe_ctx = pipe_ctx; +		block_sequence[*num_steps].func = OPTC_PIPE_CONTROL_LOCK; +		(*num_steps)++; +	} + +	for (i = 0; i < dmub_cmd_count; i++) { +		block_sequence[*num_steps].params.send_dmcub_cmd_params.ctx = dc->ctx; +		block_sequence[*num_steps].params.send_dmcub_cmd_params.cmd = &(dc_dmub_cmd[i].dmub_cmd); +		block_sequence[*num_steps].params.send_dmcub_cmd_params.wait_type = dc_dmub_cmd[i].wait_type; +		block_sequence[*num_steps].func = DMUB_SEND_DMCUB_CMD; +		(*num_steps)++; +	} + +	current_pipe = pipe_ctx; +	while (current_pipe) { +		current_mpc_pipe = current_pipe; +		while (current_mpc_pipe) { +			if (dc->hwss.set_flip_control_gsl && current_mpc_pipe->plane_state && current_mpc_pipe->plane_state->update_flags.raw) { +				block_sequence[*num_steps].params.set_flip_control_gsl_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].params.set_flip_control_gsl_params.flip_immediate = current_mpc_pipe->plane_state->flip_immediate; +				block_sequence[*num_steps].func = HUBP_SET_FLIP_CONTROL_GSL; +				(*num_steps)++; +			} +			if (dc->hwss.program_triplebuffer && dc->debug.enable_tri_buf && current_mpc_pipe->plane_state->update_flags.raw) { +				block_sequence[*num_steps].params.program_triplebuffer_params.dc = dc; +				block_sequence[*num_steps].params.program_triplebuffer_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].params.program_triplebuffer_params.enableTripleBuffer = current_mpc_pipe->plane_state->triplebuffer_flips; +				block_sequence[*num_steps].func = HUBP_PROGRAM_TRIPLEBUFFER; +				(*num_steps)++; +			} +			if (dc->hwss.update_plane_addr && current_mpc_pipe->plane_state->update_flags.bits.addr_update) { +				block_sequence[*num_steps].params.update_plane_addr_params.dc = dc; +				block_sequence[*num_steps].params.update_plane_addr_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].func = HUBP_UPDATE_PLANE_ADDR; +				(*num_steps)++; +			} + +			if (hws->funcs.set_input_transfer_func && current_mpc_pipe->plane_state->update_flags.bits.gamma_change) { +				block_sequence[*num_steps].params.set_input_transfer_func_params.dc = dc; +				block_sequence[*num_steps].params.set_input_transfer_func_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].params.set_input_transfer_func_params.plane_state = current_mpc_pipe->plane_state; +				block_sequence[*num_steps].func = DPP_SET_INPUT_TRANSFER_FUNC; +				(*num_steps)++; +			} + +			if (dc->hwss.program_gamut_remap && current_mpc_pipe->plane_state->update_flags.bits.gamut_remap_change) { +				block_sequence[*num_steps].params.program_gamut_remap_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].func = DPP_PROGRAM_GAMUT_REMAP; +				(*num_steps)++; +			} +			if (current_mpc_pipe->plane_state->update_flags.bits.input_csc_change) { +				block_sequence[*num_steps].params.setup_dpp_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].func = DPP_SETUP_DPP; +				(*num_steps)++; +			} +			if (current_mpc_pipe->plane_state->update_flags.bits.coeff_reduction_change) { +				block_sequence[*num_steps].params.program_bias_and_scale_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].func = DPP_PROGRAM_BIAS_AND_SCALE; +				(*num_steps)++; +			} +			if (hws->funcs.set_output_transfer_func && current_mpc_pipe->stream->update_flags.bits.out_tf) { +				block_sequence[*num_steps].params.set_output_transfer_func_params.dc = dc; +				block_sequence[*num_steps].params.set_output_transfer_func_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].params.set_output_transfer_func_params.stream = current_mpc_pipe->stream; +				block_sequence[*num_steps].func = DPP_SET_OUTPUT_TRANSFER_FUNC; +				(*num_steps)++; +			} + +			current_mpc_pipe = current_mpc_pipe->bottom_pipe; +		} +		current_pipe = current_pipe->next_odm_pipe; +	} + +	if (dc->hwss.pipe_control_lock) { +		block_sequence[*num_steps].params.pipe_control_lock_params.dc = dc; +		block_sequence[*num_steps].params.pipe_control_lock_params.lock = false; +		block_sequence[*num_steps].params.pipe_control_lock_params.pipe_ctx = pipe_ctx; +		block_sequence[*num_steps].func = OPTC_PIPE_CONTROL_LOCK; +		(*num_steps)++; +	} +	if (dc->hwss.subvp_pipe_control_lock_fast) { +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.dc = dc; +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.lock = false; +		block_sequence[*num_steps].params.subvp_pipe_control_lock_fast_params.pipe_ctx = pipe_ctx; +		block_sequence[*num_steps].func = DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST; +		(*num_steps)++; +	} + +	current_pipe = pipe_ctx; +	while (current_pipe) { +		current_mpc_pipe = current_pipe; + +		while (current_mpc_pipe) { +			if (!current_mpc_pipe->bottom_pipe && !pipe_ctx->next_odm_pipe && +					current_mpc_pipe->stream && current_mpc_pipe->plane_state && +					current_mpc_pipe->plane_state->update_flags.bits.addr_update && +					!current_mpc_pipe->plane_state->skip_manual_trigger) { +				block_sequence[*num_steps].params.program_manual_trigger_params.pipe_ctx = current_mpc_pipe; +				block_sequence[*num_steps].func = OPTC_PROGRAM_MANUAL_TRIGGER; +				(*num_steps)++; +			} +			current_mpc_pipe = current_mpc_pipe->bottom_pipe; +		} +		current_pipe = current_pipe->next_odm_pipe; +	} +} + +void hwss_execute_sequence(struct dc *dc, +		struct block_sequence block_sequence[], +		int num_steps) +{ +	unsigned int i; +	union block_sequence_params *params; +	struct dce_hwseq *hws = dc->hwseq; + +	for (i = 0; i < num_steps; i++) { +		params = &(block_sequence[i].params); +		switch (block_sequence[i].func) { + +		case DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST: +			dc->hwss.subvp_pipe_control_lock_fast(params); +			break; +		case OPTC_PIPE_CONTROL_LOCK: +			dc->hwss.pipe_control_lock(params->pipe_control_lock_params.dc, +					params->pipe_control_lock_params.pipe_ctx, +					params->pipe_control_lock_params.lock); +			break; +		case HUBP_SET_FLIP_CONTROL_GSL: +			dc->hwss.set_flip_control_gsl(params->set_flip_control_gsl_params.pipe_ctx, +					params->set_flip_control_gsl_params.flip_immediate); +			break; +		case HUBP_PROGRAM_TRIPLEBUFFER: +			dc->hwss.program_triplebuffer(params->program_triplebuffer_params.dc, +					params->program_triplebuffer_params.pipe_ctx, +					params->program_triplebuffer_params.enableTripleBuffer); +			break; +		case HUBP_UPDATE_PLANE_ADDR: +			dc->hwss.update_plane_addr(params->update_plane_addr_params.dc, +					params->update_plane_addr_params.pipe_ctx); +			break; +		case DPP_SET_INPUT_TRANSFER_FUNC: +			hws->funcs.set_input_transfer_func(params->set_input_transfer_func_params.dc, +					params->set_input_transfer_func_params.pipe_ctx, +					params->set_input_transfer_func_params.plane_state); +			break; +		case DPP_PROGRAM_GAMUT_REMAP: +			dc->hwss.program_gamut_remap(params->program_gamut_remap_params.pipe_ctx); +			break; +		case DPP_SETUP_DPP: +			hwss_setup_dpp(params); +			break; +		case DPP_PROGRAM_BIAS_AND_SCALE: +			hwss_program_bias_and_scale(params); +			break; +		case OPTC_PROGRAM_MANUAL_TRIGGER: +			hwss_program_manual_trigger(params); +			break; +		case DPP_SET_OUTPUT_TRANSFER_FUNC: +			hws->funcs.set_output_transfer_func(params->set_output_transfer_func_params.dc, +					params->set_output_transfer_func_params.pipe_ctx, +					params->set_output_transfer_func_params.stream); +			break; +		case MPC_UPDATE_VISUAL_CONFIRM: +			dc->hwss.update_visual_confirm_color(params->update_visual_confirm_params.dc, +					params->update_visual_confirm_params.pipe_ctx, +					params->update_visual_confirm_params.mpcc_id); +			break; +		case DMUB_SEND_DMCUB_CMD: +			hwss_send_dmcub_cmd(params); +			break; +		default: +			ASSERT(false); +			break; +		} +	} +} + +void hwss_send_dmcub_cmd(union block_sequence_params *params) +{ +	struct dc_context *ctx = params->send_dmcub_cmd_params.ctx; +	union dmub_rb_cmd *cmd = params->send_dmcub_cmd_params.cmd; +	enum dm_dmub_wait_type wait_type = params->send_dmcub_cmd_params.wait_type; + +	dm_execute_dmub_cmd(ctx, cmd, wait_type); +} + +void hwss_program_manual_trigger(union block_sequence_params *params) +{ +	struct pipe_ctx *pipe_ctx = params->program_manual_trigger_params.pipe_ctx; + +	if (pipe_ctx->stream_res.tg->funcs->program_manual_trigger) +		pipe_ctx->stream_res.tg->funcs->program_manual_trigger(pipe_ctx->stream_res.tg); +} + +void hwss_setup_dpp(union block_sequence_params *params) +{ +	struct pipe_ctx *pipe_ctx = params->setup_dpp_params.pipe_ctx; +	struct dpp *dpp = pipe_ctx->plane_res.dpp; +	struct dc_plane_state *plane_state = pipe_ctx->plane_state; + +	if (dpp && dpp->funcs->dpp_setup) { +		// program the input csc +		dpp->funcs->dpp_setup(dpp, +				plane_state->format, +				EXPANSION_MODE_ZERO, +				plane_state->input_csc_color_matrix, +				plane_state->color_space, +				NULL); +	} +} + +void hwss_program_bias_and_scale(union block_sequence_params *params) +{ +	struct pipe_ctx *pipe_ctx = params->program_bias_and_scale_params.pipe_ctx; +	struct dpp *dpp = pipe_ctx->plane_res.dpp; +	struct dc_plane_state *plane_state = pipe_ctx->plane_state; +	struct dc_bias_and_scale bns_params = {0}; + +	//TODO :for CNVC set scale and bias registers if necessary +	build_prescale_params(&bns_params, plane_state); +	if (dpp->funcs->dpp_program_bias_and_scale) +		dpp->funcs->dpp_program_bias_and_scale(dpp, &bns_params); +} + +void get_mclk_switch_visual_confirm_color( +		struct dc *dc, +		struct dc_state *context, +		struct pipe_ctx *pipe_ctx, +		struct tg_color *color) +{ +	uint32_t color_value = MAX_TG_COLOR_VALUE; +	struct vba_vars_st *vba = &context->bw_ctx.dml.vba; + +	if (!dc->ctx || !dc->ctx->dmub_srv || !pipe_ctx || !vba || !context) +		return; + +	if (vba->DRAMClockChangeSupport[vba->VoltageLevel][vba->maxMpcComb] != +			dm_dram_clock_change_unsupported) { +		/* MCLK switching is supported */ +		if (!pipe_ctx->has_vactive_margin) { +			/* In Vblank - yellow */ +			color->color_r_cr = color_value; +			color->color_g_y = color_value; + +			if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) { +				/* FPO + Vblank - cyan */ +				color->color_r_cr = 0; +				color->color_g_y  = color_value; +				color->color_b_cb = color_value; +			} +		} else { +			/* In Vactive - pink */ +			color->color_r_cr = color_value;  			color->color_b_cb = color_value; +		} +		/* SubVP */ +		get_subvp_visual_confirm_color(dc, context, pipe_ctx, color);  	}  } diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c index 117d80cb36fb..2f3d9a698486 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -69,6 +69,7 @@  #include "../dcn32/dcn32_resource.h"  #include "../dcn321/dcn321_resource.h" +  #define DC_LOGGER_INIT(logger)  enum dce_version resource_parse_asic_id(struct hw_asic_id asic_id) @@ -1446,6 +1447,26 @@ static int acquire_first_split_pipe(  			split_pipe->stream = stream;  			return i; +		} else if (split_pipe->prev_odm_pipe && +				split_pipe->prev_odm_pipe->plane_state == split_pipe->plane_state) { +			split_pipe->prev_odm_pipe->next_odm_pipe = split_pipe->next_odm_pipe; +			if (split_pipe->next_odm_pipe) +				split_pipe->next_odm_pipe->prev_odm_pipe = split_pipe->prev_odm_pipe; + +			if (split_pipe->prev_odm_pipe->plane_state) +				resource_build_scaling_params(split_pipe->prev_odm_pipe); + +			memset(split_pipe, 0, sizeof(*split_pipe)); +			split_pipe->stream_res.tg = pool->timing_generators[i]; +			split_pipe->plane_res.hubp = pool->hubps[i]; +			split_pipe->plane_res.ipp = pool->ipps[i]; +			split_pipe->plane_res.dpp = pool->dpps[i]; +			split_pipe->stream_res.opp = pool->opps[i]; +			split_pipe->plane_res.mpcc_inst = pool->dpps[i]->inst; +			split_pipe->pipe_idx = i; + +			split_pipe->stream = stream; +			return i;  		}  	}  	return -1; @@ -1858,7 +1879,7 @@ bool dc_add_all_planes_for_stream(  	return add_all_planes_for_stream(dc, stream, &set, 1, context);  } -bool is_timing_changed(struct dc_stream_state *cur_stream, +bool dc_is_timing_changed(struct dc_stream_state *cur_stream,  		       struct dc_stream_state *new_stream)  {  	if (cur_stream == NULL) @@ -1883,7 +1904,7 @@ static bool are_stream_backends_same(  	if (stream_a == NULL || stream_b == NULL)  		return false; -	if (is_timing_changed(stream_a, stream_b)) +	if (dc_is_timing_changed(stream_a, stream_b))  		return false;  	if (stream_a->signal != stream_b->signal) @@ -3014,23 +3035,29 @@ static void set_avi_info_frame(  	hdmi_info.bits.S0_S1 = scan_type;  	/* C0, C1 : Colorimetry */ -	if (color_space == COLOR_SPACE_YCBCR709 || -			color_space == COLOR_SPACE_YCBCR709_LIMITED) +	switch (color_space) { +	case COLOR_SPACE_YCBCR709: +	case COLOR_SPACE_YCBCR709_LIMITED:  		hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709; -	else if (color_space == COLOR_SPACE_YCBCR601 || -			color_space == COLOR_SPACE_YCBCR601_LIMITED) +		break; +	case COLOR_SPACE_YCBCR601: +	case COLOR_SPACE_YCBCR601_LIMITED:  		hdmi_info.bits.C0_C1 = COLORIMETRY_ITU601; -	else { -		hdmi_info.bits.C0_C1 = COLORIMETRY_NO_DATA; -	} -	if (color_space == COLOR_SPACE_2020_RGB_FULLRANGE || -			color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE || -			color_space == COLOR_SPACE_2020_YCBCR) { +		break; +	case COLOR_SPACE_2020_RGB_FULLRANGE: +	case COLOR_SPACE_2020_RGB_LIMITEDRANGE: +	case COLOR_SPACE_2020_YCBCR:  		hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR;  		hdmi_info.bits.C0_C1   = COLORIMETRY_EXTENDED; -	} else if (color_space == COLOR_SPACE_ADOBERGB) { +		break; +	case COLOR_SPACE_ADOBERGB:  		hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_ADOBERGB;  		hdmi_info.bits.C0_C1   = COLORIMETRY_EXTENDED; +		break; +	case COLOR_SPACE_SRGB: +	default: +		hdmi_info.bits.C0_C1 = COLORIMETRY_NO_DATA; +		break;  	}  	if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR && @@ -3508,7 +3535,7 @@ bool pipe_need_reprogram(  	if (pipe_ctx_old->stream_res.stream_enc != pipe_ctx->stream_res.stream_enc)  		return true; -	if (is_timing_changed(pipe_ctx_old->stream, pipe_ctx->stream)) +	if (dc_is_timing_changed(pipe_ctx_old->stream, pipe_ctx->stream))  		return true;  	if (pipe_ctx_old->stream->dpms_off != pipe_ctx->stream->dpms_off) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c index 72b261ad9587..6e11d2b701f8 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c @@ -276,8 +276,8 @@ static void program_cursor_attributes(  		}  		dc->hwss.set_cursor_attribute(pipe_ctx); - -		dc_send_update_cursor_info_to_dmu(pipe_ctx, i); +		if (dc->ctx->dmub_srv) +			dc_send_update_cursor_info_to_dmu(pipe_ctx, i);  		if (dc->hwss.set_cursor_sdr_white_level)  			dc->hwss.set_cursor_sdr_white_level(pipe_ctx);  	} @@ -396,8 +396,8 @@ static void program_cursor_position(  		}  		dc->hwss.set_cursor_position(pipe_ctx); - -		dc_send_update_cursor_info_to_dmu(pipe_ctx, i); +		if (dc->ctx->dmub_srv) +			dc_send_update_cursor_info_to_dmu(pipe_ctx, i);  	}  	if (pipe_to_program) @@ -490,25 +490,6 @@ bool dc_stream_add_writeback(struct dc *dc,  		struct dwbc *dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst];  		dwb->otg_inst = stream_status->primary_otg_inst;  	} -	if (IS_DIAG_DC(dc->ctx->dce_environment)) { -		if (!dc->hwss.update_bandwidth(dc, dc->current_state)) { -			dm_error("DC: update_bandwidth failed!\n"); -			return false; -		} - -		/* enable writeback */ -		if (dc->hwss.enable_writeback) { -			struct dwbc *dwb = dc->res_pool->dwbc[wb_info->dwb_pipe_inst]; - -			if (dwb->funcs->is_enabled(dwb)) { -				/* writeback pipe already enabled, only need to update */ -				dc->hwss.update_writeback(dc, wb_info, dc->current_state); -			} else { -				/* Enable writeback pipe from scratch*/ -				dc->hwss.enable_writeback(dc, wb_info, dc->current_state); -			} -		} -	}  	return true;  } @@ -553,17 +534,6 @@ bool dc_stream_remove_writeback(struct dc *dc,  	}  	stream->num_wb_info = j; -	if (IS_DIAG_DC(dc->ctx->dce_environment)) { -		/* recalculate and apply DML parameters */ -		if (!dc->hwss.update_bandwidth(dc, dc->current_state)) { -			dm_error("DC: update_bandwidth failed!\n"); -			return false; -		} - -		/* disable writeback */ -		if (dc->hwss.disable_writeback) -			dc->hwss.disable_writeback(dc, dwb_pipe_inst); -	}  	return true;  } diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 30f0ba05a6e6..360dd83b1a7a 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -45,7 +45,7 @@ struct aux_payload;  struct set_config_cmd_payload;  struct dmub_notification; -#define DC_VER "3.2.230" +#define DC_VER "3.2.237"  #define MAX_SURFACES 3  #define MAX_PLANES 6 @@ -209,6 +209,8 @@ struct dc_color_caps {  struct dc_dmub_caps {  	bool psr;  	bool mclk_sw; +	bool subvp_psr; +	bool gecc_enable;  };  struct dc_caps { @@ -270,8 +272,13 @@ struct dc_bug_wa {  	bool dedcn20_305_wa;  	bool skip_clock_update;  	bool lt_early_cr_pattern; +	struct { +		uint8_t uclk : 1; +		uint8_t fclk : 1; +		uint8_t dcfclk : 1; +		uint8_t dcfclk_ds: 1; +	} clock_update_disable_mask;  }; -  struct dc_dcc_surface_param {  	struct dc_size surface_size;  	enum surface_pixel_format format; @@ -419,6 +426,7 @@ enum visual_confirm {  	VISUAL_CONFIRM_FAMS = 7,  	VISUAL_CONFIRM_SWIZZLE = 9,  	VISUAL_CONFIRM_SUBVP = 14, +	VISUAL_CONFIRM_MCLK_SWITCH = 16,  };  enum dc_psr_power_opts { @@ -698,6 +706,8 @@ struct dc_virtual_addr_space_config {  struct dc_bounding_box_overrides {  	int sr_exit_time_ns;  	int sr_enter_plus_exit_time_ns; +	int sr_exit_z8_time_ns; +	int sr_enter_plus_exit_z8_time_ns;  	int urgent_latency_ns;  	int percent_of_ideal_drambw;  	int dram_clock_change_latency_ns; @@ -767,6 +777,8 @@ struct dc_debug_options {  	int sr_enter_plus_exit_time_dpm0_ns;  	int sr_exit_time_ns;  	int sr_enter_plus_exit_time_ns; +	int sr_exit_z8_time_ns; +	int sr_enter_plus_exit_z8_time_ns;  	int urgent_latency_ns;  	uint32_t underflow_assert_delay_us;  	int percent_of_ideal_drambw; @@ -855,7 +867,6 @@ struct dc_debug_options {  	bool force_usr_allow;  	/* uses value at boot and disables switch */  	bool disable_dtb_ref_clk_switch; -	uint32_t fixed_vs_aux_delay_config_wa;  	bool extended_blank_optimization;  	union aux_wake_wa_options aux_wake_wa;  	uint32_t mst_start_top_delay; @@ -879,6 +890,14 @@ struct dc_debug_options {  	uint32_t fpo_vactive_margin_us;  	bool disable_fpo_vactive;  	bool disable_boot_optimizations; +	bool override_odm_optimization; +	bool minimize_dispclk_using_odm; +	bool disable_subvp_high_refresh; +	bool disable_dp_plus_plus_wa; +	uint32_t fpo_vactive_min_active_margin_us; +	uint32_t fpo_vactive_max_blank_us; +	bool enable_legacy_fast_update; +	bool disable_dc_mode_overwrite;  };  struct gpu_info_soc_bounding_box_v1_0; @@ -1502,6 +1521,7 @@ struct dc_link {  		/* Forced DPIA into TBT3 compatibility mode. */  		bool dpia_forced_tbt3_mode;  		bool dongle_mode_timing_override; +		bool blank_stream_on_ocs_change;  	} wa_flags;  	struct link_mst_stream_allocation_table mst_stream_alloc_table; @@ -2126,8 +2146,6 @@ struct dc_sink_init_data {  	bool converter_disable_audio;  }; -bool dc_extended_blank_supported(struct dc *dc); -  struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params);  /* Newer interfaces  */ @@ -2220,10 +2238,15 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,  void dc_process_dmub_dpia_hpd_int_enable(const struct dc *dc,  				uint32_t hpd_int_enable); +void dc_print_dmub_diagnostic_data(const struct dc *dc); +  /* DSC Interfaces */  #include "dc_dsc.h"  /* Disable acc mode Interfaces */  void dc_disable_accelerated_mode(struct dc *dc); +bool dc_is_timing_changed(struct dc_stream_state *cur_stream, +		       struct dc_stream_state *new_stream); +  #endif /* DC_INTERFACE_H_ */ diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c index a9b9490a532c..c52c40b16387 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c @@ -65,47 +65,6 @@ void dc_dmub_srv_destroy(struct dc_dmub_srv **dmub_srv)  	}  } -void dc_dmub_srv_cmd_queue(struct dc_dmub_srv *dc_dmub_srv, -			   union dmub_rb_cmd *cmd) -{ -	struct dmub_srv *dmub = dc_dmub_srv->dmub; -	struct dc_context *dc_ctx = dc_dmub_srv->ctx; -	enum dmub_status status; - -	status = dmub_srv_cmd_queue(dmub, cmd); -	if (status == DMUB_STATUS_OK) -		return; - -	if (status != DMUB_STATUS_QUEUE_FULL) -		goto error; - -	/* Execute and wait for queue to become empty again. */ -	dc_dmub_srv_cmd_execute(dc_dmub_srv); -	dc_dmub_srv_wait_idle(dc_dmub_srv); - -	/* Requeue the command. */ -	status = dmub_srv_cmd_queue(dmub, cmd); -	if (status == DMUB_STATUS_OK) -		return; - -error: -	DC_ERROR("Error queuing DMUB command: status=%d\n", status); -	dc_dmub_srv_log_diagnostic_data(dc_dmub_srv); -} - -void dc_dmub_srv_cmd_execute(struct dc_dmub_srv *dc_dmub_srv) -{ -	struct dmub_srv *dmub = dc_dmub_srv->dmub; -	struct dc_context *dc_ctx = dc_dmub_srv->ctx; -	enum dmub_status status; - -	status = dmub_srv_cmd_execute(dmub); -	if (status != DMUB_STATUS_OK) { -		DC_ERROR("Error starting DMUB execution: status=%d\n", status); -		dc_dmub_srv_log_diagnostic_data(dc_dmub_srv); -	} -} -  void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv)  {  	struct dmub_srv *dmub = dc_dmub_srv->dmub; @@ -159,50 +118,89 @@ void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv,  	}  } -bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd) +bool dc_dmub_srv_cmd_run(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type) +{ +	return dc_dmub_srv_cmd_run_list(dc_dmub_srv, 1, cmd, wait_type); +} + +bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int count, union dmub_rb_cmd *cmd_list, enum dm_dmub_wait_type wait_type)  { +	struct dc_context *dc_ctx;  	struct dmub_srv *dmub;  	enum dmub_status status; +	int i;  	if (!dc_dmub_srv || !dc_dmub_srv->dmub)  		return false; +	dc_ctx = dc_dmub_srv->ctx;  	dmub = dc_dmub_srv->dmub; -	status = dmub_srv_cmd_with_reply_data(dmub, cmd); +	for (i = 0 ; i < count; i++) { +		// Queue command +		status = dmub_srv_cmd_queue(dmub, &cmd_list[i]); + +		if (status == DMUB_STATUS_QUEUE_FULL) { +			/* Execute and wait for queue to become empty again. */ +			dmub_srv_cmd_execute(dmub); +			dmub_srv_wait_for_idle(dmub, 100000); + +			/* Requeue the command. */ +			status = dmub_srv_cmd_queue(dmub, &cmd_list[i]); +		} + +		if (status != DMUB_STATUS_OK) { +			DC_ERROR("Error queueing DMUB command: status=%d\n", status); +			dc_dmub_srv_log_diagnostic_data(dc_dmub_srv); +			return false; +		} +	} + +	status = dmub_srv_cmd_execute(dmub);  	if (status != DMUB_STATUS_OK) { -		DC_LOG_DEBUG("No reply for DMUB command: status=%d\n", status); +		DC_ERROR("Error starting DMUB execution: status=%d\n", status); +		dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);  		return false;  	} +	// Wait for DMUB to process command +	if (wait_type != DM_DMUB_WAIT_TYPE_NO_WAIT) { +		status = dmub_srv_wait_for_idle(dmub, 100000); + +		if (status != DMUB_STATUS_OK) { +			DC_LOG_DEBUG("No reply for DMUB command: status=%d\n", status); +			dc_dmub_srv_log_diagnostic_data(dc_dmub_srv); +			return false; +		} + +		// Copy data back from ring buffer into command +		if (wait_type == DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) +			dmub_rb_get_return_data(&dmub->inbox1_rb, cmd_list); +	} +  	return true;  } -void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv) +bool dc_dmub_srv_optimized_init_done(struct dc_dmub_srv *dc_dmub_srv)  { -	struct dmub_srv *dmub = dc_dmub_srv->dmub; -	struct dc_context *dc_ctx = dc_dmub_srv->ctx; +	struct dmub_srv *dmub; +	struct dc_context *dc_ctx; +	union dmub_fw_boot_status boot_status;  	enum dmub_status status; -	for (;;) { -		/* Wait up to a second for PHY init. */ -		status = dmub_srv_wait_for_phy_init(dmub, 1000000); -		if (status == DMUB_STATUS_OK) -			/* Initialization OK */ -			break; - -		DC_ERROR("DMCUB PHY init failed: status=%d\n", status); -		ASSERT(0); +	if (!dc_dmub_srv || !dc_dmub_srv->dmub) +		return false; -		if (status != DMUB_STATUS_TIMEOUT) -			/* -			 * Server likely initialized or we don't have -			 * DMCUB HW support - this won't end. -			 */ -			break; +	dmub = dc_dmub_srv->dmub; +	dc_ctx = dc_dmub_srv->ctx; -		/* Continue spinning so we don't hang the ASIC. */ +	status = dmub_srv_get_fw_boot_status(dmub, &boot_status); +	if (status != DMUB_STATUS_OK) { +		DC_ERROR("Error querying DMUB boot status: error=%d\n", status); +		return false;  	} + +	return boot_status.bits.optimized_init_done;  }  bool dc_dmub_srv_notify_stream_mask(struct dc_dmub_srv *dc_dmub_srv, @@ -267,9 +265,7 @@ void dc_dmub_srv_drr_update_cmd(struct dc *dc, uint32_t tg_inst, uint32_t vtotal  	cmd.drr_update.header.payload_bytes = sizeof(cmd.drr_update) - sizeof(cmd.drr_update.header);  	// Send the command to the DMCUB. -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst) @@ -283,9 +279,7 @@ void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst)  	cmd.drr_update.header.payload_bytes = sizeof(cmd.drr_update) - sizeof(cmd.drr_update.header);  	// Send the command to the DMCUB. -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  static uint8_t dc_dmub_srv_get_pipes_for_stream(struct dc *dc, struct dc_stream_state *stream) @@ -378,21 +372,14 @@ bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool should_manage_pstate, stru  		sizeof(cmd.fw_assisted_mclk_switch) - sizeof(cmd.fw_assisted_mclk_switch.header);  	// Send the command to the DMCUB. -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } -void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub) +void dc_dmub_srv_query_caps_cmd(struct dc_dmub_srv *dc_dmub_srv)  {  	union dmub_rb_cmd cmd = { 0 }; -	enum dmub_status status; - -	if (!dmub) { -		return; -	}  	memset(&cmd, 0, sizeof(cmd)); @@ -402,15 +389,10 @@ void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub)  	cmd.query_feature_caps.header.ret_status = 1;  	cmd.query_feature_caps.header.payload_bytes = sizeof(struct dmub_cmd_query_feature_caps_data); -	/* Send command to fw */ -	status = dmub_srv_cmd_with_reply_data(dmub, &cmd); - -	ASSERT(status == DMUB_STATUS_OK); -  	/* If command was processed, copy feature caps to dmub srv */ -	if (status == DMUB_STATUS_OK && +	if (dm_execute_dmub_cmd(dc_dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&  	    cmd.query_feature_caps.header.ret_status == 0) { -		memcpy(&dmub->feature_caps, +		memcpy(&dc_dmub_srv->dmub->feature_caps,  		       &cmd.query_feature_caps.query_feature_caps_data,  		       sizeof(struct dmub_feature_caps));  	} @@ -419,7 +401,6 @@ void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub)  void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx)  {  	union dmub_rb_cmd cmd = { 0 }; -	enum dmub_status status;  	unsigned int panel_inst = 0;  	dc_get_edp_link_panel_inst(dc, pipe_ctx->stream->link, &panel_inst); @@ -433,13 +414,8 @@ void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pi  	cmd.visual_confirm_color.header.payload_bytes = sizeof(struct dmub_cmd_visual_confirm_color_data);  	cmd.visual_confirm_color.visual_confirm_color_data.visual_confirm_color.panel_inst = panel_inst; -	// Send command to fw -	status = dmub_srv_cmd_with_reply_data(dc->ctx->dmub_srv->dmub, &cmd); - -	ASSERT(status == DMUB_STATUS_OK); -  	// If command was processed, copy feature caps to dmub srv -	if (status == DMUB_STATUS_OK && +	if (dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&  		cmd.visual_confirm_color.header.ret_status == 0) {  		memcpy(&dc->ctx->dmub_srv->dmub->visual_confirm_color,  			&cmd.visual_confirm_color.visual_confirm_color_data, @@ -797,9 +773,8 @@ void dc_dmub_setup_subvp_dmub_command(struct dc *dc,  		cmd.fw_assisted_mclk_switch_v2.config_data.watermark_a_cache = wm_val_refclk < 0xFFFF ? wm_val_refclk : 0xFFFF;  	} -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); + +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  bool dc_dmub_srv_get_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv, struct dmub_diagnostic_data *diag_data) @@ -823,74 +798,40 @@ void dc_dmub_srv_log_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv)  		return;  	} -	DC_LOG_DEBUG( -		"DMCUB STATE\n" -		"    dmcub_version      : %08x\n" -		"    scratch  [0]       : %08x\n" -		"    scratch  [1]       : %08x\n" -		"    scratch  [2]       : %08x\n" -		"    scratch  [3]       : %08x\n" -		"    scratch  [4]       : %08x\n" -		"    scratch  [5]       : %08x\n" -		"    scratch  [6]       : %08x\n" -		"    scratch  [7]       : %08x\n" -		"    scratch  [8]       : %08x\n" -		"    scratch  [9]       : %08x\n" -		"    scratch [10]       : %08x\n" -		"    scratch [11]       : %08x\n" -		"    scratch [12]       : %08x\n" -		"    scratch [13]       : %08x\n" -		"    scratch [14]       : %08x\n" -		"    scratch [15]       : %08x\n" -		"    pc                 : %08x\n" -		"    unk_fault_addr     : %08x\n" -		"    inst_fault_addr    : %08x\n" -		"    data_fault_addr    : %08x\n" -		"    inbox1_rptr        : %08x\n" -		"    inbox1_wptr        : %08x\n" -		"    inbox1_size        : %08x\n" -		"    inbox0_rptr        : %08x\n" -		"    inbox0_wptr        : %08x\n" -		"    inbox0_size        : %08x\n" -		"    is_enabled         : %d\n" -		"    is_soft_reset      : %d\n" -		"    is_secure_reset    : %d\n" -		"    is_traceport_en    : %d\n" -		"    is_cw0_en          : %d\n" -		"    is_cw6_en          : %d\n", -		diag_data.dmcub_version, -		diag_data.scratch[0], -		diag_data.scratch[1], -		diag_data.scratch[2], -		diag_data.scratch[3], -		diag_data.scratch[4], -		diag_data.scratch[5], -		diag_data.scratch[6], -		diag_data.scratch[7], -		diag_data.scratch[8], -		diag_data.scratch[9], -		diag_data.scratch[10], -		diag_data.scratch[11], -		diag_data.scratch[12], -		diag_data.scratch[13], -		diag_data.scratch[14], -		diag_data.scratch[15], -		diag_data.pc, -		diag_data.undefined_address_fault_addr, -		diag_data.inst_fetch_fault_addr, -		diag_data.data_write_fault_addr, -		diag_data.inbox1_rptr, -		diag_data.inbox1_wptr, -		diag_data.inbox1_size, -		diag_data.inbox0_rptr, -		diag_data.inbox0_wptr, -		diag_data.inbox0_size, -		diag_data.is_dmcub_enabled, -		diag_data.is_dmcub_soft_reset, -		diag_data.is_dmcub_secure_reset, -		diag_data.is_traceport_en, -		diag_data.is_cw0_enabled, -		diag_data.is_cw6_enabled); +	DC_LOG_DEBUG("DMCUB STATE:"); +	DC_LOG_DEBUG("    dmcub_version      : %08x", diag_data.dmcub_version); +	DC_LOG_DEBUG("    scratch  [0]       : %08x", diag_data.scratch[0]); +	DC_LOG_DEBUG("    scratch  [1]       : %08x", diag_data.scratch[1]); +	DC_LOG_DEBUG("    scratch  [2]       : %08x", diag_data.scratch[2]); +	DC_LOG_DEBUG("    scratch  [3]       : %08x", diag_data.scratch[3]); +	DC_LOG_DEBUG("    scratch  [4]       : %08x", diag_data.scratch[4]); +	DC_LOG_DEBUG("    scratch  [5]       : %08x", diag_data.scratch[5]); +	DC_LOG_DEBUG("    scratch  [6]       : %08x", diag_data.scratch[6]); +	DC_LOG_DEBUG("    scratch  [7]       : %08x", diag_data.scratch[7]); +	DC_LOG_DEBUG("    scratch  [8]       : %08x", diag_data.scratch[8]); +	DC_LOG_DEBUG("    scratch  [9]       : %08x", diag_data.scratch[9]); +	DC_LOG_DEBUG("    scratch [10]       : %08x", diag_data.scratch[10]); +	DC_LOG_DEBUG("    scratch [11]       : %08x", diag_data.scratch[11]); +	DC_LOG_DEBUG("    scratch [12]       : %08x", diag_data.scratch[12]); +	DC_LOG_DEBUG("    scratch [13]       : %08x", diag_data.scratch[13]); +	DC_LOG_DEBUG("    scratch [14]       : %08x", diag_data.scratch[14]); +	DC_LOG_DEBUG("    scratch [15]       : %08x", diag_data.scratch[15]); +	DC_LOG_DEBUG("    pc                 : %08x", diag_data.pc); +	DC_LOG_DEBUG("    unk_fault_addr     : %08x", diag_data.undefined_address_fault_addr); +	DC_LOG_DEBUG("    inst_fault_addr    : %08x", diag_data.inst_fetch_fault_addr); +	DC_LOG_DEBUG("    data_fault_addr    : %08x", diag_data.data_write_fault_addr); +	DC_LOG_DEBUG("    inbox1_rptr        : %08x", diag_data.inbox1_rptr); +	DC_LOG_DEBUG("    inbox1_wptr        : %08x", diag_data.inbox1_wptr); +	DC_LOG_DEBUG("    inbox1_size        : %08x", diag_data.inbox1_size); +	DC_LOG_DEBUG("    inbox0_rptr        : %08x", diag_data.inbox0_rptr); +	DC_LOG_DEBUG("    inbox0_wptr        : %08x", diag_data.inbox0_wptr); +	DC_LOG_DEBUG("    inbox0_size        : %08x", diag_data.inbox0_size); +	DC_LOG_DEBUG("    is_enabled         : %d", diag_data.is_dmcub_enabled); +	DC_LOG_DEBUG("    is_soft_reset      : %d", diag_data.is_dmcub_soft_reset); +	DC_LOG_DEBUG("    is_secure_reset    : %d", diag_data.is_dmcub_secure_reset); +	DC_LOG_DEBUG("    is_traceport_en    : %d", diag_data.is_traceport_en); +	DC_LOG_DEBUG("    is_cw0_en          : %d", diag_data.is_cw0_enabled); +	DC_LOG_DEBUG("    is_cw6_en          : %d", diag_data.is_cw6_enabled);  }  static bool dc_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx) @@ -982,14 +923,6 @@ static void dc_build_cursor_update_payload0(  	payload->panel_inst  = panel_inst;  } -static void dc_send_cmd_to_dmu(struct dc_dmub_srv *dmub_srv, -		union dmub_rb_cmd *cmd) -{ -	dc_dmub_srv_cmd_queue(dmub_srv, cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); -	dc_dmub_srv_wait_idle(dmub_srv); -} -  static void dc_build_cursor_position_update_payload0(  		struct dmub_cmd_update_cursor_payload0 *pl, const uint8_t p_idx,  		const struct hubp *hubp, const struct dpp *dpp) @@ -1032,9 +965,11 @@ static void dc_build_cursor_attribute_update_payload1(  void dc_send_update_cursor_info_to_dmu(  		struct pipe_ctx *pCtx, uint8_t pipe_idx)  { -	union dmub_rb_cmd cmd = { 0 }; -	union dmub_cmd_update_cursor_info_data *update_cursor_info = -					&cmd.update_cursor_info.update_cursor_info_data; +	union dmub_rb_cmd cmd[2]; +	union dmub_cmd_update_cursor_info_data *update_cursor_info_0 = +					&cmd[0].update_cursor_info.update_cursor_info_data; + +	memset(cmd, 0, sizeof(cmd));  	if (!dc_dmub_should_update_cursor_data(pCtx))  		return; @@ -1051,31 +986,28 @@ void dc_send_update_cursor_info_to_dmu(  	{  		/* Build Payload#0 Header */ -		cmd.update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO; -		cmd.update_cursor_info.header.payload_bytes = -				sizeof(cmd.update_cursor_info.update_cursor_info_data); -		cmd.update_cursor_info.header.multi_cmd_pending = 1; /* To combine multi dmu cmd, 1st cmd */ +		cmd[0].update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO; +		cmd[0].update_cursor_info.header.payload_bytes = +				sizeof(cmd[0].update_cursor_info.update_cursor_info_data); +		cmd[0].update_cursor_info.header.multi_cmd_pending = 1; //To combine multi dmu cmd, 1st cmd  		/* Prepare Payload */ -		dc_build_cursor_update_payload0(pCtx, pipe_idx, &update_cursor_info->payload0); +		dc_build_cursor_update_payload0(pCtx, pipe_idx, &update_cursor_info_0->payload0); -		dc_build_cursor_position_update_payload0(&update_cursor_info->payload0, pipe_idx, +		dc_build_cursor_position_update_payload0(&update_cursor_info_0->payload0, pipe_idx,  				pCtx->plane_res.hubp, pCtx->plane_res.dpp); -		/* Send update_curosr_info to queue */ -		dc_dmub_srv_cmd_queue(pCtx->stream->ctx->dmub_srv, &cmd); -	} +		}  	{  		/* Build Payload#1 Header */ -		memset(update_cursor_info, 0, sizeof(union dmub_cmd_update_cursor_info_data)); -		cmd.update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO; -		cmd.update_cursor_info.header.payload_bytes = sizeof(struct cursor_attributes_cfg); -		cmd.update_cursor_info.header.multi_cmd_pending = 0; /* Indicate it's the last command. */ +		cmd[1].update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO; +		cmd[1].update_cursor_info.header.payload_bytes = sizeof(struct cursor_attributes_cfg); +		cmd[1].update_cursor_info.header.multi_cmd_pending = 0; //Indicate it's the last command.  		dc_build_cursor_attribute_update_payload1( -				&cmd.update_cursor_info.update_cursor_info_data.payload1.attribute_cfg, +				&cmd[1].update_cursor_info.update_cursor_info_data.payload1.attribute_cfg,  				pipe_idx, pCtx->plane_res.hubp, pCtx->plane_res.dpp);  		/* Combine 2nd cmds update_curosr_info to DMU */ -		dc_send_cmd_to_dmu(pCtx->stream->ctx->dmub_srv, &cmd); +		dm_execute_dmub_cmd_list(pCtx->stream->ctx, 2, cmd, DM_DMUB_WAIT_TYPE_WAIT);  	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h index d34f5563df2e..a5196a9292b3 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h @@ -26,7 +26,7 @@  #ifndef _DMUB_DC_SRV_H_  #define _DMUB_DC_SRV_H_ -#include "os_types.h" +#include "dm_services_types.h"  #include "dmub/dmub_srv.h"  struct dmub_srv; @@ -52,16 +52,13 @@ struct dc_dmub_srv {  	void *dm;  }; -void dc_dmub_srv_cmd_queue(struct dc_dmub_srv *dc_dmub_srv, -			   union dmub_rb_cmd *cmd); - -void dc_dmub_srv_cmd_execute(struct dc_dmub_srv *dc_dmub_srv); -  void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv); -void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv); +bool dc_dmub_srv_optimized_init_done(struct dc_dmub_srv *dc_dmub_srv); + +bool dc_dmub_srv_cmd_run(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type); -bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd); +bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int count, union dmub_rb_cmd *cmd_list, enum dm_dmub_wait_type wait_type);  bool dc_dmub_srv_notify_stream_mask(struct dc_dmub_srv *dc_dmub_srv,  				    unsigned int stream_mask); @@ -77,7 +74,7 @@ void dc_dmub_srv_drr_update_cmd(struct dc *dc, uint32_t tg_inst, uint32_t vtotal  void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst);  bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool enable_pstate, struct dc_state *context); -void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub); +void dc_dmub_srv_query_caps_cmd(struct dc_dmub_srv *dc_dmub_srv);  void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx);  void dc_dmub_srv_clear_inbox0_ack(struct dc_dmub_srv *dmub_srv);  void dc_dmub_srv_wait_for_inbox0_ack(struct dc_dmub_srv *dmub_srv); diff --git a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h index 49aab1924665..4a7f6497dc5a 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dp_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_dp_types.h @@ -566,6 +566,12 @@ struct dpcd_amd_device_id {  	uint8_t dal_version_byte2;  }; +struct target_luminance_value { +	uint8_t byte0; +	uint8_t byte1; +	uint8_t byte2; +}; +  struct dpcd_source_backlight_set {  	struct  {  		uint8_t byte0; @@ -1225,6 +1231,7 @@ struct dpcd_caps {  	union dp_main_line_channel_coding_cap channel_coding_cap;  	union dp_sink_video_fallback_formats fallback_formats;  	union dp_fec_capability1 fec_cap1; +	bool panel_luminance_control;  	union dp_cable_id cable_id;  	uint8_t edp_rev;  	union edp_alpm_caps alpm_caps; diff --git a/drivers/gpu/drm/amd/display/dc/dc_dsc.h b/drivers/gpu/drm/amd/display/dc/dc_dsc.h index 0e92a322c2ed..9491b76d61f5 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dsc.h +++ b/drivers/gpu/drm/amd/display/dc/dc_dsc.h @@ -58,6 +58,7 @@ struct dc_dsc_config_options {  	uint32_t dsc_min_slice_height_override;  	uint32_t max_target_bpp_limit_override_x16;  	uint32_t slice_height_granularity; +	uint32_t dsc_force_odm_hslice_override;  };  bool dc_dsc_parse_dsc_dpcd(const struct dc *dc, diff --git a/drivers/gpu/drm/amd/display/dc/dc_helper.c b/drivers/gpu/drm/amd/display/dc/dc_helper.c index f43cce16bb6c..3907eeff560c 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_helper.c +++ b/drivers/gpu/drm/amd/display/dc/dc_helper.c @@ -41,19 +41,13 @@ static inline void submit_dmub_read_modify_write(  	const struct dc_context *ctx)  {  	struct dmub_rb_cmd_read_modify_write *cmd_buf = &offload->cmd_data.read_modify_write; -	bool gather = false;  	offload->should_burst_write =  			(offload->same_addr_count == (DMUB_READ_MODIFY_WRITE_SEQ__MAX - 1));  	cmd_buf->header.payload_bytes =  			sizeof(struct dmub_cmd_read_modify_write_sequence) * offload->reg_seq_count; -	gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress; -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = false; - -	dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data); - -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather; +	dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);  	memset(cmd_buf, 0, sizeof(*cmd_buf)); @@ -66,17 +60,11 @@ static inline void submit_dmub_burst_write(  	const struct dc_context *ctx)  {  	struct dmub_rb_cmd_burst_write *cmd_buf = &offload->cmd_data.burst_write; -	bool gather = false;  	cmd_buf->header.payload_bytes =  			sizeof(uint32_t) * offload->reg_seq_count; -	gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress; -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = false; - -	dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data); - -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather; +	dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);  	memset(cmd_buf, 0, sizeof(*cmd_buf)); @@ -88,17 +76,11 @@ static inline void submit_dmub_reg_wait(  		const struct dc_context *ctx)  {  	struct dmub_rb_cmd_reg_wait *cmd_buf = &offload->cmd_data.reg_wait; -	bool gather = false; - -	gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress; -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = false; -	dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data); +	dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);  	memset(cmd_buf, 0, sizeof(*cmd_buf));  	offload->reg_seq_count = 0; - -	ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather;  }  struct dc_reg_value_masks { @@ -151,7 +133,6 @@ static void dmub_flush_buffer_execute(  		const struct dc_context *ctx)  {  	submit_dmub_read_modify_write(offload, ctx); -	dc_dmub_srv_cmd_execute(ctx->dmub_srv);  }  static void dmub_flush_burst_write_buffer_execute( @@ -159,7 +140,6 @@ static void dmub_flush_burst_write_buffer_execute(  		const struct dc_context *ctx)  {  	submit_dmub_burst_write(offload, ctx); -	dc_dmub_srv_cmd_execute(ctx->dmub_srv);  }  static bool dmub_reg_value_burst_set_pack(const struct dc_context *ctx, uint32_t addr, @@ -484,8 +464,7 @@ void generic_reg_wait(const struct dc_context *ctx,  		field_value = get_reg_field_value_ex(reg_val, mask, shift);  		if (field_value == condition_value) { -			if (i * delay_between_poll_us > 1000 && -					!IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) +			if (i * delay_between_poll_us > 1000)  				DC_LOG_DC("REG_WAIT taking a while: %dms in %s line:%d\n",  						delay_between_poll_us * i / 1000,  						func_name, line); @@ -497,8 +476,7 @@ void generic_reg_wait(const struct dc_context *ctx,  			delay_between_poll_us, time_out_num_tries,  			func_name, line); -	if (!IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -		BREAK_TO_DEBUGGER(); +	BREAK_TO_DEBUGGER();  }  void generic_write_indirect_reg(const struct dc_context *ctx, @@ -691,8 +669,6 @@ void reg_sequence_start_execute(const struct dc_context *ctx)  		default:  			return;  		} - -		dc_dmub_srv_cmd_execute(ctx->dmub_srv);  	}  } @@ -712,3 +688,59 @@ void reg_sequence_wait_done(const struct dc_context *ctx)  		dc_dmub_srv_wait_idle(ctx->dmub_srv);  	}  } + +char *dce_version_to_string(const int version) +{ +	switch (version) { +	case DCE_VERSION_8_0: +		return "DCE 8.0"; +	case DCE_VERSION_8_1: +		return "DCE 8.1"; +	case DCE_VERSION_8_3: +		return "DCE 8.3"; +	case DCE_VERSION_10_0: +		return "DCE 10.0"; +	case DCE_VERSION_11_0: +		return "DCE 11.0"; +	case DCE_VERSION_11_2: +		return "DCE 11.2"; +	case DCE_VERSION_11_22: +		return "DCE 11.22"; +	case DCE_VERSION_12_0: +		return "DCE 12.0"; +	case DCE_VERSION_12_1: +		return "DCE 12.1"; +	case DCN_VERSION_1_0: +		return "DCN 1.0"; +	case DCN_VERSION_1_01: +		return "DCN 1.0.1"; +	case DCN_VERSION_2_0: +		return "DCN 2.0"; +	case DCN_VERSION_2_1: +		return "DCN 2.1"; +	case DCN_VERSION_2_01: +		return "DCN 2.0.1"; +	case DCN_VERSION_3_0: +		return "DCN 3.0"; +	case DCN_VERSION_3_01: +		return "DCN 3.0.1"; +	case DCN_VERSION_3_02: +		return "DCN 3.0.2"; +	case DCN_VERSION_3_03: +		return "DCN 3.0.3"; +	case DCN_VERSION_3_1: +		return "DCN 3.1"; +	case DCN_VERSION_3_14: +		return "DCN 3.1.4"; +	case DCN_VERSION_3_15: +		return "DCN 3.1.5"; +	case DCN_VERSION_3_16: +		return "DCN 3.1.6"; +	case DCN_VERSION_3_2: +		return "DCN 3.2"; +	case DCN_VERSION_3_21: +		return "DCN 3.2.1"; +	default: +		return "Unknown"; +	} +} diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h index 25284006019c..3697ea1d14c1 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h @@ -131,6 +131,7 @@ union stream_update_flags {  		uint32_t dsc_changed : 1;  		uint32_t mst_bw : 1;  		uint32_t crtc_timing_adjust : 1; +		uint32_t fams_changed : 1;  	} bits;  	uint32_t raw; @@ -171,6 +172,10 @@ struct mall_temp_config {  	bool is_phantom_plane[MAX_PIPES];  }; +struct dc_stream_debug_options { +	char force_odm_combine_segments; +}; +  struct dc_stream_state {  	// sink is deprecated, new code should not reference  	// this pointer @@ -181,6 +186,7 @@ struct dc_stream_state {  	 * a stream via the volatile dc_state rather than the static dc_link.  	 */  	struct link_encoder *link_enc; +	struct dc_stream_debug_options debug;  	struct dc_panel_patch sink_patches;  	union display_content_support content_support;  	struct dc_crtc_timing timing; @@ -227,6 +233,7 @@ struct dc_stream_state {  	 */  	bool vrr_active_variable;  	bool freesync_on_desktop; +	bool vrr_active_fixed;  	bool converter_disable_audio;  	uint8_t qs_bit; @@ -295,6 +302,7 @@ struct dc_stream_state {  	bool vblank_synchronized;  	bool fpo_in_use;  	struct mall_stream_config mall_stream_config; +	bool skip_edp_power_down;  };  #define ABM_LEVEL_IMMEDIATE_DISABLE 255 @@ -320,6 +328,7 @@ struct dc_stream_update {  	bool integer_scaling_update;  	bool *allow_freesync;  	bool *vrr_active_variable; +	bool *vrr_active_fixed;  	struct colorspace_transform *gamut_remap;  	enum dc_color_space *output_color_space; diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h index 45ab48fe5d00..6b4731b5e975 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h @@ -69,13 +69,6 @@ enum dce_environment {  	DCE_ENV_VIRTUAL_HW  }; -/* Note: use these macro definitions instead of direct comparison! */ -#define IS_FPGA_MAXIMUS_DC(dce_environment) \ -	(dce_environment == DCE_ENV_FPGA_MAXIMUS) - -#define IS_DIAG_DC(dce_environment) \ -	(IS_FPGA_MAXIMUS_DC(dce_environment) || (dce_environment == DCE_ENV_DIAG)) -  struct dc_perf_trace {  	unsigned long read_count;  	unsigned long write_count; @@ -83,7 +76,7 @@ struct dc_perf_trace {  	unsigned long last_entry_write;  }; -#define MAX_SURFACE_NUM 4 +#define MAX_SURFACE_NUM 6  #define NUM_PIXEL_FORMATS 10  enum tiling_mode { @@ -196,6 +189,7 @@ struct dc_panel_patch {  	unsigned int disable_fams;  	unsigned int skip_avmute;  	unsigned int mst_start_top_delay; +	unsigned int delay_disable_aux_intercept_ms;  };  struct dc_edid_caps { diff --git a/drivers/gpu/drm/amd/display/dc/dce/Makefile b/drivers/gpu/drm/amd/display/dc/dce/Makefile index 0d7db132a20f..01490c9ba958 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/Makefile +++ b/drivers/gpu/drm/amd/display/dc/dce/Makefile @@ -29,7 +29,7 @@  DCE = dce_audio.o dce_stream_encoder.o dce_link_encoder.o dce_hwseq.o \  dce_mem_input.o dce_clock_source.o dce_scl_filters.o dce_transform.o \  dce_opp.o dce_dmcu.o dce_abm.o dce_ipp.o dce_aux.o \ -dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o dmub_psr.o dmub_abm.o dce_panel_cntl.o \ +dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o dmub_psr.o dmub_abm.o dmub_abm_lcd.o dce_panel_cntl.o \  dmub_hw_lock_mgr.o dmub_outbox.o  AMD_DAL_DCE = $(addprefix $(AMDDALPATH)/dc/dce/,$(DCE)) diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c index 462c7a3ec3cc..ed8936405dfa 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c @@ -920,25 +920,6 @@ static bool dce112_program_pix_clk(  	struct dce110_clk_src *clk_src = TO_DCE110_CLK_SRC(clock_source);  	struct bp_pixel_clock_parameters bp_pc_params = {0}; -	if (IS_FPGA_MAXIMUS_DC(clock_source->ctx->dce_environment)) { -		unsigned int inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; -		unsigned dp_dto_ref_100hz = 7000000; -		unsigned clock_100hz = pll_settings->actual_pix_clk_100hz; - -		/* Set DTO values: phase = target clock, modulo = reference clock */ -		REG_WRITE(PHASE[inst], clock_100hz); -		REG_WRITE(MODULO[inst], dp_dto_ref_100hz); - -		/* Enable DTO */ -		if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL) -			REG_UPDATE_2(PIXEL_RATE_CNTL[inst], -					DP_DTO0_ENABLE, 1, -					PIPE0_DTO_SRC_SEL, 1); -		else -			REG_UPDATE(PIXEL_RATE_CNTL[inst], -					DP_DTO0_ENABLE, 1); -		return true; -	}  	/* First disable SS  	 * ATOMBIOS will enable by default SS on PLL for DP,  	 * do not disable it here @@ -1015,25 +996,6 @@ static bool dcn31_program_pix_clk(  			REG_UPDATE(PIXEL_RATE_CNTL[inst],  					DP_DTO0_ENABLE, 1);  	} else { -		if (IS_FPGA_MAXIMUS_DC(clock_source->ctx->dce_environment)) { -			unsigned int inst = pix_clk_params->controller_id - CONTROLLER_ID_D0; -			unsigned dp_dto_ref_100hz = 7000000; -			unsigned clock_100hz = pll_settings->actual_pix_clk_100hz; - -			/* Set DTO values: phase = target clock, modulo = reference clock */ -			REG_WRITE(PHASE[inst], clock_100hz); -			REG_WRITE(MODULO[inst], dp_dto_ref_100hz); - -			/* Enable DTO */ -			if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL) -				REG_UPDATE_2(PIXEL_RATE_CNTL[inst], -						DP_DTO0_ENABLE, 1, -						PIPE0_DTO_SRC_SEL, 1); -			else -				REG_UPDATE(PIXEL_RATE_CNTL[inst], -						DP_DTO0_ENABLE, 1); -			return true; -		}  		if (clk_src->cs_mask->PIPE0_DTO_SRC_SEL)  			REG_UPDATE(PIXEL_RATE_CNTL[inst], diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c index e74266cc0098..63009db8b5a7 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c @@ -1093,11 +1093,9 @@ static void dcn21_dmcu_construct(  	dce_dmcu_construct(dmcu_dce, ctx, regs, dmcu_shift, dmcu_mask); -	if (!IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) { -		psp_version = dm_read_reg(ctx, mmMP0_SMN_C2PMSG_58); -		dmcu_dce->base.auto_load_dmcu = ((psp_version & 0x00FF00FF) > 0x00110029); -		dmcu_dce->base.psp_version = psp_version; -	} +	psp_version = dm_read_reg(ctx, mmMP0_SMN_C2PMSG_58); +	dmcu_dce->base.auto_load_dmcu = ((psp_version & 0x00FF00FF) > 0x00110029); +	dmcu_dce->base.psp_version = psp_version;  }  struct dmcu *dce_dmcu_create( diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c index 9fc48208c2e4..2fb9572ce25d 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c @@ -24,212 +24,139 @@   */  #include "dmub_abm.h" -#include "dce_abm.h" +#include "dmub_abm_lcd.h"  #include "dc.h" -#include "dc_dmub_srv.h" -#include "dmub/dmub_srv.h"  #include "core_types.h" -#include "dm_services.h" -#include "reg_helper.h" -#include "fixed31_32.h" - -#include "atom.h"  #define TO_DMUB_ABM(abm)\  	container_of(abm, struct dce_abm, base) -#define REG(reg) \ -	(dce_abm->regs->reg) - -#undef FN -#define FN(reg_name, field_name) \ -	dce_abm->abm_shift->field_name, dce_abm->abm_mask->field_name - -#define CTX \ -	dce_abm->base.ctx - -#define DISABLE_ABM_IMMEDIATELY 255 +#define ABM_FEATURE_NO_SUPPORT	0 +#define ABM_LCD_SUPPORT			1 - - -static void dmub_abm_enable_fractional_pwm(struct dc_context *dc) +static unsigned int abm_feature_support(struct abm *abm, unsigned int panel_inst)  { -	union dmub_rb_cmd cmd; -	uint32_t fractional_pwm = (dc->dc->config.disable_fractional_pwm == false) ? 1 : 0; -	uint32_t edp_id_count = dc->dc_edp_id_count; +	struct dc_context *dc = abm->ctx; +	struct dc_link *edp_links[MAX_NUM_EDP];  	int i; -	uint8_t panel_mask = 0; +	int edp_num; +	unsigned int ret = ABM_FEATURE_NO_SUPPORT; -	for (i = 0; i < edp_id_count; i++) -		panel_mask |= 0x01 << i; +	dc_get_edp_links(dc->dc, edp_links, &edp_num); -	memset(&cmd, 0, sizeof(cmd)); -	cmd.abm_set_pwm_frac.header.type = DMUB_CMD__ABM; -	cmd.abm_set_pwm_frac.header.sub_type = DMUB_CMD__ABM_SET_PWM_FRAC; -	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.fractional_pwm = fractional_pwm; -	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; -	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.panel_mask = panel_mask; -	cmd.abm_set_pwm_frac.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pwm_frac_data); +	for (i = 0; i < edp_num; i++) { +		if (panel_inst == i) +			break; +	} -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	if (i < edp_num) { +		ret = ABM_LCD_SUPPORT; +	} + +	return ret;  } -static void dmub_abm_init(struct abm *abm, uint32_t backlight) +static void dmub_abm_init_ex(struct abm *abm, uint32_t backlight)  { -	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); - -	REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x3); -	REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x1); -	REG_WRITE(DC_ABM1_LS_SAMPLE_RATE, 0x3); -	REG_WRITE(DC_ABM1_LS_SAMPLE_RATE, 0x1); -	REG_WRITE(BL1_PWM_BL_UPDATE_SAMPLE_RATE, 0x1); - -	REG_SET_3(DC_ABM1_HG_MISC_CTRL, 0, -			ABM1_HG_NUM_OF_BINS_SEL, 0, -			ABM1_HG_VMAX_SEL, 1, -			ABM1_HG_BIN_BITWIDTH_SIZE_SEL, 0); - -	REG_SET_3(DC_ABM1_IPCSC_COEFF_SEL, 0, -			ABM1_IPCSC_COEFF_SEL_R, 2, -			ABM1_IPCSC_COEFF_SEL_G, 4, -			ABM1_IPCSC_COEFF_SEL_B, 2); - -	REG_UPDATE(BL1_PWM_CURRENT_ABM_LEVEL, -			BL1_PWM_CURRENT_ABM_LEVEL, backlight); - -	REG_UPDATE(BL1_PWM_TARGET_ABM_LEVEL, -			BL1_PWM_TARGET_ABM_LEVEL, backlight); - -	REG_UPDATE(BL1_PWM_USER_LEVEL, -			BL1_PWM_USER_LEVEL, backlight); - -	REG_UPDATE_2(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES, -			ABM1_LS_MIN_PIXEL_VALUE_THRES, 0, -			ABM1_LS_MAX_PIXEL_VALUE_THRES, 1000); - -	REG_SET_3(DC_ABM1_HGLS_REG_READ_PROGRESS, 0, -			ABM1_HG_REG_READ_MISSED_FRAME_CLEAR, 1, -			ABM1_LS_REG_READ_MISSED_FRAME_CLEAR, 1, -			ABM1_BL_REG_READ_MISSED_FRAME_CLEAR, 1); - -	dmub_abm_enable_fractional_pwm(abm->ctx); +	dmub_abm_init(abm, backlight);  } -static unsigned int dmub_abm_get_current_backlight(struct abm *abm) +static unsigned int dmub_abm_get_current_backlight_ex(struct abm *abm)  { -	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); -	unsigned int backlight = REG_READ(BL1_PWM_CURRENT_ABM_LEVEL); - -	/* return backlight in hardware format which is unsigned 17 bits, with -	 * 1 bit integer and 16 bit fractional -	 */ -	return backlight; +	return dmub_abm_get_current_backlight(abm);  } -static unsigned int dmub_abm_get_target_backlight(struct abm *abm) +static unsigned int dmub_abm_get_target_backlight_ex(struct abm *abm)  { -	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); -	unsigned int backlight = REG_READ(BL1_PWM_TARGET_ABM_LEVEL); - -	/* return backlight in hardware format which is unsigned 17 bits, with -	 * 1 bit integer and 16 bit fractional -	 */ -	return backlight; +	return dmub_abm_get_target_backlight(abm);  } -static bool dmub_abm_set_level(struct abm *abm, uint32_t level) +static bool dmub_abm_set_level_ex(struct abm *abm, uint32_t level)  { -	union dmub_rb_cmd cmd; -	struct dc_context *dc = abm->ctx; -	struct dc_link *edp_links[MAX_NUM_EDP]; -	int i; -	int edp_num; -	uint8_t panel_mask = 0; +	bool ret = false; +	unsigned int feature_support, i; +	uint8_t panel_mask0 = 0; -	dc_get_edp_links(dc->dc, edp_links, &edp_num); +	for (i = 0; i < MAX_NUM_EDP; i++) { +		feature_support = abm_feature_support(abm, i); -	for (i = 0; i < edp_num; i++) { -		if (edp_links[i]->link_status.link_active) -			panel_mask |= (0x01 << i); +		if (feature_support == ABM_LCD_SUPPORT) +			panel_mask0 |= (0x01 << i);  	} -	memset(&cmd, 0, sizeof(cmd)); -	cmd.abm_set_level.header.type = DMUB_CMD__ABM; -	cmd.abm_set_level.header.sub_type = DMUB_CMD__ABM_SET_LEVEL; -	cmd.abm_set_level.abm_set_level_data.level = level; -	cmd.abm_set_level.abm_set_level_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; -	cmd.abm_set_level.abm_set_level_data.panel_mask = panel_mask; -	cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_level_data); +	if (panel_mask0) +		ret = dmub_abm_set_level(abm, level, panel_mask0); -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); - -	return true; +	return ret;  } -static bool dmub_abm_init_config(struct abm *abm, +static bool dmub_abm_init_config_ex(struct abm *abm,  	const char *src,  	unsigned int bytes,  	unsigned int inst)  { -	union dmub_rb_cmd cmd; -	struct dc_context *dc = abm->ctx; -	uint8_t panel_mask = 0x01 << inst; +	unsigned int feature_support; + +	feature_support = abm_feature_support(abm, inst); + +	if (feature_support == ABM_LCD_SUPPORT) +		dmub_abm_init_config(abm, src, bytes, inst); + +	return true; +} -	// TODO: Optimize by only reading back final 4 bytes -	dmub_flush_buffer_mem(&dc->dmub_srv->dmub->scratch_mem_fb); +static bool dmub_abm_set_pause_ex(struct abm *abm, bool pause, unsigned int panel_inst, unsigned int stream_inst) +{ +	bool ret = false; +	unsigned int feature_support; -	// Copy iramtable into cw7 -	memcpy(dc->dmub_srv->dmub->scratch_mem_fb.cpu_addr, (void *)src, bytes); +	feature_support = abm_feature_support(abm, panel_inst); -	memset(&cmd, 0, sizeof(cmd)); -	// Fw will copy from cw7 to fw_state -	cmd.abm_init_config.header.type = DMUB_CMD__ABM; -	cmd.abm_init_config.header.sub_type = DMUB_CMD__ABM_INIT_CONFIG; -	cmd.abm_init_config.abm_init_config_data.src.quad_part = dc->dmub_srv->dmub->scratch_mem_fb.gpu_addr; -	cmd.abm_init_config.abm_init_config_data.bytes = bytes; -	cmd.abm_init_config.abm_init_config_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; -	cmd.abm_init_config.abm_init_config_data.panel_mask = panel_mask; +	if (feature_support == ABM_LCD_SUPPORT) +		ret = dmub_abm_set_pause(abm, pause, panel_inst, stream_inst); -	cmd.abm_init_config.header.payload_bytes = sizeof(struct dmub_cmd_abm_init_config_data); +	return ret; +} -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +static bool dmub_abm_set_pipe_ex(struct abm *abm, uint32_t otg_inst, uint32_t option, uint32_t panel_inst) +{ +	bool ret = false; +	unsigned int feature_support; -	return true; +	feature_support = abm_feature_support(abm, panel_inst); + +	if (feature_support == ABM_LCD_SUPPORT) +		ret = dmub_abm_set_pipe(abm, otg_inst, option, panel_inst); + +	return ret;  } -static bool dmub_abm_set_pause(struct abm *abm, bool pause, unsigned int panel_inst, unsigned int stream_inst) +static bool dmub_abm_set_backlight_level_pwm_ex(struct abm *abm, +		unsigned int backlight_pwm_u16_16, +		unsigned int frame_ramp, +		unsigned int controller_id, +		unsigned int panel_inst)  { -	union dmub_rb_cmd cmd; -	struct dc_context *dc = abm->ctx; -	uint8_t panel_mask = 0x01 << panel_inst; +	bool ret = false; +	unsigned int feature_support; -	memset(&cmd, 0, sizeof(cmd)); -	cmd.abm_pause.header.type = DMUB_CMD__ABM; -	cmd.abm_pause.header.sub_type = DMUB_CMD__ABM_PAUSE; -	cmd.abm_pause.abm_pause_data.enable = pause; -	cmd.abm_pause.abm_pause_data.panel_mask = panel_mask; -	cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_pause_data); +	feature_support = abm_feature_support(abm, panel_inst); -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	if (feature_support == ABM_LCD_SUPPORT) +		ret = dmub_abm_set_backlight_level(abm, backlight_pwm_u16_16, frame_ramp, panel_inst); -	return true; +	return ret;  }  static const struct abm_funcs abm_funcs = { -	.abm_init = dmub_abm_init, -	.set_abm_level = dmub_abm_set_level, -	.get_current_backlight = dmub_abm_get_current_backlight, -	.get_target_backlight = dmub_abm_get_target_backlight, -	.init_abm_config = dmub_abm_init_config, -	.set_abm_pause = dmub_abm_set_pause, +	.abm_init = dmub_abm_init_ex, +	.set_abm_level = dmub_abm_set_level_ex, +	.get_current_backlight = dmub_abm_get_current_backlight_ex, +	.get_target_backlight = dmub_abm_get_target_backlight_ex, +	.init_abm_config = dmub_abm_init_config_ex, +	.set_abm_pause = dmub_abm_set_pause_ex, +	.set_pipe_ex = dmub_abm_set_pipe_ex, +	.set_backlight_level_pwm = dmub_abm_set_backlight_level_pwm_ex,  };  static void dmub_abm_construct( @@ -256,16 +183,19 @@ struct abm *dmub_abm_create(  	const struct dce_abm_shift *abm_shift,  	const struct dce_abm_mask *abm_mask)  { -	struct dce_abm *abm_dce = kzalloc(sizeof(*abm_dce), GFP_KERNEL); +	if (ctx->dc->caps.dmcub_support) { +		struct dce_abm *abm_dce = kzalloc(sizeof(*abm_dce), GFP_KERNEL); -	if (abm_dce == NULL) { -		BREAK_TO_DEBUGGER(); -		return NULL; -	} +		if (abm_dce == NULL) { +			BREAK_TO_DEBUGGER(); +			return NULL; +		} -	dmub_abm_construct(abm_dce, ctx, regs, abm_shift, abm_mask); +		dmub_abm_construct(abm_dce, ctx, regs, abm_shift, abm_mask); -	return &abm_dce->base; +		return &abm_dce->base; +	} +	return NULL;  }  void dmub_abm_destroy(struct abm **abm) diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.c new file mode 100644 index 000000000000..39da73eba86e --- /dev/null +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.c @@ -0,0 +1,252 @@ +/* + * Copyright 2019 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. + * + * Authors: AMD + * + */ + +#include "dmub_abm.h" +#include "dmub_abm_lcd.h" +#include "dce_abm.h" +#include "dc.h" +#include "dc_dmub_srv.h" +#include "dmub/dmub_srv.h" +#include "core_types.h" +#include "dm_services.h" +#include "reg_helper.h" +#include "fixed31_32.h" + +#ifdef _WIN32 +#include "atombios.h" +#else +#include "atom.h" +#endif + +#define TO_DMUB_ABM(abm)\ +	container_of(abm, struct dce_abm, base) + +#define REG(reg) \ +	(dce_abm->regs->reg) + +#undef FN +#define FN(reg_name, field_name) \ +	dce_abm->abm_shift->field_name, dce_abm->abm_mask->field_name + +#define CTX \ +	dce_abm->base.ctx + +#define DISABLE_ABM_IMMEDIATELY 255 + + + +static void dmub_abm_enable_fractional_pwm(struct dc_context *dc) +{ +	union dmub_rb_cmd cmd; +	uint32_t fractional_pwm = (dc->dc->config.disable_fractional_pwm == false) ? 1 : 0; +	uint32_t edp_id_count = dc->dc_edp_id_count; +	int i; +	uint8_t panel_mask = 0; + +	for (i = 0; i < edp_id_count; i++) +		panel_mask |= 0x01 << i; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_set_pwm_frac.header.type = DMUB_CMD__ABM; +	cmd.abm_set_pwm_frac.header.sub_type = DMUB_CMD__ABM_SET_PWM_FRAC; +	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.fractional_pwm = fractional_pwm; +	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; +	cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.panel_mask = panel_mask; +	cmd.abm_set_pwm_frac.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pwm_frac_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); +} + +void dmub_abm_init(struct abm *abm, uint32_t backlight) +{ +	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); + +	REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x3); +	REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x1); +	REG_WRITE(DC_ABM1_LS_SAMPLE_RATE, 0x3); +	REG_WRITE(DC_ABM1_LS_SAMPLE_RATE, 0x1); +	REG_WRITE(BL1_PWM_BL_UPDATE_SAMPLE_RATE, 0x1); + +	REG_SET_3(DC_ABM1_HG_MISC_CTRL, 0, +			ABM1_HG_NUM_OF_BINS_SEL, 0, +			ABM1_HG_VMAX_SEL, 1, +			ABM1_HG_BIN_BITWIDTH_SIZE_SEL, 0); + +	REG_SET_3(DC_ABM1_IPCSC_COEFF_SEL, 0, +			ABM1_IPCSC_COEFF_SEL_R, 2, +			ABM1_IPCSC_COEFF_SEL_G, 4, +			ABM1_IPCSC_COEFF_SEL_B, 2); + +	REG_UPDATE(BL1_PWM_CURRENT_ABM_LEVEL, +			BL1_PWM_CURRENT_ABM_LEVEL, backlight); + +	REG_UPDATE(BL1_PWM_TARGET_ABM_LEVEL, +			BL1_PWM_TARGET_ABM_LEVEL, backlight); + +	REG_UPDATE(BL1_PWM_USER_LEVEL, +			BL1_PWM_USER_LEVEL, backlight); + +	REG_UPDATE_2(DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES, +			ABM1_LS_MIN_PIXEL_VALUE_THRES, 0, +			ABM1_LS_MAX_PIXEL_VALUE_THRES, 1000); + +	REG_SET_3(DC_ABM1_HGLS_REG_READ_PROGRESS, 0, +			ABM1_HG_REG_READ_MISSED_FRAME_CLEAR, 1, +			ABM1_LS_REG_READ_MISSED_FRAME_CLEAR, 1, +			ABM1_BL_REG_READ_MISSED_FRAME_CLEAR, 1); + +	dmub_abm_enable_fractional_pwm(abm->ctx); +} + +unsigned int dmub_abm_get_current_backlight(struct abm *abm) +{ +	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); +	unsigned int backlight = REG_READ(BL1_PWM_CURRENT_ABM_LEVEL); + +	/* return backlight in hardware format which is unsigned 17 bits, with +	 * 1 bit integer and 16 bit fractional +	 */ +	return backlight; +} + +unsigned int dmub_abm_get_target_backlight(struct abm *abm) +{ +	struct dce_abm *dce_abm = TO_DMUB_ABM(abm); +	unsigned int backlight = REG_READ(BL1_PWM_TARGET_ABM_LEVEL); + +	/* return backlight in hardware format which is unsigned 17 bits, with +	 * 1 bit integer and 16 bit fractional +	 */ +	return backlight; +} + +bool dmub_abm_set_level(struct abm *abm, uint32_t level, uint8_t panel_mask) +{ +	union dmub_rb_cmd cmd; +	struct dc_context *dc = abm->ctx; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_set_level.header.type = DMUB_CMD__ABM; +	cmd.abm_set_level.header.sub_type = DMUB_CMD__ABM_SET_LEVEL; +	cmd.abm_set_level.abm_set_level_data.level = level; +	cmd.abm_set_level.abm_set_level_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; +	cmd.abm_set_level.abm_set_level_data.panel_mask = panel_mask; +	cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_level_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); + +	return true; +} + +void dmub_abm_init_config(struct abm *abm, +	const char *src, +	unsigned int bytes, +	unsigned int inst) +{ +	union dmub_rb_cmd cmd; +	struct dc_context *dc = abm->ctx; +	uint8_t panel_mask = 0x01 << inst; + +	// TODO: Optimize by only reading back final 4 bytes +	dmub_flush_buffer_mem(&dc->dmub_srv->dmub->scratch_mem_fb); + +	// Copy iramtable into cw7 +	memcpy(dc->dmub_srv->dmub->scratch_mem_fb.cpu_addr, (void *)src, bytes); + +	memset(&cmd, 0, sizeof(cmd)); +	// Fw will copy from cw7 to fw_state +	cmd.abm_init_config.header.type = DMUB_CMD__ABM; +	cmd.abm_init_config.header.sub_type = DMUB_CMD__ABM_INIT_CONFIG; +	cmd.abm_init_config.abm_init_config_data.src.quad_part = dc->dmub_srv->dmub->scratch_mem_fb.gpu_addr; +	cmd.abm_init_config.abm_init_config_data.bytes = bytes; +	cmd.abm_init_config.abm_init_config_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; +	cmd.abm_init_config.abm_init_config_data.panel_mask = panel_mask; + +	cmd.abm_init_config.header.payload_bytes = sizeof(struct dmub_cmd_abm_init_config_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); + +} + +bool dmub_abm_set_pause(struct abm *abm, bool pause, unsigned int panel_inst, unsigned int stream_inst) +{ +	union dmub_rb_cmd cmd; +	struct dc_context *dc = abm->ctx; +	uint8_t panel_mask = 0x01 << panel_inst; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_pause.header.type = DMUB_CMD__ABM; +	cmd.abm_pause.header.sub_type = DMUB_CMD__ABM_PAUSE; +	cmd.abm_pause.abm_pause_data.enable = pause; +	cmd.abm_pause.abm_pause_data.panel_mask = panel_mask; +	cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_pause_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); + +	return true; +} + +bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst, uint32_t option, uint32_t panel_inst) +{ +	union dmub_rb_cmd cmd; +	struct dc_context *dc = abm->ctx; +	uint32_t ramping_boundary = 0xFFFF; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_set_pipe.header.type = DMUB_CMD__ABM; +	cmd.abm_set_pipe.header.sub_type = DMUB_CMD__ABM_SET_PIPE; +	cmd.abm_set_pipe.abm_set_pipe_data.otg_inst = otg_inst; +	cmd.abm_set_pipe.abm_set_pipe_data.set_pipe_option = option; +	cmd.abm_set_pipe.abm_set_pipe_data.panel_inst = panel_inst; +	cmd.abm_set_pipe.abm_set_pipe_data.ramping_boundary = ramping_boundary; +	cmd.abm_set_pipe.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pipe_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); + +	return true; +} + +bool dmub_abm_set_backlight_level(struct abm *abm, +		unsigned int backlight_pwm_u16_16, +		unsigned int frame_ramp, +		unsigned int panel_inst) +{ +	union dmub_rb_cmd cmd; +	struct dc_context *dc = abm->ctx; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_set_backlight.header.type = DMUB_CMD__ABM; +	cmd.abm_set_backlight.header.sub_type = DMUB_CMD__ABM_SET_BACKLIGHT; +	cmd.abm_set_backlight.abm_set_backlight_data.frame_ramp = frame_ramp; +	cmd.abm_set_backlight.abm_set_backlight_data.backlight_user_level = backlight_pwm_u16_16; +	cmd.abm_set_backlight.abm_set_backlight_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; +	cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_inst); +	cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); + +	return true; +} + diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.h b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.h new file mode 100644 index 000000000000..00b4e268768e --- /dev/null +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm_lcd.h @@ -0,0 +1,46 @@ +/* + * Copyright 2019 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. + * + * Authors: AMD + * + */ + +#ifndef __DMUB_ABM_LCD_H__ +#define __DMUB_ABM_LCD_H__ + +#include "abm.h" + +void dmub_abm_init(struct abm *abm, uint32_t backlight); +bool dmub_abm_set_level(struct abm *abm, uint32_t level, uint8_t panel_mask); +unsigned int dmub_abm_get_current_backlight(struct abm *abm); +unsigned int dmub_abm_get_target_backlight(struct abm *abm); +void dmub_abm_init_config(struct abm *abm, +	const char *src, +	unsigned int bytes, +	unsigned int inst); + +bool dmub_abm_set_pause(struct abm *abm, bool pause, unsigned int panel_inst, unsigned int stream_inst); +bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst, uint32_t option, uint32_t panel_inst); +bool dmub_abm_set_backlight_level(struct abm *abm, +		unsigned int backlight_pwm_u16_16, +		unsigned int frame_ramp, +		unsigned int panel_inst); +#endif diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c index 3f32e9c3fbaf..2aa0e01a6891 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c @@ -47,9 +47,7 @@ void dmub_hw_lock_mgr_cmd(struct dc_dmub_srv *dmub_srv,  	if (!lock)  		cmd.lock_hw.lock_hw_data.should_release = 1; -	dc_dmub_srv_cmd_queue(dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); -	dc_dmub_srv_wait_idle(dmub_srv); +	dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv, diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c index fff1d07d865d..d8009b2dc56a 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c @@ -48,7 +48,5 @@ void dmub_enable_outbox_notification(struct dc_dmub_srv *dmub_srv)  		sizeof(cmd.outbox1_enable.header);  	cmd.outbox1_enable.enable = true; -	dc_dmub_srv_cmd_queue(dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dmub_srv); -	dc_dmub_srv_wait_idle(dmub_srv); +	dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  } diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c index 9705d8f88382..4000a834592c 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c @@ -168,9 +168,7 @@ static bool dmub_psr_set_version(struct dmub_psr *dmub, struct dc_stream_state *  	cmd.psr_set_version.psr_set_version_data.panel_inst = panel_inst;  	cmd.psr_set_version.header.payload_bytes = sizeof(struct dmub_cmd_psr_set_version_data); -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } @@ -198,9 +196,7 @@ static void dmub_psr_enable(struct dmub_psr *dmub, bool enable, bool wait, uint8  	cmd.psr_enable.header.payload_bytes = 0; // Send header only -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc->dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	/* Below loops 1000 x 500us = 500 ms.  	 *  Exit PSR may need to wait 1-2 frames to power up. Timeout after at @@ -248,9 +244,7 @@ static void dmub_psr_set_level(struct dmub_psr *dmub, uint16_t psr_level, uint8_  	cmd.psr_set_level.psr_set_level_data.psr_level = psr_level;  	cmd.psr_set_level.psr_set_level_data.cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1;  	cmd.psr_set_level.psr_set_level_data.panel_inst = panel_inst; -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  /* @@ -269,9 +263,7 @@ static void dmub_psr_set_sink_vtotal_in_psr_active(struct dmub_psr *dmub,  	cmd.psr_set_vtotal.psr_set_vtotal_data.psr_vtotal_idle = psr_vtotal_idle;  	cmd.psr_set_vtotal.psr_set_vtotal_data.psr_vtotal_su = psr_vtotal_su; -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  /* @@ -290,9 +282,7 @@ static void dmub_psr_set_power_opt(struct dmub_psr *dmub, unsigned int power_opt  	cmd.psr_set_power_opt.psr_set_power_opt_data.power_opt = power_opt;  	cmd.psr_set_power_opt.psr_set_power_opt_data.panel_inst = panel_inst; -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  /* @@ -422,9 +412,7 @@ static bool dmub_psr_copy_settings(struct dmub_psr *dmub,  		copy_settings_data->relock_delay_frame_cnt = 2;  	copy_settings_data->dsc_slice_height = psr_context->dsc_slice_height; -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } @@ -445,9 +433,7 @@ static void dmub_psr_force_static(struct dmub_psr *dmub, uint8_t panel_inst)  	cmd.psr_force_static.header.sub_type = DMUB_CMD__PSR_FORCE_STATIC;  	cmd.psr_enable.header.payload_bytes = 0; -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  /* diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c index 54805802cbd5..42e9b6a529f6 100644 --- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c @@ -401,6 +401,10 @@ static const struct dc_plane_cap plane_cap = {  	}  }; +static const struct dc_debug_options debug_defaults = { +		.enable_legacy_fast_update = true, +}; +  #define CTX  ctx  #define REG(reg) mm ## reg @@ -1071,6 +1075,7 @@ static bool dce100_resource_construct(  	dc->caps.dual_link_dvi = true;  	dc->caps.disable_dp_clk_share = true;  	dc->caps.extended_aux_timeout_support = false; +	dc->debug = debug_defaults;  	for (i = 0; i < pool->base.pipe_count; i++) {  		pool->base.timing_generators[i] = diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index 8d2460d06bce..6c9ca43d1040 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c @@ -209,9 +209,6 @@ static bool dce110_enable_display_power_gating(  	struct dc_context *ctx = dc->ctx;  	unsigned int underlay_idx = dc->res_pool->underlay_pipe_index; -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -		return true; -  	if (power_gating == PIPE_GATING_CONTROL_INIT)  		cntl = ASIC_PIPE_INIT;  	else if (power_gating == PIPE_GATING_CONTROL_ENABLE) @@ -1219,7 +1216,8 @@ void dce110_blank_stream(struct pipe_ctx *pipe_ctx)  	struct dce_hwseq *hws = link->dc->hwseq;  	if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) { -		hws->funcs.edp_backlight_control(link, false); +		if (!stream->skip_edp_power_down) +			hws->funcs.edp_backlight_control(link, false);  		link->dc->hwss.set_abm_immediate_disable(pipe_ctx);  	} @@ -2291,6 +2289,11 @@ enum dc_status dce110_apply_ctx_to_hw(  		if (DC_OK != status)  			return status; + +#ifdef CONFIG_DRM_AMD_DC_FP +		if (hws->funcs.resync_fifo_dccg_dio) +			hws->funcs.resync_fifo_dccg_dio(hws, dc, context); +#endif  	}  	if (dc->fbc_compressor) diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c index a4a45a6ce61e..46eca5a21e1c 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c @@ -424,6 +424,10 @@ static const struct dc_plane_cap plane_cap = {  		64  }; +static const struct dc_debug_options debug_defaults = { +		.enable_legacy_fast_update = true, +}; +  static const struct dc_plane_cap underlay_plane_cap = {  		.type = DC_PLANE_TYPE_DCE_UNDERLAY,  		.per_pixel_alpha = 1, @@ -1368,6 +1372,7 @@ static bool dce110_resource_construct(  	dc->caps.min_horizontal_blanking_period = 80;  	dc->caps.is_apu = true;  	dc->caps.extended_aux_timeout_support = false; +	dc->debug = debug_defaults;  	/*************************************************  	 *  Create resources                             * diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c index 19873ee1f78d..690caaaff019 100644 --- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_hw_sequencer.c @@ -120,9 +120,6 @@ static bool dce112_enable_display_power_gating(  	enum bp_pipe_control_action cntl;  	struct dc_context *ctx = dc->ctx; -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -		return true; -  	if (power_gating == PIPE_GATING_CONTROL_INIT)  		cntl = ASIC_PIPE_INIT;  	else if (power_gating == PIPE_GATING_CONTROL_ENABLE) diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c index e179e80667d1..808855886183 100644 --- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c @@ -429,6 +429,10 @@ static const struct dc_plane_cap plane_cap = {  	64  }; +static const struct dc_debug_options debug_defaults = { +		.enable_legacy_fast_update = true, +}; +  #define CTX  ctx  #define REG(reg) mm ## reg @@ -1239,6 +1243,7 @@ static bool dce112_resource_construct(  	dc->caps.min_horizontal_blanking_period = 80;  	dc->caps.dual_link_dvi = true;  	dc->caps.extended_aux_timeout_support = false; +	dc->debug = debug_defaults;  	/*************************************************  	 *  Create resources                             * diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c index d4afe6c824d2..45e08c4d5861 100644 --- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_hw_sequencer.c @@ -159,9 +159,6 @@ static bool dce120_enable_display_power_gating(  	enum bp_pipe_control_action cntl;  	struct dc_context *ctx = dc->ctx; -	if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -		return true; -  	if (power_gating == PIPE_GATING_CONTROL_INIT)  		cntl = ASIC_PIPE_INIT;  	else if (power_gating == PIPE_GATING_CONTROL_ENABLE) diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c index af631085e88c..18c5a86d2d61 100644 --- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c @@ -526,6 +526,7 @@ static const struct dc_plane_cap plane_cap = {  static const struct dc_debug_options debug_defaults = {  		.disable_clock_gate = true, +		.enable_legacy_fast_update = true,  };  static struct clock_source *dce120_clock_source_create( diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c index 5825e6f412bd..3935fd455f0f 100644 --- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c @@ -418,6 +418,10 @@ static const struct dc_plane_cap plane_cap = {  	}  }; +static const struct dc_debug_options debug_defaults = { +		.enable_legacy_fast_update = true, +}; +  static const struct dce_dmcu_registers dmcu_regs = {  		DMCU_DCE80_REG_LIST()  }; @@ -969,6 +973,7 @@ static bool dce80_construct(  	dc->caps.min_horizontal_blanking_period = 80;  	dc->caps.dual_link_dvi = true;  	dc->caps.extended_aux_timeout_support = false; +	dc->debug = debug_defaults;  	/*************************************************  	 *  Create resources                             * @@ -1369,6 +1374,7 @@ static bool dce83_construct(  	dc->caps.max_cursor_size = 128;  	dc->caps.min_horizontal_blanking_period = 80;  	dc->caps.is_apu = true; +	dc->debug = debug_defaults;  	/*************************************************  	 *  Create resources                             * diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h index 0b17c2993ca5..09784222cc03 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.h @@ -690,6 +690,8 @@ struct dcn_hubp_state {  	uint32_t primary_surface_addr_hi;  	uint32_t primary_meta_addr_lo;  	uint32_t primary_meta_addr_hi; +	uint32_t uclk_pstate_force; +	uint32_t hubp_cntl;  };  struct dcn10_hubp { diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 1c3b6f25a782..20a1582be0b1 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c @@ -1012,31 +1012,29 @@ static void dcn10_reset_back_end_for_pipe(  		return;  	} -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		link = pipe_ctx->stream->link; -		/* DPMS may already disable or */ -		/* dpms_off status is incorrect due to fastboot -		 * feature. When system resume from S4 with second -		 * screen only, the dpms_off would be true but -		 * VBIOS lit up eDP, so check link status too. -		 */ -		if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) -			dc->link_srv->set_dpms_off(pipe_ctx); -		else if (pipe_ctx->stream_res.audio) -			dc->hwss.disable_audio_stream(pipe_ctx); +	link = pipe_ctx->stream->link; +	/* DPMS may already disable or */ +	/* dpms_off status is incorrect due to fastboot +	 * feature. When system resume from S4 with second +	 * screen only, the dpms_off would be true but +	 * VBIOS lit up eDP, so check link status too. +	 */ +	if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) +		dc->link_srv->set_dpms_off(pipe_ctx); +	else if (pipe_ctx->stream_res.audio) +		dc->hwss.disable_audio_stream(pipe_ctx); -		if (pipe_ctx->stream_res.audio) { -			/*disable az_endpoint*/ -			pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); +	if (pipe_ctx->stream_res.audio) { +		/*disable az_endpoint*/ +		pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); -			/*free audio*/ -			if (dc->caps.dynamic_audio == true) { -				/*we have to dynamic arbitrate the audio endpoints*/ -				/*we free the resource, need reset is_audio_acquired*/ -				update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, -						pipe_ctx->stream_res.audio, false); -				pipe_ctx->stream_res.audio = NULL; -			} +		/*free audio*/ +		if (dc->caps.dynamic_audio == true) { +			/*we have to dynamic arbitrate the audio endpoints*/ +			/*we free the resource, need reset is_audio_acquired*/ +			update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, +					pipe_ctx->stream_res.audio, false); +			pipe_ctx->stream_res.audio = NULL;  		}  	} @@ -1499,54 +1497,32 @@ void dcn10_init_hw(struct dc *dc)  	if (dc->res_pool->dccg && dc->res_pool->dccg->funcs->dccg_init)  		dc->res_pool->dccg->funcs->dccg_init(res_pool->dccg); -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { - -		REG_WRITE(REFCLK_CNTL, 0); -		REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1); -		REG_WRITE(DIO_MEM_PWR_CTRL, 0); - -		if (!dc->debug.disable_clock_gate) { -			/* enable all DCN clock gating */ -			REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0); - -			REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0); - -			REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0); -		} - -		//Enable ability to power gate / don't force power on permanently -		if (hws->funcs.enable_power_gating_plane) -			hws->funcs.enable_power_gating_plane(hws, true); - -		return; -	} -  	if (!dcb->funcs->is_accelerated_mode(dcb))  		hws->funcs.disable_vga(dc->hwseq); -	hws->funcs.bios_golden_init(dc); +	if (!dc_dmub_srv_optimized_init_done(dc->ctx->dmub_srv)) +		hws->funcs.bios_golden_init(dc); +  	if (dc->ctx->dc_bios->fw_info_valid) {  		res_pool->ref_clocks.xtalin_clock_inKhz =  				dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency; -		if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -			if (res_pool->dccg && res_pool->hubbub) { +		if (res_pool->dccg && res_pool->hubbub) { -				(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, -						dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, -						&res_pool->ref_clocks.dccg_ref_clock_inKhz); +			(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, +					dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, +					&res_pool->ref_clocks.dccg_ref_clock_inKhz); -				(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, -						res_pool->ref_clocks.dccg_ref_clock_inKhz, -						&res_pool->ref_clocks.dchub_ref_clock_inKhz); -			} else { -				// Not all ASICs have DCCG sw component -				res_pool->ref_clocks.dccg_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -				res_pool->ref_clocks.dchub_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -			} +			(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, +					res_pool->ref_clocks.dccg_ref_clock_inKhz, +					&res_pool->ref_clocks.dchub_ref_clock_inKhz); +		} else { +			// Not all ASICs have DCCG sw component +			res_pool->ref_clocks.dccg_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz; +			res_pool->ref_clocks.dchub_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz;  		}  	} else  		ASSERT_CRITICAL(false); @@ -1923,6 +1899,11 @@ void dcn10_pipe_control_lock(   *   * TODO: Optimize cursor programming to be once per frame before VUPDATE   *       to avoid the need for this workaround. + * + * @dc: Current DC state + * @pipe_ctx: Pipe_ctx pointer for delayed cursor update + * + * Return: void   */  static void delay_cursor_until_vupdate(struct dc *dc, struct pipe_ctx *pipe_ctx)  { @@ -2600,23 +2581,15 @@ static void dcn10_update_dpp(struct dpp *dpp, struct dc_plane_state *plane_state  		dpp->funcs->dpp_program_bias_and_scale(dpp, &bns_params);  } -void dcn10_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, struct tg_color *color, int mpcc_id) +void dcn10_update_visual_confirm_color(struct dc *dc, +		struct pipe_ctx *pipe_ctx, +		int mpcc_id)  {  	struct mpc *mpc = dc->res_pool->mpc; -	if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) -		get_hdr_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) -		get_surface_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SWIZZLE) -		get_surface_tile_visual_confirm_color(pipe_ctx, color); -	else -		color_space_to_black_color( -				dc, pipe_ctx->stream->output_color_space, color); -  	if (mpc->funcs->set_bg_color) { -		memcpy(&pipe_ctx->plane_state->visual_confirm_color, color, sizeof(struct tg_color)); -		mpc->funcs->set_bg_color(mpc, color, mpcc_id); +		memcpy(&pipe_ctx->plane_state->visual_confirm_color, &(pipe_ctx->visual_confirm_color), sizeof(struct tg_color)); +		mpc->funcs->set_bg_color(mpc, &(pipe_ctx->visual_confirm_color), mpcc_id);  	}  } @@ -2669,7 +2642,7 @@ void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  	/* If there is no full update, don't need to touch MPC tree*/  	if (!pipe_ctx->plane_state->update_flags.bits.full_update) {  		mpc->funcs->update_blending(mpc, &blnd_cfg, mpcc_id); -		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  		return;  	} @@ -2691,7 +2664,7 @@ void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  			NULL,  			hubp->inst,  			mpcc_id); -	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  	ASSERT(new_mpcc != NULL);  	hubp->opp_id = pipe_ctx->stream_res.opp->inst; @@ -3076,15 +3049,13 @@ void dcn10_prepare_bandwidth(  	if (dc->debug.sanity_checks)  		hws->funcs.verify_allow_pstate_change_high(dc); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (context->stream_count == 0) -			context->bw_ctx.bw.dcn.clk.phyclk_khz = 0; +	if (context->stream_count == 0) +		context->bw_ctx.bw.dcn.clk.phyclk_khz = 0; -		dc->clk_mgr->funcs->update_clocks( -				dc->clk_mgr, -				context, -				false); -	} +	dc->clk_mgr->funcs->update_clocks( +			dc->clk_mgr, +			context, +			false);  	dc->wm_optimized_required = hubbub->funcs->program_watermarks(hubbub,  			&context->bw_ctx.bw.dcn.watermarks, @@ -3116,15 +3087,13 @@ void dcn10_optimize_bandwidth(  	if (dc->debug.sanity_checks)  		hws->funcs.verify_allow_pstate_change_high(dc); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		if (context->stream_count == 0) -			context->bw_ctx.bw.dcn.clk.phyclk_khz = 0; +	if (context->stream_count == 0) +		context->bw_ctx.bw.dcn.clk.phyclk_khz = 0; -		dc->clk_mgr->funcs->update_clocks( -				dc->clk_mgr, -				context, -				true); -	} +	dc->clk_mgr->funcs->update_clocks( +			dc->clk_mgr, +			context, +			true);  	hubbub->funcs->program_watermarks(hubbub,  			&context->bw_ctx.bw.dcn.watermarks, diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h index 0ef7bf7ddb75..ef6d56da417c 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h @@ -202,7 +202,6 @@ void dcn10_get_dcc_en_bits(struct dc *dc, int *dcc_en_bits);  void dcn10_update_visual_confirm_color(  		struct dc *dc,  		struct pipe_ctx *pipe_ctx, -		struct tg_color *color,  		int mpcc_id);  #endif /* __DC_HWSS_DCN10_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c index a0f8e31d2adc..46a2ebcabd1a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer_debug.c @@ -45,7 +45,8 @@  #include "dcn10_cm_common.h"  #include "clk_mgr.h" -unsigned int snprintf_count(char *pBuf, unsigned int bufSize, char *fmt, ...) +__printf(3, 4) +unsigned int snprintf_count(char *pbuf, unsigned int bufsize, char *fmt, ...)  {  	int ret_vsnprintf;  	unsigned int chars_printed; @@ -53,15 +54,15 @@ unsigned int snprintf_count(char *pBuf, unsigned int bufSize, char *fmt, ...)  	va_list args;  	va_start(args, fmt); -	ret_vsnprintf = vsnprintf(pBuf, bufSize, fmt, args); +	ret_vsnprintf = vsnprintf(pbuf, bufsize, fmt, args);  	va_end(args);  	if (ret_vsnprintf > 0) { -		if (ret_vsnprintf < bufSize) +		if (ret_vsnprintf < bufsize)  			chars_printed = ret_vsnprintf;  		else -			chars_printed = bufSize - 1; +			chars_printed = bufsize - 1;  	} else  		chars_printed = 0; diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c index c9e53dc49c92..633989fd2514 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c @@ -653,11 +653,9 @@ void optc1_lock(struct timing_generator *optc)  	REG_SET(OTG_MASTER_UPDATE_LOCK, 0,  			OTG_MASTER_UPDATE_LOCK, 1); -	/* Should be fast, status does not update on maximus */ -	if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) -		REG_WAIT(OTG_MASTER_UPDATE_LOCK, -				UPDATE_LOCK_STATUS, 1, -				1, 10); +	REG_WAIT(OTG_MASTER_UPDATE_LOCK, +			UPDATE_LOCK_STATUS, 1, +			1, 10);  	TRACE_OPTC_LOCK_UNLOCK_STATE(optc1, optc->inst, true);  } @@ -932,19 +930,10 @@ void optc1_set_drr(  				OTG_FORCE_LOCK_ON_EVENT, 0,  				OTG_SET_V_TOTAL_MIN_MASK_EN, 0,  				OTG_SET_V_TOTAL_MIN_MASK, 0); - -		// Setup manual flow control for EOF via TRIG_A -		optc->funcs->setup_manual_trigger(optc); - -	} else { -		REG_UPDATE_4(OTG_V_TOTAL_CONTROL, -				OTG_SET_V_TOTAL_MIN_MASK, 0, -				OTG_V_TOTAL_MIN_SEL, 0, -				OTG_V_TOTAL_MAX_SEL, 0, -				OTG_FORCE_LOCK_ON_EVENT, 0); - -		optc->funcs->set_vtotal_min_max(optc, 0, 0);  	} + +	// Setup manual flow control for EOF via TRIG_A +	optc->funcs->setup_manual_trigger(optc);  }  void optc1_set_vtotal_min_max(struct timing_generator *optc, int vtotal_min, int vtotal_max) diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c index 21ec1ba5ed75..4b02f8443534 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c @@ -553,6 +553,7 @@ static const struct dc_debug_options debug_defaults_drv = {  		.recovery_enabled = false, /*enable this by default after testing.*/  		.max_downscale_src_width = 3840,  		.underflow_assert_delay_us = 0xFFFFFFFF, +		.enable_legacy_fast_update = true,  };  static const struct dc_debug_options debug_defaults_diags = { @@ -886,13 +887,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn10_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn10_hwseq_create, -}; -  static void dcn10_clock_source_destroy(struct clock_source **clk_src)  {  	kfree(TO_DCE110_CLK_SRC(*clk_src)); @@ -1651,9 +1645,8 @@ static bool dcn10_resource_construct(  	}  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto fail; +			&res_create_funcs)) +		goto fail;  	dcn10_hw_sequencer_construct(dc);  	dc->caps.max_planes =  pool->base.pipe_count; diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dccg.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dccg.h index 7bdc146f7cb5..c8602bcfa393 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dccg.h +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dccg.h @@ -208,7 +208,9 @@  #define DCCG314_REG_FIELD_LIST(type) \  	type DSCCLK3_DTO_PHASE;\  	type DSCCLK3_DTO_MODULO;\ -	type DSCCLK3_DTO_ENABLE; +	type DSCCLK3_DTO_ENABLE;\ +	type DENTIST_DISPCLK_RDIVIDER;\ +	type DENTIST_DISPCLK_WDIVIDER;  #define DCCG32_REG_FIELD_LIST(type) \  	type DPSTREAMCLK0_EN;\ diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.c index 5bd698cd6d20..5eebe7f03ddc 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.c @@ -30,22 +30,13 @@  #include "dsc/dscc_types.h"  #include "dsc/rc_calc.h" -static void dsc_log_pps(struct display_stream_compressor *dsc, struct drm_dsc_config *pps); -static bool dsc_prepare_config(const struct dsc_config *dsc_cfg, struct dsc_reg_values *dsc_reg_vals, -			struct dsc_optc_config *dsc_optc_cfg); -static void dsc_init_reg_values(struct dsc_reg_values *reg_vals); -static void dsc_update_from_dsc_parameters(struct dsc_reg_values *reg_vals, const struct dsc_parameters *dsc_params);  static void dsc_write_to_registers(struct display_stream_compressor *dsc, const struct dsc_reg_values *reg_vals); -static enum dsc_pixel_format dsc_dc_pixel_encoding_to_dsc_pixel_format(enum dc_pixel_encoding dc_pix_enc, bool is_ycbcr422_simple); -static enum dsc_bits_per_comp dsc_dc_color_depth_to_dsc_bits_per_comp(enum dc_color_depth);  /* Object I/F functions */ -static void dsc2_get_enc_caps(struct dsc_enc_caps *dsc_enc_caps, int pixel_clock_100Hz);  static void dsc2_read_state(struct display_stream_compressor *dsc, struct dcn_dsc_state *s);  static bool dsc2_validate_stream(struct display_stream_compressor *dsc, const struct dsc_config *dsc_cfg);  static void dsc2_set_config(struct display_stream_compressor *dsc, const struct dsc_config *dsc_cfg,  		struct dsc_optc_config *dsc_optc_cfg); -static bool dsc2_get_packed_pps(struct display_stream_compressor *dsc, const struct dsc_config *dsc_cfg, uint8_t *dsc_packed_pps);  static void dsc2_enable(struct display_stream_compressor *dsc, int opp_pipe);  static void dsc2_disable(struct display_stream_compressor *dsc);  static void dsc2_disconnect(struct display_stream_compressor *dsc); @@ -108,7 +99,7 @@ void dsc2_construct(struct dcn20_dsc *dsc,  /* This returns the capabilities for a single DSC encoder engine. Number of slices and total throughput   * can be doubled, tripled etc. by using additional DSC engines.   */ -static void dsc2_get_enc_caps(struct dsc_enc_caps *dsc_enc_caps, int pixel_clock_100Hz) +void dsc2_get_enc_caps(struct dsc_enc_caps *dsc_enc_caps, int pixel_clock_100Hz)  {  	dsc_enc_caps->dsc_version = 0x21; /* v1.2 - DP spec defined it in reverse order and we kept it */ @@ -184,7 +175,7 @@ static bool dsc2_validate_stream(struct display_stream_compressor *dsc, const st  } -static void dsc_config_log(struct display_stream_compressor *dsc, const struct dsc_config *config) +void dsc_config_log(struct display_stream_compressor *dsc, const struct dsc_config *config)  {  	DC_LOG_DSC("\tnum_slices_h %d", config->dc_dsc_cfg.num_slices_h);  	DC_LOG_DSC("\tnum_slices_v %d", config->dc_dsc_cfg.num_slices_v); @@ -211,7 +202,7 @@ static void dsc2_set_config(struct display_stream_compressor *dsc, const struct  } -static bool dsc2_get_packed_pps(struct display_stream_compressor *dsc, const struct dsc_config *dsc_cfg, uint8_t *dsc_packed_pps) +bool dsc2_get_packed_pps(struct display_stream_compressor *dsc, const struct dsc_config *dsc_cfg, uint8_t *dsc_packed_pps)  {  	bool is_config_ok;  	struct dsc_reg_values dsc_reg_vals; @@ -291,7 +282,7 @@ static void dsc2_disconnect(struct display_stream_compressor *dsc)  }  /* This module's internal functions */ -static void dsc_log_pps(struct display_stream_compressor *dsc, struct drm_dsc_config *pps) +void dsc_log_pps(struct display_stream_compressor *dsc, struct drm_dsc_config *pps)  {  	int i;  	int bits_per_pixel = pps->bits_per_pixel; @@ -345,7 +336,7 @@ static void dsc_log_pps(struct display_stream_compressor *dsc, struct drm_dsc_co  	}  } -static void dsc_override_rc_params(struct rc_params *rc, const struct dc_dsc_rc_params_override *override) +void dsc_override_rc_params(struct rc_params *rc, const struct dc_dsc_rc_params_override *override)  {  	uint8_t i; @@ -372,7 +363,7 @@ static void dsc_override_rc_params(struct rc_params *rc, const struct dc_dsc_rc_  	rc->flatness_det_thresh = override->flatness_det_thresh;  } -static bool dsc_prepare_config(const struct dsc_config *dsc_cfg, struct dsc_reg_values *dsc_reg_vals, +bool dsc_prepare_config(const struct dsc_config *dsc_cfg, struct dsc_reg_values *dsc_reg_vals,  			struct dsc_optc_config *dsc_optc_cfg)  {  	struct dsc_parameters dsc_params; @@ -463,7 +454,7 @@ static bool dsc_prepare_config(const struct dsc_config *dsc_cfg, struct dsc_reg_  } -static enum dsc_pixel_format dsc_dc_pixel_encoding_to_dsc_pixel_format(enum dc_pixel_encoding dc_pix_enc, bool is_ycbcr422_simple) +enum dsc_pixel_format dsc_dc_pixel_encoding_to_dsc_pixel_format(enum dc_pixel_encoding dc_pix_enc, bool is_ycbcr422_simple)  {  	enum dsc_pixel_format dsc_pix_fmt = DSC_PIXFMT_UNKNOWN; @@ -495,7 +486,7 @@ static enum dsc_pixel_format dsc_dc_pixel_encoding_to_dsc_pixel_format(enum dc_p  } -static enum dsc_bits_per_comp dsc_dc_color_depth_to_dsc_bits_per_comp(enum dc_color_depth dc_color_depth) +enum dsc_bits_per_comp dsc_dc_color_depth_to_dsc_bits_per_comp(enum dc_color_depth dc_color_depth)  {  	enum dsc_bits_per_comp bpc = DSC_BPC_UNKNOWN; @@ -518,7 +509,7 @@ static enum dsc_bits_per_comp dsc_dc_color_depth_to_dsc_bits_per_comp(enum dc_co  } -static void dsc_init_reg_values(struct dsc_reg_values *reg_vals) +void dsc_init_reg_values(struct dsc_reg_values *reg_vals)  {  	int i; @@ -574,7 +565,7 @@ static void dsc_init_reg_values(struct dsc_reg_values *reg_vals)   * This is required because dscc_compute_dsc_parameters returns a modified PPS, which in turn   * affects non-PPS register values.   */ -static void dsc_update_from_dsc_parameters(struct dsc_reg_values *reg_vals, const struct dsc_parameters *dsc_params) +void dsc_update_from_dsc_parameters(struct dsc_reg_values *reg_vals, const struct dsc_parameters *dsc_params)  {  	int i; diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.h index 7ce64a3c1b02..ba869387c3c5 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.h +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dsc.h @@ -549,6 +549,27 @@ struct dcn20_dsc {  	int max_image_width;  }; +void dsc_config_log(struct display_stream_compressor *dsc, +		const struct dsc_config *config); + +void dsc_log_pps(struct display_stream_compressor *dsc, +		struct drm_dsc_config *pps); + +void dsc_override_rc_params(struct rc_params *rc, +		const struct dc_dsc_rc_params_override *override); + +bool dsc_prepare_config(const struct dsc_config *dsc_cfg, +		struct dsc_reg_values *dsc_reg_vals, +		struct dsc_optc_config *dsc_optc_cfg); + +enum dsc_pixel_format dsc_dc_pixel_encoding_to_dsc_pixel_format(enum dc_pixel_encoding dc_pix_enc, +		bool is_ycbcr422_simple); + +enum dsc_bits_per_comp dsc_dc_color_depth_to_dsc_bits_per_comp(enum dc_color_depth dc_color_depth); + +void dsc_init_reg_values(struct dsc_reg_values *reg_vals); + +void dsc_update_from_dsc_parameters(struct dsc_reg_values *reg_vals, const struct dsc_parameters *dsc_params);  void dsc2_construct(struct dcn20_dsc *dsc,  		struct dc_context *ctx, @@ -557,5 +578,12 @@ void dsc2_construct(struct dcn20_dsc *dsc,  		const struct dcn20_dsc_shift *dsc_shift,  		const struct dcn20_dsc_mask *dsc_mask); +void dsc2_get_enc_caps(struct dsc_enc_caps *dsc_enc_caps, +		int pixel_clock_100Hz); + +bool dsc2_get_packed_pps(struct display_stream_compressor *dsc, +		const struct dsc_config *dsc_cfg, +		uint8_t *dsc_packed_pps); +  #endif diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c index 24bd93219936..6eebcb22e317 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c @@ -623,6 +623,17 @@ void hubbub2_read_state(struct hubbub *hubbub, struct dcn_hubbub_state *hubbub_s  		 REG_GET(DCN_VM_FAULT_STATUS, DCN_VM_ERROR_VMID, &hubbub_state->vm_error_vmid);  		 REG_GET(DCN_VM_FAULT_STATUS, DCN_VM_ERROR_PIPE, &hubbub_state->vm_error_pipe);  	} + +	if (REG(DCHUBBUB_TEST_DEBUG_INDEX) && REG(DCHUBBUB_TEST_DEBUG_DATA)) { +		REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, 0x6); +		hubbub_state->test_debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA); +	} + +	if (REG(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL)) +		hubbub_state->watermark_change_cntl = REG_READ(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL); + +	if (REG(DCHUBBUB_ARB_DRAM_STATE_CNTL)) +		hubbub_state->dram_state_cntl = REG_READ(DCHUBBUB_ARB_DRAM_STATE_CNTL);  }  static const struct hubbub_funcs hubbub2_funcs = { diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c index 422fbf79da64..5934b1d70e48 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c @@ -313,6 +313,10 @@ void dcn20_init_blank(  	}  	opp = dc->res_pool->opps[opp_id_src0]; +	/* don't override the blank pattern if already enabled with the correct one. */ +	if (opp->funcs->dpg_is_blanked && opp->funcs->dpg_is_blanked(opp)) +		return; +  	if (num_opps == 2) {  		otg_active_width = otg_active_width / 2; @@ -1357,6 +1361,7 @@ static void dcn20_detect_pipe_changes(struct pipe_ctx *old_pipe, struct pipe_ctx  		new_pipe->update_flags.bits.dppclk = 1;  		new_pipe->update_flags.bits.hubp_interdependent = 1;  		new_pipe->update_flags.bits.hubp_rq_dlg_ttu = 1; +		new_pipe->update_flags.bits.unbounded_req = 1;  		new_pipe->update_flags.bits.gamut_remap = 1;  		new_pipe->update_flags.bits.scaler = 1;  		new_pipe->update_flags.bits.viewport = 1; @@ -1500,6 +1505,9 @@ static void dcn20_detect_pipe_changes(struct pipe_ctx *old_pipe, struct pipe_ctx  				memcmp(&old_pipe->rq_regs, &new_pipe->rq_regs, sizeof(old_pipe->rq_regs)))  			new_pipe->update_flags.bits.hubp_rq_dlg_ttu = 1;  	} + +	if (old_pipe->unbounded_req != new_pipe->unbounded_req) +		new_pipe->update_flags.bits.unbounded_req = 1;  }  static void dcn20_update_dchubp_dpp( @@ -1533,10 +1541,11 @@ static void dcn20_update_dchubp_dpp(  			&pipe_ctx->ttu_regs,  			&pipe_ctx->rq_regs,  			&pipe_ctx->pipe_dlg_param); - -		if (hubp->funcs->set_unbounded_requesting) -			hubp->funcs->set_unbounded_requesting(hubp, pipe_ctx->unbounded_req);  	} + +	if (pipe_ctx->update_flags.bits.unbounded_req && hubp->funcs->set_unbounded_requesting) +		hubp->funcs->set_unbounded_requesting(hubp, pipe_ctx->unbounded_req); +  	if (pipe_ctx->update_flags.bits.hubp_interdependent)  		hubp->funcs->hubp_setup_interdependent(  			hubp, @@ -1732,6 +1741,17 @@ static void dcn20_program_pipe(  		if (hws->funcs.setup_vupdate_interrupt)  			hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx); + +		if (hws->funcs.calculate_dccg_k1_k2_values && dc->res_pool->dccg->funcs->set_pixel_rate_div) { +			unsigned int k1_div, k2_div; + +			hws->funcs.calculate_dccg_k1_k2_values(pipe_ctx, &k1_div, &k2_div); + +			dc->res_pool->dccg->funcs->set_pixel_rate_div( +				dc->res_pool->dccg, +				pipe_ctx->stream_res.tg->inst, +				k1_div, k2_div); +		}  	}  	if (pipe_ctx->update_flags.bits.odm) @@ -2126,7 +2146,7 @@ void dcn20_optimize_bandwidth(  			dc->clk_mgr,  			context,  			true); -	if (dc_extended_blank_supported(dc) && context->bw_ctx.bw.dcn.clk.zstate_support == DCN_ZSTATE_SUPPORT_ALLOW) { +	if (context->bw_ctx.bw.dcn.clk.zstate_support == DCN_ZSTATE_SUPPORT_ALLOW) {  		for (i = 0; i < dc->res_pool->pipe_count; ++i) {  			struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; @@ -2134,7 +2154,7 @@ void dcn20_optimize_bandwidth(  				&& pipe_ctx->stream->adjust.v_total_min == pipe_ctx->stream->adjust.v_total_max  				&& pipe_ctx->stream->adjust.v_total_max > pipe_ctx->stream->timing.v_total)  					pipe_ctx->plane_res.hubp->funcs->program_extended_blank(pipe_ctx->plane_res.hubp, -						pipe_ctx->dlg_regs.optimized_min_dst_y_next_start); +						pipe_ctx->dlg_regs.min_dst_y_next_start);  		}  	}  } @@ -2471,36 +2491,31 @@ static void dcn20_reset_back_end_for_pipe(  		return;  	} -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		/* DPMS may already disable or */ -		/* dpms_off status is incorrect due to fastboot -		 * feature. When system resume from S4 with second -		 * screen only, the dpms_off would be true but -		 * VBIOS lit up eDP, so check link status too. -		 */ -		if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) -			dc->link_srv->set_dpms_off(pipe_ctx); -		else if (pipe_ctx->stream_res.audio) -			dc->hwss.disable_audio_stream(pipe_ctx); +	/* DPMS may already disable or */ +	/* dpms_off status is incorrect due to fastboot +	 * feature. When system resume from S4 with second +	 * screen only, the dpms_off would be true but +	 * VBIOS lit up eDP, so check link status too. +	 */ +	if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) +		dc->link_srv->set_dpms_off(pipe_ctx); +	else if (pipe_ctx->stream_res.audio) +		dc->hwss.disable_audio_stream(pipe_ctx); -		/* free acquired resources */ -		if (pipe_ctx->stream_res.audio) { -			/*disable az_endpoint*/ -			pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); +	/* free acquired resources */ +	if (pipe_ctx->stream_res.audio) { +		/*disable az_endpoint*/ +		pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); -			/*free audio*/ -			if (dc->caps.dynamic_audio == true) { -				/*we have to dynamic arbitrate the audio endpoints*/ -				/*we free the resource, need reset is_audio_acquired*/ -				update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, -						pipe_ctx->stream_res.audio, false); -				pipe_ctx->stream_res.audio = NULL; -			} +		/*free audio*/ +		if (dc->caps.dynamic_audio == true) { +			/*we have to dynamic arbitrate the audio endpoints*/ +			/*we free the resource, need reset is_audio_acquired*/ +			update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, +					pipe_ctx->stream_res.audio, false); +			pipe_ctx->stream_res.audio = NULL;  		}  	} -	else if (pipe_ctx->stream_res.dsc) { -		dc->link_srv->set_dsc_enable(pipe_ctx, false); -	}  	/* by upper caller loop, parent pipe: pipe0, will be reset last.  	 * back end share by all pipes and will be disable only when disable @@ -2576,28 +2591,6 @@ void dcn20_reset_hw_ctx_wrap(  	}  } -void dcn20_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, struct tg_color *color, int mpcc_id) -{ -	struct mpc *mpc = dc->res_pool->mpc; - -	// input to MPCC is always RGB, by default leave black_color at 0 -	if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) -		get_hdr_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) -		get_surface_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) -		get_mpctree_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SWIZZLE) -		get_surface_tile_visual_confirm_color(pipe_ctx, color); -	else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SUBVP) -		get_subvp_visual_confirm_color(dc, pipe_ctx, color); - -	if (mpc->funcs->set_bg_color) { -		memcpy(&pipe_ctx->plane_state->visual_confirm_color, color, sizeof(struct tg_color)); -		mpc->funcs->set_bg_color(mpc, color, mpcc_id); -	} -} -  void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  {  	struct hubp *hubp = pipe_ctx->plane_res.hubp; @@ -2653,7 +2646,7 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  	if (!pipe_ctx->plane_state->update_flags.bits.full_update &&  		!pipe_ctx->update_flags.bits.mpcc) {  		mpc->funcs->update_blending(mpc, &blnd_cfg, mpcc_id); -		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  		return;  	} @@ -2675,7 +2668,7 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  			NULL,  			hubp->inst,  			mpcc_id); -	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  	ASSERT(new_mpcc != NULL);  	hubp->opp_id = pipe_ctx->stream_res.opp->inst; diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h index 33a36c02b2f8..01901b08644c 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h @@ -150,10 +150,5 @@ void dcn20_set_disp_pattern_generator(const struct dc *dc,  		const struct tg_color *solid_color,  		int width, int height, int offset); -void dcn20_update_visual_confirm_color(struct dc *dc, -		struct pipe_ctx *pipe_ctx, -		struct tg_color *color, -		int mpcc_id); -  #endif /* __DC_HWSS_DCN20_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c index 7c5817c426fa..e4b44e691ce6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c @@ -102,7 +102,7 @@ static const struct hw_sequencer_funcs dcn20_funcs = {  	.disable_link_output = dce110_disable_link_output,  	.set_disp_pattern_generator = dcn20_set_disp_pattern_generator,  	.get_dcc_en_bits = dcn10_get_dcc_en_bits, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn20_private_funcs = { @@ -145,8 +145,4 @@ void dcn20_hw_sequencer_construct(struct dc *dc)  	dc->hwss = dcn20_funcs;  	dc->hwseq->funcs = dcn20_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c index a08c335b7383..58bdbd859bf9 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c @@ -38,8 +38,12 @@  	optc1->tg_shift->field_name, optc1->tg_mask->field_name  /** - * Enable CRTC - * Enable CRTC - call ASIC Control Object to enable Timing generator. + * optc2_enable_crtc() - Enable CRTC - call ASIC Control Object to enable Timing generator. + * + * @optc: timing_generator instance. + * + * Return: If CRTC is enabled, return true. + *   */  bool optc2_enable_crtc(struct timing_generator *optc)  { @@ -73,15 +77,18 @@ bool optc2_enable_crtc(struct timing_generator *optc)  }  /** - *For the below, I'm not sure how your GSL parameters are stored in your env, - * so I will assume a gsl_params struct for now + * optc2_set_gsl() - Assign OTG to GSL groups, + *                   set one of the OTGs to be master & rest are slaves + * + * @optc: timing_generator instance. + * @params: pointer to gsl_params   */  void optc2_set_gsl(struct timing_generator *optc,  		   const struct gsl_params *params)  {  	struct optc *optc1 = DCN10TG_FROM_TG(optc); -/** +/*   * There are (MAX_OPTC+1)/2 gsl groups available for use.   * In each group (assign an OTG to a group by setting OTG_GSLX_EN = 1,   * set one of the OTGs to be the master (OTG_GSL_MASTER_EN = 1) and the rest are slaves. @@ -391,10 +398,9 @@ void optc2_triplebuffer_lock(struct timing_generator *optc)  	REG_SET(OTG_MASTER_UPDATE_LOCK, 0,  		OTG_MASTER_UPDATE_LOCK, 1); -	if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) -		REG_WAIT(OTG_MASTER_UPDATE_LOCK, -				UPDATE_LOCK_STATUS, 1, -				1, 10); +	REG_WAIT(OTG_MASTER_UPDATE_LOCK, +			UPDATE_LOCK_STATUS, 1, +			1, 10);  }  void optc2_triplebuffer_unlock(struct timing_generator *optc) @@ -456,6 +462,16 @@ void optc2_setup_manual_trigger(struct timing_generator *optc)  {  	struct optc *optc1 = DCN10TG_FROM_TG(optc); +	/* Set the min/max selectors unconditionally so that +	 * DMCUB fw may change OTG timings when necessary +	 * TODO: Remove the w/a after fixing the issue in DMCUB firmware +	 */ +	REG_UPDATE_4(OTG_V_TOTAL_CONTROL, +				 OTG_V_TOTAL_MIN_SEL, 1, +				 OTG_V_TOTAL_MAX_SEL, 1, +				 OTG_FORCE_LOCK_ON_EVENT, 0, +				 OTG_SET_V_TOTAL_MIN_MASK, (1 << 1)); /* TRIGA */ +  	REG_SET_8(OTG_TRIGA_CNTL, 0,  			OTG_TRIGA_SOURCE_SELECT, 21,  			OTG_TRIGA_SOURCE_PIPE_SELECT, optc->inst, diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index 1d8c5805ef20..4cc8de2627ce 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -722,22 +722,7 @@ static const struct dc_debug_options debug_defaults_drv = {  		.scl_reset_length10 = true,  		.sanity_checks = false,  		.underflow_assert_delay_us = 0xFFFFFFFF, -}; - -static const struct dc_debug_options debug_defaults_diags = { -		.disable_dmcu = false, -		.force_abm_enable = false, -		.timing_trace = true, -		.clock_trace = true, -		.disable_dpp_power_gate = true, -		.disable_hubp_power_gate = true, -		.disable_clock_gate = true, -		.disable_pplib_clock_request = true, -		.disable_pplib_wm_range = true, -		.disable_stutter = true, -		.scl_reset_length10 = true, -		.underflow_assert_delay_us = 0xFFFFFFFF, -		.enable_tri_buf = true, +		.enable_legacy_fast_update = true,  };  void dcn20_dpp_destroy(struct dpp **dpp) @@ -1066,13 +1051,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn20_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn20_hwseq_create, -}; -  static void dcn20_pp_smu_destroy(struct pp_smu_funcs **pp_smu);  void dcn20_clock_source_destroy(struct clock_source **clk_src) @@ -2488,15 +2466,9 @@ static bool dcn20_resource_construct(  	dc->caps.dp_hdmi21_pcon_support = true; -	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV) { +	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	} else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		pool->base.pipe_count = 4; -		pool->base.mpcc_count = pool->base.pipe_count; -		dc->debug = debug_defaults_diags; -	} else { -		dc->debug = debug_defaults_diags; -	} +  	//dcn2.0x  	dc->work_arounds.dedcn20_305_wa = true; @@ -2734,9 +2706,8 @@ static bool dcn20_resource_construct(  	}  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	dcn20_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hwseq.c index 1aeb04fbd89d..9e027db6d752 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_hwseq.c @@ -231,52 +231,39 @@ void dcn201_init_hw(struct dc *dc)  	if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)  		dc->clk_mgr->funcs->init_clocks(dc->clk_mgr); -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		REG_WRITE(RBBMIF_TIMEOUT_DIS, 0xFFFFFFFF); -		REG_WRITE(RBBMIF_TIMEOUT_DIS_2, 0xFFFFFFFF); +	hws->funcs.bios_golden_init(dc); -		hws->funcs.dccg_init(hws); +	if (dc->ctx->dc_bios->fw_info_valid) { +		res_pool->ref_clocks.xtalin_clock_inKhz = +			dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency; -		REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_REFDIV, 2); -		REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1); -		REG_WRITE(REFCLK_CNTL, 0); -	} else { -		hws->funcs.bios_golden_init(dc); - -		if (dc->ctx->dc_bios->fw_info_valid) { -			res_pool->ref_clocks.xtalin_clock_inKhz = -				dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency; - -			if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -				if (res_pool->dccg && res_pool->hubbub) { -					(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, -							dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, -							&res_pool->ref_clocks.dccg_ref_clock_inKhz); - -					(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, -							res_pool->ref_clocks.dccg_ref_clock_inKhz, -							&res_pool->ref_clocks.dchub_ref_clock_inKhz); -				} else { -					res_pool->ref_clocks.dccg_ref_clock_inKhz = -							res_pool->ref_clocks.xtalin_clock_inKhz; -					res_pool->ref_clocks.dchub_ref_clock_inKhz = -							res_pool->ref_clocks.xtalin_clock_inKhz; -				} -			} -		} else -			ASSERT_CRITICAL(false); -		for (i = 0; i < dc->link_count; i++) { -			/* Power up AND update implementation according to the -			 * required signal (which may be different from the -			 * default signal on connector). -			 */ -			struct dc_link *link = dc->links[i]; +		if (res_pool->dccg && res_pool->hubbub) { +			(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, +					dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, +					&res_pool->ref_clocks.dccg_ref_clock_inKhz); -			link->link_enc->funcs->hw_init(link->link_enc); +			(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, +					res_pool->ref_clocks.dccg_ref_clock_inKhz, +					&res_pool->ref_clocks.dchub_ref_clock_inKhz); +		} else { +			res_pool->ref_clocks.dccg_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz; +			res_pool->ref_clocks.dchub_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz;  		} -		if (hws->fb_offset.quad_part == 0) -			read_mmhub_vm_setup(hws); +	} else +		ASSERT_CRITICAL(false); +	for (i = 0; i < dc->link_count; i++) { +		/* Power up AND update implementation according to the +		 * required signal (which may be different from the +		 * default signal on connector). +		 */ +		struct dc_link *link = dc->links[i]; + +		link->link_enc->funcs->hw_init(link->link_enc);  	} +	if (hws->fb_offset.quad_part == 0) +		read_mmhub_vm_setup(hws);  	/* Blank pixel data with OPP DPG */  	for (i = 0; i < res_pool->timing_generator_count; i++) { @@ -362,10 +349,6 @@ void dcn201_init_hw(struct dc *dc)  		tg->funcs->tg_init(tg);  	} -	/* end of FPGA. Below if real ASIC */ -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		return; -  	for (i = 0; i < res_pool->audio_count; i++) {  		struct audio *audio = res_pool->audios[i]; @@ -496,7 +479,7 @@ void dcn201_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  	/* If there is no full update, don't need to touch MPC tree*/  	if (!pipe_ctx->plane_state->update_flags.bits.full_update) { -		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +		dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  		mpc->funcs->update_blending(mpc, &blnd_cfg, mpcc_id);  		return;  	} @@ -521,7 +504,7 @@ void dcn201_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)  					dc->res_pool->mpc, mpcc_id);  	/* Call MPC to insert new plane */ -	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); +	dc->hwss.update_visual_confirm_color(dc, pipe_ctx, mpcc_id);  	new_mpcc = mpc->funcs->insert_plane(dc->res_pool->mpc,  			mpc_tree_params,  			&blnd_cfg, diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_init.c b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_init.c index 9c16633e473a..92dd4cddbab8 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_init.c @@ -91,7 +91,7 @@ static const struct hw_sequencer_funcs dcn201_funcs = {  	.enable_dp_link_output = dce110_enable_dp_link_output,  	.disable_link_output = dce110_disable_link_output,  	.set_disp_pattern_generator = dcn20_set_disp_pattern_generator, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn201_private_funcs = { diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_optc.c b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_optc.c index 730875dfd8b4..70fcbec03fb6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_optc.c @@ -55,10 +55,9 @@ static void optc201_triplebuffer_lock(struct timing_generator *optc)  	REG_SET(OTG_MASTER_UPDATE_LOCK, 0,  		OTG_MASTER_UPDATE_LOCK, 1); -	if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) -		REG_WAIT(OTG_MASTER_UPDATE_LOCK, -				UPDATE_LOCK_STATUS, 1, -				1, 10); +	REG_WAIT(OTG_MASTER_UPDATE_LOCK, +			UPDATE_LOCK_STATUS, 1, +			1, 10);  }  static void optc201_triplebuffer_unlock(struct timing_generator *optc) diff --git a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c index 6ea70da28aaa..fdba8a9f5c30 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn201/dcn201_resource.c @@ -613,6 +613,7 @@ static const struct dc_debug_options debug_defaults_drv = {  		.sanity_checks = false,  		.underflow_assert_delay_us = 0xFFFFFFFF,  		.enable_tri_buf = false, +		.enable_legacy_fast_update = true,  };  static void dcn201_dpp_destroy(struct dpp **dpp) @@ -896,13 +897,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn201_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn201_hwseq_create, -}; -  static void dcn201_clock_source_destroy(struct clock_source **clk_src)  {  	kfree(TO_DCE110_CLK_SRC(*clk_src)); @@ -1272,9 +1266,8 @@ static bool dcn201_resource_construct(  	}  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	dcn201_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubp.c index 58e459c7e7d3..f976fac8dc3f 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubp.c +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubp.c @@ -667,7 +667,6 @@ static void program_surface_flip_and_addr(struct hubp *hubp, struct surface_flip  static void dmcub_PLAT_54186_wa(struct hubp *hubp,  				struct surface_flip_registers *flip_regs)  { -	struct dc_dmub_srv *dmcub = hubp->ctx->dmub_srv;  	struct dcn21_hubp *hubp21 = TO_DCN21_HUBP(hubp);  	union dmub_rb_cmd cmd; @@ -690,11 +689,7 @@ static void dmcub_PLAT_54186_wa(struct hubp *hubp,  	cmd.PLAT_54186_wa.flip.flip_params.vmid = flip_regs->vmid;  	PERF_TRACE();  // TODO: remove after performance is stable. -	dc_dmub_srv_cmd_queue(dmcub, &cmd); -	PERF_TRACE();  // TODO: remove after performance is stable. -	dc_dmub_srv_cmd_execute(dmcub); -	PERF_TRACE();  // TODO: remove after performance is stable. -	dc_dmub_srv_wait_idle(dmcub); +	dm_execute_dmub_cmd(hubp->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	PERF_TRACE();  // TODO: remove after performance is stable.  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.c index 2a182c2f57d6..43463d08f21b 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hwseq.c @@ -152,13 +152,28 @@ static bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst, uint32_t optio  	cmd.abm_set_pipe.abm_set_pipe_data.ramping_boundary = ramping_boundary;  	cmd.abm_set_pipe.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pipe_data); -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } +static void dmub_abm_set_backlight(struct dc_context *dc, uint32_t backlight_pwm_u16_16, +									uint32_t frame_ramp, uint32_t panel_inst) +{ +	union dmub_rb_cmd cmd; + +	memset(&cmd, 0, sizeof(cmd)); +	cmd.abm_set_backlight.header.type = DMUB_CMD__ABM; +	cmd.abm_set_backlight.header.sub_type = DMUB_CMD__ABM_SET_BACKLIGHT; +	cmd.abm_set_backlight.abm_set_backlight_data.frame_ramp = frame_ramp; +	cmd.abm_set_backlight.abm_set_backlight_data.backlight_user_level = backlight_pwm_u16_16; +	cmd.abm_set_backlight.abm_set_backlight_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; +	cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_inst); +	cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data); + +	dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT); +} +  void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx)  {  	struct abm *abm = pipe_ctx->stream_res.abm; @@ -173,8 +188,12 @@ void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx)  	}  	if (abm && panel_cntl) { -		dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_IMMEDIATELY_DISABLE, -				panel_cntl->inst); +		if (abm->funcs && abm->funcs->set_pipe_ex) { +			abm->funcs->set_pipe_ex(abm, otg_inst, SET_ABM_PIPE_IMMEDIATELY_DISABLE, +			panel_cntl->inst); +		} else { +			dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_IMMEDIATELY_DISABLE, panel_cntl->inst); +		}  		panel_cntl->funcs->store_backlight_level(panel_cntl);  	}  } @@ -191,18 +210,21 @@ void dcn21_set_pipe(struct pipe_ctx *pipe_ctx)  		return;  	} -	if (abm && panel_cntl) -		dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +	if (abm && panel_cntl) { +		if (abm->funcs && abm->funcs->set_pipe_ex) { +			abm->funcs->set_pipe_ex(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +		} else { +			dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +		} +	}  }  bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,  		uint32_t backlight_pwm_u16_16,  		uint32_t frame_ramp)  { -	union dmub_rb_cmd cmd;  	struct dc_context *dc = pipe_ctx->stream->ctx;  	struct abm *abm = pipe_ctx->stream_res.abm; -	uint32_t otg_inst = pipe_ctx->stream_res.tg->inst;  	struct panel_cntl *panel_cntl = pipe_ctx->stream->link->panel_cntl;  	if (dc->dc->res_pool->dmcu) { @@ -210,21 +232,23 @@ bool dcn21_set_backlight_level(struct pipe_ctx *pipe_ctx,  		return true;  	} -	if (abm && panel_cntl) -		dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +	if (abm != NULL) { +		uint32_t otg_inst = pipe_ctx->stream_res.tg->inst; -	memset(&cmd, 0, sizeof(cmd)); -	cmd.abm_set_backlight.header.type = DMUB_CMD__ABM; -	cmd.abm_set_backlight.header.sub_type = DMUB_CMD__ABM_SET_BACKLIGHT; -	cmd.abm_set_backlight.abm_set_backlight_data.frame_ramp = frame_ramp; -	cmd.abm_set_backlight.abm_set_backlight_data.backlight_user_level = backlight_pwm_u16_16; -	cmd.abm_set_backlight.abm_set_backlight_data.version = DMUB_CMD_ABM_CONTROL_VERSION_1; -	cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_cntl->inst); -	cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data); +		if (abm && panel_cntl) { +			if (abm->funcs && abm->funcs->set_pipe_ex) { +				abm->funcs->set_pipe_ex(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +			} else { +				dmub_abm_set_pipe(abm, otg_inst, SET_ABM_PIPE_NORMAL, panel_cntl->inst); +			} +		} +	} -	dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->dmub_srv); -	dc_dmub_srv_wait_idle(dc->dmub_srv); +	if (abm && abm->funcs && abm->funcs->set_backlight_level_pwm) +		abm->funcs->set_backlight_level_pwm(abm, backlight_pwm_u16_16, +			frame_ramp, 0, panel_cntl->inst); +	else +		dmub_abm_set_backlight(dc, backlight_pwm_u16_16, frame_ramp, panel_cntl->inst);  	return true;  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c index fe1a8e2e08ef..f024157bd6eb 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c @@ -106,7 +106,7 @@ static const struct hw_sequencer_funcs dcn21_funcs = {  	.is_abm_supported = dcn21_is_abm_supported,  	.set_disp_pattern_generator = dcn20_set_disp_pattern_generator,  	.get_dcc_en_bits = dcn10_get_dcc_en_bits, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn21_private_funcs = { @@ -151,8 +151,4 @@ void dcn21_hw_sequencer_construct(struct dc *dc)  	dc->hwss = dcn21_funcs;  	dc->hwseq->funcs = dcn21_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c index 19aaa557b2db..d693ea42d033 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c @@ -653,22 +653,7 @@ static const struct dc_debug_options debug_defaults_drv = {  		.usbc_combo_phy_reset_wa = true,  		.dmub_command_table = true,  		.use_max_lb = true, -}; - -static const struct dc_debug_options debug_defaults_diags = { -		.disable_dmcu = false, -		.force_abm_enable = false, -		.timing_trace = true, -		.clock_trace = true, -		.disable_dpp_power_gate = true, -		.disable_hubp_power_gate = true, -		.disable_clock_gate = true, -		.disable_pplib_clock_request = true, -		.disable_pplib_wm_range = true, -		.disable_stutter = true, -		.disable_48mhz_pwrdwn = true, -		.enable_tri_buf = true, -		.use_max_lb = true +		.enable_legacy_fast_update = true,  };  static const struct dc_panel_config panel_config_defaults = { @@ -1219,13 +1204,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn21_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn21_hwseq_create, -}; -  static const struct encoder_feature_support link_enc_feature = {  		.max_hdmi_deep_color = COLOR_DEPTH_121212,  		.max_hdmi_pixel_clock = 600000, @@ -1503,11 +1481,6 @@ static bool dcn21_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		pool->base.pipe_count = 4; -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags;  	// Init the vm_helper  	if (dc->vm_helper) @@ -1721,9 +1694,8 @@ static bool dcn21_resource_construct(  	}  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	dcn21_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/Makefile b/drivers/gpu/drm/amd/display/dc/dcn30/Makefile index b7c2ae9ddfda..4a3e9e47b6b6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/Makefile +++ b/drivers/gpu/drm/amd/display/dc/dcn30/Makefile @@ -1,16 +1,16 @@ -#  +#  # Copyright 2020 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 @@ -18,17 +18,31 @@  # 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. -#  +#  # Authors: AMD -#  -#  +# +# + +DCN30 := \ +	dcn30_init.o \ +	dcn30_hubbub.o \ +	dcn30_hubp.o \ +	dcn30_dpp.o \ +	dcn30_optc.o \ +	dcn30_dccg.o \ +	dcn30_hwseq.o \ +	dcn30_mpc.o dcn30_vpg.o \ +	dcn30_afmt.o \ +	dcn30_dio_stream_encoder.o \ +	dcn30_dwb.o \ +	dcn30_dpp_cm.o \ +	dcn30_dwb_cm.o \ +	dcn30_cm_common.o \ +	dcn30_mmhubbub.o \ +	dcn30_resource.o \ +	dcn30_dio_link_encoder.o -DCN30 = dcn30_init.o dcn30_hubbub.o dcn30_hubp.o dcn30_dpp.o dcn30_optc.o \ -	dcn30_dccg.o dcn30_hwseq.o dcn30_mpc.o dcn30_vpg.o \ -	dcn30_afmt.o dcn30_dio_stream_encoder.o dcn30_dwb.o \ -	dcn30_dpp_cm.o dcn30_dwb_cm.o dcn30_cm_common.o dcn30_mmhubbub.o \ -	dcn30_dio_link_encoder.o dcn30_resource.o  AMD_DAL_DCN30 = $(addprefix $(AMDDALPATH)/dc/dcn30/,$(DCN30)) diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c index 9d08127d209b..005dbe099a7a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_stream_encoder.c @@ -436,6 +436,21 @@ void enc3_stream_encoder_update_dp_info_packets(  				&info_frame->vsc,  				true);  	} +	/* TODO: VSC SDP at packetIndex 1 should be retricted only if PSR-SU on. +	 * There should have another Infopacket type (e.g. vsc_psrsu) for PSR_SU. +	 * In addition, currently the driver check the valid bit then update and +	 * send the corresponding Infopacket. For PSR-SU, the SDP only be sent +	 * while entering PSR-SU mode. So we need another parameter(e.g. send) +	 * in dc_info_packet to indicate which infopacket should be enabled by +	 * default here. +	 */ +	if (info_frame->vsc.valid) { +		enc->vpg->funcs->update_generic_info_packet( +				enc->vpg, +				1,  /* packetIndex */ +				&info_frame->vsc, +				true); +	}  	/* TODO: VSC SDP at packetIndex 1 should be restricted only if PSR-SU on.  	 * There should have another Infopacket type (e.g. vsc_psrsu) for PSR_SU.  	 * In addition, currently the driver check the valid bit then update and diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hubp.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hubp.c index e46bbe7ddcc9..2861d974fcf6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hubp.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hubp.c @@ -449,6 +449,12 @@ void hubp3_read_state(struct hubp *hubp)  		SWATH_HEIGHT_C, &rq_regs->rq_regs_c.swath_height,  		PTE_ROW_HEIGHT_LINEAR_C, &rq_regs->rq_regs_c.pte_row_height_linear); +	if (REG(UCLK_PSTATE_FORCE)) +		s->uclk_pstate_force = REG_READ(UCLK_PSTATE_FORCE); + +	if (REG(DCHUBP_CNTL)) +		s->hubp_cntl = REG_READ(DCHUBP_CNTL); +  }  void hubp3_setup( diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c index 8263a07f265f..b59e215027e2 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_hwseq.c @@ -330,10 +330,6 @@ void dcn30_enable_writeback(  	DC_LOG_DWB("%s dwb_pipe_inst = %d, mpcc_inst = %d",\  		__func__, wb_info->dwb_pipe_inst,\  		wb_info->mpcc_inst); -	if (IS_DIAG_DC(dc->ctx->dce_environment)) { -		/*till diags switch to warmup interface*/ -		dcn30_mmhubbub_warmup(dc, 1, wb_info); -	}  	/* Update writeback pipe */  	dcn30_set_writeback(dc, wb_info, context); @@ -447,28 +443,6 @@ void dcn30_init_hw(struct dc *dc)  	if (res_pool->dccg->funcs->dccg_init)  		res_pool->dccg->funcs->dccg_init(res_pool->dccg); -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { - -		REG_WRITE(REFCLK_CNTL, 0); -		REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1); -		REG_WRITE(DIO_MEM_PWR_CTRL, 0); - -		if (!dc->debug.disable_clock_gate) { -			/* enable all DCN clock gating */ -			REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0); - -			REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0); - -			REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0); -		} - -		//Enable ability to power gate / don't force power on permanently -		if (hws->funcs.enable_power_gating_plane) -			hws->funcs.enable_power_gating_plane(hws, true); - -		return; -	} -  	if (!dcb->funcs->is_accelerated_mode(dcb)) {  		hws->funcs.bios_golden_init(dc);  		hws->funcs.disable_vga(dc->hwseq); @@ -491,23 +465,21 @@ void dcn30_init_hw(struct dc *dc)  		res_pool->ref_clocks.xtalin_clock_inKhz =  				dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency; -		if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -			if (res_pool->dccg && res_pool->hubbub) { +		if (res_pool->dccg && res_pool->hubbub) { -				(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, -						dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, -						&res_pool->ref_clocks.dccg_ref_clock_inKhz); +			(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, +					dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, +					&res_pool->ref_clocks.dccg_ref_clock_inKhz); -				(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, -						res_pool->ref_clocks.dccg_ref_clock_inKhz, -						&res_pool->ref_clocks.dchub_ref_clock_inKhz); -			} else { -				// Not all ASICs have DCCG sw component -				res_pool->ref_clocks.dccg_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -				res_pool->ref_clocks.dchub_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -			} +			(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, +					res_pool->ref_clocks.dccg_ref_clock_inKhz, +					&res_pool->ref_clocks.dchub_ref_clock_inKhz); +		} else { +			// Not all ASICs have DCCG sw component +			res_pool->ref_clocks.dccg_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz; +			res_pool->ref_clocks.dchub_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz;  		}  	} else  		ASSERT_CRITICAL(false); @@ -632,7 +604,7 @@ void dcn30_init_hw(struct dc *dc)  		dc->res_pool->hubbub->funcs->init_crb(dc->res_pool->hubbub);  	// Get DMCUB capabilities -	dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub); +	dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);  	dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr;  	dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;  } @@ -736,8 +708,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)  				cmd.mall.header.sub_type = DMUB_CMD__MALL_ACTION_NO_DF_REQ;  				cmd.mall.header.payload_bytes = sizeof(cmd.mall) - sizeof(cmd.mall.header); -				dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -				dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); +				dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);  				return true;  			} @@ -859,9 +830,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)  					cmd.mall.cursor_height = cursor_attr.height;  					cmd.mall.cursor_pitch = cursor_attr.pitch; -					dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -					dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -					dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +					dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  					/* Use copied cursor, and it's okay to not switch back */  					cursor_attr.address.quad_part = cmd.mall.cursor_copy_dst.quad_part; @@ -877,8 +846,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)  				cmd.mall.tmr_scale = tmr_scale;  				cmd.mall.debug_bits = dc->debug.mall_error_as_fatal; -				dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -				dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); +				dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);  				return true;  			} @@ -895,9 +863,7 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)  	cmd.mall.header.payload_bytes =  		sizeof(cmd.mall) - sizeof(cmd.mall.header); -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } @@ -983,7 +949,7 @@ void dcn30_set_disp_pattern_generator(const struct dc *dc,  }  void dcn30_prepare_bandwidth(struct dc *dc, -	struct dc_state *context) +			     struct dc_state *context)  {  	bool p_state_change_support = context->bw_ctx.bw.dcn.clk.p_state_change_support;  	/* Any transition into an FPO config should disable MCLK switching first to avoid diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c index 3216d10c58ba..3d19acaa12f3 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c @@ -106,7 +106,7 @@ static const struct hw_sequencer_funcs dcn30_funcs = {  	.disable_link_output = dce110_disable_link_output,  	.set_disp_pattern_generator = dcn30_set_disp_pattern_generator,  	.get_dcc_en_bits = dcn10_get_dcc_en_bits, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  	.is_abm_supported = dcn21_is_abm_supported  }; @@ -151,8 +151,4 @@ void dcn30_hw_sequencer_construct(struct dc *dc)  	dc->hwss = dcn30_funcs;  	dc->hwseq->funcs = dcn30_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c index c95f000b63b2..c6f5f3df8061 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c @@ -55,10 +55,9 @@ void optc3_triplebuffer_lock(struct timing_generator *optc)  	REG_SET(OTG_MASTER_UPDATE_LOCK, 0,  		OTG_MASTER_UPDATE_LOCK, 1); -	if (optc->ctx->dce_environment != DCE_ENV_FPGA_MAXIMUS) -		REG_WAIT(OTG_MASTER_UPDATE_LOCK, -				UPDATE_LOCK_STATUS, 1, -				1, 10); +	REG_WAIT(OTG_MASTER_UPDATE_LOCK, +			UPDATE_LOCK_STATUS, 1, +			1, 10);  	TRACE_OPTC_LOCK_UNLOCK_STATE(optc1, optc->inst, true);  } @@ -301,7 +300,12 @@ static void optc3_wait_drr_doublebuffer_pending_clear(struct timing_generator *o  void optc3_set_vtotal_min_max(struct timing_generator *optc, int vtotal_min, int vtotal_max)  { -	optc1_set_vtotal_min_max(optc, vtotal_min, vtotal_max); +	struct dc *dc = optc->ctx->dc; + +	if (dc->caps.dmub_caps.mclk_sw && !dc->debug.disable_fams) +		dc_dmub_srv_drr_update_cmd(dc, optc->inst, vtotal_min, vtotal_max); +	else +		optc1_set_vtotal_min_max(optc, vtotal_min, vtotal_max);  }  void optc3_tg_init(struct timing_generator *optc) diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c index 67a34cda3774..f4ee4b3df596 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c @@ -728,24 +728,6 @@ static const struct dc_debug_options debug_defaults_drv = {  	.exit_idle_opt_for_cursor_updates = true  }; -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, //No dmcu on DCN30 -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true -}; -  static const struct dc_panel_config panel_config_defaults = {  	.psr = {  		.disable_psr = false, @@ -1076,13 +1058,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn30_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn30_hwseq_create, -}; -  static void dcn30_resource_destruct(struct dcn30_resource_pool *pool)  {  	unsigned int i; @@ -2376,10 +2351,7 @@ static bool dcn30_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -2577,8 +2549,7 @@ static bool dcn30_resource_construct(  	/* Audio, Stream Encoders including DIG and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) +			&res_create_funcs))  		goto create_fail;  	/* HW Sequencer and Plane caps */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c index 6192851c59ed..257df8660b4c 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c @@ -107,7 +107,7 @@ static const struct hw_sequencer_funcs dcn301_funcs = {  	.get_dcc_en_bits = dcn10_get_dcc_en_bits,  	.optimize_pwr_state = dcn21_optimize_pwr_state,  	.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn301_private_funcs = { diff --git a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c index 5ac2a272c380..3485fbb1093e 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c @@ -702,23 +702,6 @@ static const struct dc_debug_options debug_defaults_drv = {  	.exit_idle_opt_for_cursor_updates = true  }; -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = false, -	.disable_hubp_power_gate = false, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = true, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.use_max_lb = false, -}; -  static void dcn301_dpp_destroy(struct dpp **dpp)  {  	kfree(TO_DCN20_DPP(*dpp)); @@ -1047,13 +1030,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn301_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hwseq = dcn301_hwseq_create, -}; -  static void dcn301_destruct(struct dcn301_resource_pool *pool)  {  	unsigned int i; @@ -1513,10 +1489,7 @@ static bool dcn301_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -1710,9 +1683,8 @@ static bool dcn301_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer and Plane caps */  	dcn301_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c index 9f93c43115ba..93f42132c900 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn302/dcn302_resource.c @@ -98,24 +98,6 @@ static const struct dc_debug_options debug_defaults_drv = {  		.exit_idle_opt_for_cursor_updates = true  }; -static const struct dc_debug_options debug_defaults_diags = { -		.disable_dmcu = true, -		.force_abm_enable = false, -		.timing_trace = true, -		.clock_trace = true, -		.disable_dpp_power_gate = true, -		.disable_hubp_power_gate = true, -		.disable_clock_gate = true, -		.disable_pplib_clock_request = true, -		.disable_pplib_wm_range = true, -		.disable_stutter = false, -		.scl_reset_length10 = true, -		.dwb_fi_phase = -1, // -1 = disable -		.dmub_command_table = true, -		.enable_tri_buf = true, -		.use_max_lb = true -}; -  static const struct dc_panel_config panel_config_defaults = {  		.psr = {  			.disable_psr = false, @@ -954,13 +936,6 @@ static const struct resource_create_funcs res_create_funcs = {  		.create_hwseq = dcn302_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -		.read_dce_straps = NULL, -		.create_audio = NULL, -		.create_stream_encoder = NULL, -		.create_hwseq = dcn302_hwseq_create, -}; -  static bool is_soc_bounding_box_valid(struct dc *dc)  {  	uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev; @@ -1309,8 +1284,6 @@ static bool dcn302_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else -		dc->debug = debug_defaults_diags;  	// Init the vm_helper  	if (dc->vm_helper) @@ -1489,8 +1462,7 @@ static bool dcn302_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, pool, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -					&res_create_funcs : &res_create_maximus_funcs))) +			&res_create_funcs))  		goto create_fail;  	/* HW Sequencer and Plane caps */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c index 7f72ef882ca4..f35514188a5c 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c @@ -81,23 +81,6 @@ static const struct dc_debug_options debug_defaults_drv = {  		.disable_idle_power_optimizations = false,  }; -static const struct dc_debug_options debug_defaults_diags = { -		.disable_dmcu = true, -		.force_abm_enable = false, -		.timing_trace = true, -		.clock_trace = true, -		.disable_dpp_power_gate = true, -		.disable_hubp_power_gate = true, -		.disable_clock_gate = true, -		.disable_pplib_clock_request = true, -		.disable_pplib_wm_range = true, -		.disable_stutter = false, -		.scl_reset_length10 = true, -		.dwb_fi_phase = -1, // -1 = disable -		.dmub_command_table = true, -		.enable_tri_buf = true, -}; -  static const struct dc_panel_config panel_config_defaults = {  		.psr = {  			.disable_psr = false, @@ -881,13 +864,6 @@ static const struct resource_create_funcs res_create_funcs = {  		.create_hwseq = dcn303_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -		.read_dce_straps = NULL, -		.create_audio = NULL, -		.create_stream_encoder = NULL, -		.create_hwseq = dcn303_hwseq_create, -}; -  static bool is_soc_bounding_box_valid(struct dc *dc)  {  	uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev; @@ -1232,8 +1208,6 @@ static bool dcn303_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else -		dc->debug = debug_defaults_diags;  	// Init the vm_helper  	if (dc->vm_helper) @@ -1400,8 +1374,7 @@ static bool dcn303_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, pool, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -					&res_create_funcs : &res_create_maximus_funcs))) +			&res_create_funcs))  		goto create_fail;  	/* HW Sequencer and Plane caps */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_dio_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_dio_link_encoder.c index 745a5d187a98..bd62502380d8 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_dio_link_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_dio_link_encoder.c @@ -117,7 +117,6 @@ static bool query_dp_alt_from_dmub(struct link_encoder *enc,  				   union dmub_rb_cmd *cmd)  {  	struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc); -	struct dc_dmub_srv *dc_dmub_srv = enc->ctx->dmub_srv;  	memset(cmd, 0, sizeof(*cmd));  	cmd->query_dp_alt.header.type = DMUB_CMD__VBIOS; @@ -126,7 +125,7 @@ static bool query_dp_alt_from_dmub(struct link_encoder *enc,  	cmd->query_dp_alt.header.payload_bytes = sizeof(cmd->query_dp_alt.data);  	cmd->query_dp_alt.data.phy_id = phy_id_from_transmitter(enc10->base.transmitter); -	if (!dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, cmd)) +	if (!dm_execute_dmub_cmd(enc->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))  		return false;  	return true; @@ -425,7 +424,6 @@ static bool link_dpia_control(struct dc_context *dc_ctx,  	struct dmub_cmd_dig_dpia_control_data *dpia_control)  {  	union dmub_rb_cmd cmd; -	struct dc_dmub_srv *dmub = dc_ctx->dmub_srv;  	memset(&cmd, 0, sizeof(cmd)); @@ -438,9 +436,7 @@ static bool link_dpia_control(struct dc_context *dc_ctx,  	cmd.dig1_dpia_control.dpia_control = *dpia_control; -	dc_dmub_srv_cmd_queue(dmub, &cmd); -	dc_dmub_srv_cmd_execute(dmub); -	dc_dmub_srv_wait_idle(dmub); +	dm_execute_dmub_cmd(dc_ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c index 7e7cd5b64e6a..7445ed27852a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c @@ -103,6 +103,7 @@ static void dcn31_program_det_size(struct hubbub *hubbub, int hubp_inst, unsigne  	default:  		break;  	} +	DC_LOG_DEBUG("Set DET%d to %d segments\n", hubp_inst, det_size_segments);  	/* Should never be hit, if it is we have an erroneous hw config*/  	ASSERT(hubbub2->det0_size + hubbub2->det1_size + hubbub2->det2_size  			+ hubbub2->det3_size + hubbub2->compbuf_size_segments <= hubbub2->crb_size_segs); diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c index 62ce36c75c4d..2a7f47642a44 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c @@ -117,28 +117,6 @@ void dcn31_init_hw(struct dc *dc)  	if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)  		dc->clk_mgr->funcs->init_clocks(dc->clk_mgr); -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { - -		REG_WRITE(REFCLK_CNTL, 0); -		REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, DCHUBBUB_GLOBAL_TIMER_ENABLE, 1); -		REG_WRITE(DIO_MEM_PWR_CTRL, 0); - -		if (!dc->debug.disable_clock_gate) { -			/* enable all DCN clock gating */ -			REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0); - -			REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0); - -			REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0); -		} - -		//Enable ability to power gate / don't force power on permanently -		if (hws->funcs.enable_power_gating_plane) -			hws->funcs.enable_power_gating_plane(hws, true); - -		return; -	} -  	if (!dcb->funcs->is_accelerated_mode(dcb)) {  		hws->funcs.bios_golden_init(dc);  		if (hws->funcs.disable_vga) @@ -154,23 +132,21 @@ void dcn31_init_hw(struct dc *dc)  		res_pool->ref_clocks.xtalin_clock_inKhz =  				dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency; -		if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -			if (res_pool->dccg && res_pool->hubbub) { +		if (res_pool->dccg && res_pool->hubbub) { -				(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, -						dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, -						&res_pool->ref_clocks.dccg_ref_clock_inKhz); +			(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg, +					dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency, +					&res_pool->ref_clocks.dccg_ref_clock_inKhz); -				(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, -						res_pool->ref_clocks.dccg_ref_clock_inKhz, -						&res_pool->ref_clocks.dchub_ref_clock_inKhz); -			} else { -				// Not all ASICs have DCCG sw component -				res_pool->ref_clocks.dccg_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -				res_pool->ref_clocks.dchub_ref_clock_inKhz = -						res_pool->ref_clocks.xtalin_clock_inKhz; -			} +			(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub, +					res_pool->ref_clocks.dccg_ref_clock_inKhz, +					&res_pool->ref_clocks.dchub_ref_clock_inKhz); +		} else { +			// Not all ASICs have DCCG sw component +			res_pool->ref_clocks.dccg_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz; +			res_pool->ref_clocks.dchub_ref_clock_inKhz = +					res_pool->ref_clocks.xtalin_clock_inKhz;  		}  	} else  		ASSERT_CRITICAL(false); @@ -197,10 +173,6 @@ void dcn31_init_hw(struct dc *dc)  		}  	} -	/* Enables outbox notifications for usb4 dpia */ -	if (dc->res_pool->usb4_dpia_count) -		dmub_enable_outbox_notification(dc->ctx->dmub_srv); -  	/* we want to turn off all dp displays before doing detection */  	dc->link_srv->blank_all_dp_displays(dc); @@ -297,8 +269,9 @@ void dcn31_init_hw(struct dc *dc)  #endif  	// Get DMCUB capabilities -	dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub); +	dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);  	dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr; +	dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;  }  void dcn31_dsc_pg_control( @@ -442,9 +415,7 @@ void dcn31_z10_save_init(struct dc *dc)  	cmd.dcn_restore.header.type = DMUB_CMD__IDLE_OPT;  	cmd.dcn_restore.header.sub_type = DMUB_CMD__IDLE_OPT_DCN_SAVE_INIT; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  void dcn31_z10_restore(const struct dc *dc) @@ -462,9 +433,7 @@ void dcn31_z10_restore(const struct dc *dc)  	cmd.dcn_restore.header.type = DMUB_CMD__IDLE_OPT;  	cmd.dcn_restore.header.sub_type = DMUB_CMD__IDLE_OPT_DCN_RESTORE; -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  }  void dcn31_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on) @@ -560,35 +529,31 @@ static void dcn31_reset_back_end_for_pipe(  		pipe_ctx->stream_res.tg->funcs->set_drr(  				pipe_ctx->stream_res.tg, NULL); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		link = pipe_ctx->stream->link; -		/* DPMS may already disable or */ -		/* dpms_off status is incorrect due to fastboot -		 * feature. When system resume from S4 with second -		 * screen only, the dpms_off would be true but -		 * VBIOS lit up eDP, so check link status too. -		 */ -		if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) -			dc->link_srv->set_dpms_off(pipe_ctx); -		else if (pipe_ctx->stream_res.audio) -			dc->hwss.disable_audio_stream(pipe_ctx); +	link = pipe_ctx->stream->link; +	/* DPMS may already disable or */ +	/* dpms_off status is incorrect due to fastboot +	 * feature. When system resume from S4 with second +	 * screen only, the dpms_off would be true but +	 * VBIOS lit up eDP, so check link status too. +	 */ +	if (!pipe_ctx->stream->dpms_off || link->link_status.link_active) +		dc->link_srv->set_dpms_off(pipe_ctx); +	else if (pipe_ctx->stream_res.audio) +		dc->hwss.disable_audio_stream(pipe_ctx); -		/* free acquired resources */ -		if (pipe_ctx->stream_res.audio) { -			/*disable az_endpoint*/ -			pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); +	/* free acquired resources */ +	if (pipe_ctx->stream_res.audio) { +		/*disable az_endpoint*/ +		pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); -			/*free audio*/ -			if (dc->caps.dynamic_audio == true) { -				/*we have to dynamic arbitrate the audio endpoints*/ -				/*we free the resource, need reset is_audio_acquired*/ -				update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, -						pipe_ctx->stream_res.audio, false); -				pipe_ctx->stream_res.audio = NULL; -			} +		/*free audio*/ +		if (dc->caps.dynamic_audio == true) { +			/*we have to dynamic arbitrate the audio endpoints*/ +			/*we free the resource, need reset is_audio_acquired*/ +			update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, +					pipe_ctx->stream_res.audio, false); +			pipe_ctx->stream_res.audio = NULL;  		} -	} else if (pipe_ctx->stream_res.dsc) { -		dc->link_srv->set_dsc_enable(pipe_ctx, false);  	}  	pipe_ctx->stream = NULL; diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c index 3a32810bbe38..fc25cc300a17 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c @@ -58,6 +58,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {  	.enable_audio_stream = dce110_enable_audio_stream,  	.disable_audio_stream = dce110_disable_audio_stream,  	.disable_plane = dcn20_disable_plane, +	.disable_pixel_data = dcn20_disable_pixel_data,  	.pipe_control_lock = dcn20_pipe_control_lock,  	.interdependent_update_lock = dcn10_lock_all_pipes,  	.cursor_lock = dcn10_cursor_lock, @@ -109,7 +110,7 @@ static const struct hw_sequencer_funcs dcn31_funcs = {  	.set_disp_pattern_generator = dcn30_set_disp_pattern_generator,  	.optimize_pwr_state = dcn21_optimize_pwr_state,  	.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn31_private_funcs = { @@ -153,8 +154,4 @@ void dcn31_hw_sequencer_construct(struct dc *dc)  	dc->hwss = dcn31_funcs;  	dc->hwseq->funcs = dcn31_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c index 11ea9d13e312..217acd4e292a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_panel_cntl.c @@ -52,7 +52,7 @@ static bool dcn31_query_backlight_info(struct panel_cntl *panel_cntl, union dmub  	cmd->panel_cntl.header.payload_bytes = sizeof(cmd->panel_cntl.data);  	cmd->panel_cntl.data.inst = dcn31_panel_cntl->base.inst; -	return dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, cmd); +	return dm_execute_dmub_cmd(dc_dmub_srv->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);  }  static uint32_t dcn31_get_16_bit_backlight_from_pwm(struct panel_cntl *panel_cntl) @@ -85,7 +85,7 @@ static uint32_t dcn31_panel_cntl_hw_init(struct panel_cntl *panel_cntl)  		panel_cntl->stored_backlight_registers.LVTMA_PWRSEQ_REF_DIV_BL_PWM_REF_DIV;  	cmd.panel_cntl.data.bl_pwm_ref_div2 =  		panel_cntl->stored_backlight_registers.PANEL_PWRSEQ_REF_DIV2; -	if (!dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, &cmd)) +	if (!dm_execute_dmub_cmd(dc_dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))  		return 0;  	panel_cntl->stored_backlight_registers.BL_PWM_CNTL = cmd.panel_cntl.data.bl_pwm_cntl; diff --git a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c index ff8cd5076434..fc33b5fcabe1 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_resource.c @@ -887,28 +887,11 @@ static const struct dc_debug_options debug_defaults_drv = {  		}  	},  	.disable_z10 = true, +	.enable_legacy_fast_update = true,  	.enable_z9_disable_interface = true, /* Allow support for the PMFW interface for disable Z9*/  	.dml_hostvm_override = DML_HOSTVM_OVERRIDE_FALSE,  }; -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true -}; -  static const struct dc_panel_config panel_config_defaults = {  	.psr = {  		.disable_psr = false, @@ -1341,13 +1324,6 @@ static struct dce_hwseq *dcn31_hwseq_create(  		hws->regs = &hwseq_reg;  		hws->shifts = &hwseq_shift;  		hws->masks = &hwseq_mask; -		/* DCN3.1 FPGA Workaround -		 * Need to enable HPO DP Stream Encoder before setting OTG master enable. -		 * To do so, move calling function enable_stream_timing to only be done AFTER calling -		 * function core_link_enable_stream -		 */ -		if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -			hws->wa.dp_hpo_and_otg_sequence = true;  	}  	return hws;  } @@ -1360,15 +1336,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn31_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create, -	.create_hwseq = dcn31_hwseq_create, -}; -  static void dcn31_resource_destruct(struct dcn31_resource_pool *pool)  {  	unsigned int i; @@ -1988,10 +1955,7 @@ static bool dcn31_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -2195,9 +2159,8 @@ static bool dcn31_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer and Plane caps */  	dcn31_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.c index de7bfba2c179..e0e7d32bb1a0 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.c +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.c @@ -45,6 +45,16 @@  #define DC_LOGGER \  	dccg->ctx->logger +static void dccg314_trigger_dio_fifo_resync( +	struct dccg *dccg) +{ +	struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); +	uint32_t dispclk_rdivider_value = 0; + +	REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_RDIVIDER, &dispclk_rdivider_value); +	REG_UPDATE(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, dispclk_rdivider_value); +} +  static void dccg314_get_pixel_rate_div(  		struct dccg *dccg,  		uint32_t otg_inst, @@ -357,6 +367,7 @@ static const struct dccg_funcs dccg314_funcs = {  	.disable_dsc = dccg31_disable_dscclk,  	.enable_dsc = dccg31_enable_dscclk,  	.set_pixel_rate_div = dccg314_set_pixel_rate_div, +	.trigger_dio_fifo_resync = dccg314_trigger_dio_fifo_resync,  	.set_valid_pixel_rate = dccg314_set_valid_pixel_rate,  }; diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.h b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.h index 90687a9e8fdd..8e07d3151f91 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.h +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_dccg.h @@ -192,7 +192,10 @@  	DCCG_SF(DCCG_GATE_DISABLE_CNTL2, PHYBSYMCLK_GATE_DISABLE, mask_sh),\  	DCCG_SF(DCCG_GATE_DISABLE_CNTL2, PHYCSYMCLK_GATE_DISABLE, mask_sh),\  	DCCG_SF(DCCG_GATE_DISABLE_CNTL2, PHYDSYMCLK_GATE_DISABLE, mask_sh),\ -	DCCG_SF(DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_GATE_DISABLE, mask_sh) +	DCCG_SF(DCCG_GATE_DISABLE_CNTL2, PHYESYMCLK_GATE_DISABLE, mask_sh),\ +	DCCG_SF(HDMISTREAMCLK0_DTO_PARAM, HDMISTREAMCLK0_DTO_MODULO, mask_sh),\ +	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_RDIVIDER, mask_sh),\ +	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, mask_sh)  struct dccg *dccg314_create(  	struct dc_context *ctx, diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c index cc3fe9cac5b5..ce7e6f20b31f 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c @@ -390,6 +390,35 @@ void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)  				pix_per_cycle);  } +void dcn314_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context) +{ +	unsigned int i; +	struct pipe_ctx *pipe = NULL; +	bool otg_disabled[MAX_PIPES] = {false}; + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +		if (pipe->top_pipe || pipe->prev_odm_pipe) +			continue; + +		if (pipe->stream && (pipe->stream->dpms_off || dc_is_virtual_signal(pipe->stream->signal))) { +			pipe->stream_res.tg->funcs->disable_crtc(pipe->stream_res.tg); +			reset_sync_context_for_pipe(dc, context, i); +			otg_disabled[i] = true; +		} +	} + +	hws->ctx->dc->res_pool->dccg->funcs->trigger_dio_fifo_resync(hws->ctx->dc->res_pool->dccg); + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +		if (otg_disabled[i]) +			pipe->stream_res.tg->funcs->enable_crtc(pipe->stream_res.tg); +	} +} +  void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool clock_on)  {  	if (!hws->ctx->dc->debug.root_clock_optimization.bits.dpp) @@ -417,9 +446,7 @@ void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool  	cmd.domain_control.data.inst = hubp_inst;  	cmd.domain_control.data.power_gate = !power_on; -	dc_dmub_srv_cmd_queue(ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(ctx->dmub_srv); -	dc_dmub_srv_wait_idle(ctx->dmub_srv); +	dm_execute_dmub_cmd(ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	PERF_TRACE();  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h index 6d0b62503caa..559d71002e8a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h @@ -41,6 +41,8 @@ unsigned int dcn314_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsig  void dcn314_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx); +void dcn314_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context); +  void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on);  void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool clock_on); diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c index a588f46b166f..86d6a514dec0 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c @@ -60,6 +60,7 @@ static const struct hw_sequencer_funcs dcn314_funcs = {  	.enable_audio_stream = dce110_enable_audio_stream,  	.disable_audio_stream = dce110_disable_audio_stream,  	.disable_plane = dcn20_disable_plane, +	.disable_pixel_data = dcn20_disable_pixel_data,  	.pipe_control_lock = dcn20_pipe_control_lock,  	.interdependent_update_lock = dcn10_lock_all_pipes,  	.cursor_lock = dcn10_cursor_lock, @@ -111,7 +112,7 @@ static const struct hw_sequencer_funcs dcn314_funcs = {  	.set_disp_pattern_generator = dcn30_set_disp_pattern_generator,  	.optimize_pwr_state = dcn21_optimize_pwr_state,  	.exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color,  };  static const struct hwseq_private_funcs dcn314_private_funcs = { @@ -151,6 +152,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {  	.setup_hpo_hw_control = dcn31_setup_hpo_hw_control,  	.calculate_dccg_k1_k2_values = dcn314_calculate_dccg_k1_k2_values,  	.set_pixels_per_cycle = dcn314_set_pixels_per_cycle, +	.resync_fifo_dccg_dio = dcn314_resync_fifo_dccg_dio,  };  void dcn314_hw_sequencer_construct(struct dc *dc) @@ -158,8 +160,4 @@ void dcn314_hw_sequencer_construct(struct dc *dc)  	dc->hwss = dcn314_funcs;  	dc->hwseq->funcs = dcn314_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c index abeeede38fb3..837884c4f03a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn314/dcn314_resource.c @@ -117,23 +117,6 @@  #define regBIF_BX2_BIOS_SCRATCH_6			0x003e  #define regBIF_BX2_BIOS_SCRATCH_6_BASE_IDX		1 -struct IP_BASE_INSTANCE { -	unsigned int segment[MAX_SEGMENT]; -}; - -struct IP_BASE { -	struct IP_BASE_INSTANCE instance[MAX_INSTANCE]; -}; - -static const struct IP_BASE DCN_BASE = { { { { 0x00000012, 0x000000C0, 0x000034C0, 0x00009000, 0x02403C00, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } }, -					{ { 0, 0, 0, 0, 0, 0, 0, 0 } } } }; - -  #define DC_LOGGER_INIT(logger)  enum dcn31_clk_src_array_id { @@ -1375,13 +1358,6 @@ static struct dce_hwseq *dcn314_hwseq_create(  		hws->regs = &hwseq_reg;  		hws->shifts = &hwseq_shift;  		hws->masks = &hwseq_mask; -		/* DCN3.1 FPGA Workaround -		 * Need to enable HPO DP Stream Encoder before setting OTG master enable. -		 * To do so, move calling function enable_stream_timing to only be done AFTER calling -		 * function core_link_enable_stream -		 */ -		if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -			hws->wa.dp_hpo_and_otg_sequence = true;  	}  	return hws;  } @@ -1394,15 +1370,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn314_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create, -	.create_hwseq = dcn314_hwseq_create, -}; -  static void dcn314_resource_destruct(struct dcn314_resource_pool *pool)  {  	unsigned int i; @@ -2101,8 +2068,7 @@ static bool dcn314_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -				(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -				 &res_create_funcs : &res_create_maximus_funcs))) +			&res_create_funcs))  		goto create_fail;  	/* HW Sequencer and Plane caps */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c index 41c972c8eb19..0cc853964781 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c @@ -136,6 +136,9 @@  #define DCN3_15_MAX_DET_SIZE 384  #define DCN3_15_CRB_SEGMENT_SIZE_KB 64 +#define DCN3_15_MAX_DET_SEGS (DCN3_15_MAX_DET_SIZE / DCN3_15_CRB_SEGMENT_SIZE_KB) +/* Minimum 2 extra segments need to be in compbuf and claimable to guarantee seamless mpo transitions */ +#define MIN_RESERVED_DET_SEGS 2  enum dcn31_clk_src_array_id {  	DCN31_CLK_SRC_PLL0, @@ -884,27 +887,10 @@ static const struct dc_debug_options debug_defaults_drv = {  			.afmt = true,  		}  	}, +	.enable_legacy_fast_update = true,  	.psr_power_use_phy_fsm = 0,  }; -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true -}; -  static const struct dc_panel_config panel_config_defaults = {  	.psr = {  		.disable_psr = false, @@ -1339,13 +1325,6 @@ static struct dce_hwseq *dcn31_hwseq_create(  		hws->regs = &hwseq_reg;  		hws->shifts = &hwseq_shift;  		hws->masks = &hwseq_mask; -		/* DCN3.1 FPGA Workaround -		 * Need to enable HPO DP Stream Encoder before setting OTG master enable. -		 * To do so, move calling function enable_stream_timing to only be done AFTER calling -		 * function core_link_enable_stream -		 */ -		if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -			hws->wa.dp_hpo_and_otg_sequence = true;  	}  	return hws;  } @@ -1358,15 +1337,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn31_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create, -	.create_hwseq = dcn31_hwseq_create, -}; -  static void dcn315_resource_destruct(struct dcn315_resource_pool *pool)  {  	unsigned int i; @@ -1636,21 +1606,69 @@ static bool is_dual_plane(enum surface_pixel_format format)  	return format >= SURFACE_PIXEL_FORMAT_VIDEO_BEGIN || format == SURFACE_PIXEL_FORMAT_GRPH_RGBE_ALPHA;  } +static int source_format_to_bpp (enum source_format_class SourcePixelFormat) +{ +	if (SourcePixelFormat == dm_444_64) +		return 8; +	else if (SourcePixelFormat == dm_444_16 || SourcePixelFormat == dm_444_16) +		return 2; +	else if (SourcePixelFormat == dm_444_8) +		return 1; +	else if (SourcePixelFormat == dm_rgbe_alpha) +		return 5; +	else if (SourcePixelFormat == dm_420_8) +		return 3; +	else if (SourcePixelFormat == dm_420_12) +		return 6; +	else +		return 4; +} + +static bool allow_pixel_rate_crb(struct dc *dc, struct dc_state *context) +{ +	int i; +	struct resource_context *res_ctx = &context->res_ctx; + +	/*Don't apply for single stream*/ +	if (context->stream_count < 2) +		return false; + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		if (!res_ctx->pipe_ctx[i].stream) +			continue; + +		/*Don't apply if scaling*/ +		if (res_ctx->pipe_ctx[i].stream->src.width != res_ctx->pipe_ctx[i].stream->dst.width || +				res_ctx->pipe_ctx[i].stream->src.height != res_ctx->pipe_ctx[i].stream->dst.height || +				(res_ctx->pipe_ctx[i].plane_state && (res_ctx->pipe_ctx[i].plane_state->src_rect.width +														!= res_ctx->pipe_ctx[i].plane_state->dst_rect.width || +					res_ctx->pipe_ctx[i].plane_state->src_rect.height +														!= res_ctx->pipe_ctx[i].plane_state->dst_rect.height))) +			return false; +		/*Don't apply if MPO to avoid transition issues*/ +		if (res_ctx->pipe_ctx[i].top_pipe && res_ctx->pipe_ctx[i].top_pipe->plane_state != res_ctx->pipe_ctx[i].plane_state) +			return false; +	} +	return true; +} +  static int dcn315_populate_dml_pipes_from_context(  	struct dc *dc, struct dc_state *context,  	display_e2e_pipe_params_st *pipes,  	bool fast_validate)  { -	int i, pipe_cnt; +	int i, pipe_cnt, crb_idx, crb_pipes;  	struct resource_context *res_ctx = &context->res_ctx;  	struct pipe_ctx *pipe;  	const int max_usable_det = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB; +	int remaining_det_segs = max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB; +	bool pixel_rate_crb = allow_pixel_rate_crb(dc, context);  	DC_FP_START();  	dcn31x_populate_dml_pipes_from_context(dc, context, pipes, fast_validate);  	DC_FP_END(); -	for (i = 0, pipe_cnt = 0; i < dc->res_pool->pipe_count; i++) { +	for (i = 0, pipe_cnt = 0, crb_pipes = 0; i < dc->res_pool->pipe_count; i++) {  		struct dc_crtc_timing *timing;  		if (!res_ctx->pipe_ctx[i].stream) @@ -1671,6 +1689,28 @@ static int dcn315_populate_dml_pipes_from_context(  		pipes[pipe_cnt].dout.dsc_input_bpc = 0;  		DC_FP_START();  		dcn31_zero_pipe_dcc_fraction(pipes, pipe_cnt); +		if (pixel_rate_crb && !pipe->top_pipe && !pipe->prev_odm_pipe) { +			int bpp = source_format_to_bpp(pipes[pipe_cnt].pipe.src.source_format); +			/* Ceil to crb segment size */ +			int approx_det_segs_required_for_pstate = dcn_get_approx_det_segs_required_for_pstate( +					&context->bw_ctx.dml.soc, timing->pix_clk_100hz, bpp, DCN3_15_CRB_SEGMENT_SIZE_KB); + +			if (approx_det_segs_required_for_pstate <= 2 * DCN3_15_MAX_DET_SEGS) { +				bool split_required = approx_det_segs_required_for_pstate > DCN3_15_MAX_DET_SEGS; +				split_required = split_required || timing->pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc); +				split_required = split_required || (pipe->plane_state && pipe->plane_state->src_rect.width > 5120); + +				/* Minimum 2 segments to allow mpc/odm combine if its used later */ +				if (approx_det_segs_required_for_pstate < 2) +					approx_det_segs_required_for_pstate = 2; +				if (split_required) +					approx_det_segs_required_for_pstate += approx_det_segs_required_for_pstate % 2; +				pipes[pipe_cnt].pipe.src.det_size_override = approx_det_segs_required_for_pstate; +				remaining_det_segs -= approx_det_segs_required_for_pstate; +			} else +				remaining_det_segs = -1; +			crb_pipes++; +		}  		DC_FP_END();  		if (pipes[pipe_cnt].dout.dsc_enable) { @@ -1689,16 +1729,54 @@ static int dcn315_populate_dml_pipes_from_context(  				break;  			}  		} -  		pipe_cnt++;  	} +	/* Spread remaining unreserved crb evenly among all pipes*/ +	if (pixel_rate_crb) { +		for (i = 0, pipe_cnt = 0, crb_idx = 0; i < dc->res_pool->pipe_count; i++) { +			pipe = &res_ctx->pipe_ctx[i]; +			if (!pipe->stream) +				continue; + +			/* Do not use asymetric crb if not enough for pstate support */ +			if (remaining_det_segs < 0) { +				pipes[pipe_cnt].pipe.src.det_size_override = 0; +				continue; +			} + +			if (!pipe->top_pipe && !pipe->prev_odm_pipe) { +				bool split_required = pipe->stream->timing.pix_clk_100hz >= dcn_get_max_non_odm_pix_rate_100hz(&dc->dml.soc) +						|| (pipe->plane_state && pipe->plane_state->src_rect.width > 5120); + +				if (remaining_det_segs > MIN_RESERVED_DET_SEGS) +					pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs - MIN_RESERVED_DET_SEGS) / crb_pipes + +							(crb_idx < (remaining_det_segs - MIN_RESERVED_DET_SEGS) % crb_pipes ? 1 : 0); +				if (pipes[pipe_cnt].pipe.src.det_size_override > 2 * DCN3_15_MAX_DET_SEGS) { +					/* Clamp to 2 pipe split max det segments */ +					remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override - 2 * (DCN3_15_MAX_DET_SEGS); +					pipes[pipe_cnt].pipe.src.det_size_override = 2 * DCN3_15_MAX_DET_SEGS; +				} +				if (pipes[pipe_cnt].pipe.src.det_size_override > DCN3_15_MAX_DET_SEGS || split_required) { +					/* If we are splitting we must have an even number of segments */ +					remaining_det_segs += pipes[pipe_cnt].pipe.src.det_size_override % 2; +					pipes[pipe_cnt].pipe.src.det_size_override -= pipes[pipe_cnt].pipe.src.det_size_override % 2; +				} +				/* Convert segments into size for DML use */ +				pipes[pipe_cnt].pipe.src.det_size_override *= DCN3_15_CRB_SEGMENT_SIZE_KB; + +				crb_idx++; +			} +			pipe_cnt++; +		} +	} +  	if (pipe_cnt)  		context->bw_ctx.dml.ip.det_buffer_size_kbytes =  				(max_usable_det / DCN3_15_CRB_SEGMENT_SIZE_KB / pipe_cnt) * DCN3_15_CRB_SEGMENT_SIZE_KB;  	if (context->bw_ctx.dml.ip.det_buffer_size_kbytes > DCN3_15_MAX_DET_SIZE)  		context->bw_ctx.dml.ip.det_buffer_size_kbytes = DCN3_15_MAX_DET_SIZE; -	ASSERT(context->bw_ctx.dml.ip.det_buffer_size_kbytes >= DCN3_15_DEFAULT_DET_SIZE); +  	dc->config.enable_4to1MPC = false;  	if (pipe_cnt == 1 && pipe->plane_state && !dc->debug.disable_z9_mpc) {  		if (is_dual_plane(pipe->plane_state->format) @@ -1845,10 +1923,7 @@ static bool dcn315_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -2029,9 +2104,8 @@ static bool dcn315_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer and Plane caps */  	dcn31_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c b/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c index 9ead347a33e9..707cf28bbceb 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn316/dcn316_resource.c @@ -884,24 +884,7 @@ static const struct dc_debug_options debug_defaults_drv = {  			.afmt = true,  		}  	}, -}; - -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true +	.enable_legacy_fast_update = true,  };  static const struct dc_panel_config panel_config_defaults = { @@ -1340,13 +1323,6 @@ static struct dce_hwseq *dcn31_hwseq_create(  		hws->regs = &hwseq_reg;  		hws->shifts = &hwseq_shift;  		hws->masks = &hwseq_mask; -		/* DCN3.1 FPGA Workaround -		 * Need to enable HPO DP Stream Encoder before setting OTG master enable. -		 * To do so, move calling function enable_stream_timing to only be done AFTER calling -		 * function core_link_enable_stream -		 */ -		if (IS_FPGA_MAXIMUS_DC(ctx->dce_environment)) -			hws->wa.dp_hpo_and_otg_sequence = true;  	}  	return hws;  } @@ -1359,15 +1335,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn31_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn31_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn31_hpo_dp_link_encoder_create, -	.create_hwseq = dcn31_hwseq_create, -}; -  static void dcn316_resource_destruct(struct dcn316_resource_pool *pool)  {  	unsigned int i; @@ -1844,10 +1811,7 @@ static bool dcn316_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -2028,9 +1992,8 @@ static bool dcn316_resource_construct(  	/* Audio, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer and Plane caps */  	dcn31_hw_sequencer_construct(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.c index ffbb739d85b6..11e28e056cf7 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.c @@ -42,18 +42,14 @@  #define DC_LOGGER \  	dccg->ctx->logger -/* This function is a workaround for writing to OTG_PIXEL_RATE_DIV - * without the probability of causing a DIG FIFO error. - */ -static void dccg32_wait_for_dentist_change_done( +static void dccg32_trigger_dio_fifo_resync(  	struct dccg *dccg)  {  	struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg); +	uint32_t dispclk_rdivider_value = 0; -	uint32_t dentist_dispclk_value = REG_READ(DENTIST_DISPCLK_CNTL); - -	REG_WRITE(DENTIST_DISPCLK_CNTL, dentist_dispclk_value); -	REG_WAIT(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, 1, 50, 2000); +	REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_RDIVIDER, &dispclk_rdivider_value); +	REG_UPDATE(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, dispclk_rdivider_value);  }  static void dccg32_get_pixel_rate_div( @@ -124,29 +120,21 @@ static void dccg32_set_pixel_rate_div(  		REG_UPDATE_2(OTG_PIXEL_RATE_DIV,  				OTG0_PIXEL_RATE_DIVK1, k1,  				OTG0_PIXEL_RATE_DIVK2, k2); - -		dccg32_wait_for_dentist_change_done(dccg);  		break;  	case 1:  		REG_UPDATE_2(OTG_PIXEL_RATE_DIV,  				OTG1_PIXEL_RATE_DIVK1, k1,  				OTG1_PIXEL_RATE_DIVK2, k2); - -		dccg32_wait_for_dentist_change_done(dccg);  		break;  	case 2:  		REG_UPDATE_2(OTG_PIXEL_RATE_DIV,  				OTG2_PIXEL_RATE_DIVK1, k1,  				OTG2_PIXEL_RATE_DIVK2, k2); - -		dccg32_wait_for_dentist_change_done(dccg);  		break;  	case 3:  		REG_UPDATE_2(OTG_PIXEL_RATE_DIV,  				OTG3_PIXEL_RATE_DIVK1, k1,  				OTG3_PIXEL_RATE_DIVK2, k2); - -		dccg32_wait_for_dentist_change_done(dccg);  		break;  	default:  		BREAK_TO_DEBUGGER(); @@ -352,6 +340,7 @@ static const struct dccg_funcs dccg32_funcs = {  	.otg_add_pixel = dccg32_otg_add_pixel,  	.otg_drop_pixel = dccg32_otg_drop_pixel,  	.set_pixel_rate_div = dccg32_set_pixel_rate_div, +	.trigger_dio_fifo_resync = dccg32_trigger_dio_fifo_resync,  };  struct dccg *dccg32_create( diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.h index 8071ab98d708..cf5508718122 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.h +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_dccg.h @@ -112,8 +112,9 @@  	DCCG_SF(DTBCLK_P_CNTL, DTBCLK_P3_EN, mask_sh),\  	DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO_SEL, mask_sh),\  	DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL, mask_sh),\ -	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, mask_sh) - +	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, mask_sh),\ +	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_RDIVIDER, mask_sh),\ +	DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_WDIVIDER, mask_sh)  struct dccg *dccg32_create(  	struct dc_context *ctx, diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.c index eb08ccc38e79..a18b9c0c5709 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubbub.c @@ -42,8 +42,8 @@  	hubbub2->shifts->field_name, hubbub2->masks->field_name  /** - * @DCN32_CRB_SEGMENT_SIZE_KB: Maximum Configurable Return Buffer size for - * DCN32 + * DCN32_CRB_SEGMENT_SIZE_KB: Maximum Configurable Return Buffer size for + *                            DCN32   */  #define DCN32_CRB_SEGMENT_SIZE_KB 64 diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c index 1f5ee5cde6e1..00f32ffe0079 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c @@ -274,8 +274,7 @@ bool dcn32_apply_idle_power_optimizations(struct dc *dc, bool enable)  				cmd.cab.header.sub_type = DMUB_CMD__CAB_NO_DCN_REQ;  				cmd.cab.header.payload_bytes = sizeof(cmd.cab) - sizeof(cmd.cab.header); -				dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -				dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); +				dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);  				return true;  			} @@ -309,8 +308,7 @@ bool dcn32_apply_idle_power_optimizations(struct dc *dc, bool enable)  				cmd.cab.header.payload_bytes = sizeof(cmd.cab) - sizeof(cmd.cab.header);  				cmd.cab.cab_alloc_ways = ways; -				dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -				dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); +				dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);  				return true;  			} @@ -326,9 +324,7 @@ bool dcn32_apply_idle_power_optimizations(struct dc *dc, bool enable)  	cmd.cab.header.payload_bytes =  			sizeof(cmd.cab) - sizeof(cmd.cab.header); -	dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd); -	dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv); -	dc_dmub_srv_wait_idle(dc->ctx->dmub_srv); +	dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);  	return true;  } @@ -413,6 +409,30 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc,  	}  } +void dcn32_subvp_pipe_control_lock_fast(union block_sequence_params *params) +{ +	struct dc *dc = params->subvp_pipe_control_lock_fast_params.dc; +	bool lock = params->subvp_pipe_control_lock_fast_params.lock; +	struct pipe_ctx *pipe_ctx = params->subvp_pipe_control_lock_fast_params.pipe_ctx; +	bool subvp_immediate_flip = false; + +	if (pipe_ctx && pipe_ctx->stream && pipe_ctx->plane_state) { +		if (pipe_ctx->stream->mall_stream_config.type == SUBVP_MAIN && +				pipe_ctx->plane_state->flip_immediate) +			subvp_immediate_flip = true; +	} + +	// Don't need to lock for DRR VSYNC flips -- FW will wait for DRR pending update cleared. +	if (subvp_immediate_flip) { +		union dmub_inbox0_cmd_lock_hw hw_lock_cmd = { 0 }; + +		hw_lock_cmd.bits.command_code = DMUB_INBOX0_CMD__HW_LOCK; +		hw_lock_cmd.bits.hw_lock_client = HW_LOCK_CLIENT_DRIVER; +		hw_lock_cmd.bits.lock = lock; +		hw_lock_cmd.bits.should_release = !lock; +		dmub_hw_lock_mgr_inbox0_cmd(dc->ctx->dmub_srv, hw_lock_cmd); +	} +}  bool dcn32_set_mpc_shaper_3dlut(  	struct pipe_ctx *pipe_ctx, const struct dc_stream_state *stream) @@ -587,8 +607,8 @@ void dcn32_update_force_pstate(struct dc *dc, struct dc_state *context)  		struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];  		struct hubp *hubp = pipe->plane_res.hubp; -		if (!pipe->stream || (pipe->stream && !(pipe->stream->mall_stream_config.type == SUBVP_MAIN || -						pipe->stream->fpo_in_use))) { +		if (!pipe->stream || !(pipe->stream->mall_stream_config.type == SUBVP_MAIN || +		    pipe->stream->fpo_in_use)) {  			if (hubp && hubp->funcs->hubp_update_force_pstate_disallow)  				hubp->funcs->hubp_update_force_pstate_disallow(hubp, false);  		} @@ -596,7 +616,7 @@ void dcn32_update_force_pstate(struct dc *dc, struct dc_state *context)  		/* Today only FPO uses cursor P-State force. Only clear cursor P-State force  		 * if it's not FPO.  		 */ -		if (!pipe->stream || (pipe->stream && !pipe->stream->fpo_in_use)) { +		if (!pipe->stream || !pipe->stream->fpo_in_use) {  			if (hubp && hubp->funcs->hubp_update_force_cursor_pstate_disallow)  				hubp->funcs->hubp_update_force_cursor_pstate_disallow(hubp, false);  		} @@ -721,6 +741,9 @@ static void dcn32_initialize_min_clocks(struct dc *dc)  	clocks->socclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].socclk_mhz * 1000;  	clocks->dramclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].memclk_mhz * 1000;  	clocks->dppclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].dppclk_mhz * 1000; +	clocks->ref_dtbclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].dtbclk_mhz * 1000; +	clocks->fclk_p_state_change_support = true; +	clocks->p_state_change_support = true;  	if (dc->debug.disable_boot_optimizations) {  		clocks->dispclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].dispclk_mhz * 1000;  	} else { @@ -730,9 +753,6 @@ static void dcn32_initialize_min_clocks(struct dc *dc)  		 * freq to ensure that the timing is valid and unchanged.  		 */  		clocks->dispclk_khz = dc->clk_mgr->funcs->get_dispclk_from_dentist(dc->clk_mgr); -		clocks->ref_dtbclk_khz = dc->clk_mgr->bw_params->clk_table.entries[0].dtbclk_mhz * 1000; -		clocks->fclk_p_state_change_support = true; -		clocks->p_state_change_support = true;  	}  	dc->clk_mgr->funcs->update_clocks( @@ -946,8 +966,10 @@ void dcn32_init_hw(struct dc *dc)  	// Get DMCUB capabilities  	if (dc->ctx->dmub_srv) { -		dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub); +		dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);  		dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr; +		dc->caps.dmub_caps.subvp_psr = dc->ctx->dmub_srv->dmub->feature_caps.subvp_psr_support; +		dc->caps.dmub_caps.gecc_enable = dc->ctx->dmub_srv->dmub->feature_caps.gecc_enable;  		dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;  	}  } @@ -1177,6 +1199,35 @@ void dcn32_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx)  				pix_per_cycle);  } +void dcn32_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context) +{ +	unsigned int i; +	struct pipe_ctx *pipe = NULL; +	bool otg_disabled[MAX_PIPES] = {false}; + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +		if (pipe->top_pipe || pipe->prev_odm_pipe) +			continue; + +		if (pipe->stream && (pipe->stream->dpms_off || dc_is_virtual_signal(pipe->stream->signal))) { +			pipe->stream_res.tg->funcs->disable_crtc(pipe->stream_res.tg); +			reset_sync_context_for_pipe(dc, context, i); +			otg_disabled[i] = true; +		} +	} + +	hws->ctx->dc->res_pool->dccg->funcs->trigger_dio_fifo_resync(hws->ctx->dc->res_pool->dccg); + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +		if (otg_disabled[i]) +			pipe->stream_res.tg->funcs->enable_crtc(pipe->stream_res.tg); +	} +} +  void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,  		struct dc_link_settings *link_settings)  { diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.h index 6694c1d14aa3..2d2628f31bed 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.h +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.h @@ -75,6 +75,8 @@ unsigned int dcn32_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsign  void dcn32_set_pixels_per_cycle(struct pipe_ctx *pipe_ctx); +void dcn32_resync_fifo_dccg_dio(struct dce_hwseq *hws, struct dc *dc, struct dc_state *context); +  void dcn32_subvp_pipe_control_lock(struct dc *dc,  		struct dc_state *context,  		bool lock, @@ -82,6 +84,8 @@ void dcn32_subvp_pipe_control_lock(struct dc *dc,  		struct pipe_ctx *top_pipe_to_program,  		bool subvp_prev_use); +void dcn32_subvp_pipe_control_lock_fast(union block_sequence_params *params); +  void dcn32_unblank_stream(struct pipe_ctx *pipe_ctx,  		struct dc_link_settings *link_settings); diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c index 8085f2acb1a9..c2490e16a66a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c @@ -109,7 +109,8 @@ static const struct hw_sequencer_funcs dcn32_funcs = {  	.commit_subvp_config = dcn32_commit_subvp_config,  	.enable_phantom_streams = dcn32_enable_phantom_streams,  	.subvp_pipe_control_lock = dcn32_subvp_pipe_control_lock, -	.update_visual_confirm_color = dcn20_update_visual_confirm_color, +	.update_visual_confirm_color = dcn10_update_visual_confirm_color, +	.subvp_pipe_control_lock_fast = dcn32_subvp_pipe_control_lock_fast,  	.update_phantom_vp_position = dcn32_update_phantom_vp_position,  	.update_dsc_pg = dcn32_update_dsc_pg,  	.apply_update_flags_for_phantom = dcn32_apply_update_flags_for_phantom, @@ -153,6 +154,7 @@ static const struct hwseq_private_funcs dcn32_private_funcs = {  	.update_mall_sel = dcn32_update_mall_sel,  	.calculate_dccg_k1_k2_values = dcn32_calculate_dccg_k1_k2_values,  	.set_pixels_per_cycle = dcn32_set_pixels_per_cycle, +	.resync_fifo_dccg_dio = dcn32_resync_fifo_dccg_dio,  	.is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy,  }; @@ -161,8 +163,4 @@ void dcn32_hw_sequencer_init_functions(struct dc *dc)  	dc->hwss = dcn32_funcs;  	dc->hwseq->funcs = dcn32_private_funcs; -	if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		dc->hwss.init_hw = dcn20_fpga_init_hw; -		dc->hwseq->funcs.init_pipes = NULL; -	}  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c index 2ee798965bc2..2cffedea2df5 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.c @@ -98,7 +98,7 @@ static void optc32_set_odm_combine(struct timing_generator *optc, int *opp_id, i  	optc1->opp_count = opp_cnt;  } -static void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode) +void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode)  {  	struct optc *optc1 = DCN10TG_FROM_TG(optc); @@ -245,16 +245,9 @@ static void optc32_set_drr(  		}  		optc->funcs->set_vtotal_min_max(optc, params->vertical_total_min - 1, params->vertical_total_max - 1); -		optc32_setup_manual_trigger(optc); -	} else { -		REG_UPDATE_4(OTG_V_TOTAL_CONTROL, -				OTG_SET_V_TOTAL_MIN_MASK, 0, -				OTG_V_TOTAL_MIN_SEL, 0, -				OTG_V_TOTAL_MAX_SEL, 0, -				OTG_FORCE_LOCK_ON_EVENT, 0); - -		optc->funcs->set_vtotal_min_max(optc, 0, 0);  	} + +	optc32_setup_manual_trigger(optc);  }  static struct timing_generator_funcs dcn32_tg_funcs = { diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h index b92ba8c75694..abf0121a1006 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_optc.h @@ -179,5 +179,6 @@  	SF(OTG0_OTG_DRR_CONTROL, OTG_V_TOTAL_LAST_USED_BY_DRR, mask_sh)  void dcn32_timing_generator_init(struct optc *optc1); +void optc32_set_h_timing_div_manual_mode(struct timing_generator *optc, bool manual_mode);  #endif /* __DC_OPTC_DCN32_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c index 22dd1ebea618..2e6b39fe2613 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c @@ -726,28 +726,12 @@ static const struct dc_debug_options debug_defaults_drv = {  	.override_dispclk_programming = true,  	.disable_fpo_optimizations = false,  	.fpo_vactive_margin_us = 2000, // 2000us -	.disable_fpo_vactive = true, +	.disable_fpo_vactive = false,  	.disable_boot_optimizations = false, -}; - -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_dsc_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true, -	.force_disable_subvp = true +	.disable_subvp_high_refresh = true, +	.disable_dp_plus_plus_wa = true, +	.fpo_vactive_min_active_margin_us = 200, +	.fpo_vactive_max_blank_us = 1000,  };  static struct dce_aux *dcn32_aux_engine_create( @@ -1353,15 +1337,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn32_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn32_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn32_hpo_dp_link_encoder_create, -	.create_hwseq = dcn32_hwseq_create, -}; -  static void dcn32_resource_destruct(struct dcn32_resource_pool *pool)  {  	unsigned int i; @@ -1888,6 +1863,8 @@ bool dcn32_validate_bandwidth(struct dc *dc,  	dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, vlevel); +	dcn32_override_min_req_memclk(dc, context); +  	BW_VAL_TRACE_END_WATERMARKS();  	goto validate_out; @@ -2254,10 +2231,7 @@ static bool dcn32_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -2313,8 +2287,7 @@ static bool dcn32_resource_construct(  	}  	/* DML */ -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_2_soc, &dcn3_2_ip, DML_PROJECT_DCN32); +	dml_init_instance(&dc->dml, &dcn3_2_soc, &dcn3_2_ip, DML_PROJECT_DCN32);  	/* IRQ Service */  	init_data.ctx = dc->ctx; @@ -2451,9 +2424,8 @@ static bool dcn32_resource_construct(  	/* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer init functions and Plane caps */  	dcn32_hw_sequencer_init_functions(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h index 3937dbc1e552..2f34f01b3ea1 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.h @@ -37,9 +37,10 @@  #define DCN3_2_MBLK_WIDTH 128  #define DCN3_2_MBLK_HEIGHT_4BPE 128  #define DCN3_2_MBLK_HEIGHT_8BPE 64 -#define DCN3_2_VMIN_DISPCLK_HZ 717000000  #define DCN3_2_DCFCLK_DS_INIT_KHZ 10000 // Choose 10Mhz for init DCFCLK DS freq -#define DCN3_2_MIN_ACTIVE_SWITCH_MARGIN_FPO_US 100 // Only allow FPO + Vactive if active margin >= 100 +#define SUBVP_HIGH_REFRESH_LIST_LEN 3 +#define DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ 1800 +#define DCN3_2_VMIN_DISPCLK_HZ 717000000  #define TO_DCN32_RES_POOL(pool)\  	container_of(pool, struct dcn32_resource_pool, base) @@ -47,6 +48,15 @@  extern struct _vcs_dpi_ip_params_st dcn3_2_ip;  extern struct _vcs_dpi_soc_bounding_box_st dcn3_2_soc; +struct subvp_high_refresh_list { +	int min_refresh; +	int max_refresh; +	struct resolution { +		int width; +		int height; +	} res[SUBVP_HIGH_REFRESH_LIST_LEN]; +}; +  struct dcn32_resource_pool {  	struct resource_pool base;  }; @@ -151,10 +161,14 @@ struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stre  bool dcn32_allow_subvp_with_active_margin(struct pipe_ctx *pipe); +bool dcn32_allow_subvp_high_refresh_rate(struct dc *dc, struct dc_state *context, struct pipe_ctx *pipe); +  unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans);  double dcn32_determine_max_vratio_prefetch(struct dc *dc, struct dc_state *context); +bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height); +  /* definitions for run time init of reg offsets */  /* CLK SRC */ diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c index eeca16faf31a..1d13fd797212 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c +++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource_helpers.c @@ -94,18 +94,15 @@ uint32_t dcn32_helper_calculate_mall_bytes_for_cursor(  }  /** - * ******************************************************************************************** - * dcn32_helper_calculate_num_ways_for_subvp: Calculate number of ways needed for SubVP + * dcn32_helper_calculate_num_ways_for_subvp(): Calculate number of ways needed for SubVP   *   * Gets total allocation required for the phantom viewport calculated by DML in bytes and   * converts to number of cache ways.   * - * @param [in] dc: current dc state - * @param [in] context: new dc state + * @dc: current dc state + * @context: new dc state   * - * @return: number of ways required for SubVP - * - * ******************************************************************************************** + * Return: number of ways required for SubVP   */  uint32_t dcn32_helper_calculate_num_ways_for_subvp(  		struct dc *dc, @@ -261,8 +258,7 @@ bool dcn32_is_psr_capable(struct pipe_ctx *pipe)  #define DCN3_2_NEW_DET_OVERRIDE_MIN_MULTIPLIER 7  /** - * ******************************************************************************************* - * dcn32_determine_det_override: Determine DET allocation for each pipe + * dcn32_determine_det_override(): Determine DET allocation for each pipe   *   * This function determines how much DET to allocate for each pipe. The total number of   * DET segments will be split equally among each of the streams, and after that the DET @@ -290,13 +286,11 @@ bool dcn32_is_psr_capable(struct pipe_ctx *pipe)   * 3. Assign smaller DET size for lower pixel display and higher DET size for   *    higher pixel display   * - * @param [in]: dc: Current DC state - * @param [in]: context: New DC state to be programmed - * @param [in]: pipes: Array of DML pipes - * - * @return: void + * @dc: Current DC state + * @context: New DC state to be programmed + * @pipes: Array of DML pipes   * - * ******************************************************************************************* + * Return: void   */  void dcn32_determine_det_override(struct dc *dc,  		struct dc_state *context, @@ -432,8 +426,7 @@ void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,  }  /** - * ******************************************************************************************* - * dcn32_save_mall_state: Save MALL (SubVP) state for fast validation cases + * dcn32_save_mall_state(): Save MALL (SubVP) state for fast validation cases   *   * This function saves the MALL (SubVP) case for fast validation cases. For fast validation,   * there are situations where a shallow copy of the dc->current_state is created for the @@ -446,13 +439,11 @@ void dcn32_set_det_allocations(struct dc *dc, struct dc_state *context,   * NOTE: This function ONLY works if the streams are not moved to a different pipe in the   *       validation. We don't expect this to happen in fast_validation=1 cases.   * - * @param [in]: dc: Current DC state - * @param [in]: context: New DC state to be programmed - * @param [out]: temp_config: struct used to cache the existing MALL state - * - * @return: void + * @dc: Current DC state + * @context: New DC state to be programmed + * @temp_config: struct used to cache the existing MALL state   * - * ******************************************************************************************* + * Return: void   */  void dcn32_save_mall_state(struct dc *dc,  		struct dc_state *context, @@ -472,18 +463,15 @@ void dcn32_save_mall_state(struct dc *dc,  }  /** - * ******************************************************************************************* - * dcn32_restore_mall_state: Restore MALL (SubVP) state for fast validation cases + * dcn32_restore_mall_state(): Restore MALL (SubVP) state for fast validation cases   *   * Restore the MALL state based on the previously saved state from dcn32_save_mall_state   * - * @param [in]: dc: Current DC state - * @param [in/out]: context: New DC state to be programmed, restore MALL state into here - * @param [in]: temp_config: struct that has the cached MALL state + * @dc: Current DC state + * @context: New DC state to be programmed, restore MALL state into here + * @temp_config: struct that has the cached MALL state   * - * @return: void - * - * ******************************************************************************************* + * Return: void   */  void dcn32_restore_mall_state(struct dc *dc,  		struct dc_state *context, @@ -588,10 +576,11 @@ static int get_refresh_rate(struct dc_stream_state *fpo_candidate_stream)  }  /** - * dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch - Determines if config can support FPO + * dcn32_can_support_mclk_switch_using_fw_based_vblank_stretch() - Determines if config can + *								    support FPO   * - * @param [in]: dc - current dc state - * @param [in]: context - new dc state + * @dc: current dc state + * @context: new dc state   *   * Return: Pointer to FPO stream candidate if config can support FPO, otherwise NULL   */ @@ -626,7 +615,7 @@ struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stre  		DC_FP_END();  		DC_FP_START(); -		is_fpo_vactive = dcn32_find_vactive_pipe(dc, context, DCN3_2_MIN_ACTIVE_SWITCH_MARGIN_FPO_US); +		is_fpo_vactive = dcn32_find_vactive_pipe(dc, context, dc->debug.fpo_vactive_min_active_margin_us);  		DC_FP_END();  		if (!is_fpo_vactive || dc->debug.disable_fpo_vactive)  			return NULL; @@ -656,3 +645,18 @@ struct dc_stream_state *dcn32_can_support_mclk_switch_using_fw_based_vblank_stre  	return fpo_candidate_stream;  } + +bool dcn32_check_native_scaling_for_res(struct pipe_ctx *pipe, unsigned int width, unsigned int height) +{ +	bool is_native_scaling = false; + +	if (pipe->stream->timing.h_addressable == width && +			pipe->stream->timing.v_addressable == height && +			pipe->plane_state->src_rect.width == width && +			pipe->plane_state->src_rect.height == height && +			pipe->plane_state->dst_rect.width == width && +			pipe->plane_state->dst_rect.height == height) +		is_native_scaling = true; + +	return is_native_scaling; +} diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c index a60ddb343d13..bbcd3579fea6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c @@ -725,31 +725,13 @@ static const struct dc_debug_options debug_defaults_drv = {  	.override_dispclk_programming = true,  	.disable_fpo_optimizations = false,  	.fpo_vactive_margin_us = 2000, // 2000us -	.disable_fpo_vactive = true, +	.disable_fpo_vactive = false,  	.disable_boot_optimizations = false, +	.disable_subvp_high_refresh = true, +	.fpo_vactive_min_active_margin_us = 200, +	.fpo_vactive_max_blank_us = 1000,  }; -static const struct dc_debug_options debug_defaults_diags = { -	.disable_dmcu = true, -	.force_abm_enable = false, -	.timing_trace = true, -	.clock_trace = true, -	.disable_dpp_power_gate = true, -	.disable_hubp_power_gate = true, -	.disable_dsc_power_gate = true, -	.disable_clock_gate = true, -	.disable_pplib_clock_request = true, -	.disable_pplib_wm_range = true, -	.disable_stutter = false, -	.scl_reset_length10 = true, -	.dwb_fi_phase = -1, // -1 = disable -	.dmub_command_table = true, -	.enable_tri_buf = true, -	.use_max_lb = true, -	.force_disable_subvp = true, -}; - -  static struct dce_aux *dcn321_aux_engine_create(  	struct dc_context *ctx,  	uint32_t inst) @@ -1340,15 +1322,6 @@ static const struct resource_create_funcs res_create_funcs = {  	.create_hwseq = dcn321_hwseq_create,  }; -static const struct resource_create_funcs res_create_maximus_funcs = { -	.read_dce_straps = NULL, -	.create_audio = NULL, -	.create_stream_encoder = NULL, -	.create_hpo_dp_stream_encoder = dcn321_hpo_dp_stream_encoder_create, -	.create_hpo_dp_link_encoder = dcn321_hpo_dp_link_encoder_create, -	.create_hwseq = dcn321_hwseq_create, -}; -  static void dcn321_resource_destruct(struct dcn321_resource_pool *pool)  {  	unsigned int i; @@ -1735,9 +1708,9 @@ static bool dcn321_resource_construct(  	dc->caps.subvp_pstate_allow_width_us = 20;  	dc->caps.subvp_vertical_int_margin_us = 30;  	dc->caps.subvp_drr_vblank_start_margin_us = 100; // 100us margin -	dc->caps.max_slave_planes = 1; -	dc->caps.max_slave_yuv_planes = 1; -	dc->caps.max_slave_rgb_planes = 1; +	dc->caps.max_slave_planes = 2; +	dc->caps.max_slave_yuv_planes = 2; +	dc->caps.max_slave_rgb_planes = 2;  	dc->caps.post_blend_color_processing = true;  	dc->caps.force_dp_tps4_for_cp2520 = true;  	dc->caps.dp_hpo = true; @@ -1798,10 +1771,7 @@ static bool dcn321_resource_construct(  	if (dc->ctx->dce_environment == DCE_ENV_PRODUCTION_DRV)  		dc->debug = debug_defaults_drv; -	else if (dc->ctx->dce_environment == DCE_ENV_FPGA_MAXIMUS) { -		dc->debug = debug_defaults_diags; -	} else -		dc->debug = debug_defaults_diags; +  	// Init the vm_helper  	if (dc->vm_helper)  		vm_helper_init(dc->vm_helper, 16); @@ -1857,8 +1827,7 @@ static bool dcn321_resource_construct(  	}  	/* DML */ -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32); +	dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32);  	/* IRQ Service */  	init_data.ctx = dc->ctx; @@ -1990,9 +1959,8 @@ static bool dcn321_resource_construct(  	/* Audio, HWSeq, Stream Encoders including HPO and virtual, MPC 3D LUTs */  	if (!resource_construct(num_virtual_links, dc, &pool->base, -			(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) ? -			&res_create_funcs : &res_create_maximus_funcs))) -			goto create_fail; +			&res_create_funcs)) +		goto create_fail;  	/* HW Sequencer init functions and Plane caps */  	dcn32_hw_sequencer_init_functions(dc); diff --git a/drivers/gpu/drm/amd/display/dc/dm_services.h b/drivers/gpu/drm/amd/display/dc/dm_services.h index 9a3f2a44f882..d0eed3b4771e 100644 --- a/drivers/gpu/drm/amd/display/dc/dm_services.h +++ b/drivers/gpu/drm/amd/display/dc/dm_services.h @@ -40,6 +40,7 @@  struct dmub_srv;  struct dc_dmub_srv; +union dmub_rb_cmd;  irq_handler_idx dm_register_interrupt(  	struct dc_context *ctx, @@ -274,6 +275,12 @@ void dm_perf_trace_timestamp(const char *func_name, unsigned int line, struct dc  #define PERF_TRACE_CTX(__CTX)	dm_perf_trace_timestamp(__func__, __LINE__, __CTX)  /* + * DMUB Interfaces + */ +bool dm_execute_dmub_cmd(const struct dc_context *ctx, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type); +bool dm_execute_dmub_cmd_list(const struct dc_context *ctx, unsigned int count, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type); + +/*   * Debug and verification hooks   */ @@ -285,4 +292,6 @@ void dm_dtn_log_append_v(struct dc_context *ctx,  void dm_dtn_log_end(struct dc_context *ctx,  	struct dc_log_buffer_ctx *log_ctx); +char *dce_version_to_string(const int version); +  #endif /* __DM_SERVICES_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/dm_services_types.h b/drivers/gpu/drm/amd/display/dc/dm_services_types.h index b52ba6ffabe1..facf269c4326 100644 --- a/drivers/gpu/drm/amd/display/dc/dm_services_types.h +++ b/drivers/gpu/drm/amd/display/dc/dm_services_types.h @@ -269,4 +269,10 @@ struct dtn_min_clk_info {  	uint32_t min_memory_clock_khz;  }; +enum dm_dmub_wait_type { +	DM_DMUB_WAIT_TYPE_NO_WAIT, +	DM_DMUB_WAIT_TYPE_WAIT, +	DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY, +}; +  #endif diff --git a/drivers/gpu/drm/amd/display/dc/dml/Makefile b/drivers/gpu/drm/amd/display/dc/dml/Makefile index 01db035589c5..77cf5545c94c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/Makefile +++ b/drivers/gpu/drm/amd/display/dc/dml/Makefile @@ -38,6 +38,11 @@ ifdef CONFIG_ARM64  dml_rcflags := -mgeneral-regs-only  endif +ifdef CONFIG_LOONGARCH +dml_ccflags := -mfpu=64 +dml_rcflags := -msoft-float +endif +  ifdef CONFIG_CC_IS_GCC  ifneq ($(call gcc-min-version, 70100),y)  IS_OLD_GCC = 1 diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c index f1c1a4b5fcac..8ae5ddbd1b27 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c @@ -948,10 +948,10 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc  {  	int plane_count;  	int i; -	unsigned int optimized_min_dst_y_next_start_us; +	unsigned int min_dst_y_next_start_us;  	plane_count = 0; -	optimized_min_dst_y_next_start_us = 0; +	min_dst_y_next_start_us = 0;  	for (i = 0; i < dc->res_pool->pipe_count; i++) {  		if (context->res_ctx.pipe_ctx[i].plane_state)  			plane_count++; @@ -973,19 +973,18 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc  	else if (context->stream_count == 1 &&  context->streams[0]->signal == SIGNAL_TYPE_EDP) {  		struct dc_link *link = context->streams[0]->sink->link;  		struct dc_stream_status *stream_status = &context->stream_status[0]; +		struct dc_stream_state *current_stream = context->streams[0];  		int minmum_z8_residency = dc->debug.minimum_z8_residency_time > 0 ? dc->debug.minimum_z8_residency_time : 1000;  		bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > (double)minmum_z8_residency;  		bool is_pwrseq0 = link->link_index == 0; +		bool isFreesyncVideo; -		if (dc_extended_blank_supported(dc)) { -			for (i = 0; i < dc->res_pool->pipe_count; i++) { -				if (context->res_ctx.pipe_ctx[i].stream == context->streams[0] -					&& context->res_ctx.pipe_ctx[i].stream->adjust.v_total_min == context->res_ctx.pipe_ctx[i].stream->adjust.v_total_max -					&& context->res_ctx.pipe_ctx[i].stream->adjust.v_total_min > context->res_ctx.pipe_ctx[i].stream->timing.v_total) { -						optimized_min_dst_y_next_start_us = -							context->res_ctx.pipe_ctx[i].dlg_regs.optimized_min_dst_y_next_start_us; -						break; -				} +		isFreesyncVideo = current_stream->adjust.v_total_min == current_stream->adjust.v_total_max; +		isFreesyncVideo = isFreesyncVideo && current_stream->timing.v_total < current_stream->adjust.v_total_min; +		for (i = 0; i < dc->res_pool->pipe_count; i++) { +			if (context->res_ctx.pipe_ctx[i].stream == current_stream && isFreesyncVideo) { +				min_dst_y_next_start_us = context->res_ctx.pipe_ctx[i].dlg_regs.min_dst_y_next_start_us; +				break;  			}  		} @@ -993,7 +992,7 @@ static enum dcn_zstate_support_state  decide_zstate_support(struct dc *dc, struc  		if (stream_status->plane_count > 1)  			return DCN_ZSTATE_SUPPORT_DISALLOW; -		if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || optimized_min_dst_y_next_start_us > 5000)) +		if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod > 5000.0 || min_dst_y_next_start_us > 5000))  			return DCN_ZSTATE_SUPPORT_ALLOW;  		else if (is_pwrseq0 && link->psr_settings.psr_version == DC_PSR_VERSION_1 && !link->panel_config.psr.disable_psr)  			return allow_z8 ? DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY : DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY; @@ -1043,7 +1042,7 @@ void dcn20_calculate_dlg_params(struct dc *dc,  				int pipe_cnt,  				int vlevel)  { -	int i, pipe_idx; +	int i, pipe_idx, active_hubp_count = 0;  	dc_assert_fp_enabled(); @@ -1079,6 +1078,8 @@ void dcn20_calculate_dlg_params(struct dc *dc,  	for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {  		if (!context->res_ctx.pipe_ctx[i].stream)  			continue; +		if (context->res_ctx.pipe_ctx[i].plane_state) +			active_hubp_count++;  		pipes[pipe_idx].pipe.dest.vstartup_start = get_vstartup(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx);  		pipes[pipe_idx].pipe.dest.vupdate_offset = get_vupdate_offset(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx);  		pipes[pipe_idx].pipe.dest.vupdate_width = get_vupdate_width(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); @@ -1098,13 +1099,13 @@ void dcn20_calculate_dlg_params(struct dc *dc,  		context->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz =  						pipes[pipe_idx].clks_cfg.dppclk_mhz * 1000;  		context->res_ctx.pipe_ctx[i].pipe_dlg_param = pipes[pipe_idx].pipe.dest; -		if (context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid) -			dcn20_adjust_freesync_v_startup( -				&context->res_ctx.pipe_ctx[i].stream->timing, -				&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start);  		pipe_idx++;  	} +	/* If DCN isn't making memory requests we can allow pstate change */ +	if (!active_hubp_count) { +		context->bw_ctx.bw.dcn.clk.p_state_change_support = true; +	}  	/*save a original dppclock copy*/  	context->bw_ctx.bw.dcn.clk.bw_dppclk_khz = context->bw_ctx.bw.dcn.clk.dppclk_khz;  	context->bw_ctx.bw.dcn.clk.bw_dispclk_khz = context->bw_ctx.bw.dcn.clk.dispclk_khz; @@ -1885,6 +1886,17 @@ void dcn20_patch_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st  				dc->bb_overrides.sr_enter_plus_exit_time_ns / 1000.0;  	} +	if ((int)(bb->sr_exit_z8_time_us * 1000) +				!= dc->bb_overrides.sr_exit_z8_time_ns +			&& dc->bb_overrides.sr_exit_z8_time_ns) { +		bb->sr_exit_z8_time_us = dc->bb_overrides.sr_exit_z8_time_ns / 1000.0; +	} + +	if ((int)(bb->sr_enter_plus_exit_z8_time_us * 1000) +				!= dc->bb_overrides.sr_enter_plus_exit_z8_time_ns +			&& dc->bb_overrides.sr_enter_plus_exit_z8_time_ns) { +		bb->sr_enter_plus_exit_z8_time_us = dc->bb_overrides.sr_enter_plus_exit_z8_time_ns / 1000.0; +	}  	if ((int)(bb->urgent_latency_us * 1000) != dc->bb_overrides.urgent_latency_ns  			&& dc->bb_overrides.urgent_latency_ns) {  		bb->urgent_latency_us = dc->bb_overrides.urgent_latency_ns / 1000.0; @@ -1915,6 +1927,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co  	int vlevel = 0;  	int pipe_split_from[MAX_PIPES];  	int pipe_cnt = 0; +	int i = 0;  	display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);  	DC_LOGGER_INIT(dc->ctx->logger); @@ -1938,6 +1951,15 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co  	dcn20_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);  	dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel); +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		if (!context->res_ctx.pipe_ctx[i].stream) +			continue; +		if (context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid) +			dcn20_adjust_freesync_v_startup( +				&context->res_ctx.pipe_ctx[i].stream->timing, +				&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start); +	} +  	BW_VAL_TRACE_END_WATERMARKS();  	goto validate_out; @@ -2210,6 +2232,7 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,  	int vlevel = 0;  	int pipe_split_from[MAX_PIPES];  	int pipe_cnt = 0; +	int i = 0;  	display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);  	DC_LOGGER_INIT(dc->ctx->logger); @@ -2238,6 +2261,15 @@ bool dcn21_validate_bandwidth_fp(struct dc *dc,  	dcn21_calculate_wm(dc, context, pipes, &pipe_cnt, pipe_split_from, vlevel, fast_validate);  	dcn20_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel); +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		if (!context->res_ctx.pipe_ctx[i].stream) +			continue; +		if (context->res_ctx.pipe_ctx[i].stream->adaptive_sync_infopacket.valid) +			dcn20_adjust_freesync_v_startup( +				&context->res_ctx.pipe_ctx[i].stream->timing, +				&context->res_ctx.pipe_ctx[i].pipe_dlg_param.vstartup_start); +	} +  	BW_VAL_TRACE_END_WATERMARKS();  	goto validate_out; diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c b/drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c index b7c2844d0cbe..f294f2f8c75b 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn21/display_mode_vba_21.c @@ -810,7 +810,7 @@ static bool CalculatePrefetchSchedule(  			*swath_width_chroma_ub = dml_ceil(SwathWidthY / 2 - 1, myPipe->BlockWidth256BytesC) + myPipe->BlockWidth256BytesC;  	} else {  		*swath_width_luma_ub = dml_ceil(SwathWidthY - 1, myPipe->BlockHeight256BytesY) + myPipe->BlockHeight256BytesY; -		if (myPipe->BlockWidth256BytesC > 0) +		if (myPipe->BlockHeight256BytesC > 0)  			*swath_width_chroma_ub = dml_ceil(SwathWidthY / 2 - 1, myPipe->BlockHeight256BytesC) + myPipe->BlockHeight256BytesC;  	} diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.c index a352c703e258..ccb4ad78f667 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn30/dcn30_fpu.c @@ -674,10 +674,19 @@ void dcn30_fpu_update_bw_bounding_box(struct dc *dc,  }  /** - * Finds dummy_latency_index when MCLK switching using firmware based - * vblank stretch is enabled. This function will iterate through the - * table of dummy pstate latencies until the lowest value that allows + * dcn30_find_dummy_latency_index_for_fw_based_mclk_switch() - Finds + * dummy_latency_index when MCLK switching using firmware based vblank stretch + * is enabled. This function will iterate through the table of dummy pstate + * latencies until the lowest value that allows   * dm_allow_self_refresh_and_mclk_switch to happen is found + * + * @dc: Current DC state + * @context: new dc state + * @pipes: DML pipe params + * @pipe_cnt: number of DML pipes + * @vlevel: Voltage level calculated by DML + * + * Return: lowest dummy_latency_index value   */  int dcn30_find_dummy_latency_index_for_fw_based_mclk_switch(struct dc *dc,  							    struct dc_state *context, diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c index 7d0626e42ea6..9af1a43c042b 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c @@ -4939,8 +4939,8 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  					}  					v->TotImmediateFlipBytes = 0.0;  					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) { -						v->TotImmediateFlipBytes = v->TotImmediateFlipBytes + v->NoOfDPP[i][j][k] * v->PDEAndMetaPTEBytesPerFrame[i][j][k] -								+ v->MetaRowBytes[i][j][k] + v->DPTEBytesPerRow[i][j][k]; +						v->TotImmediateFlipBytes = v->TotImmediateFlipBytes + v->NoOfDPP[i][j][k] * (v->PDEAndMetaPTEBytesPerFrame[i][j][k] +								+ v->MetaRowBytes[i][j][k] + v->DPTEBytesPerRow[i][j][k]);  					}  					for (k = 0; k <= v->NumberOfActivePlanes - 1; k++) { @@ -5130,7 +5130,7 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  			ViewportExceedsSurface = true;  		if (v->SourcePixelFormat[k] != dm_444_64 && v->SourcePixelFormat[k] != dm_444_32 && v->SourcePixelFormat[k] != dm_444_16 -				&& v->SourcePixelFormat[k] != dm_444_8 && v->SourcePixelFormat[k] != dm_rgbe) { +				&& v->SourcePixelFormat[k] != dm_444_16 && v->SourcePixelFormat[k] != dm_444_8 && v->SourcePixelFormat[k] != dm_rgbe) {  			if (v->ViewportWidthChroma[k] > v->SurfaceWidthC[k] || v->ViewportHeightChroma[k] > v->SurfaceHeightC[k]) {  				ViewportExceedsSurface = true;  			} diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c index cd3cfcb2a2b0..0497a5d74a62 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_rq_dlg_calc_30.c @@ -980,7 +980,7 @@ static void dml_rq_dlg_get_dlg_params(struct display_mode_lib *mode_lib,  	unsigned int vstartup_start = 0;  	unsigned int dst_x_after_scaler = 0; -	unsigned int dst_y_after_scaler = 0; +	int dst_y_after_scaler = 0;  	double line_wait = 0;  	double dst_y_prefetch = 0;  	double dst_y_per_vm_vblank = 0; @@ -1171,6 +1171,8 @@ static void dml_rq_dlg_get_dlg_params(struct display_mode_lib *mode_lib,  	dst_x_after_scaler = get_dst_x_after_scaler(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);  	dst_y_after_scaler = get_dst_y_after_scaler(mode_lib, e2e_pipe_param, num_pipes, pipe_idx); +	if (dst_y_after_scaler < 0) +		dst_y_after_scaler = 0;  	// do some adjustment on the dst_after scaler to account for odm combine mode  	dml_print("DML_DLG: %s: input dst_x_after_scaler                     = %d\n", diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c index 422f17aefd4a..6ce90678b33c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn301/dcn301_fpu.c @@ -333,45 +333,43 @@ void dcn301_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param  	memcpy(s, dcn3_01_soc.clock_limits, sizeof(dcn3_01_soc.clock_limits));  	/* Default clock levels are used for diags, which may lead to overclocking. */ -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		dcn3_01_ip.max_num_otg = pool->base.res_cap->num_timing_generator; -		dcn3_01_ip.max_num_dpp = pool->base.pipe_count; -		dcn3_01_soc.num_chans = bw_params->num_channels; +	dcn3_01_ip.max_num_otg = pool->base.res_cap->num_timing_generator; +	dcn3_01_ip.max_num_dpp = pool->base.pipe_count; +	dcn3_01_soc.num_chans = bw_params->num_channels; -		ASSERT(clk_table->num_entries); -		for (i = 0; i < clk_table->num_entries; i++) { -			/* loop backwards*/ -			for (closest_clk_lvl = 0, j = dcn3_01_soc.num_states - 1; j >= 0; j--) { -				if ((unsigned int) dcn3_01_soc.clock_limits[j].dcfclk_mhz <= clk_table->entries[i].dcfclk_mhz) { -					closest_clk_lvl = j; -					break; -				} +	ASSERT(clk_table->num_entries); +	for (i = 0; i < clk_table->num_entries; i++) { +		/* loop backwards*/ +		for (closest_clk_lvl = 0, j = dcn3_01_soc.num_states - 1; j >= 0; j--) { +			if ((unsigned int) dcn3_01_soc.clock_limits[j].dcfclk_mhz <= clk_table->entries[i].dcfclk_mhz) { +				closest_clk_lvl = j; +				break;  			} +		} -			s[i].state = i; -			s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; -			s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; -			s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; -			s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * 2; +		s[i].state = i; +		s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; +		s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; +		s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; +		s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * 2; -			s[i].dispclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz; -			s[i].dppclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz; -			s[i].dram_bw_per_chan_gbps = -				dcn3_01_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; -			s[i].dscclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dscclk_mhz; -			s[i].dtbclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; -			s[i].phyclk_d18_mhz = -				dcn3_01_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; -			s[i].phyclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].phyclk_mhz; -		} +		s[i].dispclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dispclk_mhz; +		s[i].dppclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dppclk_mhz; +		s[i].dram_bw_per_chan_gbps = +			dcn3_01_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; +		s[i].dscclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dscclk_mhz; +		s[i].dtbclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; +		s[i].phyclk_d18_mhz = +			dcn3_01_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; +		s[i].phyclk_mhz = dcn3_01_soc.clock_limits[closest_clk_lvl].phyclk_mhz; +	} -		if (clk_table->num_entries) { -			dcn3_01_soc.num_states = clk_table->num_entries; -			/* duplicate last level */ -			s[dcn3_01_soc.num_states] = -				dcn3_01_soc.clock_limits[dcn3_01_soc.num_states - 1]; -			s[dcn3_01_soc.num_states].state = dcn3_01_soc.num_states; -		} +	if (clk_table->num_entries) { +		dcn3_01_soc.num_states = clk_table->num_entries; +		/* duplicate last level */ +		s[dcn3_01_soc.num_states] = +			dcn3_01_soc.clock_limits[dcn3_01_soc.num_states - 1]; +		s[dcn3_01_soc.num_states].state = dcn3_01_soc.num_states;  	}  	memcpy(dcn3_01_soc.clock_limits, s, sizeof(dcn3_01_soc.clock_limits)); diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c index 59836570603a..deb6d162a2d5 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c @@ -483,7 +483,7 @@ void dcn31_calculate_wm_and_dlg_fp(  		int pipe_cnt,  		int vlevel)  { -	int i, pipe_idx, active_hubp_count = 0; +	int i, pipe_idx, total_det = 0, active_hubp_count = 0;  	double dcfclk = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];  	dc_assert_fp_enabled(); @@ -563,6 +563,18 @@ void dcn31_calculate_wm_and_dlg_fp(  			if (context->res_ctx.pipe_ctx[i].stream)  				context->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz = 0;  	} +	for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) { +		if (!context->res_ctx.pipe_ctx[i].stream) +			continue; + +		context->res_ctx.pipe_ctx[i].det_buffer_size_kb = +				get_det_buffer_size_kbytes(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); +		if (context->res_ctx.pipe_ctx[i].det_buffer_size_kb > 384) +			context->res_ctx.pipe_ctx[i].det_buffer_size_kb /= 2; +		total_det += context->res_ctx.pipe_ctx[i].det_buffer_size_kb; +		pipe_idx++; +	} +	context->bw_ctx.bw.dcn.compbuf_size_kb = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - total_det;  }  void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params) @@ -570,6 +582,7 @@ void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params  	struct _vcs_dpi_voltage_scaling_st *s = dc->scratch.update_bw_bounding_box.clock_limits;  	struct clk_limit_table *clk_table = &bw_params->clk_table;  	unsigned int i, closest_clk_lvl; +	int max_dispclk_mhz = 0, max_dppclk_mhz = 0;  	int j;  	dc_assert_fp_enabled(); @@ -577,59 +590,55 @@ void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params  	memcpy(s, dcn3_1_soc.clock_limits, sizeof(dcn3_1_soc.clock_limits));  	// Default clock levels are used for diags, which may lead to overclocking. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { -		int max_dispclk_mhz = 0, max_dppclk_mhz = 0; - -		dcn3_1_ip.max_num_otg = dc->res_pool->res_cap->num_timing_generator; -		dcn3_1_ip.max_num_dpp = dc->res_pool->pipe_count; -		dcn3_1_soc.num_chans = bw_params->num_channels; +	dcn3_1_ip.max_num_otg = dc->res_pool->res_cap->num_timing_generator; +	dcn3_1_ip.max_num_dpp = dc->res_pool->pipe_count; +	dcn3_1_soc.num_chans = bw_params->num_channels; -		ASSERT(clk_table->num_entries); +	ASSERT(clk_table->num_entries); -		/* Prepass to find max clocks independent of voltage level. */ -		for (i = 0; i < clk_table->num_entries; ++i) { -			if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz) -				max_dispclk_mhz = clk_table->entries[i].dispclk_mhz; -			if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz) -				max_dppclk_mhz = clk_table->entries[i].dppclk_mhz; -		} +	/* Prepass to find max clocks independent of voltage level. */ +	for (i = 0; i < clk_table->num_entries; ++i) { +		if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz) +			max_dispclk_mhz = clk_table->entries[i].dispclk_mhz; +		if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz) +			max_dppclk_mhz = clk_table->entries[i].dppclk_mhz; +	} -		for (i = 0; i < clk_table->num_entries; i++) { -			/* loop backwards*/ -			for (closest_clk_lvl = 0, j = dcn3_1_soc.num_states - 1; j >= 0; j--) { -				if ((unsigned int) dcn3_1_soc.clock_limits[j].dcfclk_mhz <= clk_table->entries[i].dcfclk_mhz) { -					closest_clk_lvl = j; -					break; -				} +	for (i = 0; i < clk_table->num_entries; i++) { +		/* loop backwards*/ +		for (closest_clk_lvl = 0, j = dcn3_1_soc.num_states - 1; j >= 0; j--) { +			if ((unsigned int) dcn3_1_soc.clock_limits[j].dcfclk_mhz <= clk_table->entries[i].dcfclk_mhz) { +				closest_clk_lvl = j; +				break;  			} +		} -			s[i].state = i; +		s[i].state = i; -			/* Clocks dependent on voltage level. */ -			s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; -			s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; -			s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; -			s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * -				2 * clk_table->entries[i].wck_ratio; +		/* Clocks dependent on voltage level. */ +		s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; +		s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; +		s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; +		s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * +			2 * clk_table->entries[i].wck_ratio; -			/* Clocks independent of voltage level. */ -			s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz : -				dcn3_1_soc.clock_limits[closest_clk_lvl].dispclk_mhz; +		/* Clocks independent of voltage level. */ +		s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz : +			dcn3_1_soc.clock_limits[closest_clk_lvl].dispclk_mhz; -			s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz : -				dcn3_1_soc.clock_limits[closest_clk_lvl].dppclk_mhz; +		s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz : +			dcn3_1_soc.clock_limits[closest_clk_lvl].dppclk_mhz; -			s[i].dram_bw_per_chan_gbps = -				dcn3_1_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; -			s[i].dscclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].dscclk_mhz; -			s[i].dtbclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; -			s[i].phyclk_d18_mhz = -				dcn3_1_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; -			s[i].phyclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].phyclk_mhz; -		} -		if (clk_table->num_entries) { -			dcn3_1_soc.num_states = clk_table->num_entries; -		} +		s[i].dram_bw_per_chan_gbps = +			dcn3_1_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; +		s[i].dscclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].dscclk_mhz; +		s[i].dtbclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; +		s[i].phyclk_d18_mhz = +			dcn3_1_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; +		s[i].phyclk_mhz = dcn3_1_soc.clock_limits[closest_clk_lvl].phyclk_mhz; +	} +	if (clk_table->num_entries) { +		dcn3_1_soc.num_states = clk_table->num_entries;  	}  	memcpy(dcn3_1_soc.clock_limits, s, sizeof(dcn3_1_soc.clock_limits)); @@ -643,10 +652,7 @@ void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params  		dcn3_1_soc.dram_clock_change_latency_us = dc->debug.dram_clock_change_latency_ns / 1000;  	} -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_1_soc, &dcn3_1_ip, DML_PROJECT_DCN31); -	else -		dml_init_instance(&dc->dml, &dcn3_1_soc, &dcn3_1_ip, DML_PROJECT_DCN31_FPGA); +	dml_init_instance(&dc->dml, &dcn3_1_soc, &dcn3_1_ip, DML_PROJECT_DCN31);  }  void dcn315_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params) @@ -707,10 +713,7 @@ void dcn315_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param  		dcn3_15_soc.dram_clock_change_latency_us = dc->debug.dram_clock_change_latency_ns / 1000;  	} -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN315); -	else -		dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN31_FPGA); +	dml_init_instance(&dc->dml, &dcn3_15_soc, &dcn3_15_ip, DML_PROJECT_DCN315);  }  void dcn316_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params) @@ -726,71 +729,68 @@ void dcn316_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param  	memcpy(s, dcn3_16_soc.clock_limits, sizeof(dcn3_16_soc.clock_limits));  	// Default clock levels are used for diags, which may lead to overclocking. -	if (!IS_DIAG_DC(dc->ctx->dce_environment)) { - -		dcn3_16_ip.max_num_otg = dc->res_pool->res_cap->num_timing_generator; -		dcn3_16_ip.max_num_dpp = dc->res_pool->pipe_count; -		dcn3_16_soc.num_chans = bw_params->num_channels; +	dcn3_16_ip.max_num_otg = dc->res_pool->res_cap->num_timing_generator; +	dcn3_16_ip.max_num_dpp = dc->res_pool->pipe_count; +	dcn3_16_soc.num_chans = bw_params->num_channels; -		ASSERT(clk_table->num_entries); +	ASSERT(clk_table->num_entries); -		/* Prepass to find max clocks independent of voltage level. */ -		for (i = 0; i < clk_table->num_entries; ++i) { -			if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz) -				max_dispclk_mhz = clk_table->entries[i].dispclk_mhz; -			if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz) -				max_dppclk_mhz = clk_table->entries[i].dppclk_mhz; -		} +	/* Prepass to find max clocks independent of voltage level. */ +	for (i = 0; i < clk_table->num_entries; ++i) { +		if (clk_table->entries[i].dispclk_mhz > max_dispclk_mhz) +			max_dispclk_mhz = clk_table->entries[i].dispclk_mhz; +		if (clk_table->entries[i].dppclk_mhz > max_dppclk_mhz) +			max_dppclk_mhz = clk_table->entries[i].dppclk_mhz; +	} -		for (i = 0; i < clk_table->num_entries; i++) { -			/* loop backwards*/ -			for (closest_clk_lvl = 0, j = dcn3_16_soc.num_states - 1; j >= 0; j--) { -				if ((unsigned int) dcn3_16_soc.clock_limits[j].dcfclk_mhz <= -				    clk_table->entries[i].dcfclk_mhz) { -					closest_clk_lvl = j; -					break; -				} -			} -			// Ported from DCN315 -			if (clk_table->num_entries == 1) { -				/*smu gives one DPM level, let's take the highest one*/ -				closest_clk_lvl = dcn3_16_soc.num_states - 1; +	for (i = 0; i < clk_table->num_entries; i++) { +		/* loop backwards*/ +		for (closest_clk_lvl = 0, j = dcn3_16_soc.num_states - 1; j >= 0; j--) { +			if ((unsigned int) dcn3_16_soc.clock_limits[j].dcfclk_mhz <= +			    clk_table->entries[i].dcfclk_mhz) { +				closest_clk_lvl = j; +				break;  			} +		} +		// Ported from DCN315 +		if (clk_table->num_entries == 1) { +			/*smu gives one DPM level, let's take the highest one*/ +			closest_clk_lvl = dcn3_16_soc.num_states - 1; +		} -			s[i].state = i; +		s[i].state = i; -			/* Clocks dependent on voltage level. */ -			s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; -			if (clk_table->num_entries == 1 && -			    s[i].dcfclk_mhz < -			    dcn3_16_soc.clock_limits[closest_clk_lvl].dcfclk_mhz) { -				/*SMU fix not released yet*/ -				s[i].dcfclk_mhz = -					dcn3_16_soc.clock_limits[closest_clk_lvl].dcfclk_mhz; -			} -			s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; -			s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; -			s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * -				2 * clk_table->entries[i].wck_ratio; +		/* Clocks dependent on voltage level. */ +		s[i].dcfclk_mhz = clk_table->entries[i].dcfclk_mhz; +		if (clk_table->num_entries == 1 && +		    s[i].dcfclk_mhz < +		    dcn3_16_soc.clock_limits[closest_clk_lvl].dcfclk_mhz) { +			/*SMU fix not released yet*/ +			s[i].dcfclk_mhz = +				dcn3_16_soc.clock_limits[closest_clk_lvl].dcfclk_mhz; +		} +		s[i].fabricclk_mhz = clk_table->entries[i].fclk_mhz; +		s[i].socclk_mhz = clk_table->entries[i].socclk_mhz; +		s[i].dram_speed_mts = clk_table->entries[i].memclk_mhz * +			2 * clk_table->entries[i].wck_ratio; -			/* Clocks independent of voltage level. */ -			s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz : -				dcn3_16_soc.clock_limits[closest_clk_lvl].dispclk_mhz; +		/* Clocks independent of voltage level. */ +		s[i].dispclk_mhz = max_dispclk_mhz ? max_dispclk_mhz : +			dcn3_16_soc.clock_limits[closest_clk_lvl].dispclk_mhz; -			s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz : -				dcn3_16_soc.clock_limits[closest_clk_lvl].dppclk_mhz; +		s[i].dppclk_mhz = max_dppclk_mhz ? max_dppclk_mhz : +			dcn3_16_soc.clock_limits[closest_clk_lvl].dppclk_mhz; -			s[i].dram_bw_per_chan_gbps = -				dcn3_16_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; -			s[i].dscclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].dscclk_mhz; -			s[i].dtbclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; -			s[i].phyclk_d18_mhz = -				dcn3_16_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; -			s[i].phyclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].phyclk_mhz; -		} -		if (clk_table->num_entries) { -			dcn3_16_soc.num_states = clk_table->num_entries; -		} +		s[i].dram_bw_per_chan_gbps = +			dcn3_16_soc.clock_limits[closest_clk_lvl].dram_bw_per_chan_gbps; +		s[i].dscclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].dscclk_mhz; +		s[i].dtbclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].dtbclk_mhz; +		s[i].phyclk_d18_mhz = +			dcn3_16_soc.clock_limits[closest_clk_lvl].phyclk_d18_mhz; +		s[i].phyclk_mhz = dcn3_16_soc.clock_limits[closest_clk_lvl].phyclk_mhz; +	} +	if (clk_table->num_entries) { +		dcn3_16_soc.num_states = clk_table->num_entries;  	}  	memcpy(dcn3_16_soc.clock_limits, s, sizeof(dcn3_16_soc.clock_limits)); @@ -805,13 +805,21 @@ void dcn316_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_param  		dcn3_16_soc.dram_clock_change_latency_us = dc->debug.dram_clock_change_latency_ns / 1000;  	} -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_16_soc, &dcn3_16_ip, DML_PROJECT_DCN31); -	else -		dml_init_instance(&dc->dml, &dcn3_16_soc, &dcn3_16_ip, DML_PROJECT_DCN31_FPGA); +	dml_init_instance(&dc->dml, &dcn3_16_soc, &dcn3_16_ip, DML_PROJECT_DCN31);  }  int dcn_get_max_non_odm_pix_rate_100hz(struct _vcs_dpi_soc_bounding_box_st *soc)  {  	return soc->clock_limits[0].dispclk_mhz * 10000.0 / (1.0 + soc->dcn_downspread_percent / 100.0);  } + +int dcn_get_approx_det_segs_required_for_pstate( +		struct _vcs_dpi_soc_bounding_box_st *soc, +		int pix_clk_100hz, int bpp, int seg_size_kb) +{ +	/* Roughly calculate required crb to hide latency. In practice there is slightly +	 * more buffer available for latency hiding +	 */ +	return (int)(soc->dram_clock_change_latency_us * pix_clk_100hz * bpp +					/ 10240000 + seg_size_kb - 1) /	seg_size_kb; +} diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h b/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h index 687d3522cc33..8f9c8faed260 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h @@ -47,6 +47,9 @@ void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params  void dcn315_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);  void dcn316_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params);  int dcn_get_max_non_odm_pix_rate_100hz(struct _vcs_dpi_soc_bounding_box_st *soc); +int dcn_get_approx_det_segs_required_for_pstate( +		struct _vcs_dpi_soc_bounding_box_st *soc, +		int pix_clk_100hz, int bpp, int seg_size_kb);  int dcn31x_populate_dml_pipes_from_context(struct dc *dc,  					  struct dc_state *context, diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c index bd674dc30df3..43016c462251 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c @@ -532,7 +532,8 @@ static void CalculateStutterEfficiency(  static void CalculateSwathAndDETConfiguration(  		bool ForceSingleDPP,  		int NumberOfActivePlanes, -		unsigned int DETBufferSizeInKByte, +		bool DETSharedByAllDPP, +		unsigned int DETBufferSizeInKByte[],  		double MaximumSwathWidthLuma[],  		double MaximumSwathWidthChroma[],  		enum scan_direction_class SourceScan[], @@ -3118,7 +3119,7 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman  				v->SurfaceWidthC[k],  				v->SurfaceHeightY[k],  				v->SurfaceHeightC[k], -				v->DETBufferSizeInKByte[0] * 1024, +				v->DETBufferSizeInKByte[k] * 1024,  				v->BlockHeight256BytesY[k],  				v->BlockHeight256BytesC[k],  				v->SurfaceTiling[k], @@ -3313,7 +3314,8 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib)  	CalculateSwathAndDETConfiguration(  			false,  			v->NumberOfActivePlanes, -			v->DETBufferSizeInKByte[0], +			mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], +			v->DETBufferSizeInKByte,  			dummy1,  			dummy2,  			v->SourceScan, @@ -3779,14 +3781,16 @@ static noinline void CalculatePrefetchSchedulePerPlane(  		&v->VReadyOffsetPix[k]);  } -static void PatchDETBufferSizeInKByte(unsigned int NumberOfActivePlanes, int NoOfDPPThisState[], unsigned int config_return_buffer_size_in_kbytes, unsigned int *DETBufferSizeInKByte) +static void PatchDETBufferSizeInKByte(unsigned int NumberOfActivePlanes, int NoOfDPPThisState[], unsigned int config_return_buffer_size_in_kbytes, unsigned int DETBufferSizeInKByte[])  {  	int i, total_pipes = 0;  	for (i = 0; i < NumberOfActivePlanes; i++)  		total_pipes += NoOfDPPThisState[i]; -	*DETBufferSizeInKByte = ((config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB) / 64 / total_pipes) * 64; -	if (*DETBufferSizeInKByte > DCN3_15_MAX_DET_SIZE) -		*DETBufferSizeInKByte = DCN3_15_MAX_DET_SIZE; +	DETBufferSizeInKByte[0] = ((config_return_buffer_size_in_kbytes - DCN3_15_MIN_COMPBUF_SIZE_KB) / 64 / total_pipes) * 64; +	if (DETBufferSizeInKByte[0] > DCN3_15_MAX_DET_SIZE) +		DETBufferSizeInKByte[0] = DCN3_15_MAX_DET_SIZE; +	for (i = 1; i < NumberOfActivePlanes; i++) +		DETBufferSizeInKByte[i] = DETBufferSizeInKByte[0];  } @@ -4026,7 +4030,8 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  	CalculateSwathAndDETConfiguration(  			true,  			v->NumberOfActivePlanes, -			v->DETBufferSizeInKByte[0], +			mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], +			v->DETBufferSizeInKByte,  			v->MaximumSwathWidthLuma,  			v->MaximumSwathWidthChroma,  			v->SourceScan, @@ -4166,6 +4171,10 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  						|| (v->PlaneRequiredDISPCLK > v->MaxDispclkRoundedDownToDFSGranularity)) {  					v->DISPCLK_DPPCLK_Support[i][j] = false;  				} +				if (mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[k] > DCN3_15_MAX_DET_SIZE && v->NoOfDPP[i][j][k] < 2) { +					v->MPCCombine[i][j][k] = true; +					v->NoOfDPP[i][j][k] = 2; +				}  			}  			v->TotalNumberOfActiveDPP[i][j] = 0;  			v->TotalNumberOfSingleDPPPlanes[i][j] = 0; @@ -4642,12 +4651,13 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  				v->ODMCombineEnableThisState[k] = v->ODMCombineEnablePerState[i][k];  			} -			if (v->NumberOfActivePlanes > 1 && mode_lib->project == DML_PROJECT_DCN315) -				PatchDETBufferSizeInKByte(v->NumberOfActivePlanes, v->NoOfDPPThisState, v->ip.config_return_buffer_size_in_kbytes, &v->DETBufferSizeInKByte[0]); +			if (v->NumberOfActivePlanes > 1 && mode_lib->project == DML_PROJECT_DCN315 && !v->DETSizeOverride[0]) +				PatchDETBufferSizeInKByte(v->NumberOfActivePlanes, v->NoOfDPPThisState, v->ip.config_return_buffer_size_in_kbytes, v->DETBufferSizeInKByte);  			CalculateSwathAndDETConfiguration(  					false,  					v->NumberOfActivePlanes, -					v->DETBufferSizeInKByte[0], +					mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], +					v->DETBufferSizeInKByte,  					v->MaximumSwathWidthLuma,  					v->MaximumSwathWidthChroma,  					v->SourceScan, @@ -5274,8 +5284,8 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  					v->TotImmediateFlipBytes = 0.0;  					for (k = 0; k < v->NumberOfActivePlanes; k++) {  						v->TotImmediateFlipBytes = v->TotImmediateFlipBytes -								+ v->NoOfDPP[i][j][k] * v->PDEAndMetaPTEBytesPerFrame[i][j][k] + v->MetaRowBytes[i][j][k] -								+ v->DPTEBytesPerRow[i][j][k]; +								+ v->NoOfDPP[i][j][k] * (v->PDEAndMetaPTEBytesPerFrame[i][j][k] + v->MetaRowBytes[i][j][k] +								+ v->DPTEBytesPerRow[i][j][k]);  					}  					for (k = 0; k < v->NumberOfActivePlanes; k++) { @@ -6611,7 +6621,8 @@ static void CalculateStutterEfficiency(  static void CalculateSwathAndDETConfiguration(  		bool ForceSingleDPP,  		int NumberOfActivePlanes, -		unsigned int DETBufferSizeInKByte, +		bool DETSharedByAllDPP, +		unsigned int DETBufferSizeInKByteA[],  		double MaximumSwathWidthLuma[],  		double MaximumSwathWidthChroma[],  		enum scan_direction_class SourceScan[], @@ -6695,6 +6706,10 @@ static void CalculateSwathAndDETConfiguration(  	*ViewportSizeSupport = true;  	for (k = 0; k < NumberOfActivePlanes; ++k) { +		unsigned int DETBufferSizeInKByte = DETBufferSizeInKByteA[k]; + +		if (DETSharedByAllDPP && DPPPerPlane[k]) +			DETBufferSizeInKByte /= DPPPerPlane[k];  		if ((SourcePixelFormat[k] == dm_444_64 || SourcePixelFormat[k] == dm_444_32 || SourcePixelFormat[k] == dm_444_16 || SourcePixelFormat[k] == dm_mono_16  				|| SourcePixelFormat[k] == dm_mono_8 || SourcePixelFormat[k] == dm_rgbe)) {  			if (SurfaceTiling[k] == dm_sw_linear @@ -7017,7 +7032,7 @@ static double CalculateUrgentLatency(  	return ret;  } -static void UseMinimumDCFCLK( +static noinline_for_stack void UseMinimumDCFCLK(  		struct display_mode_lib *mode_lib,  		int MaxPrefetchMode,  		int ReorderingBytes) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c index 2244e4fb8c96..4113ce79c4af 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c @@ -987,8 +987,7 @@ static void dml_rq_dlg_get_dlg_params(  	dlg_vblank_start = interlaced ? (vblank_start / 2) : vblank_start;  	disp_dlg_regs->min_dst_y_next_start = (unsigned int) (((double) dlg_vblank_start) * dml_pow(2, 2)); -	disp_dlg_regs->optimized_min_dst_y_next_start_us = 0; -	disp_dlg_regs->optimized_min_dst_y_next_start = disp_dlg_regs->min_dst_y_next_start; +	disp_dlg_regs->min_dst_y_next_start_us = 0;  	ASSERT(disp_dlg_regs->min_dst_y_next_start < (unsigned int)dml_pow(2, 18));  	dml_print("DML_DLG: %s: min_ttu_vblank (us)         = %3.2f\n", __func__, min_ttu_vblank); @@ -1433,14 +1432,6 @@ static void dml_rq_dlg_get_dlg_params(  	dml_print("DML_DLG: %s: disp_dlg_regs->dst_y_per_vm_flip    = 0x%x\n", __func__, disp_dlg_regs->dst_y_per_vm_flip);  	dml_print("DML_DLG: %s: disp_dlg_regs->dst_y_per_row_flip   = 0x%x\n", __func__, disp_dlg_regs->dst_y_per_row_flip); -	// hack for FPGA -	if (mode_lib->project == DML_PROJECT_DCN31_FPGA) { -		if (disp_dlg_regs->vratio_prefetch >= (unsigned int) dml_pow(2, 22)) { -			disp_dlg_regs->vratio_prefetch = (unsigned int) dml_pow(2, 22) - 1; -			dml_print("vratio_prefetch exceed the max value, the register field is [21:0]\n"); -		} -	} -  	disp_dlg_regs->refcyc_per_pte_group_vblank_l = (unsigned int) (dst_y_per_row_vblank * (double) htotal * ref_freq_to_pix_freq / (double) dpte_groups_per_row_ub_l);  	ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_l < (unsigned int)dml_pow(2, 13)); diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c index 9e54e3d0eb78..c9afddd11589 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c @@ -33,7 +33,7 @@  #include "dml/display_mode_vba.h"  struct _vcs_dpi_ip_params_st dcn3_14_ip = { -	.VBlankNomDefaultUS = 668, +	.VBlankNomDefaultUS = 800,  	.gpuvm_enable = 1,  	.gpuvm_max_page_table_levels = 1,  	.hostvm_enable = 1, @@ -190,8 +190,7 @@ void dcn314_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_p  	dc_assert_fp_enabled();  	// Default clock levels are used for diags, which may lead to overclocking. -	if (!IS_DIAG_DC(dc->ctx->dce_environment) && dc->config.use_default_clock_table == false) { - +	if (dc->config.use_default_clock_table == false) {  		dcn3_14_ip.max_num_otg = dc->res_pool->res_cap->num_timing_generator;  		dcn3_14_ip.max_num_dpp = dc->res_pool->pipe_count; @@ -266,11 +265,7 @@ void dcn314_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_p  	}  	dcn20_patch_bounding_box(dc, &dcn3_14_soc); - -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		dml_init_instance(&dc->dml, &dcn3_14_soc, &dcn3_14_ip, DML_PROJECT_DCN314); -	else -		dml_init_instance(&dc->dml, &dcn3_14_soc, &dcn3_14_ip, DML_PROJECT_DCN31_FPGA); +	dml_init_instance(&dc->dml, &dcn3_14_soc, &dcn3_14_ip, DML_PROJECT_DCN314);  }  static bool is_dual_plane(enum surface_pixel_format format) @@ -286,6 +281,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c  	struct resource_context *res_ctx = &context->res_ctx;  	struct pipe_ctx *pipe;  	bool upscaled = false; +	const unsigned int max_allowed_vblank_nom = 1023;  	dc_assert_fp_enabled(); @@ -299,9 +295,11 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c  		pipe = &res_ctx->pipe_ctx[i];  		timing = &pipe->stream->timing; -		if (dc_extended_blank_supported(dc) && pipe->stream->adjust.v_total_max == pipe->stream->adjust.v_total_min -			&& pipe->stream->adjust.v_total_min > timing->v_total) -			pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; +		pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; +		pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; +		pipes[pipe_cnt].pipe.dest.vblank_nom = min(pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS); +		pipes[pipe_cnt].pipe.dest.vblank_nom = max(pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width); +		pipes[pipe_cnt].pipe.dest.vblank_nom = min(pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom);  		if (pipe->plane_state &&  				(pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height || @@ -323,8 +321,6 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c  		pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_luma = 0;  		pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_chroma = 0;  		pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch; -		pipes[pipe_cnt].pipe.dest.vblank_nom = -				dcn3_14_ip.VBlankNomDefaultUS / (timing->h_total / (timing->pix_clk_100hz / 10000.0));  		pipes[pipe_cnt].pipe.src.dcc_rate = 3;  		pipes[pipe_cnt].dout.dsc_input_bpc = 0; diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c b/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c index 7eb2173b7691..1532a7e0ed6c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_mode_vba_314.c @@ -5371,8 +5371,8 @@ void dml314_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_  					v->TotImmediateFlipBytes = 0.0;  					for (k = 0; k < v->NumberOfActivePlanes; k++) {  						v->TotImmediateFlipBytes = v->TotImmediateFlipBytes -								+ v->NoOfDPP[i][j][k] * v->PDEAndMetaPTEBytesPerFrame[i][j][k] + v->MetaRowBytes[i][j][k] -								+ v->DPTEBytesPerRow[i][j][k]; +								+ v->NoOfDPP[i][j][k] * (v->PDEAndMetaPTEBytesPerFrame[i][j][k] + v->MetaRowBytes[i][j][k] +								+ v->DPTEBytesPerRow[i][j][k]);  					}  					for (k = 0; k < v->NumberOfActivePlanes; k++) { @@ -7061,7 +7061,7 @@ static double CalculateUrgentLatency(  	return ret;  } -static void UseMinimumDCFCLK( +static noinline_for_stack void UseMinimumDCFCLK(  		struct display_mode_lib *mode_lib,  		int MaxPrefetchMode,  		int ReorderingBytes) diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c b/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c index ea4eb66066c4..b3e8dc08030c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c @@ -951,7 +951,6 @@ static void dml_rq_dlg_get_dlg_params(  {  	const display_pipe_source_params_st *src = &e2e_pipe_param[pipe_idx].pipe.src;  	const display_pipe_dest_params_st *dst = &e2e_pipe_param[pipe_idx].pipe.dest; -	const display_output_params_st *dout = &e2e_pipe_param[pipe_idx].dout;  	const display_clocks_and_cfg_st *clks = &e2e_pipe_param[pipe_idx].clks_cfg;  	const scaler_ratio_depth_st *scl = &e2e_pipe_param[pipe_idx].pipe.scale_ratio_depth;  	const scaler_taps_st *taps = &e2e_pipe_param[pipe_idx].pipe.scale_taps; @@ -1000,8 +999,6 @@ static void dml_rq_dlg_get_dlg_params(  	unsigned int vupdate_width;  	unsigned int vready_offset; -	unsigned int dispclk_delay_subtotal; -  	unsigned int vstartup_start;  	unsigned int dst_x_after_scaler;  	unsigned int dst_y_after_scaler; @@ -1051,7 +1048,6 @@ static void dml_rq_dlg_get_dlg_params(  	float vba__refcyc_per_req_delivery_pre_l = get_refcyc_per_req_delivery_pre_l_in_us(mode_lib, e2e_pipe_param, num_pipes, pipe_idx) * refclk_freq_in_mhz;  // From VBA  	float vba__refcyc_per_req_delivery_l = get_refcyc_per_req_delivery_l_in_us(mode_lib, e2e_pipe_param, num_pipes, pipe_idx) * refclk_freq_in_mhz;  // From VBA -	int blank_lines = 0;  	memset(disp_dlg_regs, 0, sizeof(*disp_dlg_regs));  	memset(disp_ttu_regs, 0, sizeof(*disp_ttu_regs)); @@ -1075,17 +1071,10 @@ static void dml_rq_dlg_get_dlg_params(  	min_ttu_vblank = get_min_ttu_vblank_in_us(mode_lib, e2e_pipe_param, num_pipes, pipe_idx);	// From VBA  	dlg_vblank_start = interlaced ? (vblank_start / 2) : vblank_start; -	disp_dlg_regs->optimized_min_dst_y_next_start = disp_dlg_regs->min_dst_y_next_start; -	disp_dlg_regs->optimized_min_dst_y_next_start_us = 0; -	disp_dlg_regs->min_dst_y_next_start = (unsigned int) (((double) dlg_vblank_start) * dml_pow(2, 2)); -	blank_lines = (dst->vblank_end + dst->vtotal_min - dst->vblank_start - dst->vstartup_start - 1); -	if (blank_lines < 0) -		blank_lines = 0; -	if (blank_lines != 0) { -		disp_dlg_regs->optimized_min_dst_y_next_start = vba__min_dst_y_next_start; -		disp_dlg_regs->optimized_min_dst_y_next_start_us = (disp_dlg_regs->optimized_min_dst_y_next_start * dst->hactive) / (unsigned int) dst->pixel_rate_mhz; -		disp_dlg_regs->min_dst_y_next_start = disp_dlg_regs->optimized_min_dst_y_next_start; -	} +	disp_dlg_regs->min_dst_y_next_start_us = +		(vba__min_dst_y_next_start * dst->hactive) / (unsigned int) dst->pixel_rate_mhz; +	disp_dlg_regs->min_dst_y_next_start = vba__min_dst_y_next_start * dml_pow(2, 2); +  	ASSERT(disp_dlg_regs->min_dst_y_next_start < (unsigned int)dml_pow(2, 18));  	dml_print("DML_DLG: %s: min_ttu_vblank (us)         = %3.2f\n", __func__, min_ttu_vblank); @@ -1127,13 +1116,6 @@ static void dml_rq_dlg_get_dlg_params(  	vupdate_offset = dst->vupdate_offset;  	vupdate_width = dst->vupdate_width;  	vready_offset = dst->vready_offset; -	dispclk_delay_subtotal = mode_lib->ip.dispclk_delay_subtotal; - -	if (dout->dsc_enable) { -		double dsc_delay = get_dsc_delay(mode_lib, e2e_pipe_param, num_pipes, pipe_idx); // FROM VBA - -		dispclk_delay_subtotal += dsc_delay; -	}  	vstartup_start = dst->vstartup_start;  	if (interlaced) { @@ -1538,14 +1520,6 @@ static void dml_rq_dlg_get_dlg_params(  	dml_print("DML_DLG: %s: disp_dlg_regs->dst_y_per_vm_flip    = 0x%x\n", __func__, disp_dlg_regs->dst_y_per_vm_flip);  	dml_print("DML_DLG: %s: disp_dlg_regs->dst_y_per_row_flip   = 0x%x\n", __func__, disp_dlg_regs->dst_y_per_row_flip); -	// hack for FPGA -	if (mode_lib->project == DML_PROJECT_DCN31_FPGA) { -		if (disp_dlg_regs->vratio_prefetch >= (unsigned int) dml_pow(2, 22)) { -			disp_dlg_regs->vratio_prefetch = (unsigned int) dml_pow(2, 22) - 1; -			dml_print("vratio_prefetch exceed the max value, the register field is [21:0]\n"); -		} -	} -  	disp_dlg_regs->refcyc_per_pte_group_vblank_l = (unsigned int) (dst_y_per_row_vblank * (double) htotal * ref_freq_to_pix_freq / (double) dpte_groups_per_row_ub_l);  	ASSERT(disp_dlg_regs->refcyc_per_pte_group_vblank_l < (unsigned int)dml_pow(2, 13)); diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c index 47beb4ea779d..fa3678342abb 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c @@ -35,6 +35,15 @@  #define DC_LOGGER_INIT(logger) +static const struct subvp_high_refresh_list subvp_high_refresh_list = { +			.min_refresh = 120, +			.max_refresh = 165, +			.res = { +				{.width = 3840, .height = 2160, }, +				{.width = 3440, .height = 1440, }, +				{.width = 2560, .height = 1440, }}, +}; +  struct _vcs_dpi_ip_params_st dcn3_2_ip = {  	.gpuvm_enable = 0,  	.gpuvm_max_page_table_levels = 4, @@ -138,7 +147,7 @@ struct _vcs_dpi_soc_bounding_box_st dcn3_2_soc = {  	.urgent_out_of_order_return_per_channel_pixel_only_bytes = 4096,  	.urgent_out_of_order_return_per_channel_pixel_and_vm_bytes = 4096,  	.urgent_out_of_order_return_per_channel_vm_only_bytes = 4096, -	.pct_ideal_sdp_bw_after_urgent = 100.0, +	.pct_ideal_sdp_bw_after_urgent = 90.0,  	.pct_ideal_fabric_bw_after_urgent = 67.0,  	.pct_ideal_dram_sdp_bw_after_urgent_pixel_only = 20.0,  	.pct_ideal_dram_sdp_bw_after_urgent_pixel_and_vm = 60.0, // N/A, for now keep as is until DML implemented @@ -692,8 +701,12 @@ static bool dcn32_assign_subvp_pipe(struct dc *dc,  		 *   to combine this with SubVP can cause issues with the scheduling).  		 * - Not TMZ surface  		 */ -		if (pipe->plane_state && !pipe->top_pipe && !dcn32_is_center_timing(pipe) && !dcn32_is_psr_capable(pipe) && -				pipe->stream->mall_stream_config.type == SUBVP_NONE && refresh_rate < 120 && !pipe->plane_state->address.tmz_surface && +		if (pipe->plane_state && !pipe->top_pipe && !dcn32_is_center_timing(pipe) && +				!(pipe->stream->timing.pix_clk_100hz / 10000 > DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ) && +				(!dcn32_is_psr_capable(pipe) || (context->stream_count == 1 && dc->caps.dmub_caps.subvp_psr)) && +				pipe->stream->mall_stream_config.type == SUBVP_NONE && +				(refresh_rate < 120 || dcn32_allow_subvp_high_refresh_rate(dc, context, pipe)) && +				!pipe->plane_state->address.tmz_surface &&  				(vba->ActiveDRAMClockChangeLatencyMarginPerState[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]] <= 0 ||  				(vba->ActiveDRAMClockChangeLatencyMarginPerState[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]] > 0 &&  						dcn32_allow_subvp_with_active_margin(pipe)))) { @@ -880,10 +893,6 @@ static bool subvp_drr_schedulable(struct dc *dc, struct dc_state *context, struc  	int16_t stretched_drr_us = 0;  	int16_t drr_stretched_vblank_us = 0;  	int16_t max_vblank_mallregion = 0; -	const struct dc_config *config = &dc->config; - -	if (config->disable_subvp_drr) -		return false;  	// Find SubVP pipe  	for (i = 0; i < dc->res_pool->pipe_count; i++) { @@ -1129,7 +1138,7 @@ static void dcn32_full_validate_bw_helper(struct dc *dc,  	 * 4. Display configuration passes validation  	 * 5. (Config doesn't support MCLK in VACTIVE/VBLANK || dc->debug.force_subvp_mclk_switch)  	 */ -	if (!dc->debug.force_disable_subvp && dcn32_all_pipes_have_stream_and_plane(dc, context) && +	if (!dc->debug.force_disable_subvp && !dc->caps.dmub_caps.gecc_enable && dcn32_all_pipes_have_stream_and_plane(dc, context) &&  	    !dcn32_mpo_in_use(context) && !dcn32_any_surfaces_rotated(dc, context) &&  		(*vlevel == context->bw_ctx.dml.soc.num_states ||  	    vba->DRAMClockChangeSupport[*vlevel][vba->maxMpcComb] == dm_dram_clock_change_unsupported || @@ -1315,6 +1324,7 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context,  	int i, pipe_idx, active_hubp_count = 0;  	bool usr_retraining_support = false;  	bool unbounded_req_enabled = false; +	struct vba_vars_st *vba = &context->bw_ctx.dml.vba;  	dc_assert_fp_enabled(); @@ -1396,6 +1406,11 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context,  		context->res_ctx.pipe_ctx[i].surface_size_in_mall_bytes = get_surface_size_in_mall(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); +		if (vba->ActiveDRAMClockChangeLatencyMarginPerState[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]] > 0) +			context->res_ctx.pipe_ctx[i].has_vactive_margin = true; +		else +			context->res_ctx.pipe_ctx[i].has_vactive_margin = false; +  		/* MALL Allocation Sizes */  		/* count from active, top pipes per plane only */  		if (context->res_ctx.pipe_ctx[i].stream && context->res_ctx.pipe_ctx[i].plane_state && @@ -1432,6 +1447,7 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context,  		context->bw_ctx.bw.dcn.clk.dramclk_khz = 0;  		context->bw_ctx.bw.dcn.clk.fclk_khz = 0;  		context->bw_ctx.bw.dcn.clk.p_state_change_support = true; +		context->bw_ctx.bw.dcn.clk.fclk_p_state_change_support = true;  	}  	/*save a original dppclock copy*/  	context->bw_ctx.bw.dcn.clk.bw_dppclk_khz = context->bw_ctx.bw.dcn.clk.dppclk_khz; @@ -2005,6 +2021,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,  				maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;  				dcfclk_from_fw_based_mclk_switching = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];  				pstate_en = true; +				context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][maxMpcComb] = dm_dram_clock_change_vblank;  			} else {  				/* Restore FCLK latency and re-run validation to go back to original validation  				 * output if we find that enabling FPO does not give us any benefit (i.e. lower @@ -2062,6 +2079,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,  	 * sr_enter_exit/sr_exit should be lower than used for DRAM (TBD after bringup or later, use as decided in Clk Mgr)  	 */ +	/*  	if (dcn3_2_soc.num_states > 2) {  		vlevel_temp = 0;  		dcfclk = dc->clk_mgr->bw_params->clk_table.entries[0].dcfclk_mhz; @@ -2088,6 +2106,7 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,  	context->bw_ctx.bw.dcn.watermarks.d.urgent_latency_ns = get_urgent_latency(&context->bw_ctx.dml, pipes, pipe_cnt) * 1000;  	context->bw_ctx.bw.dcn.watermarks.d.cstate_pstate.fclk_pstate_change_ns = get_fclk_watermark(&context->bw_ctx.dml, pipes, pipe_cnt) * 1000;  	context->bw_ctx.bw.dcn.watermarks.d.usr_retraining_ns = get_usr_retraining_watermark(&context->bw_ctx.dml, pipes, pipe_cnt) * 1000; +	*/  	/* Set C, for Dummy P-State:  	 * All clocks min. @@ -2189,6 +2208,9 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,  		context->bw_ctx.bw.dcn.watermarks.a.usr_retraining_ns = get_usr_retraining_watermark(&context->bw_ctx.dml, pipes, pipe_cnt) * 1000;  	} +	/* Make set D = set A since we do not optimized watermarks for MALL */ +	context->bw_ctx.bw.dcn.watermarks.d = context->bw_ctx.bw.dcn.watermarks.a; +  	for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {  		if (!context->res_ctx.pipe_ctx[i].stream)  			continue; @@ -2303,14 +2325,48 @@ void dcn32_patch_dpm_table(struct clk_bw_params *bw_params)  		bw_params->clk_table.entries[0].memclk_mhz = dcn3_2_soc.clock_limits[0].dram_speed_mts / 16;  } -static int build_synthetic_soc_states(struct clk_bw_params *bw_params, +/* + * override_max_clk_values - Overwrite the max clock frequencies with the max DC mode timings + * Input: + *	max_clk_limit - struct containing the desired clock timings + * Output: + *	curr_clk_limit  - struct containing the timings that need to be overwritten + * Return: 0 upon success, non-zero for failure + */ +static int override_max_clk_values(struct clk_limit_table_entry *max_clk_limit, +		struct clk_limit_table_entry *curr_clk_limit) +{ +	if (NULL == max_clk_limit || NULL == curr_clk_limit) +		return -1; //invalid parameters + +	//only overwrite if desired max clock frequency is initialized +	if (max_clk_limit->dcfclk_mhz != 0) +		curr_clk_limit->dcfclk_mhz = max_clk_limit->dcfclk_mhz; + +	if (max_clk_limit->fclk_mhz != 0) +		curr_clk_limit->fclk_mhz = max_clk_limit->fclk_mhz; + +	if (max_clk_limit->memclk_mhz != 0) +		curr_clk_limit->memclk_mhz = max_clk_limit->memclk_mhz; + +	if (max_clk_limit->socclk_mhz != 0) +		curr_clk_limit->socclk_mhz = max_clk_limit->socclk_mhz; + +	if (max_clk_limit->dtbclk_mhz != 0) +		curr_clk_limit->dtbclk_mhz = max_clk_limit->dtbclk_mhz; + +	if (max_clk_limit->dispclk_mhz != 0) +		curr_clk_limit->dispclk_mhz = max_clk_limit->dispclk_mhz; + +	return 0; +} + +static int build_synthetic_soc_states(bool disable_dc_mode_overwrite, struct clk_bw_params *bw_params,  		struct _vcs_dpi_voltage_scaling_st *table, unsigned int *num_entries)  {  	int i, j;  	struct _vcs_dpi_voltage_scaling_st entry = {0}; - -	unsigned int max_dcfclk_mhz = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0, -			max_phyclk_mhz = 0, max_dtbclk_mhz = 0, max_fclk_mhz = 0, max_uclk_mhz = 0; +	struct clk_limit_table_entry max_clk_data = {0};  	unsigned int min_dcfclk_mhz = 199, min_fclk_mhz = 299; @@ -2321,51 +2377,76 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	unsigned int num_fclk_dpms = 0;  	unsigned int num_dcfclk_dpms = 0; +	unsigned int num_dc_uclk_dpms = 0; +	unsigned int num_dc_fclk_dpms = 0; +	unsigned int num_dc_dcfclk_dpms = 0; +  	for (i = 0; i < MAX_NUM_DPM_LVL; i++) { -		if (bw_params->clk_table.entries[i].dcfclk_mhz > max_dcfclk_mhz) -			max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; -		if (bw_params->clk_table.entries[i].fclk_mhz > max_fclk_mhz) -			max_fclk_mhz = bw_params->clk_table.entries[i].fclk_mhz; -		if (bw_params->clk_table.entries[i].memclk_mhz > max_uclk_mhz) -			max_uclk_mhz = bw_params->clk_table.entries[i].memclk_mhz; -		if (bw_params->clk_table.entries[i].dispclk_mhz > max_dispclk_mhz) -			max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; -		if (bw_params->clk_table.entries[i].dppclk_mhz > max_dppclk_mhz) -			max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; -		if (bw_params->clk_table.entries[i].phyclk_mhz > max_phyclk_mhz) -			max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; -		if (bw_params->clk_table.entries[i].dtbclk_mhz > max_dtbclk_mhz) -			max_dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz; +		if (bw_params->clk_table.entries[i].dcfclk_mhz > max_clk_data.dcfclk_mhz) +			max_clk_data.dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; +		if (bw_params->clk_table.entries[i].fclk_mhz > max_clk_data.fclk_mhz) +			max_clk_data.fclk_mhz = bw_params->clk_table.entries[i].fclk_mhz; +		if (bw_params->clk_table.entries[i].memclk_mhz > max_clk_data.memclk_mhz) +			max_clk_data.memclk_mhz = bw_params->clk_table.entries[i].memclk_mhz; +		if (bw_params->clk_table.entries[i].dispclk_mhz > max_clk_data.dispclk_mhz) +			max_clk_data.dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; +		if (bw_params->clk_table.entries[i].dppclk_mhz > max_clk_data.dppclk_mhz) +			max_clk_data.dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; +		if (bw_params->clk_table.entries[i].phyclk_mhz > max_clk_data.phyclk_mhz) +			max_clk_data.phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; +		if (bw_params->clk_table.entries[i].dtbclk_mhz > max_clk_data.dtbclk_mhz) +			max_clk_data.dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz; -		if (bw_params->clk_table.entries[i].memclk_mhz > 0) +		if (bw_params->clk_table.entries[i].memclk_mhz > 0) {  			num_uclk_dpms++; -		if (bw_params->clk_table.entries[i].fclk_mhz > 0) +			if (bw_params->clk_table.entries[i].memclk_mhz <= bw_params->dc_mode_limit.memclk_mhz) +				num_dc_uclk_dpms++; +		} +		if (bw_params->clk_table.entries[i].fclk_mhz > 0) {  			num_fclk_dpms++; -		if (bw_params->clk_table.entries[i].dcfclk_mhz > 0) +			if (bw_params->clk_table.entries[i].fclk_mhz <= bw_params->dc_mode_limit.fclk_mhz) +				num_dc_fclk_dpms++; +		} +		if (bw_params->clk_table.entries[i].dcfclk_mhz > 0) {  			num_dcfclk_dpms++; +			if (bw_params->clk_table.entries[i].dcfclk_mhz <= bw_params->dc_mode_limit.dcfclk_mhz) +				num_dc_dcfclk_dpms++; +		} +	} + +	if (!disable_dc_mode_overwrite) { +		//Overwrite max frequencies with max DC mode frequencies for DC mode systems +		override_max_clk_values(&bw_params->dc_mode_limit, &max_clk_data); +		num_uclk_dpms = num_dc_uclk_dpms; +		num_fclk_dpms = num_dc_fclk_dpms; +		num_dcfclk_dpms = num_dc_dcfclk_dpms; +		bw_params->clk_table.num_entries_per_clk.num_memclk_levels = num_uclk_dpms; +		bw_params->clk_table.num_entries_per_clk.num_fclk_levels = num_fclk_dpms;  	}  	if (num_dcfclk_dpms > 0 && bw_params->clk_table.entries[0].fclk_mhz > min_fclk_mhz)  		min_fclk_mhz = bw_params->clk_table.entries[0].fclk_mhz; -	if (!max_dcfclk_mhz || !max_dispclk_mhz || !max_dtbclk_mhz) +	if (!max_clk_data.dcfclk_mhz || !max_clk_data.dispclk_mhz || !max_clk_data.dtbclk_mhz)  		return -1; -	if (max_dppclk_mhz == 0) -		max_dppclk_mhz = max_dispclk_mhz; +	if (max_clk_data.dppclk_mhz == 0) +		max_clk_data.dppclk_mhz = max_clk_data.dispclk_mhz; -	if (max_fclk_mhz == 0) -		max_fclk_mhz = max_dcfclk_mhz * dcn3_2_soc.pct_ideal_sdp_bw_after_urgent / dcn3_2_soc.pct_ideal_fabric_bw_after_urgent; +	if (max_clk_data.fclk_mhz == 0) +		max_clk_data.fclk_mhz = max_clk_data.dcfclk_mhz * +				dcn3_2_soc.pct_ideal_sdp_bw_after_urgent / +				dcn3_2_soc.pct_ideal_fabric_bw_after_urgent; -	if (max_phyclk_mhz == 0) -		max_phyclk_mhz = dcn3_2_soc.clock_limits[0].phyclk_mhz; +	if (max_clk_data.phyclk_mhz == 0) +		max_clk_data.phyclk_mhz = dcn3_2_soc.clock_limits[0].phyclk_mhz;  	*num_entries = 0; -	entry.dispclk_mhz = max_dispclk_mhz; -	entry.dscclk_mhz = max_dispclk_mhz / 3; -	entry.dppclk_mhz = max_dppclk_mhz; -	entry.dtbclk_mhz = max_dtbclk_mhz; -	entry.phyclk_mhz = max_phyclk_mhz; +	entry.dispclk_mhz = max_clk_data.dispclk_mhz; +	entry.dscclk_mhz = max_clk_data.dispclk_mhz / 3; +	entry.dppclk_mhz = max_clk_data.dppclk_mhz; +	entry.dtbclk_mhz = max_clk_data.dtbclk_mhz; +	entry.phyclk_mhz = max_clk_data.phyclk_mhz;  	entry.phyclk_d18_mhz = dcn3_2_soc.clock_limits[0].phyclk_d18_mhz;  	entry.phyclk_d32_mhz = dcn3_2_soc.clock_limits[0].phyclk_d32_mhz; @@ -2379,7 +2460,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	}  	// Insert the max DCFCLK -	entry.dcfclk_mhz = max_dcfclk_mhz; +	entry.dcfclk_mhz = max_clk_data.dcfclk_mhz;  	entry.fabricclk_mhz = 0;  	entry.dram_speed_mts = 0; @@ -2407,7 +2488,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	// If FCLK fine grained, only insert max  	else {  		entry.dcfclk_mhz = 0; -		entry.fabricclk_mhz = max_fclk_mhz; +		entry.fabricclk_mhz = max_clk_data.fclk_mhz;  		entry.dram_speed_mts = 0;  		insert_entry_into_table_sorted(table, num_entries, &entry); @@ -2419,9 +2500,9 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	// Remove states that require higher clocks than are supported  	for (i = *num_entries - 1; i >= 0 ; i--) { -		if (table[i].dcfclk_mhz > max_dcfclk_mhz || -				table[i].fabricclk_mhz > max_fclk_mhz || -				table[i].dram_speed_mts > max_uclk_mhz * 16) +		if (table[i].dcfclk_mhz > max_clk_data.dcfclk_mhz || +				table[i].fabricclk_mhz > max_clk_data.fclk_mhz || +				table[i].dram_speed_mts > max_clk_data.memclk_mhz * 16)  			remove_entry_from_table_at_index(table, num_entries, i);  	} @@ -2508,80 +2589,78 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa  {  	dc_assert_fp_enabled(); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		/* Overrides from dc->config options */ -		dcn3_2_ip.clamp_min_dcfclk = dc->config.clamp_min_dcfclk; +	/* Overrides from dc->config options */ +	dcn3_2_ip.clamp_min_dcfclk = dc->config.clamp_min_dcfclk; -		/* Override from passed dc->bb_overrides if available*/ -		if ((int)(dcn3_2_soc.sr_exit_time_us * 1000) != dc->bb_overrides.sr_exit_time_ns -				&& dc->bb_overrides.sr_exit_time_ns) { -			dcn3_2_soc.sr_exit_time_us = dc->bb_overrides.sr_exit_time_ns / 1000.0; -		} - -		if ((int)(dcn3_2_soc.sr_enter_plus_exit_time_us * 1000) -				!= dc->bb_overrides.sr_enter_plus_exit_time_ns -				&& dc->bb_overrides.sr_enter_plus_exit_time_ns) { -			dcn3_2_soc.sr_enter_plus_exit_time_us = -				dc->bb_overrides.sr_enter_plus_exit_time_ns / 1000.0; -		} +	/* Override from passed dc->bb_overrides if available*/ +	if ((int)(dcn3_2_soc.sr_exit_time_us * 1000) != dc->bb_overrides.sr_exit_time_ns +			&& dc->bb_overrides.sr_exit_time_ns) { +		dcn3_2_soc.sr_exit_time_us = dc->bb_overrides.sr_exit_time_ns / 1000.0; +	} -		if ((int)(dcn3_2_soc.urgent_latency_us * 1000) != dc->bb_overrides.urgent_latency_ns -			&& dc->bb_overrides.urgent_latency_ns) { -			dcn3_2_soc.urgent_latency_us = dc->bb_overrides.urgent_latency_ns / 1000.0; -			dcn3_2_soc.urgent_latency_pixel_data_only_us = dc->bb_overrides.urgent_latency_ns / 1000.0; -		} +	if ((int)(dcn3_2_soc.sr_enter_plus_exit_time_us * 1000) +			!= dc->bb_overrides.sr_enter_plus_exit_time_ns +			&& dc->bb_overrides.sr_enter_plus_exit_time_ns) { +		dcn3_2_soc.sr_enter_plus_exit_time_us = +			dc->bb_overrides.sr_enter_plus_exit_time_ns / 1000.0; +	} -		if ((int)(dcn3_2_soc.dram_clock_change_latency_us * 1000) -				!= dc->bb_overrides.dram_clock_change_latency_ns -				&& dc->bb_overrides.dram_clock_change_latency_ns) { -			dcn3_2_soc.dram_clock_change_latency_us = -				dc->bb_overrides.dram_clock_change_latency_ns / 1000.0; -		} +	if ((int)(dcn3_2_soc.urgent_latency_us * 1000) != dc->bb_overrides.urgent_latency_ns +		&& dc->bb_overrides.urgent_latency_ns) { +		dcn3_2_soc.urgent_latency_us = dc->bb_overrides.urgent_latency_ns / 1000.0; +		dcn3_2_soc.urgent_latency_pixel_data_only_us = dc->bb_overrides.urgent_latency_ns / 1000.0; +	} -		if ((int)(dcn3_2_soc.fclk_change_latency_us * 1000) -				!= dc->bb_overrides.fclk_clock_change_latency_ns -				&& dc->bb_overrides.fclk_clock_change_latency_ns) { -			dcn3_2_soc.fclk_change_latency_us = -				dc->bb_overrides.fclk_clock_change_latency_ns / 1000; -		} +	if ((int)(dcn3_2_soc.dram_clock_change_latency_us * 1000) +			!= dc->bb_overrides.dram_clock_change_latency_ns +			&& dc->bb_overrides.dram_clock_change_latency_ns) { +		dcn3_2_soc.dram_clock_change_latency_us = +			dc->bb_overrides.dram_clock_change_latency_ns / 1000.0; +	} -		if ((int)(dcn3_2_soc.dummy_pstate_latency_us * 1000) -				!= dc->bb_overrides.dummy_clock_change_latency_ns -				&& dc->bb_overrides.dummy_clock_change_latency_ns) { -			dcn3_2_soc.dummy_pstate_latency_us = -				dc->bb_overrides.dummy_clock_change_latency_ns / 1000.0; -		} +	if ((int)(dcn3_2_soc.fclk_change_latency_us * 1000) +			!= dc->bb_overrides.fclk_clock_change_latency_ns +			&& dc->bb_overrides.fclk_clock_change_latency_ns) { +		dcn3_2_soc.fclk_change_latency_us = +			dc->bb_overrides.fclk_clock_change_latency_ns / 1000; +	} -		/* Override from VBIOS if VBIOS bb_info available */ -		if (dc->ctx->dc_bios->funcs->get_soc_bb_info) { -			struct bp_soc_bb_info bb_info = {0}; +	if ((int)(dcn3_2_soc.dummy_pstate_latency_us * 1000) +			!= dc->bb_overrides.dummy_clock_change_latency_ns +			&& dc->bb_overrides.dummy_clock_change_latency_ns) { +		dcn3_2_soc.dummy_pstate_latency_us = +			dc->bb_overrides.dummy_clock_change_latency_ns / 1000.0; +	} -			if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) { -				if (bb_info.dram_clock_change_latency_100ns > 0) -					dcn3_2_soc.dram_clock_change_latency_us = -						bb_info.dram_clock_change_latency_100ns * 10; +	/* Override from VBIOS if VBIOS bb_info available */ +	if (dc->ctx->dc_bios->funcs->get_soc_bb_info) { +		struct bp_soc_bb_info bb_info = {0}; -				if (bb_info.dram_sr_enter_exit_latency_100ns > 0) -					dcn3_2_soc.sr_enter_plus_exit_time_us = -						bb_info.dram_sr_enter_exit_latency_100ns * 10; +		if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) { +			if (bb_info.dram_clock_change_latency_100ns > 0) +				dcn3_2_soc.dram_clock_change_latency_us = +					bb_info.dram_clock_change_latency_100ns * 10; -				if (bb_info.dram_sr_exit_latency_100ns > 0) -					dcn3_2_soc.sr_exit_time_us = -						bb_info.dram_sr_exit_latency_100ns * 10; -			} -		} +			if (bb_info.dram_sr_enter_exit_latency_100ns > 0) +				dcn3_2_soc.sr_enter_plus_exit_time_us = +					bb_info.dram_sr_enter_exit_latency_100ns * 10; -		/* Override from VBIOS for num_chan */ -		if (dc->ctx->dc_bios->vram_info.num_chans) { -			dcn3_2_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans; -			dcn3_2_soc.mall_allocated_for_dcn_mbytes = (double)(dcn32_calc_num_avail_chans_for_mall(dc, -				dc->ctx->dc_bios->vram_info.num_chans) * dc->caps.mall_size_per_mem_channel); +			if (bb_info.dram_sr_exit_latency_100ns > 0) +				dcn3_2_soc.sr_exit_time_us = +					bb_info.dram_sr_exit_latency_100ns * 10;  		} +	} -		if (dc->ctx->dc_bios->vram_info.dram_channel_width_bytes) -			dcn3_2_soc.dram_channel_width_bytes = dc->ctx->dc_bios->vram_info.dram_channel_width_bytes; +	/* Override from VBIOS for num_chan */ +	if (dc->ctx->dc_bios->vram_info.num_chans) { +		dcn3_2_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans; +		dcn3_2_soc.mall_allocated_for_dcn_mbytes = (double)(dcn32_calc_num_avail_chans_for_mall(dc, +			dc->ctx->dc_bios->vram_info.num_chans) * dc->caps.mall_size_per_mem_channel);  	} +	if (dc->ctx->dc_bios->vram_info.dram_channel_width_bytes) +		dcn3_2_soc.dram_channel_width_bytes = dc->ctx->dc_bios->vram_info.dram_channel_width_bytes; +  	/* DML DSC delay factor workaround */  	dcn3_2_ip.dsc_delay_factor_wa = dc->debug.dsc_delay_factor_wa_x1000 / 1000.0; @@ -2592,7 +2671,7 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa  	dc->dml.soc.dispclk_dppclk_vco_speed_mhz = dc->clk_mgr->dentist_vco_freq_khz / 1000.0;  	/* Overrides Clock levelsfrom CLK Mgr table entries as reported by PM FW */ -	if ((!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) && (bw_params->clk_table.entries[0].memclk_mhz)) { +	if (bw_params->clk_table.entries[0].memclk_mhz) {  		if (dc->debug.use_legacy_soc_bb_mechanism) {  			unsigned int i = 0, j = 0, num_states = 0; @@ -2736,7 +2815,8 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa  				dcn3_2_soc.clock_limits[i].phyclk_d32_mhz = dcn3_2_soc.clock_limits[0].phyclk_d32_mhz;  			}  		} else { -			build_synthetic_soc_states(bw_params, dcn3_2_soc.clock_limits, &dcn3_2_soc.num_states); +			build_synthetic_soc_states(dc->debug.disable_dc_mode_overwrite, bw_params, +					dcn3_2_soc.clock_limits, &dcn3_2_soc.num_states);  		}  		/* Re-init DML with updated bb */ @@ -2783,15 +2863,58 @@ bool dcn32_allow_subvp_with_active_margin(struct pipe_ctx *pipe)  }  /** - * ******************************************************************************************* - * dcn32_determine_max_vratio_prefetch: Determine max Vratio for prefetch by driver policy + * dcn32_allow_subvp_high_refresh_rate: Determine if the high refresh rate config will allow subvp   * - * @param [in]: dc: Current DC state - * @param [in]: context: New DC state to be programmed + * @dc: Current DC state + * @context: New DC state to be programmed + * @pipe: Pipe to be considered for use in subvp + * + * On high refresh rate display configs, we will allow subvp under the following conditions: + * 1. Resolution is 3840x2160, 3440x1440, or 2560x1440 + * 2. Refresh rate is between 120hz - 165hz + * 3. No scaling + * 4. Freesync is inactive + * 5. For single display cases, freesync must be disabled + * + * Return: True if pipe can be used for subvp, false otherwise + */ +bool dcn32_allow_subvp_high_refresh_rate(struct dc *dc, struct dc_state *context, struct pipe_ctx *pipe) +{ +	bool allow = false; +	uint32_t refresh_rate = 0; +	uint32_t min_refresh = subvp_high_refresh_list.min_refresh; +	uint32_t max_refresh = subvp_high_refresh_list.max_refresh; +	uint32_t i; + +	if (!dc->debug.disable_subvp_high_refresh && pipe->stream && +			pipe->plane_state && !(pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed)) { +		refresh_rate = (pipe->stream->timing.pix_clk_100hz * 100 + +						pipe->stream->timing.v_total * pipe->stream->timing.h_total - 1) +						/ (double)(pipe->stream->timing.v_total * pipe->stream->timing.h_total); +		if (refresh_rate >= min_refresh && refresh_rate <= max_refresh) { +			for (i = 0; i < SUBVP_HIGH_REFRESH_LIST_LEN; i++) { +				uint32_t width = subvp_high_refresh_list.res[i].width; +				uint32_t height = subvp_high_refresh_list.res[i].height; + +				if (dcn32_check_native_scaling_for_res(pipe, width, height)) { +					if ((context->stream_count == 1 && !pipe->stream->allow_freesync) || context->stream_count > 1) { +						allow = true; +						break; +					} +				} +			} +		} +	} +	return allow; +} + +/** + * dcn32_determine_max_vratio_prefetch: Determine max Vratio for prefetch by driver policy   * - * @return: Max vratio for prefetch + * @dc: Current DC state + * @context: New DC state to be programmed   * - * ******************************************************************************************* + * Return: Max vratio for prefetch   */  double dcn32_determine_max_vratio_prefetch(struct dc *dc, struct dc_state *context)  { @@ -2821,9 +2944,9 @@ double dcn32_determine_max_vratio_prefetch(struct dc *dc, struct dc_state *conte   * ActiveMargin <= 0 to be the FPO stream candidate if found.   *   * - * @param [in]: dc - current dc state - * @param [in]: context - new dc state - * @param [out]: fpo_candidate_stream - pointer to FPO stream candidate if one is found + * @dc: current dc state + * @context: new dc state + * @fpo_candidate_stream: pointer to FPO stream candidate if one is found   *   * Return: void   */ @@ -2849,10 +2972,9 @@ void dcn32_assign_fpo_vactive_candidate(struct dc *dc, const struct dc_state *co  /**   * dcn32_find_vactive_pipe - Determines if the config has a pipe that can switch in VACTIVE   * - * @param [in]: dc - current dc state - * @param [in]: context - new dc state - * @param [in]: vactive_margin_req_us - The vactive marign required for a vactive pipe to be - *                                      considered "found" + * @dc: current dc state + * @context: new dc state + * @vactive_margin_req_us: The vactive marign required for a vactive pipe to be considered "found"   *   * Return: True if VACTIVE display is found, false otherwise   */ @@ -2861,6 +2983,7 @@ bool dcn32_find_vactive_pipe(struct dc *dc, const struct dc_state *context, uint  	unsigned int i, pipe_idx;  	const struct vba_vars_st *vba = &context->bw_ctx.dml.vba;  	bool vactive_found = false; +	unsigned int blank_us = 0;  	for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {  		const struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i]; @@ -2868,7 +2991,10 @@ bool dcn32_find_vactive_pipe(struct dc *dc, const struct dc_state *context, uint  		if (!pipe->stream)  			continue; -		if (vba->ActiveDRAMClockChangeLatencyMarginPerState[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]] >= vactive_margin_req_us) { +		blank_us = ((pipe->stream->timing.v_total - pipe->stream->timing.v_addressable) * pipe->stream->timing.h_total / +				(double)(pipe->stream->timing.pix_clk_100hz * 100)) * 1000000; +		if (vba->ActiveDRAMClockChangeLatencyMarginPerState[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]] >= vactive_margin_req_us && +				!(pipe->stream->vrr_active_variable || pipe->stream->vrr_active_fixed) && blank_us < dc->debug.fpo_vactive_max_blank_us) {  			vactive_found = true;  			break;  		} @@ -2882,3 +3008,18 @@ void dcn32_set_clock_limits(const struct _vcs_dpi_soc_bounding_box_st *soc_bb)  	dc_assert_fp_enabled();  	dcn3_2_soc.clock_limits[0].dcfclk_mhz = 1200.0;  } + +void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context) +{ +	// WA: restrict FPO and SubVP to use first non-strobe mode (DCN32 BW issue) +	if ((context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || dcn32_subvp_in_use(dc, context)) && +			dc->dml.soc.num_chans <= 8) { +		int num_mclk_levels = dc->clk_mgr->bw_params->clk_table.num_entries_per_clk.num_memclk_levels; + +		if (context->bw_ctx.dml.vba.DRAMSpeed <= dc->clk_mgr->bw_params->clk_table.entries[0].memclk_mhz * 16 && +				num_mclk_levels > 1) { +			context->bw_ctx.dml.vba.DRAMSpeed = dc->clk_mgr->bw_params->clk_table.entries[1].memclk_mhz * 16; +			context->bw_ctx.bw.dcn.clk.dramclk_khz = context->bw_ctx.dml.vba.DRAMSpeed * 1000 / 16; +		} +	} +} diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h index dcf512cd3072..a4206b71d650 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h @@ -80,6 +80,8 @@ void dcn32_assign_fpo_vactive_candidate(struct dc *dc, const struct dc_state *co  bool dcn32_find_vactive_pipe(struct dc *dc, const struct dc_state *context, uint32_t vactive_margin_req); +void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context); +  void dcn32_set_clock_limits(const struct _vcs_dpi_soc_bounding_box_st *soc_bb);  #endif diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c index d75248b6cae9..cbdfb762c10c 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c @@ -811,7 +811,7 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman  					v->SwathHeightC[k],  					TWait,  					(v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ || -						v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= MIN_DCFCLK_FREQ_MHZ) ? +						v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?  							mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,  					/* Output */  					&v->DSTXAfterScaler[k], @@ -2323,10 +2323,14 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  		mode_lib->vba.LinkCapacitySupport[i] = true;  		for (k = 0; k < mode_lib->vba.NumberOfActiveSurfaces; ++k) {  			if (mode_lib->vba.BlendingAndTiming[k] == k -					&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0 -							|| mode_lib->vba.Output[k] == dm_edp -							|| mode_lib->vba.Output[k] == dm_hdmi) -					&& mode_lib->vba.OutputBppPerState[i][k] == 0) { +				&& (mode_lib->vba.Output[k] == dm_dp || mode_lib->vba.Output[k] == dm_dp2p0 +					|| mode_lib->vba.Output[k] == dm_edp +					|| mode_lib->vba.Output[k] == dm_hdmi) +				&& mode_lib->vba.OutputBppPerState[i][k] == 0 && +				(mode_lib->vba.UsesMALLForPStateChange[k] != dm_use_mall_pstate_change_phantom_pipe)) { +				/* Phantom pipes don't consider DSC in DML, so it could fail link check. +				 * However, we don't care about the link for phantom pipes. +				 */  				mode_lib->vba.LinkCapacitySupport[i] = false;  			}  		} @@ -3311,7 +3315,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  							v->swath_width_chroma_ub_this_state[k],  							v->SwathHeightYThisState[k],  							v->SwathHeightCThisState[k], v->TWait, -							(v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= MIN_DCFCLK_FREQ_MHZ) ? +							(v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ) ?  									mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,  							/* Output */ diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h index d98e36a9a09c..c4745d63039b 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h @@ -53,7 +53,7 @@  #define BPP_BLENDED_PIPE 0xffffffff  #define MEM_STROBE_FREQ_MHZ 1600 -#define MIN_DCFCLK_FREQ_MHZ 200 +#define DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ 300  #define MEM_STROBE_MAX_DELIVERY_TIME_US 60.0  struct display_mode_lib; diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c index 61cc4904ade4..a50e7f4dce42 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c @@ -1595,7 +1595,6 @@ double dml32_TruncToValidBPP(  	unsigned int   NonDSCBPP0;  	unsigned int   NonDSCBPP1;  	unsigned int   NonDSCBPP2; -	unsigned int   NonDSCBPP3;  	if (Format == dm_420) {  		NonDSCBPP0 = 12; @@ -1604,10 +1603,9 @@ double dml32_TruncToValidBPP(  		MinDSCBPP = 6;  		MaxDSCBPP = 1.5 * DSCInputBitPerComponent - 1 / 16;  	} else if (Format == dm_444) { -		NonDSCBPP0 = 18; -		NonDSCBPP1 = 24; -		NonDSCBPP2 = 30; -		NonDSCBPP3 = 36; +		NonDSCBPP0 = 24; +		NonDSCBPP1 = 30; +		NonDSCBPP2 = 36;  		MinDSCBPP = 8;  		MaxDSCBPP = 3 * DSCInputBitPerComponent - 1.0 / 16;  	} else { @@ -1661,9 +1659,7 @@ double dml32_TruncToValidBPP(  			else  				return dml_floor(16.0 * MaxLinkBPP, 1.0) / 16.0;  		} else { -			if (MaxLinkBPP >= NonDSCBPP3) -				return NonDSCBPP3; -			else if (MaxLinkBPP >= NonDSCBPP2) +			if (MaxLinkBPP >= NonDSCBPP2)  				return NonDSCBPP2;  			else if (MaxLinkBPP >= NonDSCBPP1)  				return NonDSCBPP1; @@ -1674,7 +1670,7 @@ double dml32_TruncToValidBPP(  		}  	} else {  		if (!((DSCEnable == false && (DesiredBPP == NonDSCBPP2 || DesiredBPP == NonDSCBPP1 || -				DesiredBPP == NonDSCBPP0 || DesiredBPP == NonDSCBPP3)) || +				DesiredBPP <= NonDSCBPP0)) ||  				(DSCEnable && DesiredBPP >= MinDSCBPP && DesiredBPP <= MaxDSCBPP)))  			return BPP_INVALID;  		else @@ -4342,7 +4338,7 @@ void dml32_CalculateWatermarksMALLUseAndDRAMSpeedChangeSupport(  				+ v->WritebackChunkSize * 1024.0 / 32.0 / SOCCLK;  	}  	if (v->USRRetrainingRequiredFinal) -		v->Watermark.WritebackUrgentWatermark = v->Watermark.WritebackUrgentWatermark +		v->Watermark.WritebackDRAMClockChangeWatermark = v->Watermark.WritebackDRAMClockChangeWatermark  				+ mmSOCParameters.USRRetrainingLatency;  	if (TotalActiveWriteback <= 1) { @@ -4660,6 +4656,10 @@ void dml32_CalculateMinAndMaxPrefetchMode(  	} else if (AllowForPStateChangeOrStutterInVBlankFinal == dm_prefetch_support_uclk_fclk_and_stutter) {  		*MinPrefetchMode = 0;  		*MaxPrefetchMode = 0; +	} else if (AllowForPStateChangeOrStutterInVBlankFinal == +			dm_prefetch_support_uclk_fclk_and_stutter_if_possible) { +		*MinPrefetchMode = 0; +		*MaxPrefetchMode = 3;  	} else {  		*MinPrefetchMode = 0;  		*MaxPrefetchMode = 3; diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.c b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.c index 395ae8761980..9ba6cb67655f 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/display_rq_dlg_calc_32.c @@ -116,7 +116,7 @@ void dml32_rq_dlg_get_rq_reg(display_rq_regs_st *rq_regs,  	else  		rq_regs->rq_regs_l.min_meta_chunk_size = dml_log2(min_meta_chunk_bytes) - 6 + 1; -	if (min_meta_chunk_bytes == 0) +	if (p1_min_meta_chunk_bytes == 0)  		rq_regs->rq_regs_c.min_meta_chunk_size = 0;  	else  		rq_regs->rq_regs_c.min_meta_chunk_size = dml_log2(p1_min_meta_chunk_bytes) - 6 + 1; diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c b/drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c index 342a1bcb4927..f0683fd9d3f0 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn321/dcn321_fpu.c @@ -252,14 +252,48 @@ static void remove_entry_from_table_at_index(struct _vcs_dpi_voltage_scaling_st  	memset(&table[--(*num_entries)], 0, sizeof(struct _vcs_dpi_voltage_scaling_st));  } -static int build_synthetic_soc_states(struct clk_bw_params *bw_params, +/* + * override_max_clk_values - Overwrite the max clock frequencies with the max DC mode timings + * Input: + *	max_clk_limit - struct containing the desired clock timings + * Output: + *	curr_clk_limit  - struct containing the timings that need to be overwritten + * Return: 0 upon success, non-zero for failure + */ +static int override_max_clk_values(struct clk_limit_table_entry *max_clk_limit, +		struct clk_limit_table_entry *curr_clk_limit) +{ +	if (NULL == max_clk_limit || NULL == curr_clk_limit) +		return -1; //invalid parameters + +	//only overwrite if desired max clock frequency is initialized +	if (max_clk_limit->dcfclk_mhz != 0) +		curr_clk_limit->dcfclk_mhz = max_clk_limit->dcfclk_mhz; + +	if (max_clk_limit->fclk_mhz != 0) +		curr_clk_limit->fclk_mhz = max_clk_limit->fclk_mhz; + +	if (max_clk_limit->memclk_mhz != 0) +		curr_clk_limit->memclk_mhz = max_clk_limit->memclk_mhz; + +	if (max_clk_limit->socclk_mhz != 0) +		curr_clk_limit->socclk_mhz = max_clk_limit->socclk_mhz; + +	if (max_clk_limit->dtbclk_mhz != 0) +		curr_clk_limit->dtbclk_mhz = max_clk_limit->dtbclk_mhz; + +	if (max_clk_limit->dispclk_mhz != 0) +		curr_clk_limit->dispclk_mhz = max_clk_limit->dispclk_mhz; + +	return 0; +} + +static int build_synthetic_soc_states(bool disable_dc_mode_overwrite, struct clk_bw_params *bw_params,  		struct _vcs_dpi_voltage_scaling_st *table, unsigned int *num_entries)  {  	int i, j;  	struct _vcs_dpi_voltage_scaling_st entry = {0}; - -	unsigned int max_dcfclk_mhz = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0, -			max_phyclk_mhz = 0, max_dtbclk_mhz = 0, max_fclk_mhz = 0, max_uclk_mhz = 0; +	struct clk_limit_table_entry max_clk_data = {0};  	unsigned int min_dcfclk_mhz = 199, min_fclk_mhz = 299; @@ -270,53 +304,78 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	unsigned int num_fclk_dpms = 0;  	unsigned int num_dcfclk_dpms = 0; +	unsigned int num_dc_uclk_dpms = 0; +	unsigned int num_dc_fclk_dpms = 0; +	unsigned int num_dc_dcfclk_dpms = 0; +  	for (i = 0; i < MAX_NUM_DPM_LVL; i++) { -		if (bw_params->clk_table.entries[i].dcfclk_mhz > max_dcfclk_mhz) -			max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; -		if (bw_params->clk_table.entries[i].fclk_mhz > max_fclk_mhz) -			max_fclk_mhz = bw_params->clk_table.entries[i].fclk_mhz; -		if (bw_params->clk_table.entries[i].memclk_mhz > max_uclk_mhz) -			max_uclk_mhz = bw_params->clk_table.entries[i].memclk_mhz; -		if (bw_params->clk_table.entries[i].dispclk_mhz > max_dispclk_mhz) -			max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; -		if (bw_params->clk_table.entries[i].dppclk_mhz > max_dppclk_mhz) -			max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; -		if (bw_params->clk_table.entries[i].phyclk_mhz > max_phyclk_mhz) -			max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; -		if (bw_params->clk_table.entries[i].dtbclk_mhz > max_dtbclk_mhz) -			max_dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz; +		if (bw_params->clk_table.entries[i].dcfclk_mhz > max_clk_data.dcfclk_mhz) +			max_clk_data.dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; +		if (bw_params->clk_table.entries[i].fclk_mhz > max_clk_data.fclk_mhz) +			max_clk_data.fclk_mhz = bw_params->clk_table.entries[i].fclk_mhz; +		if (bw_params->clk_table.entries[i].memclk_mhz > max_clk_data.memclk_mhz) +			max_clk_data.memclk_mhz = bw_params->clk_table.entries[i].memclk_mhz; +		if (bw_params->clk_table.entries[i].dispclk_mhz > max_clk_data.dispclk_mhz) +			max_clk_data.dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; +		if (bw_params->clk_table.entries[i].dppclk_mhz > max_clk_data.dppclk_mhz) +			max_clk_data.dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; +		if (bw_params->clk_table.entries[i].phyclk_mhz > max_clk_data.phyclk_mhz) +			max_clk_data.phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; +		if (bw_params->clk_table.entries[i].dtbclk_mhz > max_clk_data.dtbclk_mhz) +			max_clk_data.dtbclk_mhz = bw_params->clk_table.entries[i].dtbclk_mhz; -		if (bw_params->clk_table.entries[i].memclk_mhz > 0) +		if (bw_params->clk_table.entries[i].memclk_mhz > 0) {  			num_uclk_dpms++; -		if (bw_params->clk_table.entries[i].fclk_mhz > 0) +			if (bw_params->clk_table.entries[i].memclk_mhz <= bw_params->dc_mode_limit.memclk_mhz) +				num_dc_uclk_dpms++; +		} +		if (bw_params->clk_table.entries[i].fclk_mhz > 0) {  			num_fclk_dpms++; -		if (bw_params->clk_table.entries[i].dcfclk_mhz > 0) +			if (bw_params->clk_table.entries[i].fclk_mhz <= bw_params->dc_mode_limit.fclk_mhz) +				num_dc_fclk_dpms++; +		} +		if (bw_params->clk_table.entries[i].dcfclk_mhz > 0) {  			num_dcfclk_dpms++; +			if (bw_params->clk_table.entries[i].dcfclk_mhz <= bw_params->dc_mode_limit.dcfclk_mhz) +				num_dc_dcfclk_dpms++; +		} +	} + +	if (!disable_dc_mode_overwrite) { +		//Overwrite max frequencies with max DC mode frequencies for DC mode systems +		override_max_clk_values(&bw_params->dc_mode_limit, &max_clk_data); +		num_uclk_dpms = num_dc_uclk_dpms; +		num_fclk_dpms = num_dc_fclk_dpms; +		num_dcfclk_dpms = num_dc_dcfclk_dpms; +		bw_params->clk_table.num_entries_per_clk.num_memclk_levels = num_uclk_dpms; +		bw_params->clk_table.num_entries_per_clk.num_fclk_levels = num_fclk_dpms;  	}  	if (num_dcfclk_dpms > 0 && bw_params->clk_table.entries[0].fclk_mhz > min_fclk_mhz)  		min_fclk_mhz = bw_params->clk_table.entries[0].fclk_mhz; -	if (!max_dcfclk_mhz || !max_dispclk_mhz || !max_dtbclk_mhz) +	if (!max_clk_data.dcfclk_mhz || !max_clk_data.dispclk_mhz || !max_clk_data.dtbclk_mhz)  		return -1; -	if (max_dppclk_mhz == 0) -		max_dppclk_mhz = max_dispclk_mhz; +	if (max_clk_data.dppclk_mhz == 0) +		max_clk_data.dppclk_mhz = max_clk_data.dispclk_mhz; -	if (max_fclk_mhz == 0) -		max_fclk_mhz = max_dcfclk_mhz * dcn3_21_soc.pct_ideal_sdp_bw_after_urgent / dcn3_21_soc.pct_ideal_fabric_bw_after_urgent; +	if (max_clk_data.fclk_mhz == 0) +		max_clk_data.fclk_mhz = max_clk_data.dcfclk_mhz * +				dcn3_2_soc.pct_ideal_sdp_bw_after_urgent / +				dcn3_2_soc.pct_ideal_fabric_bw_after_urgent; -	if (max_phyclk_mhz == 0) -		max_phyclk_mhz = dcn3_21_soc.clock_limits[0].phyclk_mhz; +	if (max_clk_data.phyclk_mhz == 0) +		max_clk_data.phyclk_mhz = dcn3_2_soc.clock_limits[0].phyclk_mhz;  	*num_entries = 0; -	entry.dispclk_mhz = max_dispclk_mhz; -	entry.dscclk_mhz = max_dispclk_mhz / 3; -	entry.dppclk_mhz = max_dppclk_mhz; -	entry.dtbclk_mhz = max_dtbclk_mhz; -	entry.phyclk_mhz = max_phyclk_mhz; -	entry.phyclk_d18_mhz = dcn3_21_soc.clock_limits[0].phyclk_d18_mhz; -	entry.phyclk_d32_mhz = dcn3_21_soc.clock_limits[0].phyclk_d32_mhz; +	entry.dispclk_mhz = max_clk_data.dispclk_mhz; +	entry.dscclk_mhz = max_clk_data.dispclk_mhz / 3; +	entry.dppclk_mhz = max_clk_data.dppclk_mhz; +	entry.dtbclk_mhz = max_clk_data.dtbclk_mhz; +	entry.phyclk_mhz = max_clk_data.phyclk_mhz; +	entry.phyclk_d18_mhz = dcn3_2_soc.clock_limits[0].phyclk_d18_mhz; +	entry.phyclk_d32_mhz = dcn3_2_soc.clock_limits[0].phyclk_d32_mhz;  	// Insert all the DCFCLK STAs  	for (i = 0; i < num_dcfclk_stas; i++) { @@ -328,7 +387,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	}  	// Insert the max DCFCLK -	entry.dcfclk_mhz = max_dcfclk_mhz; +	entry.dcfclk_mhz = max_clk_data.dcfclk_mhz;  	entry.fabricclk_mhz = 0;  	entry.dram_speed_mts = 0; @@ -356,7 +415,7 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	// If FCLK fine grained, only insert max  	else {  		entry.dcfclk_mhz = 0; -		entry.fabricclk_mhz = max_fclk_mhz; +		entry.fabricclk_mhz = max_clk_data.fclk_mhz;  		entry.dram_speed_mts = 0;  		dcn321_insert_entry_into_table_sorted(table, num_entries, &entry); @@ -368,9 +427,9 @@ static int build_synthetic_soc_states(struct clk_bw_params *bw_params,  	// Remove states that require higher clocks than are supported  	for (i = *num_entries - 1; i >= 0 ; i--) { -		if (table[i].dcfclk_mhz > max_dcfclk_mhz || -				table[i].fabricclk_mhz > max_fclk_mhz || -				table[i].dram_speed_mts > max_uclk_mhz * 16) +		if (table[i].dcfclk_mhz > max_clk_data.dcfclk_mhz || +				table[i].fabricclk_mhz > max_clk_data.fclk_mhz || +				table[i].dram_speed_mts > max_clk_data.memclk_mhz * 16)  			remove_entry_from_table_at_index(table, num_entries, i);  	} @@ -471,80 +530,78 @@ static void dcn321_get_optimal_dcfclk_fclk_for_uclk(unsigned int uclk_mts,  void dcn321_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_params)  {  	dc_assert_fp_enabled(); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		/* Overrides from dc->config options */ -		dcn3_21_ip.clamp_min_dcfclk = dc->config.clamp_min_dcfclk; +	/* Overrides from dc->config options */ +	dcn3_21_ip.clamp_min_dcfclk = dc->config.clamp_min_dcfclk; -		/* Override from passed dc->bb_overrides if available*/ -		if ((int)(dcn3_21_soc.sr_exit_time_us * 1000) != dc->bb_overrides.sr_exit_time_ns -				&& dc->bb_overrides.sr_exit_time_ns) { -			dcn3_21_soc.sr_exit_time_us = dc->bb_overrides.sr_exit_time_ns / 1000.0; -		} - -		if ((int)(dcn3_21_soc.sr_enter_plus_exit_time_us * 1000) -				!= dc->bb_overrides.sr_enter_plus_exit_time_ns -				&& dc->bb_overrides.sr_enter_plus_exit_time_ns) { -			dcn3_21_soc.sr_enter_plus_exit_time_us = -				dc->bb_overrides.sr_enter_plus_exit_time_ns / 1000.0; -		} +	/* Override from passed dc->bb_overrides if available*/ +	if ((int)(dcn3_21_soc.sr_exit_time_us * 1000) != dc->bb_overrides.sr_exit_time_ns +			&& dc->bb_overrides.sr_exit_time_ns) { +		dcn3_21_soc.sr_exit_time_us = dc->bb_overrides.sr_exit_time_ns / 1000.0; +	} -		if ((int)(dcn3_21_soc.urgent_latency_us * 1000) != dc->bb_overrides.urgent_latency_ns -			&& dc->bb_overrides.urgent_latency_ns) { -			dcn3_21_soc.urgent_latency_us = dc->bb_overrides.urgent_latency_ns / 1000.0; -			dcn3_21_soc.urgent_latency_pixel_data_only_us = dc->bb_overrides.urgent_latency_ns / 1000.0; -		} +	if ((int)(dcn3_21_soc.sr_enter_plus_exit_time_us * 1000) +			!= dc->bb_overrides.sr_enter_plus_exit_time_ns +			&& dc->bb_overrides.sr_enter_plus_exit_time_ns) { +		dcn3_21_soc.sr_enter_plus_exit_time_us = +			dc->bb_overrides.sr_enter_plus_exit_time_ns / 1000.0; +	} -		if ((int)(dcn3_21_soc.dram_clock_change_latency_us * 1000) -				!= dc->bb_overrides.dram_clock_change_latency_ns -				&& dc->bb_overrides.dram_clock_change_latency_ns) { -			dcn3_21_soc.dram_clock_change_latency_us = -				dc->bb_overrides.dram_clock_change_latency_ns / 1000.0; -		} +	if ((int)(dcn3_21_soc.urgent_latency_us * 1000) != dc->bb_overrides.urgent_latency_ns +		&& dc->bb_overrides.urgent_latency_ns) { +		dcn3_21_soc.urgent_latency_us = dc->bb_overrides.urgent_latency_ns / 1000.0; +		dcn3_21_soc.urgent_latency_pixel_data_only_us = dc->bb_overrides.urgent_latency_ns / 1000.0; +	} -		if ((int)(dcn3_21_soc.fclk_change_latency_us * 1000) -				!= dc->bb_overrides.fclk_clock_change_latency_ns -				&& dc->bb_overrides.fclk_clock_change_latency_ns) { -			dcn3_21_soc.fclk_change_latency_us = -				dc->bb_overrides.fclk_clock_change_latency_ns / 1000; -		} +	if ((int)(dcn3_21_soc.dram_clock_change_latency_us * 1000) +			!= dc->bb_overrides.dram_clock_change_latency_ns +			&& dc->bb_overrides.dram_clock_change_latency_ns) { +		dcn3_21_soc.dram_clock_change_latency_us = +			dc->bb_overrides.dram_clock_change_latency_ns / 1000.0; +	} -		if ((int)(dcn3_21_soc.dummy_pstate_latency_us * 1000) -				!= dc->bb_overrides.dummy_clock_change_latency_ns -				&& dc->bb_overrides.dummy_clock_change_latency_ns) { -			dcn3_21_soc.dummy_pstate_latency_us = -				dc->bb_overrides.dummy_clock_change_latency_ns / 1000.0; -		} +	if ((int)(dcn3_21_soc.fclk_change_latency_us * 1000) +			!= dc->bb_overrides.fclk_clock_change_latency_ns +			&& dc->bb_overrides.fclk_clock_change_latency_ns) { +		dcn3_21_soc.fclk_change_latency_us = +			dc->bb_overrides.fclk_clock_change_latency_ns / 1000; +	} -		/* Override from VBIOS if VBIOS bb_info available */ -		if (dc->ctx->dc_bios->funcs->get_soc_bb_info) { -			struct bp_soc_bb_info bb_info = {0}; +	if ((int)(dcn3_21_soc.dummy_pstate_latency_us * 1000) +			!= dc->bb_overrides.dummy_clock_change_latency_ns +			&& dc->bb_overrides.dummy_clock_change_latency_ns) { +		dcn3_21_soc.dummy_pstate_latency_us = +			dc->bb_overrides.dummy_clock_change_latency_ns / 1000.0; +	} -			if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) { -				if (bb_info.dram_clock_change_latency_100ns > 0) -					dcn3_21_soc.dram_clock_change_latency_us = -						bb_info.dram_clock_change_latency_100ns * 10; +	/* Override from VBIOS if VBIOS bb_info available */ +	if (dc->ctx->dc_bios->funcs->get_soc_bb_info) { +		struct bp_soc_bb_info bb_info = {0}; -				if (bb_info.dram_sr_enter_exit_latency_100ns > 0) -					dcn3_21_soc.sr_enter_plus_exit_time_us = -						bb_info.dram_sr_enter_exit_latency_100ns * 10; +		if (dc->ctx->dc_bios->funcs->get_soc_bb_info(dc->ctx->dc_bios, &bb_info) == BP_RESULT_OK) { +			if (bb_info.dram_clock_change_latency_100ns > 0) +				dcn3_21_soc.dram_clock_change_latency_us = +					bb_info.dram_clock_change_latency_100ns * 10; -				if (bb_info.dram_sr_exit_latency_100ns > 0) -					dcn3_21_soc.sr_exit_time_us = -						bb_info.dram_sr_exit_latency_100ns * 10; -			} -		} +			if (bb_info.dram_sr_enter_exit_latency_100ns > 0) +				dcn3_21_soc.sr_enter_plus_exit_time_us = +					bb_info.dram_sr_enter_exit_latency_100ns * 10; -		/* Override from VBIOS for num_chan */ -		if (dc->ctx->dc_bios->vram_info.num_chans) { -			dcn3_21_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans; -			dcn3_21_soc.mall_allocated_for_dcn_mbytes = (double)(dcn32_calc_num_avail_chans_for_mall(dc, -				dc->ctx->dc_bios->vram_info.num_chans) * dc->caps.mall_size_per_mem_channel); +			if (bb_info.dram_sr_exit_latency_100ns > 0) +				dcn3_21_soc.sr_exit_time_us = +					bb_info.dram_sr_exit_latency_100ns * 10;  		} +	} -		if (dc->ctx->dc_bios->vram_info.dram_channel_width_bytes) -			dcn3_21_soc.dram_channel_width_bytes = dc->ctx->dc_bios->vram_info.dram_channel_width_bytes; +	/* Override from VBIOS for num_chan */ +	if (dc->ctx->dc_bios->vram_info.num_chans) { +		dcn3_21_soc.num_chans = dc->ctx->dc_bios->vram_info.num_chans; +		dcn3_21_soc.mall_allocated_for_dcn_mbytes = (double)(dcn32_calc_num_avail_chans_for_mall(dc, +			dc->ctx->dc_bios->vram_info.num_chans) * dc->caps.mall_size_per_mem_channel);  	} +	if (dc->ctx->dc_bios->vram_info.dram_channel_width_bytes) +		dcn3_21_soc.dram_channel_width_bytes = dc->ctx->dc_bios->vram_info.dram_channel_width_bytes; +  	/* DML DSC delay factor workaround */  	dcn3_21_ip.dsc_delay_factor_wa = dc->debug.dsc_delay_factor_wa_x1000 / 1000.0; @@ -555,150 +612,149 @@ void dcn321_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_p  	dc->dml.soc.dispclk_dppclk_vco_speed_mhz = dc->clk_mgr->dentist_vco_freq_khz / 1000.0;  	/* Overrides Clock levelsfrom CLK Mgr table entries as reported by PM FW */ -	if ((!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) && (bw_params->clk_table.entries[0].memclk_mhz)) { -		if (dc->debug.use_legacy_soc_bb_mechanism) { -			unsigned int i = 0, j = 0, num_states = 0; +	if (dc->debug.use_legacy_soc_bb_mechanism) { +		unsigned int i = 0, j = 0, num_states = 0; -			unsigned int dcfclk_mhz[DC__VOLTAGE_STATES] = {0}; -			unsigned int dram_speed_mts[DC__VOLTAGE_STATES] = {0}; -			unsigned int optimal_uclk_for_dcfclk_sta_targets[DC__VOLTAGE_STATES] = {0}; -			unsigned int optimal_dcfclk_for_uclk[DC__VOLTAGE_STATES] = {0}; +		unsigned int dcfclk_mhz[DC__VOLTAGE_STATES] = {0}; +		unsigned int dram_speed_mts[DC__VOLTAGE_STATES] = {0}; +		unsigned int optimal_uclk_for_dcfclk_sta_targets[DC__VOLTAGE_STATES] = {0}; +		unsigned int optimal_dcfclk_for_uclk[DC__VOLTAGE_STATES] = {0}; -			unsigned int dcfclk_sta_targets[DC__VOLTAGE_STATES] = {615, 906, 1324, 1564}; -			unsigned int num_dcfclk_sta_targets = 4, num_uclk_states = 0; -			unsigned int max_dcfclk_mhz = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0, max_phyclk_mhz = 0; +		unsigned int dcfclk_sta_targets[DC__VOLTAGE_STATES] = {615, 906, 1324, 1564}; +		unsigned int num_dcfclk_sta_targets = 4, num_uclk_states = 0; +		unsigned int max_dcfclk_mhz = 0, max_dispclk_mhz = 0, max_dppclk_mhz = 0, max_phyclk_mhz = 0; -			for (i = 0; i < MAX_NUM_DPM_LVL; i++) { -				if (bw_params->clk_table.entries[i].dcfclk_mhz > max_dcfclk_mhz) -					max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; -				if (bw_params->clk_table.entries[i].dispclk_mhz > max_dispclk_mhz) -					max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; -				if (bw_params->clk_table.entries[i].dppclk_mhz > max_dppclk_mhz) -					max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; -				if (bw_params->clk_table.entries[i].phyclk_mhz > max_phyclk_mhz) -					max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; -			} -			if (!max_dcfclk_mhz) -				max_dcfclk_mhz = dcn3_21_soc.clock_limits[0].dcfclk_mhz; -			if (!max_dispclk_mhz) -				max_dispclk_mhz = dcn3_21_soc.clock_limits[0].dispclk_mhz; -			if (!max_dppclk_mhz) -				max_dppclk_mhz = dcn3_21_soc.clock_limits[0].dppclk_mhz; -			if (!max_phyclk_mhz) -				max_phyclk_mhz = dcn3_21_soc.clock_limits[0].phyclk_mhz; +		for (i = 0; i < MAX_NUM_DPM_LVL; i++) { +			if (bw_params->clk_table.entries[i].dcfclk_mhz > max_dcfclk_mhz) +				max_dcfclk_mhz = bw_params->clk_table.entries[i].dcfclk_mhz; +			if (bw_params->clk_table.entries[i].dispclk_mhz > max_dispclk_mhz) +				max_dispclk_mhz = bw_params->clk_table.entries[i].dispclk_mhz; +			if (bw_params->clk_table.entries[i].dppclk_mhz > max_dppclk_mhz) +				max_dppclk_mhz = bw_params->clk_table.entries[i].dppclk_mhz; +			if (bw_params->clk_table.entries[i].phyclk_mhz > max_phyclk_mhz) +				max_phyclk_mhz = bw_params->clk_table.entries[i].phyclk_mhz; +		} +		if (!max_dcfclk_mhz) +			max_dcfclk_mhz = dcn3_21_soc.clock_limits[0].dcfclk_mhz; +		if (!max_dispclk_mhz) +			max_dispclk_mhz = dcn3_21_soc.clock_limits[0].dispclk_mhz; +		if (!max_dppclk_mhz) +			max_dppclk_mhz = dcn3_21_soc.clock_limits[0].dppclk_mhz; +		if (!max_phyclk_mhz) +			max_phyclk_mhz = dcn3_21_soc.clock_limits[0].phyclk_mhz; -			if (max_dcfclk_mhz > dcfclk_sta_targets[num_dcfclk_sta_targets-1]) { -				// If max DCFCLK is greater than the max DCFCLK STA target, insert into the DCFCLK STA target array -				dcfclk_sta_targets[num_dcfclk_sta_targets] = max_dcfclk_mhz; -				num_dcfclk_sta_targets++; -			} else if (max_dcfclk_mhz < dcfclk_sta_targets[num_dcfclk_sta_targets-1]) { -				// If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates -				for (i = 0; i < num_dcfclk_sta_targets; i++) { -					if (dcfclk_sta_targets[i] > max_dcfclk_mhz) { -						dcfclk_sta_targets[i] = max_dcfclk_mhz; -						break; -					} +		if (max_dcfclk_mhz > dcfclk_sta_targets[num_dcfclk_sta_targets-1]) { +			// If max DCFCLK is greater than the max DCFCLK STA target, insert into the DCFCLK STA target array +			dcfclk_sta_targets[num_dcfclk_sta_targets] = max_dcfclk_mhz; +			num_dcfclk_sta_targets++; +		} else if (max_dcfclk_mhz < dcfclk_sta_targets[num_dcfclk_sta_targets-1]) { +			// If max DCFCLK is less than the max DCFCLK STA target, cap values and remove duplicates +			for (i = 0; i < num_dcfclk_sta_targets; i++) { +				if (dcfclk_sta_targets[i] > max_dcfclk_mhz) { +					dcfclk_sta_targets[i] = max_dcfclk_mhz; +					break;  				} -				// Update size of array since we "removed" duplicates -				num_dcfclk_sta_targets = i + 1;  			} +			// Update size of array since we "removed" duplicates +			num_dcfclk_sta_targets = i + 1; +		} -			num_uclk_states = bw_params->clk_table.num_entries; +		num_uclk_states = bw_params->clk_table.num_entries; -			// Calculate optimal dcfclk for each uclk -			for (i = 0; i < num_uclk_states; i++) { -				dcn321_get_optimal_dcfclk_fclk_for_uclk(bw_params->clk_table.entries[i].memclk_mhz * 16, -						&optimal_dcfclk_for_uclk[i], NULL); -				if (optimal_dcfclk_for_uclk[i] < bw_params->clk_table.entries[0].dcfclk_mhz) { -					optimal_dcfclk_for_uclk[i] = bw_params->clk_table.entries[0].dcfclk_mhz; -				} +		// Calculate optimal dcfclk for each uclk +		for (i = 0; i < num_uclk_states; i++) { +			dcn321_get_optimal_dcfclk_fclk_for_uclk(bw_params->clk_table.entries[i].memclk_mhz * 16, +					&optimal_dcfclk_for_uclk[i], NULL); +			if (optimal_dcfclk_for_uclk[i] < bw_params->clk_table.entries[0].dcfclk_mhz) { +				optimal_dcfclk_for_uclk[i] = bw_params->clk_table.entries[0].dcfclk_mhz;  			} +		} -			// Calculate optimal uclk for each dcfclk sta target -			for (i = 0; i < num_dcfclk_sta_targets; i++) { -				for (j = 0; j < num_uclk_states; j++) { -					if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j]) { -						optimal_uclk_for_dcfclk_sta_targets[i] = -								bw_params->clk_table.entries[j].memclk_mhz * 16; -						break; -					} +		// Calculate optimal uclk for each dcfclk sta target +		for (i = 0; i < num_dcfclk_sta_targets; i++) { +			for (j = 0; j < num_uclk_states; j++) { +				if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j]) { +					optimal_uclk_for_dcfclk_sta_targets[i] = +							bw_params->clk_table.entries[j].memclk_mhz * 16; +					break;  				}  			} +		} -			i = 0; -			j = 0; -			// create the final dcfclk and uclk table -			while (i < num_dcfclk_sta_targets && j < num_uclk_states && num_states < DC__VOLTAGE_STATES) { -				if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j] && i < num_dcfclk_sta_targets) { -					dcfclk_mhz[num_states] = dcfclk_sta_targets[i]; -					dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++]; +		i = 0; +		j = 0; +		// create the final dcfclk and uclk table +		while (i < num_dcfclk_sta_targets && j < num_uclk_states && num_states < DC__VOLTAGE_STATES) { +			if (dcfclk_sta_targets[i] < optimal_dcfclk_for_uclk[j] && i < num_dcfclk_sta_targets) { +				dcfclk_mhz[num_states] = dcfclk_sta_targets[i]; +				dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++]; +			} else { +				if (j < num_uclk_states && optimal_dcfclk_for_uclk[j] <= max_dcfclk_mhz) { +					dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j]; +					dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;  				} else { -					if (j < num_uclk_states && optimal_dcfclk_for_uclk[j] <= max_dcfclk_mhz) { -						dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j]; -						dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16; -					} else { -						j = num_uclk_states; -					} +					j = num_uclk_states;  				}  			} +		} -			while (i < num_dcfclk_sta_targets && num_states < DC__VOLTAGE_STATES) { -				dcfclk_mhz[num_states] = dcfclk_sta_targets[i]; -				dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++]; -			} +		while (i < num_dcfclk_sta_targets && num_states < DC__VOLTAGE_STATES) { +			dcfclk_mhz[num_states] = dcfclk_sta_targets[i]; +			dram_speed_mts[num_states++] = optimal_uclk_for_dcfclk_sta_targets[i++]; +		} -			while (j < num_uclk_states && num_states < DC__VOLTAGE_STATES && -					optimal_dcfclk_for_uclk[j] <= max_dcfclk_mhz) { -				dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j]; -				dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16; -			} +		while (j < num_uclk_states && num_states < DC__VOLTAGE_STATES && +				optimal_dcfclk_for_uclk[j] <= max_dcfclk_mhz) { +			dcfclk_mhz[num_states] = optimal_dcfclk_for_uclk[j]; +			dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16; +		} -			dcn3_21_soc.num_states = num_states; -			for (i = 0; i < dcn3_21_soc.num_states; i++) { -				dcn3_21_soc.clock_limits[i].state = i; -				dcn3_21_soc.clock_limits[i].dcfclk_mhz = dcfclk_mhz[i]; -				dcn3_21_soc.clock_limits[i].fabricclk_mhz = dcfclk_mhz[i]; +		dcn3_21_soc.num_states = num_states; +		for (i = 0; i < dcn3_21_soc.num_states; i++) { +			dcn3_21_soc.clock_limits[i].state = i; +			dcn3_21_soc.clock_limits[i].dcfclk_mhz = dcfclk_mhz[i]; +			dcn3_21_soc.clock_limits[i].fabricclk_mhz = dcfclk_mhz[i]; -				/* Fill all states with max values of all these clocks */ -				dcn3_21_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz; -				dcn3_21_soc.clock_limits[i].dppclk_mhz  = max_dppclk_mhz; -				dcn3_21_soc.clock_limits[i].phyclk_mhz  = max_phyclk_mhz; -				dcn3_21_soc.clock_limits[i].dscclk_mhz  = max_dispclk_mhz / 3; +			/* Fill all states with max values of all these clocks */ +			dcn3_21_soc.clock_limits[i].dispclk_mhz = max_dispclk_mhz; +			dcn3_21_soc.clock_limits[i].dppclk_mhz  = max_dppclk_mhz; +			dcn3_21_soc.clock_limits[i].phyclk_mhz  = max_phyclk_mhz; +			dcn3_21_soc.clock_limits[i].dscclk_mhz  = max_dispclk_mhz / 3; -				/* Populate from bw_params for DTBCLK, SOCCLK */ -				if (i > 0) { -					if (!bw_params->clk_table.entries[i].dtbclk_mhz) { -						dcn3_21_soc.clock_limits[i].dtbclk_mhz  = dcn3_21_soc.clock_limits[i-1].dtbclk_mhz; -					} else { -						dcn3_21_soc.clock_limits[i].dtbclk_mhz  = bw_params->clk_table.entries[i].dtbclk_mhz; -					} -				} else if (bw_params->clk_table.entries[i].dtbclk_mhz) { +			/* Populate from bw_params for DTBCLK, SOCCLK */ +			if (i > 0) { +				if (!bw_params->clk_table.entries[i].dtbclk_mhz) { +					dcn3_21_soc.clock_limits[i].dtbclk_mhz  = dcn3_21_soc.clock_limits[i-1].dtbclk_mhz; +				} else {  					dcn3_21_soc.clock_limits[i].dtbclk_mhz  = bw_params->clk_table.entries[i].dtbclk_mhz;  				} +			} else if (bw_params->clk_table.entries[i].dtbclk_mhz) { +				dcn3_21_soc.clock_limits[i].dtbclk_mhz  = bw_params->clk_table.entries[i].dtbclk_mhz; +			} -				if (!bw_params->clk_table.entries[i].socclk_mhz && i > 0) -					dcn3_21_soc.clock_limits[i].socclk_mhz = dcn3_21_soc.clock_limits[i-1].socclk_mhz; -				else -					dcn3_21_soc.clock_limits[i].socclk_mhz = bw_params->clk_table.entries[i].socclk_mhz; +			if (!bw_params->clk_table.entries[i].socclk_mhz && i > 0) +				dcn3_21_soc.clock_limits[i].socclk_mhz = dcn3_21_soc.clock_limits[i-1].socclk_mhz; +			else +				dcn3_21_soc.clock_limits[i].socclk_mhz = bw_params->clk_table.entries[i].socclk_mhz; -				if (!dram_speed_mts[i] && i > 0) -					dcn3_21_soc.clock_limits[i].dram_speed_mts = dcn3_21_soc.clock_limits[i-1].dram_speed_mts; -				else -					dcn3_21_soc.clock_limits[i].dram_speed_mts = dram_speed_mts[i]; +			if (!dram_speed_mts[i] && i > 0) +				dcn3_21_soc.clock_limits[i].dram_speed_mts = dcn3_21_soc.clock_limits[i-1].dram_speed_mts; +			else +				dcn3_21_soc.clock_limits[i].dram_speed_mts = dram_speed_mts[i]; -				/* These clocks cannot come from bw_params, always fill from dcn3_21_soc[0] */ -				/* PHYCLK_D18, PHYCLK_D32 */ -				dcn3_21_soc.clock_limits[i].phyclk_d18_mhz = dcn3_21_soc.clock_limits[0].phyclk_d18_mhz; -				dcn3_21_soc.clock_limits[i].phyclk_d32_mhz = dcn3_21_soc.clock_limits[0].phyclk_d32_mhz; -			} -		} else { -			build_synthetic_soc_states(bw_params, dcn3_21_soc.clock_limits, &dcn3_21_soc.num_states); +			/* These clocks cannot come from bw_params, always fill from dcn3_21_soc[0] */ +			/* PHYCLK_D18, PHYCLK_D32 */ +			dcn3_21_soc.clock_limits[i].phyclk_d18_mhz = dcn3_21_soc.clock_limits[0].phyclk_d18_mhz; +			dcn3_21_soc.clock_limits[i].phyclk_d32_mhz = dcn3_21_soc.clock_limits[0].phyclk_d32_mhz;  		} - -		/* Re-init DML with updated bb */ -		dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32); -		if (dc->current_state) -			dml_init_instance(&dc->current_state->bw_ctx.dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32); +	} else { +		build_synthetic_soc_states(dc->debug.disable_dc_mode_overwrite, bw_params, +			dcn3_21_soc.clock_limits, &dcn3_21_soc.num_states);  	} + +	/* Re-init DML with updated bb */ +	dml_init_instance(&dc->dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32); +	if (dc->current_state) +		dml_init_instance(&dc->current_state->bw_ctx.dml, &dcn3_21_soc, &dcn3_21_ip, DML_PROJECT_DCN32);  } diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c index bdf3ac6cadd5..da0cfbb071e6 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c +++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.c @@ -113,7 +113,6 @@ void dml_init_instance(struct display_mode_lib *lib,  		lib->funcs = dml30_funcs;  		break;  	case DML_PROJECT_DCN31: -	case DML_PROJECT_DCN31_FPGA:  	case DML_PROJECT_DCN315:  		lib->funcs = dml31_funcs;  		break; diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h index a9d49ef58fb5..5edf69fa40d1 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h +++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_lib.h @@ -41,7 +41,6 @@ enum dml_project {  	DML_PROJECT_DCN30,  	DML_PROJECT_DCN31,  	DML_PROJECT_DCN315, -	DML_PROJECT_DCN31_FPGA,  	DML_PROJECT_DCN314,  	DML_PROJECT_DCN32,  }; diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h index 3c077164f362..ff0246a9458f 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h +++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h @@ -619,8 +619,7 @@ struct _vcs_dpi_display_dlg_regs_st {  	unsigned int refcyc_h_blank_end;  	unsigned int dlg_vblank_end;  	unsigned int min_dst_y_next_start; -	unsigned int optimized_min_dst_y_next_start; -	unsigned int optimized_min_dst_y_next_start_us; +	unsigned int min_dst_y_next_start_us;  	unsigned int refcyc_per_htotal;  	unsigned int refcyc_x_after_scaler;  	unsigned int dst_y_after_scaler; diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c index f9653f511baa..9a3ded311195 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c +++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c @@ -571,6 +571,10 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)  		mode_lib->vba.OutputLinkDPRate[mode_lib->vba.NumberOfActivePlanes] = dout->dp_rate;  		mode_lib->vba.ODMUse[mode_lib->vba.NumberOfActivePlanes] = dst->odm_combine_policy;  		mode_lib->vba.DETSizeOverride[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override; +		if (src->det_size_override) +			mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override; +		else +			mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = ip->det_buffer_size_kbytes;  		//TODO: Need to assign correct values to dp_multistream vars  		mode_lib->vba.OutputMultistreamEn[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_en;  		mode_lib->vba.OutputMultistreamId[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_id; @@ -785,6 +789,8 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)  					mode_lib->vba.pipe_plane[k] =  							mode_lib->vba.NumberOfActivePlanes;  					mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes]++; +					if (src_k->det_size_override) +						mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src_k->det_size_override;  					if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes]  							== dm_horz) {  						mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] += @@ -927,18 +933,16 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib)  }  /** - * ********************************************************************************************   * cache_debug_params: Cache any params that needed to be maintained from the initial validation   * for debug purposes.   *   * The DML getters can modify some of the VBA params that we are interested in (for example when   * calculating with dummy p-state latency), so cache any params here that we want for debugging   * - * @param [in] mode_lib: mode_lib input/output of validate call + * @mode_lib: mode_lib input/output of validate call   * - * @return: void + * Return: void   * - * ********************************************************************************************   */  static void cache_debug_params(struct display_mode_lib *mode_lib)  { diff --git a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c index 2bdc47615543..58dd62cce4bb 100644 --- a/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +++ b/drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c @@ -645,8 +645,6 @@ static int get_available_dsc_slices(union dsc_enc_slice_caps slice_caps, int *av  {  	int idx = 0; -	memset(available_slices, -1, MIN_AVAILABLE_SLICES_SIZE); -  	if (slice_caps.bits.NUM_SLICES_1)  		available_slices[idx++] = 1; @@ -700,7 +698,7 @@ static int inc_num_slices(union dsc_enc_slice_caps slice_caps, int num_slices)  		}  	} -	if (new_num_slices == num_slices) // No biger number of slices found +	if (new_num_slices == num_slices) // No bigger number of slices found  		new_num_slices++;  	return new_num_slices; @@ -952,6 +950,13 @@ static bool setup_dsc_config(  		else  			is_dsc_possible = false;  	} +	// When we force 2:1 ODM, we can't have 1 slice to divide amongst 2 separate DSC instances +	// need to enforce at minimum 2 horizontal slices +	if (options->dsc_force_odm_hslice_override) { +		num_slices_h = fit_num_slices_up(dsc_common_caps.slice_caps, 2); +		if (num_slices_h == 0) +			is_dsc_possible = false; +	}  	if (!is_dsc_possible)  		goto done; @@ -1163,6 +1168,7 @@ void dc_dsc_policy_set_disable_dsc_stream_overhead(bool disable)  void dc_dsc_get_default_config_option(const struct dc *dc, struct dc_dsc_config_options *options)  {  	options->dsc_min_slice_height_override = dc->debug.dsc_min_slice_height_override; +	options->dsc_force_odm_hslice_override = dc->debug.force_odm_combine;  	options->max_target_bpp_limit_override_x16 = 0;  	options->slice_height_granularity = 1;  } diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h index 2eb597a24425..034610b74a37 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h @@ -37,6 +37,7 @@  #include "dwb.h"  #include "mcif_wb.h"  #include "panel_cntl.h" +#include "dmub/inc/dmub_cmd.h"  #define MAX_CLOCK_SOURCES 7  #define MAX_SVP_PHANTOM_STREAMS 2 @@ -374,6 +375,7 @@ union pipe_update_flags {  		uint32_t viewport : 1;  		uint32_t plane_changed : 1;  		uint32_t det_size : 1; +		uint32_t unbounded_req : 1;  	} bits;  	uint32_t raw;  }; @@ -426,6 +428,8 @@ struct pipe_ctx {  	struct dwbc *dwbc;  	struct mcif_wb *mcif_wb;  	union pipe_update_flags update_flags; +	struct tg_color visual_confirm_color; +	bool has_vactive_margin;  };  /* Data used for dynamic link encoder assignment. @@ -496,6 +500,11 @@ struct bw_context {  	struct display_mode_lib dml;  }; +struct dc_dmub_cmd { +	union dmub_rb_cmd dmub_cmd; +	enum dm_dmub_wait_type wait_type; +}; +  /**   * struct dc_state - The full description of a state requested by users   */ @@ -544,6 +553,11 @@ struct dc_state {  	 */  	struct bw_context bw_ctx; +	struct block_sequence block_sequence[50]; +	unsigned int block_sequence_steps; +	struct dc_dmub_cmd dc_dmub_cmd[10]; +	unsigned int dmub_cmd_count; +  	/**  	 * @refcount: refcount reference  	 * diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h index ecb4191b6e64..d2190a3320f6 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h @@ -55,6 +55,10 @@ struct abm_funcs {  			unsigned int bytes,  			unsigned int inst);  	bool (*set_abm_pause)(struct abm *abm, bool pause, unsigned int panel_inst, unsigned int otg_inst); +	bool (*set_pipe_ex)(struct abm *abm, +			unsigned int otg_inst, +			unsigned int option, +			unsigned int panel_inst);  };  #endif diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h index bef843cc32a1..6faf40fa5c69 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h @@ -233,6 +233,7 @@ struct clk_bw_params {  	struct clk_limit_table clk_table;  	struct wm_table wm_table;  	struct dummy_pstate_entry dummy_pstate_table[4]; +	struct clk_limit_table_entry dc_mode_limit;  };  /* Public interfaces */ diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h index ad6acd1b34e1..0b700b3d7d97 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h @@ -159,6 +159,9 @@ struct dccg_funcs {  			int otg_inst,  			int pixclk_khz); +	void (*trigger_dio_fifo_resync)( +			struct dccg *dccg); +  	void (*dpp_root_clock_control)(  			struct dccg *dccg,  			unsigned int dpp_inst, diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h index beb26dc8a07f..aaa293613846 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h @@ -111,6 +111,9 @@ struct dcn_hubbub_state {  	uint32_t vm_error_vmid;  	uint32_t vm_error_pipe;  	uint32_t vm_error_mode; +	uint32_t test_debug_data; +	uint32_t watermark_change_cntl; +	uint32_t dram_state_cntl;  };  struct hubbub_funcs { diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h index 88ac723d10aa..cc0a3a992f7b 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h @@ -44,6 +44,112 @@ struct dc_virtual_addr_space_config;  struct dpp;  struct dce_hwseq;  struct link_resource; +struct dc_dmub_cmd; + +struct subvp_pipe_control_lock_fast_params { +	struct dc *dc; +	bool lock; +	struct pipe_ctx *pipe_ctx; +}; + +struct pipe_control_lock_params { +	struct dc *dc; +	struct pipe_ctx *pipe_ctx; +	bool lock; +}; + +struct set_flip_control_gsl_params { +	struct pipe_ctx *pipe_ctx; +	bool flip_immediate; +}; + +struct program_triplebuffer_params { +	const struct dc *dc; +	struct pipe_ctx *pipe_ctx; +	bool enableTripleBuffer; +}; + +struct update_plane_addr_params { +	struct dc *dc; +	struct pipe_ctx *pipe_ctx; +}; + +struct set_input_transfer_func_params { +	struct dc *dc; +	struct pipe_ctx *pipe_ctx; +	struct dc_plane_state *plane_state; +}; + +struct program_gamut_remap_params { +	struct pipe_ctx *pipe_ctx; +}; + +struct program_manual_trigger_params { +	struct pipe_ctx *pipe_ctx; +}; + +struct send_dmcub_cmd_params { +	struct dc_context *ctx; +	union dmub_rb_cmd *cmd; +	enum dm_dmub_wait_type wait_type; +}; + +struct setup_dpp_params { +	struct pipe_ctx *pipe_ctx; +}; + +struct program_bias_and_scale_params { +	struct pipe_ctx *pipe_ctx; +}; + +struct set_output_transfer_func_params { +	struct dc *dc; +	struct pipe_ctx *pipe_ctx; +	const struct dc_stream_state *stream; +}; + +struct update_visual_confirm_params { +	struct dc *dc; +	struct pipe_ctx *pipe_ctx; +	int mpcc_id; +}; + +union block_sequence_params { +	struct update_plane_addr_params update_plane_addr_params; +	struct subvp_pipe_control_lock_fast_params subvp_pipe_control_lock_fast_params; +	struct pipe_control_lock_params pipe_control_lock_params; +	struct set_flip_control_gsl_params set_flip_control_gsl_params; +	struct program_triplebuffer_params program_triplebuffer_params; +	struct set_input_transfer_func_params set_input_transfer_func_params; +	struct program_gamut_remap_params program_gamut_remap_params; +	struct program_manual_trigger_params program_manual_trigger_params; +	struct send_dmcub_cmd_params send_dmcub_cmd_params; +	struct setup_dpp_params setup_dpp_params; +	struct program_bias_and_scale_params program_bias_and_scale_params; +	struct set_output_transfer_func_params set_output_transfer_func_params; +	struct update_visual_confirm_params update_visual_confirm_params; +}; + +enum block_sequence_func { +	DMUB_SUBVP_PIPE_CONTROL_LOCK_FAST = 0, +	OPTC_PIPE_CONTROL_LOCK, +	HUBP_SET_FLIP_CONTROL_GSL, +	HUBP_PROGRAM_TRIPLEBUFFER, +	HUBP_UPDATE_PLANE_ADDR, +	DPP_SET_INPUT_TRANSFER_FUNC, +	DPP_PROGRAM_GAMUT_REMAP, +	OPTC_PROGRAM_MANUAL_TRIGGER, +	DMUB_SEND_DMCUB_CMD, +	DPP_SETUP_DPP, +	DPP_PROGRAM_BIAS_AND_SCALE, +	DPP_SET_OUTPUT_TRANSFER_FUNC, +	MPC_UPDATE_VISUAL_CONFIRM, +}; + +struct block_sequence { +	union block_sequence_params params; +	enum block_sequence_func func; +};  struct hw_sequencer_funcs {  	void (*hardware_release)(struct dc *dc); @@ -252,12 +358,12 @@ struct hw_sequencer_funcs {  			const struct tg_color *solid_color,  			int width, int height, int offset); +	void (*subvp_pipe_control_lock_fast)(union block_sequence_params *params);  	void (*z10_restore)(const struct dc *dc);  	void (*z10_save_init)(struct dc *dc);  	void (*update_visual_confirm_color)(struct dc *dc,  			struct pipe_ctx *pipe_ctx, -			struct tg_color *color,  			int mpcc_id);  	void (*update_phantom_vp_position)(struct dc *dc, @@ -294,6 +400,7 @@ void get_surface_visual_confirm_color(  void get_subvp_visual_confirm_color(  	struct dc *dc, +	struct dc_state *context,  	struct pipe_ctx *pipe_ctx,  	struct tg_color *color); @@ -306,4 +413,30 @@ void get_mpctree_visual_confirm_color(  void get_surface_tile_visual_confirm_color(  		struct pipe_ctx *pipe_ctx,  		struct tg_color *color); + +void get_mclk_switch_visual_confirm_color( +		struct dc *dc, +		struct dc_state *context, +		struct pipe_ctx *pipe_ctx, +		struct tg_color *color); + +void hwss_execute_sequence(struct dc *dc, +		struct block_sequence block_sequence[], +		int num_steps); + +void hwss_build_fast_sequence(struct dc *dc, +		struct dc_dmub_cmd *dc_dmub_cmd, +		unsigned int dmub_cmd_count, +		struct block_sequence block_sequence[], +		int *num_steps, +		struct pipe_ctx *pipe_ctx); + +void hwss_send_dmcub_cmd(union block_sequence_params *params); + +void hwss_program_manual_trigger(union block_sequence_params *params); + +void hwss_setup_dpp(union block_sequence_params *params); + +void hwss_program_bias_and_scale(union block_sequence_params *params); +  #endif /* __DC_HW_SEQUENCER_H__ */ diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer_private.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer_private.h index 4513544559be..4ca4192c1e12 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer_private.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer_private.h @@ -160,6 +160,8 @@ struct hwseq_private_funcs {  			unsigned int *k1_div,  			unsigned int *k2_div);  	void (*set_pixels_per_cycle)(struct pipe_ctx *pipe_ctx); +	void (*resync_fifo_dccg_dio)(struct dce_hwseq *hws, struct dc *dc, +			struct dc_state *context);  	bool (*is_dp_dig_pixel_rate_div_policy)(struct pipe_ctx *pipe_ctx);  #endif  }; diff --git a/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c b/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c index edd7d026a762..586fe25c1702 100644 --- a/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c +++ b/drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c @@ -28,24 +28,6 @@  #include "dccg.h"  #include "clk_mgr.h" -static enum phyd32clk_clock_source get_phyd32clk_src(struct dc_link *link) -{ -	switch (link->link_enc->transmitter) { -	case TRANSMITTER_UNIPHY_A: -		return PHYD32CLKA; -	case TRANSMITTER_UNIPHY_B: -		return PHYD32CLKB; -	case TRANSMITTER_UNIPHY_C: -		return PHYD32CLKC; -	case TRANSMITTER_UNIPHY_D: -		return PHYD32CLKD; -	case TRANSMITTER_UNIPHY_E: -		return PHYD32CLKE; -	default: -		return PHYD32CLKA; -	} -} -  static void set_hpo_dp_throttled_vcp_size(struct pipe_ctx *pipe_ctx,  		struct fixed31_32 throttled_vcp_size)  { @@ -120,81 +102,26 @@ static void setup_hpo_dp_stream_attribute(struct pipe_ctx *pipe_ctx)  			DPCD_SOURCE_SEQ_AFTER_DP_STREAM_ATTR);  } -static void enable_hpo_dp_fpga_link_output(struct dc_link *link, -		const struct link_resource *link_res, -		enum signal_type signal, -		enum clock_source_id clock_source, -		const struct dc_link_settings *link_settings) -{ -	const struct dc *dc = link->dc; -	enum phyd32clk_clock_source phyd32clk = get_phyd32clk_src(link); -	int phyd32clk_freq_khz = link_settings->link_rate == LINK_RATE_UHBR10 ? 312500 : -			link_settings->link_rate == LINK_RATE_UHBR13_5 ? 412875 : -			link_settings->link_rate == LINK_RATE_UHBR20 ? 625000 : 0; - -	dm_set_phyd32clk(dc->ctx, phyd32clk_freq_khz); -	dc->res_pool->dccg->funcs->set_physymclk( -			dc->res_pool->dccg, -			link->link_enc_hw_inst, -			PHYSYMCLK_FORCE_SRC_PHYD32CLK, -			true); -	dc->res_pool->dccg->funcs->enable_symclk32_le( -			dc->res_pool->dccg, -			link_res->hpo_dp_link_enc->inst, -			phyd32clk); -	link_res->hpo_dp_link_enc->funcs->link_enable( -			link_res->hpo_dp_link_enc, -			link_settings->lane_count); - -} -  static void enable_hpo_dp_link_output(struct dc_link *link,  		const struct link_resource *link_res,  		enum signal_type signal,  		enum clock_source_id clock_source,  		const struct dc_link_settings *link_settings)  { -	if (IS_FPGA_MAXIMUS_DC(link->dc->ctx->dce_environment)) -		enable_hpo_dp_fpga_link_output(link, link_res, signal, -				clock_source, link_settings); -	else -		link_res->hpo_dp_link_enc->funcs->enable_link_phy( -				link_res->hpo_dp_link_enc, -				link_settings, -				link->link_enc->transmitter, -				link->link_enc->hpd_source); -} - - -static void disable_hpo_dp_fpga_link_output(struct dc_link *link, -		const struct link_resource *link_res, -		enum signal_type signal) -{ -	const struct dc *dc = link->dc; - -	link_res->hpo_dp_link_enc->funcs->link_disable(link_res->hpo_dp_link_enc); -	dc->res_pool->dccg->funcs->disable_symclk32_le( -			dc->res_pool->dccg, -			link_res->hpo_dp_link_enc->inst); -	dc->res_pool->dccg->funcs->set_physymclk( -			dc->res_pool->dccg, -			link->link_enc_hw_inst, -			PHYSYMCLK_FORCE_SRC_SYMCLK, -			false); -	dm_set_phyd32clk(dc->ctx, 0); +	link_res->hpo_dp_link_enc->funcs->enable_link_phy( +			link_res->hpo_dp_link_enc, +			link_settings, +			link->link_enc->transmitter, +			link->link_enc->hpd_source);  }  static void disable_hpo_dp_link_output(struct dc_link *link,  		const struct link_resource *link_res,  		enum signal_type signal)  { -	if (IS_FPGA_MAXIMUS_DC(link->dc->ctx->dce_environment)) { -		disable_hpo_dp_fpga_link_output(link, link_res, signal); -	} else {  		link_res->hpo_dp_link_enc->funcs->link_disable(link_res->hpo_dp_link_enc);  		link_res->hpo_dp_link_enc->funcs->disable_link_phy(  				link_res->hpo_dp_link_enc, signal); -	}  }  static void set_hpo_dp_link_test_pattern(struct dc_link *link, diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index a131e30fd7d6..17904de4f155 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -593,6 +593,10 @@ static bool detect_dp(struct dc_link *link,  			/* DP SST branch */  			link->type = dc_connection_sst_branch;  	} else { +		if (link->dc->debug.disable_dp_plus_plus_wa && +				link->link_enc->features.flags.bits.IS_UHBR20_CAPABLE) +			return false; +  		/* DP passive dongles */  		sink_caps->signal = dp_passive_dongle_detection(link->ddc,  								sink_caps, diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index 2267fb097830..1a7b93e41e35 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -765,7 +765,7 @@ static bool dp_set_dsc_on_rx(struct pipe_ctx *pipe_ctx, bool enable)  	struct dc_stream_state *stream = pipe_ctx->stream;  	bool result = false; -	if (dc_is_virtual_signal(stream->signal) || IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) +	if (dc_is_virtual_signal(stream->signal))  		result = true;  	else  		result = dm_helpers_dp_write_dsc_enable(dc->ctx, stream, enable); @@ -778,7 +778,6 @@ static bool dp_set_dsc_on_rx(struct pipe_ctx *pipe_ctx, bool enable)  void link_set_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)  {  	struct display_stream_compressor *dsc = pipe_ctx->stream_res.dsc; -	struct dc *dc = pipe_ctx->stream->ctx->dc;  	struct dc_stream_state *stream = pipe_ctx->stream;  	struct pipe_ctx *odm_pipe;  	int opp_cnt = 1; @@ -816,8 +815,7 @@ void link_set_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)  		optc_dsc_mode = dsc_optc_cfg.is_pixel_format_444 ? OPTC_DSC_ENABLED_444 : OPTC_DSC_ENABLED_NATIVE_SUBSAMPLED;  		/* Enable DSC in encoder */ -		if (dc_is_dp_signal(stream->signal) && !IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment) -				&& !dp_is_128b_132b_signal(pipe_ctx)) { +		if (dc_is_dp_signal(stream->signal) && !dp_is_128b_132b_signal(pipe_ctx)) {  			DC_LOG_DSC("Setting stream encoder DSC config for engine %d:", (int)pipe_ctx->stream_res.stream_enc->id);  			dsc_optc_config_log(dsc, &dsc_optc_cfg);  			pipe_ctx->stream_res.stream_enc->funcs->dp_set_dsc_config(pipe_ctx->stream_res.stream_enc, @@ -849,7 +847,7 @@ void link_set_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable)  										false,  										NULL,  										true); -			else if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { +			else {  				pipe_ctx->stream_res.stream_enc->funcs->dp_set_dsc_config(  						pipe_ctx->stream_res.stream_enc,  						OPTC_DSC_DISABLED, 0, 0); @@ -2209,9 +2207,8 @@ static enum dc_status enable_link(  	 * link settings. Need to call disable first before enabling at  	 * new link settings.  	 */ -	if (link->link_status.link_active) { +	if (link->link_status.link_active && !stream->skip_edp_power_down)  		disable_link(link, &pipe_ctx->link_res, pipe_ctx->stream->signal); -	}  	switch (pipe_ctx->stream->signal) {  	case SIGNAL_TYPE_DISPLAY_PORT: @@ -2271,8 +2268,7 @@ void link_set_dpms_off(struct pipe_ctx *pipe_ctx)  		}  	} -	if (!IS_DIAG_DC(dc->ctx->dce_environment) && -			dc_is_virtual_signal(pipe_ctx->stream->signal)) +	if (dc_is_virtual_signal(pipe_ctx->stream->signal))  		return;  	if (!pipe_ctx->stream->sink->edid_caps.panel_patch.skip_avmute) { @@ -2330,7 +2326,9 @@ void link_set_dpms_off(struct pipe_ctx *pipe_ctx)  		dc->hwss.disable_stream(pipe_ctx);  	} else {  		dc->hwss.disable_stream(pipe_ctx); -		disable_link(pipe_ctx->stream->link, &pipe_ctx->link_res, pipe_ctx->stream->signal); +		if (!pipe_ctx->stream->skip_edp_power_down) { +			disable_link(pipe_ctx->stream->link, &pipe_ctx->link_res, pipe_ctx->stream->signal); +		}  	}  	if (pipe_ctx->stream->timing.flags.DSC) { @@ -2358,6 +2356,8 @@ void link_set_dpms_on(  	enum otg_out_mux_dest otg_out_dest = OUT_MUX_DIO;  	struct vpg *vpg = pipe_ctx->stream_res.stream_enc->vpg;  	const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res); +	bool apply_edp_fast_boot_optimization = +		pipe_ctx->stream->apply_edp_fast_boot_optimization;  	ASSERT(is_master_pipe_for_link(link, pipe_ctx)); @@ -2375,8 +2375,7 @@ void link_set_dpms_on(  		}  	} -	if (!IS_DIAG_DC(dc->ctx->dce_environment) && -			dc_is_virtual_signal(pipe_ctx->stream->signal)) +	if (dc_is_virtual_signal(pipe_ctx->stream->signal))  		return;  	link_enc = link_enc_cfg_get_link_enc(link); @@ -2402,138 +2401,126 @@ void link_set_dpms_on(  	link_hwss->setup_stream_attribute(pipe_ctx); -	if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { -		bool apply_edp_fast_boot_optimization = -			pipe_ctx->stream->apply_edp_fast_boot_optimization; - -		pipe_ctx->stream->apply_edp_fast_boot_optimization = false; +	pipe_ctx->stream->apply_edp_fast_boot_optimization = false; -		// Enable VPG before building infoframe -		if (vpg && vpg->funcs->vpg_poweron) -			vpg->funcs->vpg_poweron(vpg); +	// Enable VPG before building infoframe +	if (vpg && vpg->funcs->vpg_poweron) +		vpg->funcs->vpg_poweron(vpg); -		resource_build_info_frame(pipe_ctx); -		dc->hwss.update_info_frame(pipe_ctx); +	resource_build_info_frame(pipe_ctx); +	dc->hwss.update_info_frame(pipe_ctx); -		if (dc_is_dp_signal(pipe_ctx->stream->signal)) -			dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_UPDATE_INFO_FRAME); - -		/* Do not touch link on seamless boot optimization. */ -		if (pipe_ctx->stream->apply_seamless_boot_optimization) { -			pipe_ctx->stream->dpms_off = false; +	if (dc_is_dp_signal(pipe_ctx->stream->signal)) +		dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_UPDATE_INFO_FRAME); -			/* Still enable stream features & audio on seamless boot for DP external displays */ -			if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT) { -				enable_stream_features(pipe_ctx); -				dc->hwss.enable_audio_stream(pipe_ctx); -			} +	/* Do not touch link on seamless boot optimization. */ +	if (pipe_ctx->stream->apply_seamless_boot_optimization) { +		pipe_ctx->stream->dpms_off = false; -			update_psp_stream_config(pipe_ctx, false); -			return; -		} - -		/* eDP lit up by bios already, no need to enable again. */ -		if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && -					apply_edp_fast_boot_optimization && -					!pipe_ctx->stream->timing.flags.DSC && -					!pipe_ctx->next_odm_pipe) { -			pipe_ctx->stream->dpms_off = false; -			update_psp_stream_config(pipe_ctx, false); -			return; +		/* Still enable stream features & audio on seamless boot for DP external displays */ +		if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT) { +			enable_stream_features(pipe_ctx); +			dc->hwss.enable_audio_stream(pipe_ctx);  		} -		if (pipe_ctx->stream->dpms_off) -			return; +		update_psp_stream_config(pipe_ctx, false); +		return; +	} -		/* Have to setup DSC before DIG FE and BE are connected (which happens before the -		 * link training). This is to make sure the bandwidth sent to DIG BE won't be -		 * bigger than what the link and/or DIG BE can handle. VBID[6]/CompressedStream_flag -		 * will be automatically set at a later time when the video is enabled -		 * (DP_VID_STREAM_EN = 1). -		 */ -		if (pipe_ctx->stream->timing.flags.DSC) { -			if (dc_is_dp_signal(pipe_ctx->stream->signal) || -				dc_is_virtual_signal(pipe_ctx->stream->signal)) -			link_set_dsc_enable(pipe_ctx, true); +	/* eDP lit up by bios already, no need to enable again. */ +	if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && +				apply_edp_fast_boot_optimization && +				!pipe_ctx->stream->timing.flags.DSC && +				!pipe_ctx->next_odm_pipe) { +		pipe_ctx->stream->dpms_off = false; +		update_psp_stream_config(pipe_ctx, false); +		return; +	} -		} +	if (pipe_ctx->stream->dpms_off) +		return; -		status = enable_link(state, pipe_ctx); +	/* Have to setup DSC before DIG FE and BE are connected (which happens before the +	 * link training). This is to make sure the bandwidth sent to DIG BE won't be +	 * bigger than what the link and/or DIG BE can handle. VBID[6]/CompressedStream_flag +	 * will be automatically set at a later time when the video is enabled +	 * (DP_VID_STREAM_EN = 1). +	 */ +	if (pipe_ctx->stream->timing.flags.DSC) { +		if (dc_is_dp_signal(pipe_ctx->stream->signal) || +			dc_is_virtual_signal(pipe_ctx->stream->signal)) +		link_set_dsc_enable(pipe_ctx, true); -		if (status != DC_OK) { -			DC_LOG_WARNING("enabling link %u failed: %d\n", -			pipe_ctx->stream->link->link_index, -			status); +	} -			/* Abort stream enable *unless* the failure was due to -			 * DP link training - some DP monitors will recover and -			 * show the stream anyway. But MST displays can't proceed -			 * without link training. -			 */ -			if (status != DC_FAIL_DP_LINK_TRAINING || -					pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { -				if (false == stream->link->link_status.link_active) -					disable_link(stream->link, &pipe_ctx->link_res, -							pipe_ctx->stream->signal); -				BREAK_TO_DEBUGGER(); -				return; -			} -		} +	status = enable_link(state, pipe_ctx); -		/* turn off otg test pattern if enable */ -		if (pipe_ctx->stream_res.tg->funcs->set_test_pattern) -			pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, -					CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, -					COLOR_DEPTH_UNDEFINED); +	if (status != DC_OK) { +		DC_LOG_WARNING("enabling link %u failed: %d\n", +		pipe_ctx->stream->link->link_index, +		status); -		/* This second call is needed to reconfigure the DIG -		 * as a workaround for the incorrect value being applied -		 * from transmitter control. +		/* Abort stream enable *unless* the failure was due to +		 * DP link training - some DP monitors will recover and +		 * show the stream anyway. But MST displays can't proceed +		 * without link training.  		 */ -		if (!(dc_is_virtual_signal(pipe_ctx->stream->signal) || -				dp_is_128b_132b_signal(pipe_ctx))) { -				if (link_enc) -					link_enc->funcs->setup( -						link_enc, +		if (status != DC_FAIL_DP_LINK_TRAINING || +				pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { +			if (false == stream->link->link_status.link_active) +				disable_link(stream->link, &pipe_ctx->link_res,  						pipe_ctx->stream->signal); -			} +			BREAK_TO_DEBUGGER(); +			return; +		} +	} -		dc->hwss.enable_stream(pipe_ctx); +	/* turn off otg test pattern if enable */ +	if (pipe_ctx->stream_res.tg->funcs->set_test_pattern) +		pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, +				CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, +				COLOR_DEPTH_UNDEFINED); -		/* Set DPS PPS SDP (AKA "info frames") */ -		if (pipe_ctx->stream->timing.flags.DSC) { -			if (dc_is_dp_signal(pipe_ctx->stream->signal) || -					dc_is_virtual_signal(pipe_ctx->stream->signal)) { -				dp_set_dsc_on_rx(pipe_ctx, true); -				link_set_dsc_pps_packet(pipe_ctx, true, true); -			} +	/* This second call is needed to reconfigure the DIG +	 * as a workaround for the incorrect value being applied +	 * from transmitter control. +	 */ +	if (!(dc_is_virtual_signal(pipe_ctx->stream->signal) || +			dp_is_128b_132b_signal(pipe_ctx))) { +			if (link_enc) +				link_enc->funcs->setup( +					link_enc, +					pipe_ctx->stream->signal);  		} -		if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) -			allocate_mst_payload(pipe_ctx); -		else if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT && -				dp_is_128b_132b_signal(pipe_ctx)) -			update_sst_payload(pipe_ctx, true); +	dc->hwss.enable_stream(pipe_ctx); + +	/* Set DPS PPS SDP (AKA "info frames") */ +	if (pipe_ctx->stream->timing.flags.DSC) { +		if (dc_is_dp_signal(pipe_ctx->stream->signal) || +				dc_is_virtual_signal(pipe_ctx->stream->signal)) { +			dp_set_dsc_on_rx(pipe_ctx, true); +			link_set_dsc_pps_packet(pipe_ctx, true, true); +		} +	} -		dc->hwss.unblank_stream(pipe_ctx, -			&pipe_ctx->stream->link->cur_link_settings); +	if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) +		allocate_mst_payload(pipe_ctx); +	else if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT && +			dp_is_128b_132b_signal(pipe_ctx)) +		update_sst_payload(pipe_ctx, true); -		if (stream->sink_patches.delay_ignore_msa > 0) -			msleep(stream->sink_patches.delay_ignore_msa); +	dc->hwss.unblank_stream(pipe_ctx, +		&pipe_ctx->stream->link->cur_link_settings); -		if (dc_is_dp_signal(pipe_ctx->stream->signal)) -			enable_stream_features(pipe_ctx); -		update_psp_stream_config(pipe_ctx, false); +	if (stream->sink_patches.delay_ignore_msa > 0) +		msleep(stream->sink_patches.delay_ignore_msa); -		dc->hwss.enable_audio_stream(pipe_ctx); +	if (dc_is_dp_signal(pipe_ctx->stream->signal)) +		enable_stream_features(pipe_ctx); +	update_psp_stream_config(pipe_ctx, false); -	} else { // if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) -		if (dp_is_128b_132b_signal(pipe_ctx)) -			dp_fpga_hpo_enable_link_and_stream(state, pipe_ctx); -		if (dc_is_dp_signal(pipe_ctx->stream->signal) || -				dc_is_virtual_signal(pipe_ctx->stream->signal)) -			link_set_dsc_enable(pipe_ctx, true); -	} +	dc->hwss.enable_audio_stream(pipe_ctx);  	if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) {  		set_avmute(pipe_ctx, false); diff --git a/drivers/gpu/drm/amd/display/dc/link/link_factory.c b/drivers/gpu/drm/amd/display/dc/link/link_factory.c index 1515c817f03b..ac1c3e2e7c1d 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_factory.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_factory.c @@ -563,11 +563,9 @@ static bool construct_phy(struct dc_link *link,  		goto create_fail;  	} -	/* TODO: #DAL3 Implement id to str function.*/ -	LINK_INFO("Connector[%d] description:" -		  "signal %d\n", +	LINK_INFO("Connector[%d] description: signal: %s\n",  		  init_params->connector_index, -		  link->connector_signal); +		  signal_type_to_string(link->connector_signal));  	ddc_service_init_data.ctx = link->ctx;  	ddc_service_init_data.id = link->link_id; diff --git a/drivers/gpu/drm/amd/display/dc/link/link_validation.c b/drivers/gpu/drm/amd/display/dc/link/link_validation.c index d4b7da526f0a..e8b2fc4002a5 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_validation.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_validation.c @@ -359,5 +359,8 @@ bool link_validate_dpia_bandwidth(const struct dc_stream_state *stream, const un  		link[i] = stream[i].link;  		bw_needed[i] = dc_bandwidth_in_kbps_from_timing(&stream[i].timing);  	} + +	ret = dpia_validate_usb4_bw(link, bw_needed, num_streams); +  	return ret;  } diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c index ba98013fecd0..3a5e80b57711 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c @@ -326,8 +326,7 @@ bool dp_is_fec_supported(const struct dc_link *link)  	return (dc_is_dp_signal(link->connector_signal) && link_enc &&  			link_enc->features.fec_supported && -			link->dpcd_caps.fec_cap.bits.FEC_CAPABLE && -			!IS_FPGA_MAXIMUS_DC(link->ctx->dce_environment)); +			link->dpcd_caps.fec_cap.bits.FEC_CAPABLE);  }  bool dp_should_enable_fec(const struct dc_link *link) @@ -1043,9 +1042,7 @@ static enum dc_status wake_up_aux_channel(struct dc_link *link)  				DP_SET_POWER,  				&dpcd_power_state,  				sizeof(dpcd_power_state)); -		if (status < 0) -			DC_LOG_DC("%s: Failed to power up sink: %s\n", __func__, -				  dpcd_power_state == DP_SET_POWER_D0 ? "D0" : "D3"); +		DC_LOG_DC("%s: Failed to power up sink\n", __func__);  		return DC_ERROR_UNEXPECTED;  	} @@ -1396,7 +1393,7 @@ static bool get_usbc_cable_id(struct dc_link *link, union dp_cable_id *cable_id)  	cmd.cable_id.header.payload_bytes = sizeof(cmd.cable_id.data);  	cmd.cable_id.data.input.phy_inst = resource_transmitter_to_phy_idx(  			link->dc, link->link_enc->transmitter); -	if (dc_dmub_srv_cmd_with_reply_data(link->ctx->dmub_srv, &cmd) && +	if (dm_execute_dmub_cmd(link->dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&  			cmd.cable_id.header.ret_status == 1) {  		cable_id->raw = cmd.cable_id.data.output_raw;  		DC_LOG_DC("usbc_cable_id = %d.\n", cable_id->raw); @@ -1452,7 +1449,8 @@ bool read_is_mst_supported(struct dc_link *link)   */  static bool dpcd_read_sink_ext_caps(struct dc_link *link)  { -	uint8_t dpcd_data; +	uint8_t dpcd_data = 0; +	uint8_t edp_general_cap2 = 0;  	if (!link)  		return false; @@ -1461,6 +1459,12 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link)  		return false;  	link->dpcd_sink_ext_caps.raw = dpcd_data; + +	if (core_link_read_dpcd(link, DP_EDP_GENERAL_CAP_2, &edp_general_cap2, 1) != DC_OK) +		return false; + +	link->dpcd_caps.panel_luminance_control = (edp_general_cap2 & DP_EDP_PANEL_LUMINANCE_CONTROL_CAPABLE) != 0; +  	return true;  } @@ -1554,6 +1558,9 @@ static bool retrieve_link_cap(struct dc_link *link)  	int i;  	struct dp_sink_hw_fw_revision dp_hw_fw_revision;  	const uint32_t post_oui_delay = 30; // 30ms +	bool is_fec_supported = false; +	bool is_dsc_basic_supported = false; +	bool is_dsc_passthrough_supported = false;  	memset(dpcd_data, '\0', sizeof(dpcd_data));  	memset(&down_strm_port_count, @@ -1696,6 +1703,7 @@ static bool retrieve_link_cap(struct dc_link *link)  	/* TODO - decouple raw mst capability from policy decision */  	link->dpcd_caps.is_mst_capable = read_is_mst_supported(link); +	DC_LOG_DC("%s: MST_Support: %s\n", __func__, str_yes_no(link->dpcd_caps.is_mst_capable));  	get_active_converter_info(ds_port.byte, link); @@ -1803,6 +1811,17 @@ static bool retrieve_link_cap(struct dc_link *link)  				DP_DSC_SUPPORT,  				link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,  				sizeof(link->dpcd_caps.dsc_caps.dsc_basic_caps.raw)); +		if (status == DC_OK) { +			is_fec_supported = link->dpcd_caps.fec_cap.bits.FEC_CAPABLE; +			is_dsc_basic_supported = link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT; +			is_dsc_passthrough_supported = link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_PASSTHROUGH_SUPPORT; +			DC_LOG_DC("%s: FEC_Sink_Support: %s\n", __func__, +				  str_yes_no(is_fec_supported)); +			DC_LOG_DC("%s: DSC_Basic_Sink_Support: %s\n", __func__, +				  str_yes_no(is_dsc_basic_supported)); +			DC_LOG_DC("%s: DSC_Passthrough_Sink_Support: %s\n", __func__, +				  str_yes_no(is_dsc_passthrough_supported)); +		}  		if (link->dpcd_caps.dongle_type != DISPLAY_DONGLE_NONE) {  			status = core_link_read_dpcd(  					link, @@ -1931,6 +1950,9 @@ void detect_edp_sink_caps(struct dc_link *link)  			link_rate_in_khz = (supported_link_rates[entry+1] * 0x100 +  										supported_link_rates[entry]) * 200; +			DC_LOG_DC("%s: eDP v1.4 supported sink rates: [%d] %d kHz\n", __func__, +				  entry / 2, link_rate_in_khz); +  			if (link_rate_in_khz != 0) {  				link_rate = linkRateInKHzToLinkRateMultiplier(link_rate_in_khz);  				link->dpcd_caps.edp_supported_link_rates[link->dpcd_caps.edp_supported_link_rates_count] = link_rate; diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.c index 4626fabc0a96..0bb749133909 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia.c @@ -90,7 +90,7 @@ bool dpia_query_hpd_status(struct dc_link *link)  	cmd.query_hpd.data.ch_type = AUX_CHANNEL_DPIA;  	/* Return HPD status reported by DMUB if query successfully executed. */ -	if (dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd) && cmd.query_hpd.data.status == AUX_RET_SUCCESS) +	if (dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) && cmd.query_hpd.data.status == AUX_RET_SUCCESS)  		is_hpd_high = cmd.query_hpd.data.result;  	DC_LOG_DEBUG("%s: link(%d) dpia(%d) cmd_status(%d) result(%d)\n", diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c index 579fa222810d..e011df4bdaf2 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training.c @@ -1653,10 +1653,19 @@ bool perform_link_training_with_retries(  				break;  		} -		DC_LOG_WARNING("%s: Link(%d) training attempt %u of %d failed @ rate(%d) x lane(%d) @ spread = %x : fail reason:(%d)\n", -			       __func__, link->link_index, (unsigned int)j + 1, attempts, -			      cur_link_settings.link_rate, cur_link_settings.lane_count, -			      cur_link_settings.link_spread, status); +		if (j == (attempts - 1)) { +			DC_LOG_WARNING( +				"%s: Link(%d) training attempt %u of %d failed @ rate(%d) x lane(%d) @ spread = %x : fail reason:(%d)\n", +				__func__, link->link_index, (unsigned int)j + 1, attempts, +				cur_link_settings.link_rate, cur_link_settings.lane_count, +				cur_link_settings.link_spread, status); +		} else { +			DC_LOG_HW_LINK_TRAINING( +				"%s: Link(%d) training attempt %u of %d failed @ rate(%d) x lane(%d) @ spread = %x : fail reason:(%d)\n", +				__func__, link->link_index, (unsigned int)j + 1, attempts, +				cur_link_settings.link_rate, cur_link_settings.lane_count, +				cur_link_settings.link_spread, status); +		}  		dp_disable_link_phy(link, &pipe_ctx->link_res, signal); diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.c index 23d380f09a21..db87cfe37b5c 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_128b_132b.c @@ -211,11 +211,17 @@ enum link_training_result dp_perform_128b_132b_link_training(  	dpcd_set_link_settings(link, lt_settings); -	if (result == LINK_TRAINING_SUCCESS) +	if (result == LINK_TRAINING_SUCCESS) {  		result = dp_perform_128b_132b_channel_eq_done_sequence(link, link_res, lt_settings); +		if (result == LINK_TRAINING_SUCCESS) +			DC_LOG_HW_LINK_TRAINING("%s: Channel EQ done.\n", __func__); +	} -	if (result == LINK_TRAINING_SUCCESS) +	if (result == LINK_TRAINING_SUCCESS) {  		result = dp_perform_128b_132b_cds_done_sequence(link, link_res, lt_settings); +		if (result == LINK_TRAINING_SUCCESS) +			DC_LOG_HW_LINK_TRAINING("%s: CDS done.\n", __func__); +	}  	return result;  } diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c index 3889ebb2256b..2b4c15b0b407 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_8b_10b.c @@ -388,6 +388,8 @@ enum link_training_result dp_perform_8b_10b_link_training(  					link_res,  					lt_settings,  					repeater_id); +			if (status == LINK_TRAINING_SUCCESS) +				DC_LOG_HW_LINK_TRAINING("%s: Channel EQ done.\n", __func__);  			repeater_training_done(link, repeater_id); @@ -409,6 +411,8 @@ enum link_training_result dp_perform_8b_10b_link_training(  					link_res,  					lt_settings,  					DPRX); +			if (status == LINK_TRAINING_SUCCESS) +				DC_LOG_HW_LINK_TRAINING("%s: Channel EQ done.\n", __func__);  		}  	} diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.c index 5731c4b61f9f..15faaf645b14 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_training_fixed_vs_pe_retimer.c @@ -233,7 +233,7 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence_legacy(  			link->dpcd_caps.lttpr_caps.phy_repeater_cnt);  	const uint8_t vendor_lttpr_write_data_intercept_en[4] = {0x1, 0x55, 0x63, 0x0};  	const uint8_t vendor_lttpr_write_data_intercept_dis[4] = {0x1, 0x55, 0x63, 0x68}; -	uint32_t pre_disable_intercept_delay_ms = link->dc->debug.fixed_vs_aux_delay_config_wa; +	uint32_t pre_disable_intercept_delay_ms = 0;  	uint8_t vendor_lttpr_write_data_vs[4] = {0x1, 0x51, 0x63, 0x0};  	uint8_t vendor_lttpr_write_data_pe[4] = {0x1, 0x52, 0x63, 0x0};  	uint32_t vendor_lttpr_write_address = 0xF004F; @@ -244,6 +244,10 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence_legacy(  	uint8_t toggle_rate;  	uint8_t rate; +	if (link->local_sink) +		pre_disable_intercept_delay_ms = +				link->local_sink->edid_caps.panel_patch.delay_disable_aux_intercept_ms; +  	/* Only 8b/10b is supported */  	ASSERT(link_dp_get_encoding_format(<_settings->link_settings) ==  			DP_8b_10b_ENCODING); @@ -259,7 +263,7 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence_legacy(  		/* Certain display and cable configuration require extra delay */  		if (offset > 2) -			pre_disable_intercept_delay_ms = link->dc->debug.fixed_vs_aux_delay_config_wa * 2; +			pre_disable_intercept_delay_ms = pre_disable_intercept_delay_ms * 2;  	}  	/* Vendor specific: Reset lane settings */ @@ -380,7 +384,8 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence_legacy(  						0);  				/* Vendor specific: Disable intercept */  				for (i = 0; i < max_vendor_dpcd_retries; i++) { -					msleep(pre_disable_intercept_delay_ms); +					if (pre_disable_intercept_delay_ms != 0) +						msleep(pre_disable_intercept_delay_ms);  					dpcd_status = core_link_write_dpcd(  							link,  							vendor_lttpr_write_address, @@ -591,10 +596,9 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence(  	const uint8_t vendor_lttpr_write_data_adicora_eq1[4] = {0x1, 0x55, 0x63, 0x2E};  	const uint8_t vendor_lttpr_write_data_adicora_eq2[4] = {0x1, 0x55, 0x63, 0x01};  	const uint8_t vendor_lttpr_write_data_adicora_eq3[4] = {0x1, 0x55, 0x63, 0x68}; -	uint32_t pre_disable_intercept_delay_ms = link->dc->debug.fixed_vs_aux_delay_config_wa;  	uint8_t vendor_lttpr_write_data_vs[4] = {0x1, 0x51, 0x63, 0x0};  	uint8_t vendor_lttpr_write_data_pe[4] = {0x1, 0x52, 0x63, 0x0}; - +	uint32_t pre_disable_intercept_delay_ms = 0;  	uint32_t vendor_lttpr_write_address = 0xF004F;  	enum link_training_result status = LINK_TRAINING_SUCCESS;  	uint8_t lane = 0; @@ -603,6 +607,10 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence(  	uint8_t toggle_rate;  	uint8_t rate; +	if (link->local_sink) +		pre_disable_intercept_delay_ms = +				link->local_sink->edid_caps.panel_patch.delay_disable_aux_intercept_ms; +  	/* Only 8b/10b is supported */  	ASSERT(link_dp_get_encoding_format(<_settings->link_settings) ==  			DP_8b_10b_ENCODING); @@ -618,7 +626,7 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence(  		/* Certain display and cable configuration require extra delay */  		if (offset > 2) -			pre_disable_intercept_delay_ms = link->dc->debug.fixed_vs_aux_delay_config_wa * 2; +			pre_disable_intercept_delay_ms = pre_disable_intercept_delay_ms * 2;  	}  	/* Vendor specific: Reset lane settings */ @@ -739,7 +747,8 @@ enum link_training_result dp_perform_fixed_vs_pe_training_sequence(  						0);  				/* Vendor specific: Disable intercept */  				for (i = 0; i < max_vendor_dpcd_retries; i++) { -					msleep(pre_disable_intercept_delay_ms); +					if (pre_disable_intercept_delay_ms != 0) +						msleep(pre_disable_intercept_delay_ms);  					dpcd_status = core_link_write_dpcd(  							link,  							vendor_lttpr_write_address, diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c index 8d1df863659c..2039a345f23a 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c @@ -165,14 +165,35 @@ bool edp_set_backlight_level_nits(struct dc_link *link,  	*(uint16_t *)&dpcd_backlight_set.backlight_transition_time_ms = (uint16_t)transition_time_in_ms; -	if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL, +	if (!link->dpcd_caps.panel_luminance_control) { +		if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL,  			(uint8_t *)(&dpcd_backlight_set),  			sizeof(dpcd_backlight_set)) != DC_OK) -		return false; +			return false; -	if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_CONTROL, +		if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_CONTROL,  			&backlight_control, 1) != DC_OK) -		return false; +			return false; +	} else { +		const uint8_t backlight_enable = DP_EDP_PANEL_LUMINANCE_CONTROL_ENABLE; +		struct target_luminance_value *target_luminance = NULL; + +		//if target luminance value is greater than 24 bits, clip the value to 24 bits +		if (backlight_millinits > 0xFFFFFF) +			backlight_millinits = 0xFFFFFF; + +		target_luminance = (struct target_luminance_value *)&backlight_millinits; + +		if (core_link_write_dpcd(link, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, +			&backlight_enable, +			sizeof(backlight_enable)) != DC_OK) +			return false; + +		if (core_link_write_dpcd(link, DP_EDP_PANEL_TARGET_LUMINANCE_VALUE, +			(uint8_t *)(target_luminance), +			sizeof(struct target_luminance_value)) != DC_OK) +			return false; +	}  	return true;  } diff --git a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h index ba1715e2d25a..7c9a2b34bd05 100644 --- a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h +++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h @@ -271,7 +271,7 @@ struct dmub_srv_hw_params {   */  struct dmub_diagnostic_data {  	uint32_t dmcub_version; -	uint32_t scratch[16]; +	uint32_t scratch[17];  	uint32_t pc;  	uint32_t undefined_address_fault_addr;  	uint32_t inst_fetch_fault_addr; @@ -282,6 +282,7 @@ struct dmub_diagnostic_data {  	uint32_t inbox0_rptr;  	uint32_t inbox0_wptr;  	uint32_t inbox0_size; +	uint32_t gpint_datain0;  	uint8_t is_dmcub_enabled : 1;  	uint8_t is_dmcub_soft_reset : 1;  	uint8_t is_dmcub_secure_reset : 1; @@ -340,6 +341,8 @@ struct dmub_srv_hw_funcs {  	void (*setup_mailbox)(struct dmub_srv *dmub,  			      const struct dmub_region *inbox1); +	uint32_t (*get_inbox1_wptr)(struct dmub_srv *dmub); +  	uint32_t (*get_inbox1_rptr)(struct dmub_srv *dmub);  	void (*set_inbox1_wptr)(struct dmub_srv *dmub, uint32_t wptr_offset); @@ -366,7 +369,6 @@ struct dmub_srv_hw_funcs {  	bool (*is_hw_init)(struct dmub_srv *dmub); -	bool (*is_phy_init)(struct dmub_srv *dmub);  	void (*enable_dmub_boot_options)(struct dmub_srv *dmub,  				const struct dmub_srv_hw_params *params); @@ -602,6 +604,18 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,  enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub);  /** + * dmub_srv_sync_inbox1() - sync sw state with hw state + * @dmub: the dmub service + * + * Sync sw state with hw state when resume from S0i3 + * + * Return: + *   DMUB_STATUS_OK - success + *   DMUB_STATUS_INVALID - unspecified error + */ +enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub); + +/**   * dmub_srv_cmd_queue() - queues a command to the DMUB   * @dmub: the dmub service   * @cmd: the command to queue diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h index 598fa1de54ce..af1f50742371 100644 --- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h +++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h @@ -257,7 +257,9 @@ struct dmub_feature_caps {  	 */  	uint8_t psr;  	uint8_t fw_assisted_mclk_switch; -	uint8_t reserved[6]; +	uint8_t reserved[4]; +	uint8_t subvp_psr_support; +	uint8_t gecc_enable;  };  struct dmub_visual_confirm_color { @@ -360,7 +362,7 @@ union dmub_fw_boot_status {  		uint32_t optimized_init_done : 1; /**< 1 if optimized init done */  		uint32_t restore_required : 1; /**< 1 if driver should call restore */  		uint32_t defer_load : 1; /**< 1 if VBIOS data is deferred programmed */ -		uint32_t reserved : 1; +		uint32_t fams_enabled : 1; /**< 1 if VBIOS data is deferred programmed */  		uint32_t detection_required: 1; /**<  if detection need to be triggered by driver */  		uint32_t hw_power_init_done: 1; /**< 1 if hw power init is completed */  	} bits; /**< status bits */ @@ -376,6 +378,7 @@ enum dmub_fw_boot_status_bit {  	DMUB_FW_BOOT_STATUS_BIT_OPTIMIZED_INIT_DONE = (1 << 2), /**< 1 if init done */  	DMUB_FW_BOOT_STATUS_BIT_RESTORE_REQUIRED = (1 << 3), /**< 1 if driver should call restore */  	DMUB_FW_BOOT_STATUS_BIT_DEFERRED_LOADED = (1 << 4), /**< 1 if VBIOS data is deferred programmed */ +	DMUB_FW_BOOT_STATUS_BIT_FAMS_ENABLED = (1 << 5), /**< 1 if FAMS is enabled*/  	DMUB_FW_BOOT_STATUS_BIT_DETECTION_REQUIRED = (1 << 6), /**< 1 if detection need to be triggered by driver*/  	DMUB_FW_BOOT_STATUS_BIT_HW_POWER_INIT_DONE = (1 << 7), /**< 1 if hw power init is completed */  }; @@ -395,6 +398,12 @@ enum dmub_lvtma_status_bit {  	DMUB_LVTMA_STATUS_BIT_EDP_ON = (1 << 1),  }; +enum dmub_ips_disable_type { +	DMUB_IPS_DISABLE_IPS1 = 1, +	DMUB_IPS_DISABLE_IPS2 = 2, +	DMUB_IPS_DISABLE_IPS2_Z10 = 3, +}; +  /**   * union dmub_fw_boot_options - Boot option definitions for SCRATCH14   */ @@ -419,7 +428,10 @@ union dmub_fw_boot_options {  		uint32_t dpia_hpd_int_enable_supported: 1; /* 1 if dpia hpd int enable supported */  		uint32_t usb4_dpia_bw_alloc_supported: 1; /* 1 if USB4 dpia BW allocation supported */  		uint32_t disable_clk_ds: 1; /* 1 if disallow dispclk_ds and dppclk_ds*/ -		uint32_t reserved : 14; /**< reserved */ +		uint32_t disable_timeout_recovery : 1; /* 1 if timeout recovery should be disabled */ +		uint32_t ips_pg_disable: 1; /* 1 to disable ONO domains power gating*/ +		uint32_t ips_disable: 2; /* options to disable ips support*/ +		uint32_t reserved : 10; /**< reserved */  	} bits; /**< boot bits */  	uint32_t all; /**< 32-bit access to bits */  }; @@ -988,16 +1000,25 @@ struct dmub_rb_cmd_mall {  };  /** - * enum dmub_cmd_cab_type - TODO: + * enum dmub_cmd_cab_type - CAB command data.   */  enum dmub_cmd_cab_type { +	/** +	 * No idle optimizations (i.e. no CAB) +	 */  	DMUB_CMD__CAB_NO_IDLE_OPTIMIZATION = 0, +	/** +	 * No DCN requests for memory +	 */  	DMUB_CMD__CAB_NO_DCN_REQ = 1, +	/** +	 * Fit surfaces in CAB (i.e. CAB enable) +	 */  	DMUB_CMD__CAB_DCN_SS_FIT_IN_CAB = 2,  };  /** - * struct dmub_rb_cmd_cab_for_ss - TODO: + * struct dmub_rb_cmd_cab - CAB command data.   */  struct dmub_rb_cmd_cab_for_ss {  	struct dmub_cmd_header header; @@ -1005,6 +1026,9 @@ struct dmub_rb_cmd_cab_for_ss {  	uint8_t debug_bits;     /* debug bits */  }; +/** + * Enum for indicating which MCLK switch mode per pipe + */  enum mclk_switch_mode {  	NONE = 0,  	FPO = 1, @@ -1125,8 +1149,6 @@ struct dmub_rb_cmd_idle_opt_dcn_restore {   */  struct dmub_dcn_notify_idle_cntl_data {  	uint8_t driver_idle; -	uint8_t d3_entry; -	uint8_t trigger;  	uint8_t pad[1];  }; @@ -3550,6 +3572,10 @@ union dmub_rb_cmd {  	 * Definition of a DMUB_CMD__DPIA_HPD_INT_ENABLE command.  	 */  	struct dmub_rb_cmd_dpia_hpd_int_enable dpia_hpd_int_enable; +	/** +	 * Definition of a DMUB_CMD__IDLE_OPT_DCN_NOTIFY_IDLE command. +	 */ +	struct dmub_rb_cmd_idle_opt_dcn_notify_idle idle_opt_notify_idle;  };  /** diff --git a/drivers/gpu/drm/amd/display/dmub/src/Makefile b/drivers/gpu/drm/amd/display/dmub/src/Makefile index 0589ad4778ee..caf095aca8f3 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/Makefile +++ b/drivers/gpu/drm/amd/display/dmub/src/Makefile @@ -22,7 +22,7 @@  DMUB = dmub_srv.o dmub_srv_stat.o dmub_reg.o dmub_dcn20.o dmub_dcn21.o  DMUB += dmub_dcn30.o dmub_dcn301.o dmub_dcn302.o dmub_dcn303.o -DMUB += dmub_dcn31.o dmub_dcn315.o dmub_dcn316.o +DMUB += dmub_dcn31.o dmub_dcn314.o dmub_dcn315.o dmub_dcn316.o  DMUB += dmub_dcn32.o  AMD_DAL_DMUB = $(addprefix $(AMDDALPATH)/dmub/src/,$(DMUB)) diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c index a6540e27044d..98dad0d47e72 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.c @@ -282,6 +282,11 @@ void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,  	REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);  } +uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub) +{ +	return REG_READ(DMCUB_INBOX1_WPTR); +} +  uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub)  {  	return REG_READ(DMCUB_INBOX1_RPTR); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.h index c2e5831ac52c..1df128e57ed3 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.h +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn20.h @@ -202,6 +202,8 @@ void dmub_dcn20_setup_windows(struct dmub_srv *dmub,  void dmub_dcn20_setup_mailbox(struct dmub_srv *dmub,  			      const struct dmub_region *inbox1); +uint32_t dmub_dcn20_get_inbox1_wptr(struct dmub_srv *dmub); +  uint32_t dmub_dcn20_get_inbox1_rptr(struct dmub_srv *dmub);  void dmub_dcn20_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c index 51bb9bceb1b1..2d212bc974cc 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.c @@ -54,9 +54,3 @@ const struct dmub_srv_common_regs dmub_srv_dcn21_regs = {  #undef DMUB_SF  }; -/* Shared functions. */ - -bool dmub_dcn21_is_phy_init(struct dmub_srv *dmub) -{ -	return REG_READ(DMCUB_SCRATCH10) == 0; -} diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.h index 6fd5b0cd4ef3..8c4033ae4007 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.h +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn21.h @@ -32,8 +32,4 @@  extern const struct dmub_srv_common_regs dmub_srv_dcn21_regs; -/* Hardware functions. */ - -bool dmub_dcn21_is_phy_init(struct dmub_srv *dmub); -  #endif /* _DMUB_DCN21_H_ */ diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c index c90b9ee42e12..ebf7aeec4029 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c @@ -242,6 +242,11 @@ void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,  	REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);  } +uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub) +{ +	return REG_READ(DMCUB_INBOX1_WPTR); +} +  uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub)  {  	return REG_READ(DMCUB_INBOX1_RPTR); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h index f6db6f89d45d..7d5c10ee539b 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h @@ -204,6 +204,8 @@ void dmub_dcn31_setup_windows(struct dmub_srv *dmub,  void dmub_dcn31_setup_mailbox(struct dmub_srv *dmub,  			      const struct dmub_region *inbox1); +uint32_t dmub_dcn31_get_inbox1_wptr(struct dmub_srv *dmub); +  uint32_t dmub_dcn31_get_inbox1_rptr(struct dmub_srv *dmub);  void dmub_dcn31_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c new file mode 100644 index 000000000000..48a06dbd9be7 --- /dev/null +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c @@ -0,0 +1,62 @@ +/* + * Copyright 2021 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. + * + * Authors: AMD + * + */ + +#include "../dmub_srv.h" +#include "dmub_reg.h" +#include "dmub_dcn314.h" + +#include "dcn/dcn_3_1_4_offset.h" +#include "dcn/dcn_3_1_4_sh_mask.h" + +#define DCN_BASE__INST0_SEG0                       0x00000012 +#define DCN_BASE__INST0_SEG1                       0x000000C0 +#define DCN_BASE__INST0_SEG2                       0x000034C0 +#define DCN_BASE__INST0_SEG3                       0x00009000 +#define DCN_BASE__INST0_SEG4                       0x02403C00 +#define DCN_BASE__INST0_SEG5                       0 + +#define BASE_INNER(seg) DCN_BASE__INST0_SEG##seg +#define CTX dmub +#define REGS dmub->regs_dcn31 +#define REG_OFFSET_EXP(reg_name) (BASE(reg##reg_name##_BASE_IDX) + reg##reg_name) + +/* Registers. */ + +const struct dmub_srv_dcn31_regs dmub_srv_dcn314_regs = { +#define DMUB_SR(reg) REG_OFFSET_EXP(reg), +	{ +		DMUB_DCN31_REGS() +		DMCUB_INTERNAL_REGS() +	}, +#undef DMUB_SR + +#define DMUB_SF(reg, field) FD_MASK(reg, field), +	{ DMUB_DCN31_FIELDS() }, +#undef DMUB_SF + +#define DMUB_SF(reg, field) FD_SHIFT(reg, field), +	{ DMUB_DCN31_FIELDS() }, +#undef DMUB_SF +}; diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h new file mode 100644 index 000000000000..674267a2940e --- /dev/null +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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. + * + * Authors: AMD + * + */ + +#ifndef _DMUB_DCN314_H_ +#define _DMUB_DCN314_H_ + +#include "dmub_dcn31.h" + +extern const struct dmub_srv_dcn31_regs dmub_srv_dcn314_regs; + +#endif /* _DMUB_DCN314_H_ */ diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c index 9c20516be066..bf5994e292d9 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.c @@ -116,10 +116,6 @@ void dmub_dcn32_reset(struct dmub_srv *dmub)  				break;  		} -		/* Clear the GPINT command manually so we don't reset again. */ -		cmd.all = 0; -		dmub->hw_funcs.set_gpint(dmub, cmd); -  		/* Force reset in case we timed out, DMCUB is likely hung. */  	} @@ -133,6 +129,10 @@ void dmub_dcn32_reset(struct dmub_srv *dmub)  	REG_WRITE(DMCUB_OUTBOX0_RPTR, 0);  	REG_WRITE(DMCUB_OUTBOX0_WPTR, 0);  	REG_WRITE(DMCUB_SCRATCH0, 0); + +	/* Clear the GPINT command manually so we don't reset again. */ +	cmd.all = 0; +	dmub->hw_funcs.set_gpint(dmub, cmd);  }  void dmub_dcn32_reset_release(struct dmub_srv *dmub) @@ -266,6 +266,11 @@ void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,  	REG_WRITE(DMCUB_INBOX1_SIZE, inbox1->top - inbox1->base);  } +uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub) +{ +	return REG_READ(DMCUB_INBOX1_WPTR); +} +  uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub)  {  	return REG_READ(DMCUB_INBOX1_RPTR); @@ -434,6 +439,7 @@ void dmub_dcn32_get_diagnostic_data(struct dmub_srv *dmub, struct dmub_diagnosti  	diag_data->scratch[13] = REG_READ(DMCUB_SCRATCH13);  	diag_data->scratch[14] = REG_READ(DMCUB_SCRATCH14);  	diag_data->scratch[15] = REG_READ(DMCUB_SCRATCH15); +	diag_data->scratch[16] = REG_READ(DMCUB_SCRATCH16);  	diag_data->undefined_address_fault_addr = REG_READ(DMCUB_UNDEFINED_ADDRESS_FAULT_ADDR);  	diag_data->inst_fetch_fault_addr = REG_READ(DMCUB_INST_FETCH_FAULT_ADDR); @@ -464,6 +470,8 @@ void dmub_dcn32_get_diagnostic_data(struct dmub_srv *dmub, struct dmub_diagnosti  	REG_GET(DMCUB_REGION3_CW6_TOP_ADDRESS, DMCUB_REGION3_CW6_ENABLE, &is_cw6_enabled);  	diag_data->is_cw6_enabled = is_cw6_enabled; + +	diag_data->gpint_datain0 = REG_READ(DMCUB_GPINT_DATAIN0);  }  void dmub_dcn32_configure_dmub_in_system_memory(struct dmub_srv *dmub)  { diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h index 7d1a6eb4d665..d58a1e4b9f1c 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_dcn32.h @@ -107,6 +107,7 @@ struct dmub_srv;  	DMUB_SR(DMCUB_SCRATCH15) \  	DMUB_SR(DMCUB_SCRATCH16) \  	DMUB_SR(DMCUB_SCRATCH17) \ +	DMUB_SR(DMCUB_GPINT_DATAIN0) \  	DMUB_SR(DMCUB_GPINT_DATAIN1) \  	DMUB_SR(DMCUB_GPINT_DATAOUT) \  	DMUB_SR(CC_DC_PIPE_DIS) \ @@ -206,6 +207,8 @@ void dmub_dcn32_setup_windows(struct dmub_srv *dmub,  void dmub_dcn32_setup_mailbox(struct dmub_srv *dmub,  			      const struct dmub_region *inbox1); +uint32_t dmub_dcn32_get_inbox1_wptr(struct dmub_srv *dmub); +  uint32_t dmub_dcn32_get_inbox1_rptr(struct dmub_srv *dmub);  void dmub_dcn32_set_inbox1_wptr(struct dmub_srv *dmub, uint32_t wptr_offset); diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c index 92c18bfb98b3..9e9a6a44a7ac 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c @@ -32,6 +32,7 @@  #include "dmub_dcn302.h"  #include "dmub_dcn303.h"  #include "dmub_dcn31.h" +#include "dmub_dcn314.h"  #include "dmub_dcn315.h"  #include "dmub_dcn316.h"  #include "dmub_dcn32.h" @@ -166,6 +167,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)  		funcs->backdoor_load = dmub_dcn20_backdoor_load;  		funcs->setup_windows = dmub_dcn20_setup_windows;  		funcs->setup_mailbox = dmub_dcn20_setup_mailbox; +		funcs->get_inbox1_wptr = dmub_dcn20_get_inbox1_wptr;  		funcs->get_inbox1_rptr = dmub_dcn20_get_inbox1_rptr;  		funcs->set_inbox1_wptr = dmub_dcn20_set_inbox1_wptr;  		funcs->is_supported = dmub_dcn20_is_supported; @@ -190,11 +192,9 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)  		funcs->get_diagnostic_data = dmub_dcn20_get_diagnostic_data; -		if (asic == DMUB_ASIC_DCN21) { +		if (asic == DMUB_ASIC_DCN21)  			dmub->regs = &dmub_srv_dcn21_regs; -			funcs->is_phy_init = dmub_dcn21_is_phy_init; -		}  		if (asic == DMUB_ASIC_DCN30) {  			dmub->regs = &dmub_srv_dcn30_regs; @@ -226,7 +226,9 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)  	case DMUB_ASIC_DCN314:  	case DMUB_ASIC_DCN315:  	case DMUB_ASIC_DCN316: -		if (asic == DMUB_ASIC_DCN315) +		if (asic == DMUB_ASIC_DCN314) +			dmub->regs_dcn31 = &dmub_srv_dcn314_regs; +		else if (asic == DMUB_ASIC_DCN315)  			dmub->regs_dcn31 = &dmub_srv_dcn315_regs;  		else if (asic == DMUB_ASIC_DCN316)  			dmub->regs_dcn31 = &dmub_srv_dcn316_regs; @@ -237,6 +239,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)  		funcs->backdoor_load = dmub_dcn31_backdoor_load;  		funcs->setup_windows = dmub_dcn31_setup_windows;  		funcs->setup_mailbox = dmub_dcn31_setup_mailbox; +		funcs->get_inbox1_wptr = dmub_dcn31_get_inbox1_wptr;  		funcs->get_inbox1_rptr = dmub_dcn31_get_inbox1_rptr;  		funcs->set_inbox1_wptr = dmub_dcn31_set_inbox1_wptr;  		funcs->setup_out_mailbox = dmub_dcn31_setup_out_mailbox; @@ -275,6 +278,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)  		funcs->backdoor_load_zfb_mode = dmub_dcn32_backdoor_load_zfb_mode;  		funcs->setup_windows = dmub_dcn32_setup_windows;  		funcs->setup_mailbox = dmub_dcn32_setup_mailbox; +		funcs->get_inbox1_wptr = dmub_dcn32_get_inbox1_wptr;  		funcs->get_inbox1_rptr = dmub_dcn32_get_inbox1_rptr;  		funcs->set_inbox1_wptr = dmub_dcn32_set_inbox1_wptr;  		funcs->setup_out_mailbox = dmub_dcn32_setup_out_mailbox; @@ -644,6 +648,20 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,  	return DMUB_STATUS_OK;  } +enum dmub_status dmub_srv_sync_inbox1(struct dmub_srv *dmub) +{ +	if (!dmub->sw_init) +		return DMUB_STATUS_INVALID; + +	if (dmub->hw_funcs.get_inbox1_rptr && dmub->hw_funcs.get_inbox1_wptr) { +		dmub->inbox1_rb.rptr = dmub->hw_funcs.get_inbox1_rptr(dmub); +		dmub->inbox1_rb.wrpt = dmub->hw_funcs.get_inbox1_wptr(dmub); +		dmub->inbox1_last_wptr = dmub->inbox1_rb.wrpt; +	} + +	return DMUB_STATUS_OK; +} +  enum dmub_status dmub_srv_hw_reset(struct dmub_srv *dmub)  {  	if (!dmub->sw_init) @@ -721,27 +739,6 @@ enum dmub_status dmub_srv_wait_for_auto_load(struct dmub_srv *dmub,  	return DMUB_STATUS_TIMEOUT;  } -enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub, -					    uint32_t timeout_us) -{ -	uint32_t i = 0; - -	if (!dmub->hw_init) -		return DMUB_STATUS_INVALID; - -	if (!dmub->hw_funcs.is_phy_init) -		return DMUB_STATUS_OK; - -	for (i = 0; i <= timeout_us; i += 10) { -		if (dmub->hw_funcs.is_phy_init(dmub)) -			return DMUB_STATUS_OK; - -		udelay(10); -	} - -	return DMUB_STATUS_TIMEOUT; -} -  enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub,  					uint32_t timeout_us)  { diff --git a/drivers/gpu/drm/amd/display/include/fixed31_32.h b/drivers/gpu/drm/amd/display/include/fixed31_32.h index ece97ae0e826..d4cf7ead1d87 100644 --- a/drivers/gpu/drm/amd/display/include/fixed31_32.h +++ b/drivers/gpu/drm/amd/display/include/fixed31_32.h @@ -525,7 +525,7 @@ static inline struct fixed31_32 dc_fixpt_truncate(struct fixed31_32 arg, unsigne  	if (negative)  		arg.value = -arg.value; -	arg.value &= (~0LL) << (FIXED31_32_BITS_PER_FRACTIONAL_PART - frac_bits); +	arg.value &= (~0ULL) << (FIXED31_32_BITS_PER_FRACTIONAL_PART - frac_bits);  	if (negative)  		arg.value = -arg.value;  	return arg; diff --git a/drivers/gpu/drm/amd/display/include/signal_types.h b/drivers/gpu/drm/amd/display/include/signal_types.h index 23a308c3eccb..325c5ba4c82a 100644 --- a/drivers/gpu/drm/amd/display/include/signal_types.h +++ b/drivers/gpu/drm/amd/display/include/signal_types.h @@ -44,6 +44,34 @@ enum signal_type {  	SIGNAL_TYPE_VIRTUAL		= (1 << 9),	/* Virtual Display */  }; +static inline const char *signal_type_to_string(const int type) +{ +	switch (type) { +	case SIGNAL_TYPE_NONE: +		return "No signal"; +	case SIGNAL_TYPE_DVI_SINGLE_LINK: +		return "DVI: Single Link"; +	case SIGNAL_TYPE_DVI_DUAL_LINK: +		return "DVI: Dual Link"; +	case SIGNAL_TYPE_HDMI_TYPE_A: +		return "HDMI: TYPE A"; +	case SIGNAL_TYPE_LVDS: +		return "LVDS"; +	case SIGNAL_TYPE_RGB: +		return "RGB"; +	case SIGNAL_TYPE_DISPLAY_PORT: +		return "Display Port"; +	case SIGNAL_TYPE_DISPLAY_PORT_MST: +		return "Display Port: MST"; +	case SIGNAL_TYPE_EDP: +		return "Embedded Display Port"; +	case SIGNAL_TYPE_VIRTUAL: +		return "Virtual"; +	default: +		return "Unknown"; +	} +} +  /* help functions for signal types manipulation */  static inline bool dc_is_hdmi_tmds_signal(enum signal_type signal)  { diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 5c41a4751db4..5798c0eafa1f 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -1137,10 +1137,6 @@ void mod_freesync_handle_preflip(struct mod_freesync *mod_freesync,  	if (in_out_vrr->supported &&  			in_out_vrr->state == VRR_STATE_ACTIVE_VARIABLE) { -		unsigned int oldest_index = plane->time.index + 1; - -		if (oldest_index >= DC_PLANE_UPDATE_TIMES_MAX) -			oldest_index = 0;  		last_render_time_in_us = curr_time_stamp_in_us -  				plane->time.prev_update_time_in_us; diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c index 51e76bce92ea..30349881a283 100644 --- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c +++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c @@ -116,6 +116,27 @@ static const struct abm_parameters * const abm_settings[] = {  	abm_settings_config2,  }; +static const struct dm_bl_data_point custom_backlight_curve0[] = { +		{2, 14}, {4, 16}, {6, 18}, {8, 21}, {10, 23}, {12, 26}, {14, 29}, {16, 32}, {18, 35}, +		{20, 38}, {22, 41}, {24, 44}, {26, 48}, {28, 52}, {30, 55}, {32, 59}, {34, 62}, +		{36, 67}, {38, 71}, {40, 75}, {42, 80}, {44, 84}, {46, 88}, {48, 93}, {50, 98}, +		{52, 103}, {54, 108}, {56, 113}, {58, 118}, {60, 123}, {62, 129}, {64, 135}, {66, 140}, +		{68, 146}, {70, 152}, {72, 158}, {74, 164}, {76, 171}, {78, 177}, {80, 183}, {82, 190}, +		{84, 197}, {86, 204}, {88, 211}, {90, 218}, {92, 225}, {94, 232}, {96, 240}, {98, 247}}; + +struct custom_backlight_profile { +	uint8_t  ac_level_percentage; +	uint8_t  dc_level_percentage; +	uint8_t  min_input_signal; +	uint8_t  max_input_signal; +	uint8_t  num_data_points; +	const struct dm_bl_data_point *data_points; +}; + +static const struct custom_backlight_profile custom_backlight_profiles[] = { +		{100, 32, 12, 255, ARRAY_SIZE(custom_backlight_curve0), custom_backlight_curve0}, +}; +  #define NUM_AMBI_LEVEL    5  #define NUM_AGGR_LEVEL    4  #define NUM_POWER_FN_SEGS 8 @@ -944,3 +965,25 @@ bool psr_su_set_dsc_slice_height(struct dc *dc, struct dc_link *link,  	return true;  } + +bool fill_custom_backlight_caps(unsigned int config_no, struct dm_acpi_atif_backlight_caps *caps) +{ +	unsigned int data_points_size; + +	if (config_no >= ARRAY_SIZE(custom_backlight_profiles)) +		return false; + +	data_points_size = custom_backlight_profiles[config_no].num_data_points +			* sizeof(custom_backlight_profiles[config_no].data_points[0]); + +	caps->size = sizeof(struct dm_acpi_atif_backlight_caps) - sizeof(caps->data_points) + data_points_size; +	caps->flags = 0; +	caps->error_code = 0; +	caps->ac_level_percentage = custom_backlight_profiles[config_no].ac_level_percentage; +	caps->dc_level_percentage = custom_backlight_profiles[config_no].dc_level_percentage; +	caps->min_input_signal = custom_backlight_profiles[config_no].min_input_signal; +	caps->max_input_signal = custom_backlight_profiles[config_no].max_input_signal; +	caps->num_data_points = custom_backlight_profiles[config_no].num_data_points; +	memcpy(caps->data_points, custom_backlight_profiles[config_no].data_points, data_points_size); +	return true; +} diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.h b/drivers/gpu/drm/amd/display/modules/power/power_helpers.h index 1d3079e56799..ffc924c9991b 100644 --- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.h +++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.h @@ -62,4 +62,7 @@ bool mod_power_only_edp(const struct dc_state *context,  bool psr_su_set_dsc_slice_height(struct dc *dc, struct dc_link *link,  			      struct dc_stream_state *stream,  			      struct psr_config *config); + +bool fill_custom_backlight_caps(unsigned int config_no, +		struct dm_acpi_atif_backlight_caps *caps);  #endif /* MODULES_POWER_POWER_HELPERS_H_ */ diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index e4a22c68517d..f175e65b853a 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h @@ -240,7 +240,6 @@ enum DC_FEATURE_MASK {  	DC_DISABLE_LTTPR_DP2_0 = (1 << 6), //0x40, disabled by default  	DC_PSR_ALLOW_SMU_OPT = (1 << 7), //0x80, disabled by default  	DC_PSR_ALLOW_MULTI_DISP_OPT = (1 << 8), //0x100, disabled by default -	DC_ENABLE_SUBVP_DRR = (1 << 9), // 0x200, disabled by default  };  enum DC_DEBUG_MASK { diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_offset.h index 79c41004c0b6..4908044f7409 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_offset.h @@ -5194,6 +5194,20 @@  #define mmSPI_WCL_PIPE_PERCENT_CS6_BASE_IDX                                                            0  #define mmSPI_WCL_PIPE_PERCENT_CS7                                                                     0x1f70  #define mmSPI_WCL_PIPE_PERCENT_CS7_BASE_IDX                                                            0 +#define mmSPI_GDBG_WAVE_CNTL                                                                           0x1f71 +#define mmSPI_GDBG_WAVE_CNTL_BASE_IDX                                                                  0 +#define mmSPI_GDBG_TRAP_CONFIG                                                                         0x1f72 +#define mmSPI_GDBG_TRAP_CONFIG_BASE_IDX                                                                0 +#define mmSPI_GDBG_TRAP_MASK                                                                           0x1f73 +#define mmSPI_GDBG_TRAP_MASK_BASE_IDX                                                                  0 +#define mmSPI_GDBG_WAVE_CNTL2                                                                          0x1f74 +#define mmSPI_GDBG_WAVE_CNTL2_BASE_IDX                                                                 0 +#define mmSPI_GDBG_WAVE_CNTL3                                                                          0x1f75 +#define mmSPI_GDBG_WAVE_CNTL3_BASE_IDX                                                                 0 +#define mmSPI_GDBG_TRAP_DATA0                                                                          0x1f78 +#define mmSPI_GDBG_TRAP_DATA0_BASE_IDX                                                                 0 +#define mmSPI_GDBG_TRAP_DATA1                                                                          0x1f79 +#define mmSPI_GDBG_TRAP_DATA1_BASE_IDX                                                                 0  #define mmSPI_COMPUTE_QUEUE_RESET                                                                      0x1f7b  #define mmSPI_COMPUTE_QUEUE_RESET_BASE_IDX                                                             0  #define mmSPI_RESOURCE_RESERVE_CU_0                                                                    0x1f7c diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_sh_mask.h index 52043e143067..9b7d219e7954 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_1_0_sh_mask.h @@ -19700,6 +19700,75 @@  //SPI_WCL_PIPE_PERCENT_CS7  #define SPI_WCL_PIPE_PERCENT_CS7__VALUE__SHIFT                                                                0x0  #define SPI_WCL_PIPE_PERCENT_CS7__VALUE_MASK                                                                  0x7FL +//SPI_GDBG_WAVE_CNTL +#define SPI_GDBG_WAVE_CNTL__STALL_RA__SHIFT                                                                   0x0 +#define SPI_GDBG_WAVE_CNTL__STALL_VMID__SHIFT                                                                 0x1 +#define SPI_GDBG_WAVE_CNTL__STALL_RA_MASK                                                                     0x00000001L +#define SPI_GDBG_WAVE_CNTL__STALL_VMID_MASK                                                                   0x0001FFFEL +//SPI_GDBG_TRAP_CONFIG +#define SPI_GDBG_TRAP_CONFIG__ME_SEL__SHIFT                                                                   0x0 +#define SPI_GDBG_TRAP_CONFIG__PIPE_SEL__SHIFT                                                                 0x2 +#define SPI_GDBG_TRAP_CONFIG__QUEUE_SEL__SHIFT                                                                0x4 +#define SPI_GDBG_TRAP_CONFIG__ME_MATCH__SHIFT                                                                 0x7 +#define SPI_GDBG_TRAP_CONFIG__PIPE_MATCH__SHIFT                                                               0x8 +#define SPI_GDBG_TRAP_CONFIG__QUEUE_MATCH__SHIFT                                                              0x9 +#define SPI_GDBG_TRAP_CONFIG__TRAP_EN__SHIFT                                                                  0xf +#define SPI_GDBG_TRAP_CONFIG__VMID_SEL__SHIFT                                                                 0x10 +#define SPI_GDBG_TRAP_CONFIG__ME_SEL_MASK                                                                     0x00000003L +#define SPI_GDBG_TRAP_CONFIG__PIPE_SEL_MASK                                                                   0x0000000CL +#define SPI_GDBG_TRAP_CONFIG__QUEUE_SEL_MASK                                                                  0x00000070L +#define SPI_GDBG_TRAP_CONFIG__ME_MATCH_MASK                                                                   0x00000080L +#define SPI_GDBG_TRAP_CONFIG__PIPE_MATCH_MASK                                                                 0x00000100L +#define SPI_GDBG_TRAP_CONFIG__QUEUE_MATCH_MASK                                                                0x00000200L +#define SPI_GDBG_TRAP_CONFIG__TRAP_EN_MASK                                                                    0x00008000L +#define SPI_GDBG_TRAP_CONFIG__VMID_SEL_MASK                                                                   0xFFFF0000L +//SPI_GDBG_TRAP_MASK +#define SPI_GDBG_TRAP_MASK__EXCP_EN__SHIFT                                                                    0x0 +#define SPI_GDBG_TRAP_MASK__REPLACE__SHIFT                                                                    0x9 +#define SPI_GDBG_TRAP_MASK__EXCP_EN_MASK                                                                      0x01FFL +#define SPI_GDBG_TRAP_MASK__REPLACE_MASK                                                                      0x0200L +//SPI_GDBG_WAVE_CNTL2 +#define SPI_GDBG_WAVE_CNTL2__VMID_MASK__SHIFT                                                                 0x0 +#define SPI_GDBG_WAVE_CNTL2__MODE__SHIFT                                                                      0x10 +#define SPI_GDBG_WAVE_CNTL2__VMID_MASK_MASK                                                                   0x0000FFFFL +#define SPI_GDBG_WAVE_CNTL2__MODE_MASK                                                                        0x00030000L +//SPI_GDBG_WAVE_CNTL3 +#define SPI_GDBG_WAVE_CNTL3__STALL_PS__SHIFT                                                                  0x0 +#define SPI_GDBG_WAVE_CNTL3__STALL_VS__SHIFT                                                                  0x1 +#define SPI_GDBG_WAVE_CNTL3__STALL_GS__SHIFT                                                                  0x2 +#define SPI_GDBG_WAVE_CNTL3__STALL_HS__SHIFT                                                                  0x3 +#define SPI_GDBG_WAVE_CNTL3__STALL_CSG__SHIFT                                                                 0x4 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS0__SHIFT                                                                 0x5 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS1__SHIFT                                                                 0x6 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS2__SHIFT                                                                 0x7 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS3__SHIFT                                                                 0x8 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS4__SHIFT                                                                 0x9 +#define SPI_GDBG_WAVE_CNTL3__STALL_CS5__SHIFT                                                                 0xa +#define SPI_GDBG_WAVE_CNTL3__STALL_CS6__SHIFT                                                                 0xb +#define SPI_GDBG_WAVE_CNTL3__STALL_CS7__SHIFT                                                                 0xc +#define SPI_GDBG_WAVE_CNTL3__STALL_DURATION__SHIFT                                                            0xd +#define SPI_GDBG_WAVE_CNTL3__STALL_MULT__SHIFT                                                                0x1c +#define SPI_GDBG_WAVE_CNTL3__STALL_PS_MASK                                                                    0x00000001L +#define SPI_GDBG_WAVE_CNTL3__STALL_VS_MASK                                                                    0x00000002L +#define SPI_GDBG_WAVE_CNTL3__STALL_GS_MASK                                                                    0x00000004L +#define SPI_GDBG_WAVE_CNTL3__STALL_HS_MASK                                                                    0x00000008L +#define SPI_GDBG_WAVE_CNTL3__STALL_CSG_MASK                                                                   0x00000010L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS0_MASK                                                                   0x00000020L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS1_MASK                                                                   0x00000040L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS2_MASK                                                                   0x00000080L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS3_MASK                                                                   0x00000100L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS4_MASK                                                                   0x00000200L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS5_MASK                                                                   0x00000400L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS6_MASK                                                                   0x00000800L +#define SPI_GDBG_WAVE_CNTL3__STALL_CS7_MASK                                                                   0x00001000L +#define SPI_GDBG_WAVE_CNTL3__STALL_DURATION_MASK                                                              0x0FFFE000L +#define SPI_GDBG_WAVE_CNTL3__STALL_MULT_MASK                                                                  0x10000000L +//SPI_GDBG_TRAP_DATA0 +#define SPI_GDBG_TRAP_DATA0__DATA__SHIFT                                                                      0x0 +#define SPI_GDBG_TRAP_DATA0__DATA_MASK                                                                        0xFFFFFFFFL +//SPI_GDBG_TRAP_DATA1 +#define SPI_GDBG_TRAP_DATA1__DATA__SHIFT                                                                      0x0 +#define SPI_GDBG_TRAP_DATA1__DATA_MASK                                                                        0xFFFFFFFFL  //SPI_COMPUTE_QUEUE_RESET  #define SPI_COMPUTE_QUEUE_RESET__RESET__SHIFT                                                                 0x0  #define SPI_COMPUTE_QUEUE_RESET__RESET_MASK                                                                   0x01L diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_offset.h index a734abaa91a5..5e15ac14b63c 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_offset.h @@ -26,6 +26,8 @@  #define mmSQ_DEBUG_STS_GLOBAL_BASE_IDX                                                                 0  #define mmSQ_DEBUG_STS_GLOBAL2                                                                         0x10B0  #define mmSQ_DEBUG_STS_GLOBAL2_BASE_IDX                                                                0 +#define mmSQ_DEBUG                                                                                     0x10B1 +#define mmSQ_DEBUG_BASE_IDX                                                                            0  // addressBlock: gc_sdma0_sdma0dec  // base address: 0x4980 @@ -4853,10 +4855,18 @@  #define mmSPI_WCL_PIPE_PERCENT_CS3_BASE_IDX                                                            0  #define mmSPI_GDBG_WAVE_CNTL                                                                           0x1f71  #define mmSPI_GDBG_WAVE_CNTL_BASE_IDX                                                                  0 +#define mmSPI_GDBG_TRAP_CONFIG                                                                         0x1f72 +#define mmSPI_GDBG_TRAP_CONFIG_BASE_IDX                                                                0  #define mmSPI_GDBG_TRAP_MASK                                                                           0x1f73  #define mmSPI_GDBG_TRAP_MASK_BASE_IDX                                                                  0  #define mmSPI_GDBG_WAVE_CNTL2                                                                          0x1f74  #define mmSPI_GDBG_WAVE_CNTL2_BASE_IDX                                                                 0 +#define mmSPI_GDBG_WAVE_CNTL3                                                                          0x1f75 +#define mmSPI_GDBG_WAVE_CNTL3_BASE_IDX                                                                 0 +#define mmSPI_GDBG_TRAP_DATA0                                                                          0x1f78 +#define mmSPI_GDBG_TRAP_DATA0_BASE_IDX                                                                 0 +#define mmSPI_GDBG_TRAP_DATA1                                                                          0x1f79 +#define mmSPI_GDBG_TRAP_DATA1_BASE_IDX                                                                 0  #define mmSPI_COMPUTE_QUEUE_RESET                                                                      0x1f7b  #define mmSPI_COMPUTE_QUEUE_RESET_BASE_IDX                                                             0  #define mmSPI_RESOURCE_RESERVE_CU_0                                                                    0x1f7c diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_sh_mask.h index d7a17bae2584..e4ecd6c2d20e 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_10_3_0_sh_mask.h @@ -47907,6 +47907,10 @@  // addressBlock: sqind +//SQ_DEBUG +#define SQ_DEBUG__SINGLE_MEMOP_MASK 0x00000001L +#define SQ_DEBUG__SINGLE_MEMOP__SHIFT 0x00000000 +  //SQ_DEBUG_STS_GLOBAL  #define SQ_DEBUG_STS_GLOBAL2__FIFO_LEVEL_GFX0_MASK 0x000000ffL  #define SQ_DEBUG_STS_GLOBAL2__FIFO_LEVEL_GFX0__SHIFT 0x00000000 diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_sh_mask.h index 4f08f90856fc..3088a4a13cb5 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_11_0_0_sh_mask.h @@ -17216,11 +17216,15 @@  #define SPI_GDBG_PER_VMID_CNTL__TRAP_EN__SHIFT                                                                0x3  #define SPI_GDBG_PER_VMID_CNTL__EXCP_EN__SHIFT                                                                0x4  #define SPI_GDBG_PER_VMID_CNTL__EXCP_REPLACE__SHIFT                                                           0xd +#define SPI_GDBG_PER_VMID_CNTL__TRAP_ON_START__SHIFT                                                          0xe +#define SPI_GDBG_PER_VMID_CNTL__TRAP_ON_END__SHIFT                                                            0xf  #define SPI_GDBG_PER_VMID_CNTL__STALL_VMID_MASK                                                               0x00000001L  #define SPI_GDBG_PER_VMID_CNTL__LAUNCH_MODE_MASK                                                              0x00000006L  #define SPI_GDBG_PER_VMID_CNTL__TRAP_EN_MASK                                                                  0x00000008L  #define SPI_GDBG_PER_VMID_CNTL__EXCP_EN_MASK                                                                  0x00001FF0L  #define SPI_GDBG_PER_VMID_CNTL__EXCP_REPLACE_MASK                                                             0x00002000L +#define SPI_GDBG_PER_VMID_CNTL__TRAP_ON_START_MASK                                                            0x00004000L +#define SPI_GDBG_PER_VMID_CNTL__TRAP_ON_END_MASK                                                              0x00008000L  //SPI_COMPUTE_QUEUE_RESET  #define SPI_COMPUTE_QUEUE_RESET__RESET__SHIFT                                                                 0x0  #define SPI_COMPUTE_QUEUE_RESET__RESET_MASK                                                                   0x01L diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_offset.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_offset.h index 3100de8b3881..393963502b7a 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_offset.h @@ -705,6 +705,46 @@  #define regSQC_ICACHE_UTCL1_STATUS_BASE_IDX                                                             0  #define regSQC_DCACHE_UTCL1_STATUS                                                                      0x03d8  #define regSQC_DCACHE_UTCL1_STATUS_BASE_IDX                                                             0 +#define regSQC_UE_EDC_LO                                                                                0x03d9 +#define regSQC_UE_EDC_LO_BASE_IDX                                                                       0 +#define regSQC_UE_EDC_HI                                                                                0x03da +#define regSQC_UE_EDC_HI_BASE_IDX                                                                       0 +#define regSQC_CE_EDC_LO                                                                                0x03db +#define regSQC_CE_EDC_LO_BASE_IDX                                                                       0 +#define regSQC_CE_EDC_HI                                                                                0x03dc +#define regSQC_CE_EDC_HI_BASE_IDX                                                                       0 +#define regSQ_UE_ERR_STATUS_LO                                                                          0x03dd +#define regSQ_UE_ERR_STATUS_LO_BASE_IDX                                                                 0 +#define regSQ_UE_ERR_STATUS_HI                                                                          0x03de +#define regSQ_UE_ERR_STATUS_HI_BASE_IDX                                                                 0 +#define regSQ_CE_ERR_STATUS_LO                                                                          0x03df +#define regSQ_CE_ERR_STATUS_LO_BASE_IDX                                                                 0 +#define regSQ_CE_ERR_STATUS_HI                                                                          0x03e0 +#define regSQ_CE_ERR_STATUS_HI_BASE_IDX                                                                 0 +#define regLDS_UE_ERR_STATUS_LO                                                                         0x03e1 +#define regLDS_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regLDS_UE_ERR_STATUS_HI                                                                         0x03e2 +#define regLDS_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regLDS_CE_ERR_STATUS_LO                                                                         0x03e3 +#define regLDS_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regLDS_CE_ERR_STATUS_HI                                                                         0x03e4 +#define regLDS_CE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regSP0_UE_ERR_STATUS_LO                                                                         0x03e5 +#define regSP0_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSP0_UE_ERR_STATUS_HI                                                                         0x03e6 +#define regSP0_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regSP0_CE_ERR_STATUS_LO                                                                         0x03e7 +#define regSP0_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSP0_CE_ERR_STATUS_HI                                                                         0x03e8 +#define regSP0_CE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regSP1_UE_ERR_STATUS_LO                                                                         0x03e9 +#define regSP1_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSP1_UE_ERR_STATUS_HI                                                                         0x03ea +#define regSP1_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regSP1_CE_ERR_STATUS_LO                                                                         0x03eb +#define regSP1_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSP1_CE_ERR_STATUS_HI                                                                         0x03ec +#define regSP1_CE_ERR_STATUS_HI_BASE_IDX                                                                0  // addressBlock: xcd0_gc_shsdec @@ -727,6 +767,14 @@  #define regSPI_DSM_CNTL2_BASE_IDX                                                                       0  #define regSPI_EDC_CNT                                                                                  0x0445  #define regSPI_EDC_CNT_BASE_IDX                                                                         0 +#define regSPI_UE_ERR_STATUS_LO                                                                         0x0446 +#define regSPI_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSPI_UE_ERR_STATUS_HI                                                                         0x0447 +#define regSPI_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regSPI_CE_ERR_STATUS_LO                                                                         0x0448 +#define regSPI_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regSPI_CE_ERR_STATUS_HI                                                                         0x0449 +#define regSPI_CE_ERR_STATUS_HI_BASE_IDX                                                                0  #define regSPI_DEBUG_BUSY                                                                               0x0450  #define regSPI_DEBUG_BUSY_BASE_IDX                                                                      0  #define regSPI_CONFIG_PS_CU_EN                                                                          0x0452 @@ -871,6 +919,14 @@  #define regTD_STATUS_BASE_IDX                                                                           0  #define regTD_POWER_CNTL                                                                                0x052a  #define regTD_POWER_CNTL_BASE_IDX                                                                       0 +#define regTD_UE_EDC_LO                                                                                 0x052b +#define regTD_UE_EDC_LO_BASE_IDX                                                                        0 +#define regTD_UE_EDC_HI                                                                                 0x052c +#define regTD_UE_EDC_HI_BASE_IDX                                                                        0 +#define regTD_CE_EDC_LO                                                                                 0x052d +#define regTD_CE_EDC_LO_BASE_IDX                                                                        0 +#define regTD_CE_EDC_HI                                                                                 0x052e +#define regTD_CE_EDC_HI_BASE_IDX                                                                        0  #define regTD_DSM_CNTL                                                                                  0x052f  #define regTD_DSM_CNTL_BASE_IDX                                                                         0  #define regTD_DSM_CNTL2                                                                                 0x0530 @@ -893,6 +949,14 @@  #define regTA_DSM_CNTL_BASE_IDX                                                                         0  #define regTA_DSM_CNTL2                                                                                 0x0585  #define regTA_DSM_CNTL2_BASE_IDX                                                                        0 +#define regTA_UE_EDC_LO                                                                                 0x0587 +#define regTA_UE_EDC_LO_BASE_IDX                                                                        0 +#define regTA_UE_EDC_HI                                                                                 0x0588 +#define regTA_UE_EDC_HI_BASE_IDX                                                                        0 +#define regTA_CE_EDC_LO                                                                                 0x0589 +#define regTA_CE_EDC_LO_BASE_IDX                                                                        0 +#define regTA_CE_EDC_HI                                                                                 0x058a +#define regTA_CE_EDC_HI_BASE_IDX                                                                        0  // addressBlock: xcd0_gc_gdsdec @@ -923,6 +987,14 @@  #define regGDS_DSM_CNTL2_BASE_IDX                                                                       0  #define regGDS_WD_GDS_CSB                                                                               0x05ce  #define regGDS_WD_GDS_CSB_BASE_IDX                                                                      0 +#define regGDS_UE_ERR_STATUS_LO                                                                         0x05cf +#define regGDS_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regGDS_UE_ERR_STATUS_HI                                                                         0x05d0 +#define regGDS_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regGDS_CE_ERR_STATUS_LO                                                                         0x05d1 +#define regGDS_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regGDS_CE_ERR_STATUS_HI                                                                         0x05d2 +#define regGDS_CE_ERR_STATUS_HI_BASE_IDX                                                                0  // addressBlock: xcd0_gc_rbdec @@ -1243,6 +1315,10 @@  #define regGCEA_MAM_CTRL_BASE_IDX                                                                       0  #define regGCEA_MAM_CTRL2                                                                               0x0702  #define regGCEA_MAM_CTRL2_BASE_IDX                                                                      0 +#define regGCEA_UE_ERR_STATUS_LO                                                                        0x0706 +#define regGCEA_UE_ERR_STATUS_LO_BASE_IDX                                                               0 +#define regGCEA_UE_ERR_STATUS_HI                                                                        0x0707 +#define regGCEA_UE_ERR_STATUS_HI_BASE_IDX                                                               0  #define regGCEA_DSM_CNTL                                                                                0x0708  #define regGCEA_DSM_CNTL_BASE_IDX                                                                       0  #define regGCEA_DSM_CNTLA                                                                               0x0709 @@ -1277,6 +1353,10 @@  #define regGCEA_SDP_BACKDOOR_DATACREDITS1_BASE_IDX                                                      0  #define regGCEA_SDP_BACKDOOR_MISCCREDITS                                                                0x0719  #define regGCEA_SDP_BACKDOOR_MISCCREDITS_BASE_IDX                                                       0 +#define regGCEA_CE_ERR_STATUS_LO                                                                        0x071b +#define regGCEA_CE_ERR_STATUS_LO_BASE_IDX                                                               0 +#define regGCEA_CE_ERR_STATUS_HI                                                                        0x071d +#define regGCEA_CE_ERR_STATUS_HI_BASE_IDX                                                               0  #define regGCEA_SDP_ENABLE                                                                              0x071f  #define regGCEA_SDP_ENABLE_BASE_IDX                                                                     0 @@ -1389,6 +1469,14 @@  #define regATC_L2_CNTL4_BASE_IDX                                                                        0  #define regATC_L2_MM_GROUP_RT_CLASSES                                                                   0x0816  #define regATC_L2_MM_GROUP_RT_CLASSES_BASE_IDX                                                          0 +#define regATC_L2_UE_ERR_STATUS_LO                                                                      0x081a +#define regATC_L2_UE_ERR_STATUS_LO_BASE_IDX                                                             0 +#define regATC_L2_UE_ERR_STATUS_HI                                                                      0x081b +#define regATC_L2_UE_ERR_STATUS_HI_BASE_IDX                                                             0 +#define regATC_L2_CE_ERR_STATUS_LO                                                                      0x081c +#define regATC_L2_CE_ERR_STATUS_LO_BASE_IDX                                                             0 +#define regATC_L2_CE_ERR_STATUS_HI                                                                      0x081d +#define regATC_L2_CE_ERR_STATUS_HI_BASE_IDX                                                             0  // addressBlock: xcd0_gc_utcl2_vml2pfdec @@ -1475,6 +1563,30 @@  #define regUTCL2_EDC_MODE_BASE_IDX                                                                      0  #define regUTCL2_EDC_CONFIG                                                                             0x084c  #define regUTCL2_EDC_CONFIG_BASE_IDX                                                                    0 +#define regVML2_UE_ERR_STATUS_LO                                                                        0x084d +#define regVML2_UE_ERR_STATUS_LO_BASE_IDX                                                               0 +#define regVML2_WALKER_UE_ERR_STATUS_LO                                                                 0x084e +#define regVML2_WALKER_UE_ERR_STATUS_LO_BASE_IDX                                                        0 +#define regUTCL2_UE_ERR_STATUS_LO                                                                       0x084f +#define regUTCL2_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regVML2_UE_ERR_STATUS_HI                                                                        0x0850 +#define regVML2_UE_ERR_STATUS_HI_BASE_IDX                                                               0 +#define regVML2_WALKER_UE_ERR_STATUS_HI                                                                 0x0851 +#define regVML2_WALKER_UE_ERR_STATUS_HI_BASE_IDX                                                        0 +#define regUTCL2_UE_ERR_STATUS_HI                                                                       0x0852 +#define regUTCL2_UE_ERR_STATUS_HI_BASE_IDX                                                              0 +#define regVML2_CE_ERR_STATUS_LO                                                                        0x0853 +#define regVML2_CE_ERR_STATUS_LO_BASE_IDX                                                               0 +#define regVML2_WALKER_CE_ERR_STATUS_LO                                                                 0x0854 +#define regVML2_WALKER_CE_ERR_STATUS_LO_BASE_IDX                                                        0 +#define regUTCL2_CE_ERR_STATUS_LO                                                                       0x0855 +#define regUTCL2_CE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regVML2_CE_ERR_STATUS_HI                                                                        0x0856 +#define regVML2_CE_ERR_STATUS_HI_BASE_IDX                                                               0 +#define regVML2_WALKER_CE_ERR_STATUS_HI                                                                 0x0857 +#define regVML2_WALKER_CE_ERR_STATUS_HI_BASE_IDX                                                        0 +#define regUTCL2_CE_ERR_STATUS_HI                                                                       0x0858 +#define regUTCL2_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: xcd0_gc_utcl2_vml2vcdec @@ -2011,6 +2123,22 @@  #define regTC_CFG_L1_VOLATILE_BASE_IDX                                                                  0  #define regTC_CFG_L2_VOLATILE                                                                           0x0b23  #define regTC_CFG_L2_VOLATILE_BASE_IDX                                                                  0 +#define regTCP_UE_EDC_HI_REG                                                                            0x0b54 +#define regTCP_UE_EDC_HI_REG_BASE_IDX                                                                   0 +#define regTCP_UE_EDC_LO_REG                                                                            0x0b55 +#define regTCP_UE_EDC_LO_REG_BASE_IDX                                                                   0 +#define regTCP_CE_EDC_HI_REG                                                                            0x0b56 +#define regTCP_CE_EDC_HI_REG_BASE_IDX                                                                   0 +#define regTCP_CE_EDC_LO_REG                                                                            0x0b57 +#define regTCP_CE_EDC_LO_REG_BASE_IDX                                                                   0 +#define regTCI_UE_EDC_HI_REG                                                                            0x0b58 +#define regTCI_UE_EDC_HI_REG_BASE_IDX                                                                   0 +#define regTCI_UE_EDC_LO_REG                                                                            0x0b59 +#define regTCI_UE_EDC_LO_REG_BASE_IDX                                                                   0 +#define regTCI_CE_EDC_HI_REG                                                                            0x0b5a +#define regTCI_CE_EDC_HI_REG_BASE_IDX                                                                   0 +#define regTCI_CE_EDC_LO_REG                                                                            0x0b5b +#define regTCI_CE_EDC_LO_REG_BASE_IDX                                                                   0  #define regTCI_MISC                                                                                     0x0b5c  #define regTCI_MISC_BASE_IDX                                                                            0  #define regTCI_CNTL_3                                                                                   0x0b5d @@ -2061,6 +2189,26 @@  #define regTCX_DSM_CNTL_BASE_IDX                                                                        0  #define regTCX_DSM_CNTL2                                                                                0x0bc8  #define regTCX_DSM_CNTL2_BASE_IDX                                                                       0 +#define regTCA_UE_ERR_STATUS_LO                                                                         0x0bc9 +#define regTCA_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regTCA_UE_ERR_STATUS_HI                                                                         0x0bca +#define regTCA_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regTCX_UE_ERR_STATUS_LO                                                                         0x0bcb +#define regTCX_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regTCX_UE_ERR_STATUS_HI                                                                         0x0bcc +#define regTCX_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regTCX_CE_ERR_STATUS_LO                                                                         0x0bcd +#define regTCX_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regTCX_CE_ERR_STATUS_HI                                                                         0x0bce +#define regTCX_CE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regTCC_UE_ERR_STATUS_LO                                                                         0x0bcf +#define regTCC_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regTCC_UE_ERR_STATUS_HI                                                                         0x0bd0 +#define regTCC_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regTCC_CE_ERR_STATUS_LO                                                                         0x0bd1 +#define regTCC_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regTCC_CE_ERR_STATUS_HI                                                                         0x0bd2 +#define regTCC_CE_ERR_STATUS_HI_BASE_IDX                                                                0  // addressBlock: xcd0_gc_shdec @@ -2905,6 +3053,30 @@  #define regCP_MEC2_F32_INT_DIS_BASE_IDX                                                                 0  #define regCP_VMID_STATUS                                                                               0x10bf  #define regCP_VMID_STATUS_BASE_IDX                                                                      0 +#define regCPC_UE_ERR_STATUS_LO                                                                         0x10e0 +#define regCPC_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPC_UE_ERR_STATUS_HI                                                                         0x10e1 +#define regCPC_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regCPC_CE_ERR_STATUS_LO                                                                         0x10e2 +#define regCPC_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPC_CE_ERR_STATUS_HI                                                                         0x10e3 +#define regCPC_CE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regCPF_UE_ERR_STATUS_LO                                                                         0x10e4 +#define regCPF_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPF_UE_ERR_STATUS_HI                                                                         0x10e5 +#define regCPF_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regCPF_CE_ERR_STATUS_LO                                                                         0x10e6 +#define regCPF_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPF_CE_ERR_STATUS_HI                                                                         0x10e7 +#define regCPF_CE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regCPG_UE_ERR_STATUS_LO                                                                         0x10e8 +#define regCPG_UE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPG_UE_ERR_STATUS_HI                                                                         0x10e9 +#define regCPG_UE_ERR_STATUS_HI_BASE_IDX                                                                0 +#define regCPG_CE_ERR_STATUS_LO                                                                         0x10ea +#define regCPG_CE_ERR_STATUS_LO_BASE_IDX                                                                0 +#define regCPG_CE_ERR_STATUS_HI                                                                         0x10eb +#define regCPG_CE_ERR_STATUS_HI_BASE_IDX                                                                0  // addressBlock: xcd0_gc_cppdec2 @@ -5364,6 +5536,18 @@  #define regSPI_WAVE_LIMIT_CNTL                                                                          0x2443  #define regSPI_WAVE_LIMIT_CNTL_BASE_IDX                                                                 1 +// addressBlock: xcd0_gc_gccanedec +// base address: 0x33d00 +#define regGC_CANE_ERR_STATUS                                                                           0x2f4d +#define regGC_CANE_ERR_STATUS_BASE_IDX                                                                  1 +#define regGC_CANE_UE_ERR_STATUS_LO                                                                     0x2f4e +#define regGC_CANE_UE_ERR_STATUS_LO_BASE_IDX                                                            1 +#define regGC_CANE_UE_ERR_STATUS_HI                                                                     0x2f4f +#define regGC_CANE_UE_ERR_STATUS_HI_BASE_IDX                                                            1 +#define regGC_CANE_CE_ERR_STATUS_LO                                                                     0x2f50 +#define regGC_CANE_CE_ERR_STATUS_LO_BASE_IDX                                                            1 +#define regGC_CANE_CE_ERR_STATUS_HI                                                                     0x2f51 +#define regGC_CANE_CE_ERR_STATUS_HI_BASE_IDX                                                            1  // addressBlock: xcd0_gc_perfddec  // base address: 0x34000 @@ -6583,6 +6767,10 @@  #define regRLC_CAPTURE_GPU_CLOCK_COUNT_2_BASE_IDX                                                       1  #define regRLC_CPG_STAT_INVAL                                                                           0x4d09  #define regRLC_CPG_STAT_INVAL_BASE_IDX                                                                  1 +#define regRLC_UE_ERR_STATUS_LOW                                                                        0x4d40 +#define regRLC_UE_ERR_STATUS_LOW_BASE_IDX                                                               1 +#define regRLC_UE_ERR_STATUS_HIGH                                                                       0x4d41 +#define regRLC_UE_ERR_STATUS_HIGH_BASE_IDX                                                              1  #define regRLC_DSM_CNTL                                                                                 0x4d42  #define regRLC_DSM_CNTL_BASE_IDX                                                                        1  #define regRLC_DSM_CNTLA                                                                                0x4d43 @@ -6591,6 +6779,10 @@  #define regRLC_DSM_CNTL2_BASE_IDX                                                                       1  #define regRLC_DSM_CNTL2A                                                                               0x4d45  #define regRLC_DSM_CNTL2A_BASE_IDX                                                                      1 +#define regRLC_CE_ERR_STATUS_LOW                                                                        0x4d49 +#define regRLC_CE_ERR_STATUS_LOW_BASE_IDX                                                               1 +#define regRLC_CE_ERR_STATUS_HIGH                                                                       0x4d4a +#define regRLC_CE_ERR_STATUS_HIGH_BASE_IDX                                                              1  #define regRLC_RLCV_SPARE_INT                                                                           0x4f30  #define regRLC_RLCV_SPARE_INT_BASE_IDX                                                                  1  #define regRLC_SMU_CLK_REQ                                                                              0x4f97 diff --git a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_sh_mask.h index 84a75b58347f..2bd9f3f1026f 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/gc/gc_9_4_3_sh_mask.h @@ -4129,6 +4129,240 @@  #define SQC_DCACHE_UTCL1_STATUS__FAULT_DETECTED_MASK                                                          0x00000001L  #define SQC_DCACHE_UTCL1_STATUS__RETRY_DETECTED_MASK                                                          0x00000002L  #define SQC_DCACHE_UTCL1_STATUS__PRT_DETECTED_MASK                                                            0x00000004L +//SQC_UE_EDC_LO +#define SQC_UE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                               0x0 +#define SQC_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                         0x1 +#define SQC_UE_EDC_LO__ADDRESS__SHIFT                                                                         0x2 +#define SQC_UE_EDC_LO__MEM_ID__SHIFT                                                                          0x18 +#define SQC_UE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                 0x00000001L +#define SQC_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                           0x00000002L +#define SQC_UE_EDC_LO__ADDRESS_MASK                                                                           0x00FFFFFCL +#define SQC_UE_EDC_LO__MEM_ID_MASK                                                                            0xFF000000L +//SQC_UE_EDC_HI +#define SQC_UE_EDC_HI__ECC__SHIFT                                                                             0x0 +#define SQC_UE_EDC_HI__PARITY__SHIFT                                                                          0x1 +#define SQC_UE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                             0x2 +#define SQC_UE_EDC_HI__ERR_INFO__SHIFT                                                                        0x3 +#define SQC_UE_EDC_HI__UE_CNT__SHIFT                                                                          0x17 +#define SQC_UE_EDC_HI__FED_CNT__SHIFT                                                                         0x1a +#define SQC_UE_EDC_HI__ECC_MASK                                                                               0x00000001L +#define SQC_UE_EDC_HI__PARITY_MASK                                                                            0x00000002L +#define SQC_UE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                               0x00000004L +#define SQC_UE_EDC_HI__ERR_INFO_MASK                                                                          0x007FFFF8L +#define SQC_UE_EDC_HI__UE_CNT_MASK                                                                            0x03800000L +#define SQC_UE_EDC_HI__FED_CNT_MASK                                                                           0x1C000000L +//SQC_CE_EDC_LO +#define SQC_CE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                               0x0 +#define SQC_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                         0x1 +#define SQC_CE_EDC_LO__ADDRESS__SHIFT                                                                         0x2 +#define SQC_CE_EDC_LO__MEM_ID__SHIFT                                                                          0x18 +#define SQC_CE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                 0x00000001L +#define SQC_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                           0x00000002L +#define SQC_CE_EDC_LO__ADDRESS_MASK                                                                           0x00FFFFFCL +#define SQC_CE_EDC_LO__MEM_ID_MASK                                                                            0xFF000000L +//SQC_CE_EDC_HI +#define SQC_CE_EDC_HI__ECC__SHIFT                                                                             0x0 +#define SQC_CE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                             0x2 +#define SQC_CE_EDC_HI__ERR_INFO__SHIFT                                                                        0x3 +#define SQC_CE_EDC_HI__CE_CNT__SHIFT                                                                          0x17 +#define SQC_CE_EDC_HI__POSION__SHIFT                                                                          0x1a +#define SQC_CE_EDC_HI__ECC_MASK                                                                               0x00000001L +#define SQC_CE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                               0x00000004L +#define SQC_CE_EDC_HI__ERR_INFO_MASK                                                                          0x007FFFF8L +#define SQC_CE_EDC_HI__CE_CNT_MASK                                                                            0x03800000L +#define SQC_CE_EDC_HI__POSION_MASK                                                                            0x04000000L +//SQ_UE_ERR_STATUS_LO +#define SQ_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                     0x0 +#define SQ_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                        0x1 +#define SQ_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                   0x2 +#define SQ_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                 0x18 +#define SQ_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                       0x00000001L +#define SQ_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                          0x00000002L +#define SQ_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                     0x00FFFFFCL +#define SQ_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                   0xFF000000L +//SQ_UE_ERR_STATUS_HI +#define SQ_UE_ERR_STATUS_HI__ECC__SHIFT                                                                       0x0 +#define SQ_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                    0x1 +#define SQ_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                       0x2 +#define SQ_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                  0x3 +#define SQ_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                    0x17 +#define SQ_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                   0x1a +#define SQ_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                  0x1d +#define SQ_UE_ERR_STATUS_HI__ECC_MASK                                                                         0x00000001L +#define SQ_UE_ERR_STATUS_HI__PARITY_MASK                                                                      0x00000002L +#define SQ_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                         0x00000004L +#define SQ_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                    0x007FFFF8L +#define SQ_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                      0x03800000L +#define SQ_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                     0x1C000000L +#define SQ_UE_ERR_STATUS_HI__RESERVED_MASK                                                                    0xE0000000L +//SQ_CE_ERR_STATUS_LO +#define SQ_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                     0x0 +#define SQ_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                        0x1 +#define SQ_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                   0x2 +#define SQ_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                 0x18 +#define SQ_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                       0x00000001L +#define SQ_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                          0x00000002L +#define SQ_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                     0x00FFFFFCL +#define SQ_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                   0xFF000000L +//SQ_CE_ERR_STATUS_HI +#define SQ_CE_ERR_STATUS_HI__ECC__SHIFT                                                                       0x0 +#define SQ_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                     0x1 +#define SQ_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                       0x2 +#define SQ_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                  0x3 +#define SQ_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                    0x17 +#define SQ_CE_ERR_STATUS_HI__POISON__SHIFT                                                                    0x1a +#define SQ_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                  0x1b +#define SQ_CE_ERR_STATUS_HI__ECC_MASK                                                                         0x00000001L +#define SQ_CE_ERR_STATUS_HI__OTHER_MASK                                                                       0x00000002L +#define SQ_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                         0x00000004L +#define SQ_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                    0x007FFFF8L +#define SQ_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                      0x03800000L +#define SQ_CE_ERR_STATUS_HI__POISON_MASK                                                                      0x04000000L +#define SQ_CE_ERR_STATUS_HI__RESERVED_MASK                                                                    0xF8000000L +//LDS_UE_ERR_STATUS_LO +#define LDS_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define LDS_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define LDS_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define LDS_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define LDS_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define LDS_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define LDS_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define LDS_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//LDS_UE_ERR_STATUS_HI +#define LDS_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define LDS_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define LDS_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define LDS_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define LDS_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define LDS_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define LDS_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define LDS_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define LDS_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define LDS_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define LDS_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define LDS_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define LDS_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define LDS_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//LDS_CE_ERR_STATUS_LO +#define LDS_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define LDS_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define LDS_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define LDS_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define LDS_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define LDS_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define LDS_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define LDS_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//LDS_CE_ERR_STATUS_HI +#define LDS_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define LDS_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define LDS_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define LDS_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define LDS_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define LDS_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define LDS_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define LDS_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define LDS_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define LDS_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define LDS_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define LDS_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define LDS_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define LDS_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L +//SP0_UE_ERR_STATUS_LO +#define SP0_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SP0_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SP0_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SP0_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SP0_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SP0_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SP0_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SP0_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SP0_UE_ERR_STATUS_HI +#define SP0_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SP0_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define SP0_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SP0_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SP0_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define SP0_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define SP0_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define SP0_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SP0_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define SP0_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SP0_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SP0_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define SP0_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define SP0_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//SP0_CE_ERR_STATUS_LO +#define SP0_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SP0_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SP0_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SP0_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SP0_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SP0_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SP0_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SP0_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SP0_CE_ERR_STATUS_HI +#define SP0_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SP0_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define SP0_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SP0_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SP0_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define SP0_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define SP0_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define SP0_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SP0_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define SP0_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SP0_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SP0_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define SP0_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define SP0_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L +//SP1_UE_ERR_STATUS_LO +#define SP1_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SP1_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SP1_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SP1_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SP1_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SP1_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SP1_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SP1_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SP1_UE_ERR_STATUS_HI +#define SP1_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SP1_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define SP1_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SP1_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SP1_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define SP1_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define SP1_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define SP1_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SP1_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define SP1_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SP1_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SP1_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define SP1_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define SP1_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//SP1_CE_ERR_STATUS_LO +#define SP1_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SP1_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SP1_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SP1_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SP1_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SP1_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SP1_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SP1_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SP1_CE_ERR_STATUS_HI +#define SP1_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SP1_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define SP1_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SP1_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SP1_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define SP1_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define SP1_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define SP1_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SP1_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define SP1_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SP1_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SP1_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define SP1_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define SP1_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L  // addressBlock: xcd0_gc_shsdec @@ -4235,6 +4469,54 @@  #define SPI_EDC_CNT__SPI_LIFE_CNT_SEC_COUNT_MASK                                                              0x00030000L  #define SPI_EDC_CNT__SPI_LIFE_CNT_DED_COUNT_MASK                                                              0x000C0000L  #define SPI_EDC_CNT__UNUSED_MASK                                                                              0xFFF00000L +//SPI_UE_ERR_STATUS_LO +#define SPI_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SPI_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SPI_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SPI_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SPI_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SPI_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SPI_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SPI_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SPI_UE_ERR_STATUS_HI +#define SPI_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SPI_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define SPI_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SPI_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SPI_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define SPI_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define SPI_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define SPI_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SPI_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define SPI_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SPI_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SPI_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define SPI_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define SPI_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//SPI_CE_ERR_STATUS_LO +#define SPI_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define SPI_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define SPI_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define SPI_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define SPI_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define SPI_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define SPI_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define SPI_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//SPI_CE_ERR_STATUS_HI +#define SPI_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define SPI_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define SPI_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define SPI_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define SPI_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define SPI_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define SPI_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define SPI_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define SPI_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define SPI_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define SPI_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define SPI_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define SPI_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define SPI_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L  //SPI_DEBUG_BUSY  #define SPI_DEBUG_BUSY__HS_BUSY__SHIFT                                                                        0x0  #define SPI_DEBUG_BUSY__GS_BUSY__SHIFT                                                                        0x1 @@ -4622,6 +4904,48 @@  #define TD_POWER_CNTL__MGCG_OUTPUTSTAGE_MASK                                                                  0x00000002L  #define TD_POWER_CNTL__MID0_THREAD_DATA_MASK                                                                  0x00000004L  #define TD_POWER_CNTL__MID2_ACCUM_DATA_MASK                                                                   0x00000008L +//TD_UE_EDC_LO +#define TD_UE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                                0x0 +#define TD_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                          0x1 +#define TD_UE_EDC_LO__ADDRESS__SHIFT                                                                          0x2 +#define TD_UE_EDC_LO__MEM_ID__SHIFT                                                                           0x18 +#define TD_UE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                  0x00000001L +#define TD_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                            0x00000002L +#define TD_UE_EDC_LO__ADDRESS_MASK                                                                            0x00FFFFFCL +#define TD_UE_EDC_LO__MEM_ID_MASK                                                                             0xFF000000L +//TD_UE_EDC_HI +#define TD_UE_EDC_HI__ECC__SHIFT                                                                              0x0 +#define TD_UE_EDC_HI__PARITY__SHIFT                                                                           0x1 +#define TD_UE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                              0x2 +#define TD_UE_EDC_HI__ERR_INFO__SHIFT                                                                         0x3 +#define TD_UE_EDC_HI__UE_CNT__SHIFT                                                                           0x17 +#define TD_UE_EDC_HI__FED_CNT__SHIFT                                                                          0x1a +#define TD_UE_EDC_HI__ECC_MASK                                                                                0x00000001L +#define TD_UE_EDC_HI__PARITY_MASK                                                                             0x00000002L +#define TD_UE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                                0x00000004L +#define TD_UE_EDC_HI__ERR_INFO_MASK                                                                           0x007FFFF8L +#define TD_UE_EDC_HI__UE_CNT_MASK                                                                             0x03800000L +#define TD_UE_EDC_HI__FED_CNT_MASK                                                                            0x1C000000L +//TD_CE_EDC_LO +#define TD_CE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                                0x0 +#define TD_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                          0x1 +#define TD_CE_EDC_LO__ADDRESS__SHIFT                                                                          0x2 +#define TD_CE_EDC_LO__MEM_ID__SHIFT                                                                           0x18 +#define TD_CE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                  0x00000001L +#define TD_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                            0x00000002L +#define TD_CE_EDC_LO__ADDRESS_MASK                                                                            0x00FFFFFCL +#define TD_CE_EDC_LO__MEM_ID_MASK                                                                             0xFF000000L +//TD_CE_EDC_HI +#define TD_CE_EDC_HI__ECC__SHIFT                                                                              0x0 +#define TD_CE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                              0x2 +#define TD_CE_EDC_HI__ERR_INFO__SHIFT                                                                         0x3 +#define TD_CE_EDC_HI__CE_CNT__SHIFT                                                                           0x17 +#define TD_CE_EDC_HI__POISON__SHIFT                                                                           0x1a +#define TD_CE_EDC_HI__ECC_MASK                                                                                0x00000001L +#define TD_CE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                                0x00000004L +#define TD_CE_EDC_HI__ERR_INFO_MASK                                                                           0x007FFFF8L +#define TD_CE_EDC_HI__CE_CNT_MASK                                                                             0x03800000L +#define TD_CE_EDC_HI__POISON_MASK                                                                             0x04000000L  //TD_DSM_CNTL  #define TD_DSM_CNTL__TD_SS_FIFO_LO_DSM_IRRITATOR_DATA__SHIFT                                                  0x0  #define TD_DSM_CNTL__TD_SS_FIFO_LO_ENABLE_SINGLE_WRITE__SHIFT                                                 0x2 @@ -4771,6 +5095,48 @@  #define TA_DSM_CNTL2__TA_FS_AFIFO_HI_ENABLE_ERROR_INJECT_MASK                                                 0x000C0000L  #define TA_DSM_CNTL2__TA_FS_AFIFO_HI_SELECT_INJECT_DELAY_MASK                                                 0x00100000L  #define TA_DSM_CNTL2__TA_INJECT_DELAY_MASK                                                                    0xFC000000L +//TA_UE_EDC_LO +#define TA_UE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                                0x0 +#define TA_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                          0x1 +#define TA_UE_EDC_LO__ADDRESS__SHIFT                                                                          0x2 +#define TA_UE_EDC_LO__MEM_ID__SHIFT                                                                           0x18 +#define TA_UE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                  0x00000001L +#define TA_UE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                            0x00000002L +#define TA_UE_EDC_LO__ADDRESS_MASK                                                                            0x00FFFFFCL +#define TA_UE_EDC_LO__MEM_ID_MASK                                                                             0xFF000000L +//TA_UE_EDC_HI +#define TA_UE_EDC_HI__ECC__SHIFT                                                                              0x0 +#define TA_UE_EDC_HI__PARITY__SHIFT                                                                           0x1 +#define TA_UE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                              0x2 +#define TA_UE_EDC_HI__ERR_INFO__SHIFT                                                                         0x3 +#define TA_UE_EDC_HI__UE_CNT__SHIFT                                                                           0x17 +#define TA_UE_EDC_HI__FED_CNT__SHIFT                                                                          0x1a +#define TA_UE_EDC_HI__ECC_MASK                                                                                0x00000001L +#define TA_UE_EDC_HI__PARITY_MASK                                                                             0x00000002L +#define TA_UE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                                0x00000004L +#define TA_UE_EDC_HI__ERR_INFO_MASK                                                                           0x007FFFF8L +#define TA_UE_EDC_HI__UE_CNT_MASK                                                                             0x03800000L +#define TA_UE_EDC_HI__FED_CNT_MASK                                                                            0x1C000000L +//TA_CE_EDC_LO +#define TA_CE_EDC_LO__STATUS_VALID_FLAG__SHIFT                                                                0x0 +#define TA_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG__SHIFT                                                          0x1 +#define TA_CE_EDC_LO__ADDRESS__SHIFT                                                                          0x2 +#define TA_CE_EDC_LO__MEM_ID__SHIFT                                                                           0x18 +#define TA_CE_EDC_LO__STATUS_VALID_FLAG_MASK                                                                  0x00000001L +#define TA_CE_EDC_LO__ADDRESS_INFO_VALID_FLAG_MASK                                                            0x00000002L +#define TA_CE_EDC_LO__ADDRESS_MASK                                                                            0x00FFFFFCL +#define TA_CE_EDC_LO__MEM_ID_MASK                                                                             0xFF000000L +//TA_CE_EDC_HI +#define TA_CE_EDC_HI__ECC__SHIFT                                                                              0x0 +#define TA_CE_EDC_HI__ERR_INFO_VALID_FLAG__SHIFT                                                              0x2 +#define TA_CE_EDC_HI__ERR_INFO__SHIFT                                                                         0x3 +#define TA_CE_EDC_HI__CE_CNT__SHIFT                                                                           0x17 +#define TA_CE_EDC_HI__POISON__SHIFT                                                                           0x1a +#define TA_CE_EDC_HI__ECC_MASK                                                                                0x00000001L +#define TA_CE_EDC_HI__ERR_INFO_VALID_FLAG_MASK                                                                0x00000004L +#define TA_CE_EDC_HI__ERR_INFO_MASK                                                                           0x007FFFF8L +#define TA_CE_EDC_HI__CE_CNT_MASK                                                                             0x03800000L +#define TA_CE_EDC_HI__POISON_MASK                                                                             0x04000000L  // addressBlock: xcd0_gc_gdsdec @@ -5015,6 +5381,54 @@  #define GDS_WD_GDS_CSB__UNUSED__SHIFT                                                                         0xd  #define GDS_WD_GDS_CSB__COUNTER_MASK                                                                          0x00001FFFL  #define GDS_WD_GDS_CSB__UNUSED_MASK                                                                           0xFFFFE000L +//GDS_UE_ERR_STATUS_LO +#define GDS_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define GDS_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define GDS_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define GDS_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define GDS_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define GDS_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define GDS_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define GDS_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//GDS_UE_ERR_STATUS_HI +#define GDS_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define GDS_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define GDS_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define GDS_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define GDS_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define GDS_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define GDS_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define GDS_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define GDS_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define GDS_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define GDS_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define GDS_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define GDS_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define GDS_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//GDS_CE_ERR_STATUS_LO +#define GDS_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define GDS_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define GDS_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define GDS_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define GDS_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define GDS_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define GDS_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define GDS_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//GDS_CE_ERR_STATUS_HI +#define GDS_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define GDS_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define GDS_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define GDS_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define GDS_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define GDS_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define GDS_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define GDS_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define GDS_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define GDS_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define GDS_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define GDS_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define GDS_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define GDS_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L  // addressBlock: xcd0_gc_rbdec @@ -7370,6 +7784,30 @@  #define GCEA_MAM_CTRL2__ARAM_FLUSH_NOALLOC_MASK                                                               0x00000040L  #define GCEA_MAM_CTRL2__RESERVED_FIELD_MASK                                                                   0x00FFFF80L  #define GCEA_MAM_CTRL2__ADDR_HI_MASK                                                                          0xFF000000L +//GCEA_UE_ERR_STATUS_LO +#define GCEA_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                       0x0 +#define GCEA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define GCEA_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                 0x2 +#define GCEA_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                               0x18 +#define GCEA_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                         0x00000001L +#define GCEA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define GCEA_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                   0x00FFFFFCL +#define GCEA_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                 0xFF000000L +//GCEA_UE_ERR_STATUS_HI +#define GCEA_UE_ERR_STATUS_HI__ECC__SHIFT                                                                     0x0 +#define GCEA_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                  0x1 +#define GCEA_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                     0x2 +#define GCEA_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                0x3 +#define GCEA_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                  0x17 +#define GCEA_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                 0x1a +#define GCEA_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                          0x1d +#define GCEA_UE_ERR_STATUS_HI__ECC_MASK                                                                       0x00000001L +#define GCEA_UE_ERR_STATUS_HI__PARITY_MASK                                                                    0x00000002L +#define GCEA_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                       0x00000004L +#define GCEA_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                  0x007FFFF8L +#define GCEA_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                    0x03800000L +#define GCEA_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                   0x1C000000L +#define GCEA_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                            0xE0000000L  //GCEA_DSM_CNTL  #define GCEA_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                                0x0  #define GCEA_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                               0x2 @@ -7745,6 +8183,30 @@  #define GCEA_SDP_BACKDOOR_MISCCREDITS__WRRSP_CREDITS_RELEASED_MASK                                            0x0000FF00L  #define GCEA_SDP_BACKDOOR_MISCCREDITS__PRB_REQ_CREDITS_RELEASED_MASK                                          0x007F0000L  #define GCEA_SDP_BACKDOOR_MISCCREDITS__PRB_RSP_CREDITS_RECEIVED_MASK                                          0x3F800000L +//GCEA_CE_ERR_STATUS_LO +#define GCEA_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                       0x0 +#define GCEA_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define GCEA_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                 0x2 +#define GCEA_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                               0x18 +#define GCEA_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                         0x00000001L +#define GCEA_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define GCEA_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                   0x00FFFFFCL +#define GCEA_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                 0xFF000000L +//GCEA_CE_ERR_STATUS_HI +#define GCEA_CE_ERR_STATUS_HI__ECC__SHIFT                                                                     0x0 +#define GCEA_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                         0x1 +#define GCEA_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                     0x2 +#define GCEA_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                0x3 +#define GCEA_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                  0x17 +#define GCEA_CE_ERR_STATUS_HI__POISON__SHIFT                                                                  0x1a +#define GCEA_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                         0x1b +#define GCEA_CE_ERR_STATUS_HI__ECC_MASK                                                                       0x00000001L +#define GCEA_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                           0x00000002L +#define GCEA_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                       0x00000004L +#define GCEA_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                  0x007FFFF8L +#define GCEA_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                    0x03800000L +#define GCEA_CE_ERR_STATUS_HI__POISON_MASK                                                                    0x04000000L +#define GCEA_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                           0xF8000000L  //GCEA_SDP_ENABLE  #define GCEA_SDP_ENABLE__ENABLE__SHIFT                                                                        0x0  #define GCEA_SDP_ENABLE__ENABLE_MASK                                                                          0x00000001L @@ -8440,6 +8902,54 @@  //ATC_L2_MM_GROUP_RT_CLASSES  #define ATC_L2_MM_GROUP_RT_CLASSES__GROUP_RT_CLASS__SHIFT                                                     0x0  #define ATC_L2_MM_GROUP_RT_CLASSES__GROUP_RT_CLASS_MASK                                                       0xFFFFFFFFL +//ATC_L2_UE_ERR_STATUS_LO +#define ATC_L2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                 0x0 +#define ATC_L2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                    0x1 +#define ATC_L2_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                               0x2 +#define ATC_L2_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                             0x18 +#define ATC_L2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                   0x00000001L +#define ATC_L2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                      0x00000002L +#define ATC_L2_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                 0x00FFFFFCL +#define ATC_L2_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                               0xFF000000L +//ATC_L2_UE_ERR_STATUS_HI +#define ATC_L2_UE_ERR_STATUS_HI__ECC__SHIFT                                                                   0x0 +#define ATC_L2_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                0x1 +#define ATC_L2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                   0x2 +#define ATC_L2_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                              0x3 +#define ATC_L2_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                0x17 +#define ATC_L2_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                               0x1a +#define ATC_L2_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                              0x1d +#define ATC_L2_UE_ERR_STATUS_HI__ECC_MASK                                                                     0x00000001L +#define ATC_L2_UE_ERR_STATUS_HI__PARITY_MASK                                                                  0x00000002L +#define ATC_L2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                     0x00000004L +#define ATC_L2_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                0x007FFFF8L +#define ATC_L2_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                  0x03800000L +#define ATC_L2_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                 0x1C000000L +#define ATC_L2_UE_ERR_STATUS_HI__RESERVED_MASK                                                                0x60000000L +//ATC_L2_CE_ERR_STATUS_LO +#define ATC_L2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                 0x0 +#define ATC_L2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                    0x1 +#define ATC_L2_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                               0x2 +#define ATC_L2_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                             0x18 +#define ATC_L2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                   0x00000001L +#define ATC_L2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                      0x00000002L +#define ATC_L2_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                 0x00FFFFFCL +#define ATC_L2_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                               0xFF000000L +//ATC_L2_CE_ERR_STATUS_HI +#define ATC_L2_CE_ERR_STATUS_HI__ECC__SHIFT                                                                   0x0 +#define ATC_L2_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                 0x1 +#define ATC_L2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                   0x2 +#define ATC_L2_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                              0x3 +#define ATC_L2_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                0x17 +#define ATC_L2_CE_ERR_STATUS_HI__POISON__SHIFT                                                                0x1a +#define ATC_L2_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                              0x1b +#define ATC_L2_CE_ERR_STATUS_HI__ECC_MASK                                                                     0x00000001L +#define ATC_L2_CE_ERR_STATUS_HI__OTHER_MASK                                                                   0x00000002L +#define ATC_L2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                     0x00000004L +#define ATC_L2_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                0x007FFFF8L +#define ATC_L2_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                  0x03800000L +#define ATC_L2_CE_ERR_STATUS_HI__POISON_MASK                                                                  0x04000000L +#define ATC_L2_CE_ERR_STATUS_HI__RESERVED_MASK                                                                0xF8000000L  // addressBlock: xcd0_gc_utcl2_vml2pfdec @@ -8888,6 +9398,150 @@  #define UTCL2_EDC_CONFIG__DIS_EDC__SHIFT                                                                      0x1  #define UTCL2_EDC_CONFIG__WRITE_DIS_MASK                                                                      0x00000001L  #define UTCL2_EDC_CONFIG__DIS_EDC_MASK                                                                        0x00000002L +//VML2_UE_ERR_STATUS_LO +#define VML2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                   0x0 +#define VML2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define VML2_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                 0x2 +#define VML2_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                               0x18 +#define VML2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                     0x00000001L +#define VML2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define VML2_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                   0x00FFFFFCL +#define VML2_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                 0xFF000000L +//VML2_WALKER_UE_ERR_STATUS_LO +#define VML2_WALKER_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                            0x0 +#define VML2_WALKER_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                               0x1 +#define VML2_WALKER_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                          0x2 +#define VML2_WALKER_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                        0x18 +#define VML2_WALKER_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                              0x00000001L +#define VML2_WALKER_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                 0x00000002L +#define VML2_WALKER_UE_ERR_STATUS_LO__ADDRESS_MASK                                                            0x00FFFFFCL +#define VML2_WALKER_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                          0xFF000000L +//UTCL2_UE_ERR_STATUS_LO +#define UTCL2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                  0x0 +#define UTCL2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define UTCL2_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define UTCL2_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define UTCL2_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                    0x00000001L +#define UTCL2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define UTCL2_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define UTCL2_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//VML2_UE_ERR_STATUS_HI +#define VML2_UE_ERR_STATUS_HI__ECC__SHIFT                                                                     0x0 +#define VML2_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                  0x1 +#define VML2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                     0x2 +#define VML2_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                0x3 +#define VML2_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                  0x17 +#define VML2_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                 0x1a +#define VML2_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                0x1d +#define VML2_UE_ERR_STATUS_HI__ECC_MASK                                                                       0x00000001L +#define VML2_UE_ERR_STATUS_HI__PARITY_MASK                                                                    0x00000002L +#define VML2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                       0x00000004L +#define VML2_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                  0x007FFFF8L +#define VML2_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                    0x03800000L +#define VML2_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                   0x1C000000L +#define VML2_UE_ERR_STATUS_HI__RESERVED_MASK                                                                  0xE0000000L +//VML2_WALKER_UE_ERR_STATUS_HI +#define VML2_WALKER_UE_ERR_STATUS_HI__ECC__SHIFT                                                              0x0 +#define VML2_WALKER_UE_ERR_STATUS_HI__PARITY__SHIFT                                                           0x1 +#define VML2_WALKER_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                              0x2 +#define VML2_WALKER_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                         0x3 +#define VML2_WALKER_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                           0x17 +#define VML2_WALKER_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                          0x1a +#define VML2_WALKER_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                         0x1d +#define VML2_WALKER_UE_ERR_STATUS_HI__ECC_MASK                                                                0x00000001L +#define VML2_WALKER_UE_ERR_STATUS_HI__PARITY_MASK                                                             0x00000002L +#define VML2_WALKER_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                0x00000004L +#define VML2_WALKER_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                           0x007FFFF8L +#define VML2_WALKER_UE_ERR_STATUS_HI__UE_CNT_MASK                                                             0x03800000L +#define VML2_WALKER_UE_ERR_STATUS_HI__FED_CNT_MASK                                                            0x1C000000L +#define VML2_WALKER_UE_ERR_STATUS_HI__RESERVED_MASK                                                           0xE0000000L +//UTCL2_UE_ERR_STATUS_HI +#define UTCL2_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define UTCL2_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define UTCL2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define UTCL2_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define UTCL2_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define UTCL2_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define UTCL2_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                               0x1d +#define UTCL2_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define UTCL2_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define UTCL2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define UTCL2_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define UTCL2_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define UTCL2_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define UTCL2_UE_ERR_STATUS_HI__RESERVED_MASK                                                                 0xE0000000L +//VML2_CE_ERR_STATUS_LO +#define VML2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                   0x0 +#define VML2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define VML2_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                 0x2 +#define VML2_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                               0x18 +#define VML2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                     0x00000001L +#define VML2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define VML2_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                   0x00FFFFFCL +#define VML2_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                 0xFF000000L +//VML2_WALKER_CE_ERR_STATUS_LO +#define VML2_WALKER_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                            0x0 +#define VML2_WALKER_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                               0x1 +#define VML2_WALKER_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                          0x2 +#define VML2_WALKER_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                        0x18 +#define VML2_WALKER_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                              0x00000001L +#define VML2_WALKER_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                 0x00000002L +#define VML2_WALKER_CE_ERR_STATUS_LO__ADDRESS_MASK                                                            0x00FFFFFCL +#define VML2_WALKER_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                          0xFF000000L +//UTCL2_CE_ERR_STATUS_LO +#define UTCL2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                  0x0 +#define UTCL2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define UTCL2_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define UTCL2_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define UTCL2_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                    0x00000001L +#define UTCL2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define UTCL2_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define UTCL2_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//VML2_CE_ERR_STATUS_HI +#define VML2_CE_ERR_STATUS_HI__ECC__SHIFT                                                                     0x0 +#define VML2_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                   0x1 +#define VML2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                     0x2 +#define VML2_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                0x3 +#define VML2_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                  0x17 +#define VML2_CE_ERR_STATUS_HI__POISON__SHIFT                                                                  0x1a +#define VML2_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                0x1b +#define VML2_CE_ERR_STATUS_HI__ECC_MASK                                                                       0x00000001L +#define VML2_CE_ERR_STATUS_HI__OTHER_MASK                                                                     0x00000002L +#define VML2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                       0x00000004L +#define VML2_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                  0x007FFFF8L +#define VML2_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                    0x03800000L +#define VML2_CE_ERR_STATUS_HI__POISON_MASK                                                                    0x04000000L +#define VML2_CE_ERR_STATUS_HI__RESERVED_MASK                                                                  0xF8000000L +//VML2_WALKER_CE_ERR_STATUS_HI +#define VML2_WALKER_CE_ERR_STATUS_HI__ECC__SHIFT                                                              0x0 +#define VML2_WALKER_CE_ERR_STATUS_HI__OTHER__SHIFT                                                            0x1 +#define VML2_WALKER_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                              0x2 +#define VML2_WALKER_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                         0x3 +#define VML2_WALKER_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                           0x17 +#define VML2_WALKER_CE_ERR_STATUS_HI__POISON__SHIFT                                                           0x1a +#define VML2_WALKER_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                         0x1b +#define VML2_WALKER_CE_ERR_STATUS_HI__ECC_MASK                                                                0x00000001L +#define VML2_WALKER_CE_ERR_STATUS_HI__OTHER_MASK                                                              0x00000002L +#define VML2_WALKER_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                0x00000004L +#define VML2_WALKER_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                           0x007FFFF8L +#define VML2_WALKER_CE_ERR_STATUS_HI__CE_CNT_MASK                                                             0x03800000L +#define VML2_WALKER_CE_ERR_STATUS_HI__POISON_MASK                                                             0x04000000L +#define VML2_WALKER_CE_ERR_STATUS_HI__RESERVED_MASK                                                           0xF8000000L +//UTCL2_CE_ERR_STATUS_HI +#define UTCL2_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define UTCL2_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                  0x1 +#define UTCL2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define UTCL2_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define UTCL2_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define UTCL2_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define UTCL2_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                               0x1b +#define UTCL2_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define UTCL2_CE_ERR_STATUS_HI__OTHER_MASK                                                                    0x00000002L +#define UTCL2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define UTCL2_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define UTCL2_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define UTCL2_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define UTCL2_CE_ERR_STATUS_HI__RESERVED_MASK                                                                 0xF8000000L  // addressBlock: xcd0_gc_utcl2_vml2vcdec @@ -11139,6 +11793,98 @@  //TC_CFG_L2_VOLATILE  #define TC_CFG_L2_VOLATILE__VOL__SHIFT                                                                        0x0  #define TC_CFG_L2_VOLATILE__VOL_MASK                                                                          0x0000000FL +//TCP_UE_EDC_HI_REG +#define TCP_UE_EDC_HI_REG__ECC__SHIFT                                                                         0x0 +#define TCP_UE_EDC_HI_REG__PARITY__SHIFT                                                                      0x1 +#define TCP_UE_EDC_HI_REG__ERR_INFO_VALID_FLAG__SHIFT                                                         0x2 +#define TCP_UE_EDC_HI_REG__ERR_INFO__SHIFT                                                                    0x3 +#define TCP_UE_EDC_HI_REG__UE_CNT__SHIFT                                                                      0x17 +#define TCP_UE_EDC_HI_REG__FED_CNT__SHIFT                                                                     0x1a +#define TCP_UE_EDC_HI_REG__RESERVED__SHIFT                                                                    0x1d +#define TCP_UE_EDC_HI_REG__ECC_MASK                                                                           0x00000001L +#define TCP_UE_EDC_HI_REG__PARITY_MASK                                                                        0x00000002L +#define TCP_UE_EDC_HI_REG__ERR_INFO_VALID_FLAG_MASK                                                           0x00000004L +#define TCP_UE_EDC_HI_REG__ERR_INFO_MASK                                                                      0x007FFFF8L +#define TCP_UE_EDC_HI_REG__UE_CNT_MASK                                                                        0x03800000L +#define TCP_UE_EDC_HI_REG__FED_CNT_MASK                                                                       0x1C000000L +#define TCP_UE_EDC_HI_REG__RESERVED_MASK                                                                      0xE0000000L +//TCP_UE_EDC_LO_REG +#define TCP_UE_EDC_LO_REG__STATUS_VALID_FLAG__SHIFT                                                           0x0 +#define TCP_UE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG__SHIFT                                                     0x1 +#define TCP_UE_EDC_LO_REG__ADDRESS__SHIFT                                                                     0x2 +#define TCP_UE_EDC_LO_REG__MEM_ID__SHIFT                                                                      0x18 +#define TCP_UE_EDC_LO_REG__STATUS_VALID_FLAG_MASK                                                             0x00000001L +#define TCP_UE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG_MASK                                                       0x00000002L +#define TCP_UE_EDC_LO_REG__ADDRESS_MASK                                                                       0x00FFFFFCL +#define TCP_UE_EDC_LO_REG__MEM_ID_MASK                                                                        0xFF000000L +//TCP_CE_EDC_HI_REG +#define TCP_CE_EDC_HI_REG__ECC__SHIFT                                                                         0x0 +#define TCP_CE_EDC_HI_REG__ERR_INFO_VALID_FLAG__SHIFT                                                         0x2 +#define TCP_CE_EDC_HI_REG__ERR_INFO__SHIFT                                                                    0x3 +#define TCP_CE_EDC_HI_REG__CE_CNT__SHIFT                                                                      0x17 +#define TCP_CE_EDC_HI_REG__POISON__SHIFT                                                                      0x1a +#define TCP_CE_EDC_HI_REG__RESERVED__SHIFT                                                                    0x1b +#define TCP_CE_EDC_HI_REG__ECC_MASK                                                                           0x00000001L +#define TCP_CE_EDC_HI_REG__ERR_INFO_VALID_FLAG_MASK                                                           0x00000004L +#define TCP_CE_EDC_HI_REG__ERR_INFO_MASK                                                                      0x007FFFF8L +#define TCP_CE_EDC_HI_REG__CE_CNT_MASK                                                                        0x03800000L +#define TCP_CE_EDC_HI_REG__POISON_MASK                                                                        0x04000000L +#define TCP_CE_EDC_HI_REG__RESERVED_MASK                                                                      0xF8000000L +//TCP_CE_EDC_LO_REG +#define TCP_CE_EDC_LO_REG__STATUS_VALID_FLAG__SHIFT                                                           0x0 +#define TCP_CE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG__SHIFT                                                     0x1 +#define TCP_CE_EDC_LO_REG__ADDRESS__SHIFT                                                                     0x2 +#define TCP_CE_EDC_LO_REG__MEM_ID__SHIFT                                                                      0x18 +#define TCP_CE_EDC_LO_REG__STATUS_VALID_FLAG_MASK                                                             0x00000001L +#define TCP_CE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG_MASK                                                       0x00000002L +#define TCP_CE_EDC_LO_REG__ADDRESS_MASK                                                                       0x00FFFFFCL +#define TCP_CE_EDC_LO_REG__MEM_ID_MASK                                                                        0xFF000000L +//TCI_UE_EDC_HI_REG +#define TCI_UE_EDC_HI_REG__ECC__SHIFT                                                                         0x0 +#define TCI_UE_EDC_HI_REG__PARITY__SHIFT                                                                      0x1 +#define TCI_UE_EDC_HI_REG__ERR_INFO_VALID_FLAG__SHIFT                                                         0x2 +#define TCI_UE_EDC_HI_REG__ERR_INFO__SHIFT                                                                    0x3 +#define TCI_UE_EDC_HI_REG__UE_CNT__SHIFT                                                                      0x17 +#define TCI_UE_EDC_HI_REG__FED_CNT__SHIFT                                                                     0x1a +#define TCI_UE_EDC_HI_REG__RESERVED__SHIFT                                                                    0x1d +#define TCI_UE_EDC_HI_REG__ECC_MASK                                                                           0x00000001L +#define TCI_UE_EDC_HI_REG__PARITY_MASK                                                                        0x00000002L +#define TCI_UE_EDC_HI_REG__ERR_INFO_VALID_FLAG_MASK                                                           0x00000004L +#define TCI_UE_EDC_HI_REG__ERR_INFO_MASK                                                                      0x007FFFF8L +#define TCI_UE_EDC_HI_REG__UE_CNT_MASK                                                                        0x03800000L +#define TCI_UE_EDC_HI_REG__FED_CNT_MASK                                                                       0x1C000000L +#define TCI_UE_EDC_HI_REG__RESERVED_MASK                                                                      0xE0000000L +//TCI_UE_EDC_LO_REG +#define TCI_UE_EDC_LO_REG__STATUS_VALID_FLAG__SHIFT                                                           0x0 +#define TCI_UE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG__SHIFT                                                     0x1 +#define TCI_UE_EDC_LO_REG__ADDRESS__SHIFT                                                                     0x2 +#define TCI_UE_EDC_LO_REG__MEM_ID__SHIFT                                                                      0x18 +#define TCI_UE_EDC_LO_REG__STATUS_VALID_FLAG_MASK                                                             0x00000001L +#define TCI_UE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG_MASK                                                       0x00000002L +#define TCI_UE_EDC_LO_REG__ADDRESS_MASK                                                                       0x00FFFFFCL +#define TCI_UE_EDC_LO_REG__MEM_ID_MASK                                                                        0xFF000000L +//TCI_CE_EDC_HI_REG +#define TCI_CE_EDC_HI_REG__ECC__SHIFT                                                                         0x0 +#define TCI_CE_EDC_HI_REG__ERR_INFO_VALID_FLAG__SHIFT                                                         0x2 +#define TCI_CE_EDC_HI_REG__ERR_INFO__SHIFT                                                                    0x3 +#define TCI_CE_EDC_HI_REG__CE_CNT__SHIFT                                                                      0x17 +#define TCI_CE_EDC_HI_REG__POISON__SHIFT                                                                      0x1a +#define TCI_CE_EDC_HI_REG__RESERVED__SHIFT                                                                    0x1b +#define TCI_CE_EDC_HI_REG__ECC_MASK                                                                           0x00000001L +#define TCI_CE_EDC_HI_REG__ERR_INFO_VALID_FLAG_MASK                                                           0x00000004L +#define TCI_CE_EDC_HI_REG__ERR_INFO_MASK                                                                      0x007FFFF8L +#define TCI_CE_EDC_HI_REG__CE_CNT_MASK                                                                        0x03800000L +#define TCI_CE_EDC_HI_REG__POISON_MASK                                                                        0x04000000L +#define TCI_CE_EDC_HI_REG__RESERVED_MASK                                                                      0xF8000000L +//TCI_CE_EDC_LO_REG +#define TCI_CE_EDC_LO_REG__STATUS_VALID_FLAG__SHIFT                                                           0x0 +#define TCI_CE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG__SHIFT                                                     0x1 +#define TCI_CE_EDC_LO_REG__ADDRESS__SHIFT                                                                     0x2 +#define TCI_CE_EDC_LO_REG__MEM_ID__SHIFT                                                                      0x18 +#define TCI_CE_EDC_LO_REG__STATUS_VALID_FLAG_MASK                                                             0x00000001L +#define TCI_CE_EDC_LO_REG__ADDRESS_INFO_VALID_FLAG_MASK                                                       0x00000002L +#define TCI_CE_EDC_LO_REG__ADDRESS_MASK                                                                       0x00FFFFFCL +#define TCI_CE_EDC_LO_REG__MEM_ID_MASK                                                                        0xFF000000L  //TCI_MISC  #define TCI_MISC__FGCG_REPEATER_DISABLE__SHIFT                                                                0x0  #define TCI_MISC__LEGACY_MGCG_DISABLE__SHIFT                                                                  0x1 @@ -11560,6 +12306,112 @@  #define TCX_DSM_CNTL2__SED_ENABLE_ERROR_INJECT_MASK                                                           0x00000003L  #define TCX_DSM_CNTL2__SED_SELECT_INJECT_DELAY_MASK                                                           0x00000004L  #define TCX_DSM_CNTL2__INJECT_DELAY_MASK                                                                      0xFC000000L +//TCA_UE_ERR_STATUS_LO +#define TCA_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define TCA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define TCA_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define TCA_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define TCA_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define TCA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define TCA_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define TCA_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//TCA_UE_ERR_STATUS_HI +#define TCA_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define TCA_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define TCA_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define TCA_UE_ERR_STATUS_HI__ERROR_INFO__SHIFT                                                               0x3 +#define TCA_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define TCA_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define TCA_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define TCA_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define TCA_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define TCA_UE_ERR_STATUS_HI__ERROR_INFO_MASK                                                                 0x007FFFF8L +#define TCA_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define TCA_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +//TCX_UE_ERR_STATUS_LO +#define TCX_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define TCX_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define TCX_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define TCX_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define TCX_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define TCX_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define TCX_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define TCX_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//TCX_UE_ERR_STATUS_HI +#define TCX_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define TCX_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define TCX_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define TCX_UE_ERR_STATUS_HI__ERROR_INFO__SHIFT                                                               0x3 +#define TCX_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define TCX_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define TCX_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define TCX_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define TCX_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define TCX_UE_ERR_STATUS_HI__ERROR_INFO_MASK                                                                 0x007FFFF8L +#define TCX_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define TCX_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +//TCX_CE_ERR_STATUS_LO +#define TCX_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define TCX_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define TCX_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define TCX_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define TCX_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define TCX_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define TCX_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define TCX_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//TCX_CE_ERR_STATUS_HI +#define TCX_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define TCX_CE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define TCX_CE_ERR_STATUS_HI__ERROR_INFO__SHIFT                                                               0x3 +#define TCX_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define TCX_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define TCX_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define TCX_CE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define TCX_CE_ERR_STATUS_HI__ERROR_INFO_MASK                                                                 0x007FFFF8L +#define TCX_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define TCX_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +//TCC_UE_ERR_STATUS_LO +#define TCC_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define TCC_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define TCC_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define TCC_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define TCC_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define TCC_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define TCC_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define TCC_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//TCC_UE_ERR_STATUS_HI +#define TCC_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define TCC_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define TCC_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define TCC_UE_ERR_STATUS_HI__ERROR_INFO__SHIFT                                                               0x3 +#define TCC_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define TCC_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define TCC_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define TCC_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define TCC_UE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define TCC_UE_ERR_STATUS_HI__ERROR_INFO_MASK                                                                 0x007FFFF8L +#define TCC_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define TCC_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +//TCC_CE_ERR_STATUS_LO +#define TCC_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define TCC_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define TCC_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define TCC_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define TCC_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define TCC_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define TCC_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define TCC_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//TCC_CE_ERR_STATUS_HI +#define TCC_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define TCC_CE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define TCC_CE_ERR_STATUS_HI__ERROR_INFO__SHIFT                                                               0x3 +#define TCC_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define TCC_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define TCC_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define TCC_CE_ERR_STATUS_HI__ERROR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define TCC_CE_ERR_STATUS_HI__ERROR_INFO_MASK                                                                 0x007FFFF8L +#define TCC_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define TCC_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L  // addressBlock: xcd0_gc_shdec @@ -14384,6 +15236,150 @@  #define CP_VMID_STATUS__PREEMPT_CE_STATUS__SHIFT                                                              0x10  #define CP_VMID_STATUS__PREEMPT_DE_STATUS_MASK                                                                0x0000FFFFL  #define CP_VMID_STATUS__PREEMPT_CE_STATUS_MASK                                                                0xFFFF0000L +//CPC_UE_ERR_STATUS_LO +#define CPC_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPC_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPC_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPC_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPC_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPC_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPC_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPC_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPC_UE_ERR_STATUS_HI +#define CPC_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPC_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define CPC_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPC_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPC_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define CPC_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define CPC_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define CPC_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPC_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define CPC_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPC_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPC_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define CPC_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define CPC_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//CPC_CE_ERR_STATUS_LO +#define CPC_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPC_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPC_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPC_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPC_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPC_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPC_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPC_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPC_CE_ERR_STATUS_HI +#define CPC_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPC_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define CPC_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPC_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPC_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define CPC_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define CPC_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define CPC_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPC_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define CPC_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPC_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPC_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define CPC_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define CPC_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L +//CPF_UE_ERR_STATUS_LO +#define CPF_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPF_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPF_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPF_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPF_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPF_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPF_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPF_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPF_UE_ERR_STATUS_HI +#define CPF_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPF_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define CPF_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPF_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPF_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define CPF_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define CPF_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define CPF_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPF_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define CPF_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPF_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPF_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define CPF_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define CPF_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//CPF_CE_ERR_STATUS_LO +#define CPF_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPF_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPF_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPF_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPF_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPF_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPF_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPF_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPF_CE_ERR_STATUS_HI +#define CPF_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPF_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define CPF_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPF_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPF_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define CPF_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define CPF_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define CPF_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPF_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define CPF_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPF_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPF_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define CPF_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define CPF_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L +//CPG_UE_ERR_STATUS_LO +#define CPG_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPG_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPG_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPG_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPG_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPG_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPG_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPG_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPG_UE_ERR_STATUS_HI +#define CPG_UE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPG_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                   0x1 +#define CPG_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPG_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPG_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                   0x17 +#define CPG_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                  0x1a +#define CPG_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1d +#define CPG_UE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPG_UE_ERR_STATUS_HI__PARITY_MASK                                                                     0x00000002L +#define CPG_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPG_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPG_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                     0x03800000L +#define CPG_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                    0x1C000000L +#define CPG_UE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xE0000000L +//CPG_CE_ERR_STATUS_LO +#define CPG_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                    0x0 +#define CPG_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                       0x1 +#define CPG_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                  0x2 +#define CPG_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                                0x18 +#define CPG_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                      0x00000001L +#define CPG_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                         0x00000002L +#define CPG_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                    0x00FFFFFCL +#define CPG_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                  0xFF000000L +//CPG_CE_ERR_STATUS_HI +#define CPG_CE_ERR_STATUS_HI__ECC__SHIFT                                                                      0x0 +#define CPG_CE_ERR_STATUS_HI__OTHER__SHIFT                                                                    0x1 +#define CPG_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                      0x2 +#define CPG_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                 0x3 +#define CPG_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                   0x17 +#define CPG_CE_ERR_STATUS_HI__POISON__SHIFT                                                                   0x1a +#define CPG_CE_ERR_STATUS_HI__RESERVED__SHIFT                                                                 0x1b +#define CPG_CE_ERR_STATUS_HI__ECC_MASK                                                                        0x00000001L +#define CPG_CE_ERR_STATUS_HI__OTHER_MASK                                                                      0x00000002L +#define CPG_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                        0x00000004L +#define CPG_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                   0x007FFFF8L +#define CPG_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                     0x03800000L +#define CPG_CE_ERR_STATUS_HI__POISON_MASK                                                                     0x04000000L +#define CPG_CE_ERR_STATUS_HI__RESERVED_MASK                                                                   0xF8000000L  // addressBlock: xcd0_gc_cppdec2 @@ -22764,6 +23760,74 @@  #define SPI_WAVE_LIMIT_CNTL__GS_WAVE_GRAN_MASK                                                                0x00000030L  #define SPI_WAVE_LIMIT_CNTL__HS_WAVE_GRAN_MASK                                                                0x000000C0L +// addressBlock: xcd0_gc_gccanedec +//GC_CANE_ERR_STATUS +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_STATUS__SHIFT                                                          0x0 +#define GC_CANE_ERR_STATUS__SDPM_WRRSP_STATUS__SHIFT                                                          0x4 +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_DATASTATUS__SHIFT                                                      0x8 +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_DATAPARITY_ERROR__SHIFT                                                0xa +#define GC_CANE_ERR_STATUS__SDPS_DAT_ERROR__SHIFT                                                             0xb +#define GC_CANE_ERR_STATUS__SDPS_DAT_PARITY_ERROR__SHIFT                                                      0xc +#define GC_CANE_ERR_STATUS__CLEAR_ERROR_STATUS__SHIFT                                                         0xd +#define GC_CANE_ERR_STATUS__BUSY_ON_ERROR__SHIFT                                                              0xe +#define GC_CANE_ERR_STATUS__BUSY_ON_UER_ERROR__SHIFT                                                          0xf +#define GC_CANE_ERR_STATUS__FUE_FLAG__SHIFT                                                                   0x10 +#define GC_CANE_ERR_STATUS__INTERRUPT_ON_FATAL__SHIFT                                                         0x11 +#define GC_CANE_ERR_STATUS__LEVEL_INTERRUPT__SHIFT                                                            0x12 +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_STATUS_MASK                                                            0x0000000FL +#define GC_CANE_ERR_STATUS__SDPM_WRRSP_STATUS_MASK                                                            0x000000F0L +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_DATASTATUS_MASK                                                        0x00000300L +#define GC_CANE_ERR_STATUS__SDPM_RDRSP_DATAPARITY_ERROR_MASK                                                  0x00000400L +#define GC_CANE_ERR_STATUS__SDPS_DAT_ERROR_MASK                                                               0x00000800L +#define GC_CANE_ERR_STATUS__SDPS_DAT_PARITY_ERROR_MASK                                                        0x00001000L +#define GC_CANE_ERR_STATUS__CLEAR_ERROR_STATUS_MASK                                                           0x00002000L +#define GC_CANE_ERR_STATUS__BUSY_ON_ERROR_MASK                                                                0x00004000L +#define GC_CANE_ERR_STATUS__BUSY_ON_UER_ERROR_MASK                                                            0x00008000L +#define GC_CANE_ERR_STATUS__FUE_FLAG_MASK                                                                     0x00010000L +#define GC_CANE_ERR_STATUS__INTERRUPT_ON_FATAL_MASK                                                           0x00020000L +#define GC_CANE_ERR_STATUS__LEVEL_INTERRUPT_MASK                                                              0x00040000L +//GC_CANE_UE_ERR_STATUS_LO +#define GC_CANE_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                0x0 +#define GC_CANE_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                   0x1 +#define GC_CANE_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                              0x2 +#define GC_CANE_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                            0x18 +#define GC_CANE_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                  0x00000001L +#define GC_CANE_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                     0x00000002L +#define GC_CANE_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                0x00FFFFFCL +#define GC_CANE_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                              0xFF000000L +//GC_CANE_UE_ERR_STATUS_HI +#define GC_CANE_UE_ERR_STATUS_HI__ECC__SHIFT                                                                  0x0 +#define GC_CANE_UE_ERR_STATUS_HI__PARITY__SHIFT                                                               0x1 +#define GC_CANE_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                  0x2 +#define GC_CANE_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                             0x3 +#define GC_CANE_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                               0x17 +#define GC_CANE_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                              0x1a +#define GC_CANE_UE_ERR_STATUS_HI__ECC_MASK                                                                    0x00000001L +#define GC_CANE_UE_ERR_STATUS_HI__PARITY_MASK                                                                 0x00000002L +#define GC_CANE_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                    0x00000004L +#define GC_CANE_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                               0x007FFFF8L +#define GC_CANE_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                 0x03800000L +#define GC_CANE_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                0x1C000000L +//GC_CANE_CE_ERR_STATUS_LO +#define GC_CANE_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                0x0 +#define GC_CANE_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                   0x1 +#define GC_CANE_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                              0x2 +#define GC_CANE_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                            0x18 +#define GC_CANE_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                  0x00000001L +#define GC_CANE_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                     0x00000002L +#define GC_CANE_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                0x00FFFFFCL +#define GC_CANE_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                              0xFF000000L +//GC_CANE_CE_ERR_STATUS_HI +#define GC_CANE_CE_ERR_STATUS_HI__ECC__SHIFT                                                                  0x0 +#define GC_CANE_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                  0x2 +#define GC_CANE_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                             0x3 +#define GC_CANE_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                               0x17 +#define GC_CANE_CE_ERR_STATUS_HI__POISON__SHIFT                                                               0x1a +#define GC_CANE_CE_ERR_STATUS_HI__ECC_MASK                                                                    0x00000001L +#define GC_CANE_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                    0x00000004L +#define GC_CANE_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                               0x007FFFF8L +#define GC_CANE_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                 0x03800000L +#define GC_CANE_CE_ERR_STATUS_HI__POISON_MASK                                                                 0x04000000L  // addressBlock: xcd0_gc_perfddec  //CPG_PERFCOUNTER1_LO @@ -26471,6 +27535,30 @@  //RLC_CPG_STAT_INVAL  #define RLC_CPG_STAT_INVAL__CPG_stat_inval__SHIFT                                                             0x0  #define RLC_CPG_STAT_INVAL__CPG_stat_inval_MASK                                                               0x00000001L +//RLC_UE_ERR_STATUS_LOW +#define RLC_UE_ERR_STATUS_LOW__ERR_STATUS_VALID_FLAG__SHIFT                                                   0x0 +#define RLC_UE_ERR_STATUS_LOW__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define RLC_UE_ERR_STATUS_LOW__ADDRESS__SHIFT                                                                 0x2 +#define RLC_UE_ERR_STATUS_LOW__MEMORY_ID__SHIFT                                                               0x18 +#define RLC_UE_ERR_STATUS_LOW__ERR_STATUS_VALID_FLAG_MASK                                                     0x00000001L +#define RLC_UE_ERR_STATUS_LOW__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define RLC_UE_ERR_STATUS_LOW__ADDRESS_MASK                                                                   0x00FFFFFCL +#define RLC_UE_ERR_STATUS_LOW__MEMORY_ID_MASK                                                                 0xFF000000L +//RLC_UE_ERR_STATUS_HIGH +#define RLC_UE_ERR_STATUS_HIGH__ECC__SHIFT                                                                    0x0 +#define RLC_UE_ERR_STATUS_HIGH__PARITY__SHIFT                                                                 0x1 +#define RLC_UE_ERR_STATUS_HIGH__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define RLC_UE_ERR_STATUS_HIGH__ERR_INFO__SHIFT                                                               0x3 +#define RLC_UE_ERR_STATUS_HIGH__UE_CNT__SHIFT                                                                 0x17 +#define RLC_UE_ERR_STATUS_HIGH__FED_CNT__SHIFT                                                                0x1a +#define RLC_UE_ERR_STATUS_HIGH__RESERVED__SHIFT                                                               0x1d +#define RLC_UE_ERR_STATUS_HIGH__ECC_MASK                                                                      0x00000001L +#define RLC_UE_ERR_STATUS_HIGH__PARITY_MASK                                                                   0x00000002L +#define RLC_UE_ERR_STATUS_HIGH__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define RLC_UE_ERR_STATUS_HIGH__ERR_INFO_MASK                                                                 0x007FFFF8L +#define RLC_UE_ERR_STATUS_HIGH__UE_CNT_MASK                                                                   0x03800000L +#define RLC_UE_ERR_STATUS_HIGH__FED_CNT_MASK                                                                  0x1C000000L +#define RLC_UE_ERR_STATUS_HIGH__RESERVED_MASK                                                                 0xE0000000L  //RLC_DSM_CNTL  #define RLC_DSM_CNTL__RLCG_INSTR_RAM_IRRITATOR_DATA_SEL__SHIFT                                                0x0  #define RLC_DSM_CNTL__RLCG_INSTR_RAM_IRRITATOR_SINGLE_WRITE__SHIFT                                            0x2 @@ -26573,6 +27661,30 @@  #define RLC_DSM_CNTL2A__RLC_SPM_SE2_SCRATCH_RAM_SELECT_INJECT_DELAY_MASK                                      0x00000100L  #define RLC_DSM_CNTL2A__RLC_SPM_SE3_SCRATCH_RAM_ENABLE_ERROR_INJECT_MASK                                      0x00000600L  #define RLC_DSM_CNTL2A__RLC_SPM_SE3_SCRATCH_RAM_SELECT_INJECT_DELAY_MASK                                      0x00000800L +//RLC_CE_ERR_STATUS_LOW +#define RLC_CE_ERR_STATUS_LOW__ERR_STATUS_VALID_FLAG__SHIFT                                                   0x0 +#define RLC_CE_ERR_STATUS_LOW__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define RLC_CE_ERR_STATUS_LOW__ADDRESS__SHIFT                                                                 0x2 +#define RLC_CE_ERR_STATUS_LOW__MEMORY_ID__SHIFT                                                               0x18 +#define RLC_CE_ERR_STATUS_LOW__ERR_STATUS_VALID_FLAG_MASK                                                     0x00000001L +#define RLC_CE_ERR_STATUS_LOW__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define RLC_CE_ERR_STATUS_LOW__ADDRESS_MASK                                                                   0x00FFFFFCL +#define RLC_CE_ERR_STATUS_LOW__MEMORY_ID_MASK                                                                 0xFF000000L +//RLC_CE_ERR_STATUS_HIGH +#define RLC_CE_ERR_STATUS_HIGH__ECC__SHIFT                                                                    0x0 +#define RLC_CE_ERR_STATUS_HIGH__OTHER__SHIFT                                                                  0x1 +#define RLC_CE_ERR_STATUS_HIGH__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define RLC_CE_ERR_STATUS_HIGH__ERR_INFO__SHIFT                                                               0x3 +#define RLC_CE_ERR_STATUS_HIGH__CE_CNT__SHIFT                                                                 0x17 +#define RLC_CE_ERR_STATUS_HIGH__POISON__SHIFT                                                                 0x1a +#define RLC_CE_ERR_STATUS_HIGH__RESERVED__SHIFT                                                               0x1b +#define RLC_CE_ERR_STATUS_HIGH__ECC_MASK                                                                      0x00000001L +#define RLC_CE_ERR_STATUS_HIGH__OTHER_MASK                                                                    0x00000002L +#define RLC_CE_ERR_STATUS_HIGH__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define RLC_CE_ERR_STATUS_HIGH__ERR_INFO_MASK                                                                 0x007FFFF8L +#define RLC_CE_ERR_STATUS_HIGH__CE_CNT_MASK                                                                   0x03800000L +#define RLC_CE_ERR_STATUS_HIGH__POISON_MASK                                                                   0x04000000L +#define RLC_CE_ERR_STATUS_HIGH__RESERVED_MASK                                                                 0xF8000000L  //RLC_RLCV_SPARE_INT  #define RLC_RLCV_SPARE_INT__INTERRUPT__SHIFT                                                                  0x0  #define RLC_RLCV_SPARE_INT__RESERVED__SHIFT                                                                   0x1 diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_offset.h index 8bcc81f2dfc0..879ee9de3ff3 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_offset.h @@ -1491,6 +1491,10 @@  #define regMMEA0_PERFCOUNTER1_CFG_BASE_IDX                                                              0  #define regMMEA0_PERFCOUNTER_RSLT_CNTL                                                                  0x0400  #define regMMEA0_PERFCOUNTER_RSLT_CNTL_BASE_IDX                                                         0 +#define regMMEA0_UE_ERR_STATUS_LO                                                                       0x0406 +#define regMMEA0_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regMMEA0_UE_ERR_STATUS_HI                                                                       0x0407 +#define regMMEA0_UE_ERR_STATUS_HI_BASE_IDX                                                              0  #define regMMEA0_DSM_CNTL                                                                               0x0408  #define regMMEA0_DSM_CNTL_BASE_IDX                                                                      0  #define regMMEA0_DSM_CNTLA                                                                              0x0409 @@ -1511,8 +1515,12 @@  #define regMMEA0_ERR_STATUS_BASE_IDX                                                                    0  #define regMMEA0_MISC2                                                                                  0x0412  #define regMMEA0_MISC2_BASE_IDX                                                                         0 +#define regMMEA0_CE_ERR_STATUS_LO                                                                       0x0414 +#define regMMEA0_CE_ERR_STATUS_LO_BASE_IDX                                                              0  #define regMMEA0_MISC_AON                                                                               0x0415  #define regMMEA0_MISC_AON_BASE_IDX                                                                      0 +#define regMMEA0_CE_ERR_STATUS_HI                                                                       0x0416 +#define regMMEA0_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: aid_mmhub_ea_mmeadec1 @@ -1709,6 +1717,10 @@  #define regMMEA1_PERFCOUNTER1_CFG_BASE_IDX                                                              0  #define regMMEA1_PERFCOUNTER_RSLT_CNTL                                                                  0x0540  #define regMMEA1_PERFCOUNTER_RSLT_CNTL_BASE_IDX                                                         0 +#define regMMEA1_UE_ERR_STATUS_LO                                                                       0x0546 +#define regMMEA1_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regMMEA1_UE_ERR_STATUS_HI                                                                       0x0547 +#define regMMEA1_UE_ERR_STATUS_HI_BASE_IDX                                                              0  #define regMMEA1_DSM_CNTL                                                                               0x0548  #define regMMEA1_DSM_CNTL_BASE_IDX                                                                      0  #define regMMEA1_DSM_CNTLA                                                                              0x0549 @@ -1729,8 +1741,12 @@  #define regMMEA1_ERR_STATUS_BASE_IDX                                                                    0  #define regMMEA1_MISC2                                                                                  0x0552  #define regMMEA1_MISC2_BASE_IDX                                                                         0 +#define regMMEA1_CE_ERR_STATUS_LO                                                                       0x0554 +#define regMMEA1_CE_ERR_STATUS_LO_BASE_IDX                                                              0  #define regMMEA1_MISC_AON                                                                               0x0555  #define regMMEA1_MISC_AON_BASE_IDX                                                                      0 +#define regMMEA1_CE_ERR_STATUS_HI                                                                       0x0556 +#define regMMEA1_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: aid_mmhub_ea_mmeadec2 @@ -1927,6 +1943,10 @@  #define regMMEA2_PERFCOUNTER1_CFG_BASE_IDX                                                              0  #define regMMEA2_PERFCOUNTER_RSLT_CNTL                                                                  0x0680  #define regMMEA2_PERFCOUNTER_RSLT_CNTL_BASE_IDX                                                         0 +#define regMMEA2_UE_ERR_STATUS_LO                                                                       0x0686 +#define regMMEA2_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regMMEA2_UE_ERR_STATUS_HI                                                                       0x0687 +#define regMMEA2_UE_ERR_STATUS_HI_BASE_IDX                                                              0  #define regMMEA2_DSM_CNTL                                                                               0x0688  #define regMMEA2_DSM_CNTL_BASE_IDX                                                                      0  #define regMMEA2_DSM_CNTLA                                                                              0x0689 @@ -1947,8 +1967,12 @@  #define regMMEA2_ERR_STATUS_BASE_IDX                                                                    0  #define regMMEA2_MISC2                                                                                  0x0692  #define regMMEA2_MISC2_BASE_IDX                                                                         0 +#define regMMEA2_CE_ERR_STATUS_LO                                                                       0x0694 +#define regMMEA2_CE_ERR_STATUS_LO_BASE_IDX                                                              0  #define regMMEA2_MISC_AON                                                                               0x0695  #define regMMEA2_MISC_AON_BASE_IDX                                                                      0 +#define regMMEA2_CE_ERR_STATUS_HI                                                                       0x0696 +#define regMMEA2_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: aid_mmhub_ea_mmeadec3 @@ -2145,6 +2169,10 @@  #define regMMEA3_PERFCOUNTER1_CFG_BASE_IDX                                                              0  #define regMMEA3_PERFCOUNTER_RSLT_CNTL                                                                  0x07c0  #define regMMEA3_PERFCOUNTER_RSLT_CNTL_BASE_IDX                                                         0 +#define regMMEA3_UE_ERR_STATUS_LO                                                                       0x07c6 +#define regMMEA3_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regMMEA3_UE_ERR_STATUS_HI                                                                       0x07c7 +#define regMMEA3_UE_ERR_STATUS_HI_BASE_IDX                                                              0  #define regMMEA3_DSM_CNTL                                                                               0x07c8  #define regMMEA3_DSM_CNTL_BASE_IDX                                                                      0  #define regMMEA3_DSM_CNTLA                                                                              0x07c9 @@ -2165,9 +2193,12 @@  #define regMMEA3_ERR_STATUS_BASE_IDX                                                                    0  #define regMMEA3_MISC2                                                                                  0x07d2  #define regMMEA3_MISC2_BASE_IDX                                                                         0 +#define regMMEA3_CE_ERR_STATUS_LO                                                                       0x07d4 +#define regMMEA3_CE_ERR_STATUS_LO_BASE_IDX                                                              0  #define regMMEA3_MISC_AON                                                                               0x07d5  #define regMMEA3_MISC_AON_BASE_IDX                                                                      0 - +#define regMMEA3_CE_ERR_STATUS_HI                                                                       0x07d6 +#define regMMEA3_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: aid_mmhub_ea_mmeadec4  // base address: 0x62000 @@ -2363,6 +2394,10 @@  #define regMMEA4_PERFCOUNTER1_CFG_BASE_IDX                                                              0  #define regMMEA4_PERFCOUNTER_RSLT_CNTL                                                                  0x0900  #define regMMEA4_PERFCOUNTER_RSLT_CNTL_BASE_IDX                                                         0 +#define regMMEA4_UE_ERR_STATUS_LO                                                                       0x0906 +#define regMMEA4_UE_ERR_STATUS_LO_BASE_IDX                                                              0 +#define regMMEA4_UE_ERR_STATUS_HI                                                                       0x0907 +#define regMMEA4_UE_ERR_STATUS_HI_BASE_IDX                                                              0  #define regMMEA4_DSM_CNTL                                                                               0x0908  #define regMMEA4_DSM_CNTL_BASE_IDX                                                                      0  #define regMMEA4_DSM_CNTLA                                                                              0x0909 @@ -2383,9 +2418,12 @@  #define regMMEA4_ERR_STATUS_BASE_IDX                                                                    0  #define regMMEA4_MISC2                                                                                  0x0912  #define regMMEA4_MISC2_BASE_IDX                                                                         0 +#define regMMEA4_CE_ERR_STATUS_LO                                                                       0x0914 +#define regMMEA4_CE_ERR_STATUS_LO_BASE_IDX                                                              0  #define regMMEA4_MISC_AON                                                                               0x0915  #define regMMEA4_MISC_AON_BASE_IDX                                                                      0 - +#define regMMEA4_CE_ERR_STATUS_HI                                                                       0x0916 +#define regMMEA4_CE_ERR_STATUS_HI_BASE_IDX                                                              0  // addressBlock: aid_mmhub_pctldec0  // base address: 0x62a00 @@ -3310,5 +3348,19 @@  #define regL2TLB_PERFCOUNTER_HI                                                                         0x0d2d  #define regL2TLB_PERFCOUNTER_HI_BASE_IDX                                                                0 +// addressBlock: aid_mmhub_mm_cane_mmcanedec +// base address: 0x635f0 +#define regMM_CANE_ICG_CTRL                                                                             0x0d8a +#define regMM_CANE_ICG_CTRL_BASE_IDX                                                                    0 +#define regMM_CANE_ERR_STATUS                                                                           0x0d8c +#define regMM_CANE_ERR_STATUS_BASE_IDX                                                                  0 +#define regMM_CANE_UE_ERR_STATUS_LO                                                                     0x0d8d +#define regMM_CANE_UE_ERR_STATUS_LO_BASE_IDX                                                            0 +#define regMM_CANE_UE_ERR_STATUS_HI                                                                     0x0d8e +#define regMM_CANE_UE_ERR_STATUS_HI_BASE_IDX                                                            0 +#define regMM_CANE_CE_ERR_STATUS_LO                                                                     0x0d8f +#define regMM_CANE_CE_ERR_STATUS_LO_BASE_IDX                                                            0 +#define regMM_CANE_CE_ERR_STATUS_HI                                                                     0x0d90 +#define regMM_CANE_CE_ERR_STATUS_HI_BASE_IDX                                                            0  #endif diff --git a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_sh_mask.h index af41468ce69f..088c1f02aa43 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/mmhub/mmhub_1_8_0_sh_mask.h @@ -10470,6 +10470,30 @@  #define MMEA0_PERFCOUNTER_RSLT_CNTL__ENABLE_ANY_MASK                                                          0x01000000L  #define MMEA0_PERFCOUNTER_RSLT_CNTL__CLEAR_ALL_MASK                                                           0x02000000L  #define MMEA0_PERFCOUNTER_RSLT_CNTL__STOP_ALL_ON_SATURATE_MASK                                                0x04000000L +//MMEA0_UE_ERR_STATUS_LO +#define MMEA0_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA0_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA0_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA0_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA0_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA0_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA0_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA0_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//MMEA0_UE_ERR_STATUS_HI +#define MMEA0_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA0_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define MMEA0_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA0_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA0_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define MMEA0_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define MMEA0_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                         0x1d +#define MMEA0_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA0_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define MMEA0_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA0_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA0_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define MMEA0_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define MMEA0_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                           0xE0000000L  //MMEA0_DSM_CNTL  #define MMEA0_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                               0x0  #define MMEA0_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                              0x2 @@ -10718,12 +10742,35 @@  #define MMEA0_MISC2__DRAM_WR_THROTTLE_MASK                                                                    0x00020000L  #define MMEA0_MISC2__GMI_RD_THROTTLE_MASK                                                                     0x00040000L  #define MMEA0_MISC2__GMI_WR_THROTTLE_MASK                                                                     0x00080000L +//MMEA0_CE_ERR_STATUS_LO +#define MMEA0_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA0_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA0_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA0_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA0_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA0_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA0_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA0_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L  //MMEA0_MISC_AON  #define MMEA0_MISC_AON__LINKMGR_PARTACK_HYSTERESIS__SHIFT                                                     0x0  #define MMEA0_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE__SHIFT                                                  0x2  #define MMEA0_MISC_AON__LINKMGR_PARTACK_HYSTERESIS_MASK                                                       0x00000003L  #define MMEA0_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE_MASK                                                    0x00000004L - +//MMEA0_CE_ERR_STATUS_HI +#define MMEA0_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA0_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                        0x1 +#define MMEA0_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA0_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA0_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define MMEA0_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define MMEA0_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                        0x1b +#define MMEA0_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA0_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                          0x00000002L +#define MMEA0_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA0_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA0_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define MMEA0_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define MMEA0_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                          0xF8000000L  // addressBlock: aid_mmhub_ea_mmeadec1  //MMEA1_DRAM_RD_CLI2GRP_MAP0 @@ -12418,6 +12465,30 @@  #define MMEA1_PERFCOUNTER_RSLT_CNTL__ENABLE_ANY_MASK                                                          0x01000000L  #define MMEA1_PERFCOUNTER_RSLT_CNTL__CLEAR_ALL_MASK                                                           0x02000000L  #define MMEA1_PERFCOUNTER_RSLT_CNTL__STOP_ALL_ON_SATURATE_MASK                                                0x04000000L +//MMEA1_UE_ERR_STATUS_LO +#define MMEA1_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA1_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA1_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA1_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA1_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA1_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA1_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA1_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//MMEA1_UE_ERR_STATUS_HI +#define MMEA1_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA1_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define MMEA1_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA1_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA1_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define MMEA1_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define MMEA1_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                         0x1d +#define MMEA1_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA1_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define MMEA1_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA1_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA1_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define MMEA1_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define MMEA1_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                           0xE0000000L  //MMEA1_DSM_CNTL  #define MMEA1_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                               0x0  #define MMEA1_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                              0x2 @@ -12666,12 +12737,35 @@  #define MMEA1_MISC2__DRAM_WR_THROTTLE_MASK                                                                    0x00020000L  #define MMEA1_MISC2__GMI_RD_THROTTLE_MASK                                                                     0x00040000L  #define MMEA1_MISC2__GMI_WR_THROTTLE_MASK                                                                     0x00080000L +//MMEA1_CE_ERR_STATUS_LO +#define MMEA1_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA1_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA1_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA1_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA1_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA1_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA1_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA1_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L  //MMEA1_MISC_AON  #define MMEA1_MISC_AON__LINKMGR_PARTACK_HYSTERESIS__SHIFT                                                     0x0  #define MMEA1_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE__SHIFT                                                  0x2  #define MMEA1_MISC_AON__LINKMGR_PARTACK_HYSTERESIS_MASK                                                       0x00000003L  #define MMEA1_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE_MASK                                                    0x00000004L - +//MMEA1_CE_ERR_STATUS_HI +#define MMEA1_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA1_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                        0x1 +#define MMEA1_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA1_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA1_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define MMEA1_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define MMEA1_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                        0x1b +#define MMEA1_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA1_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                          0x00000002L +#define MMEA1_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA1_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA1_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define MMEA1_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define MMEA1_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                          0xF8000000L  // addressBlock: aid_mmhub_ea_mmeadec2  //MMEA2_DRAM_RD_CLI2GRP_MAP0 @@ -14366,6 +14460,30 @@  #define MMEA2_PERFCOUNTER_RSLT_CNTL__ENABLE_ANY_MASK                                                          0x01000000L  #define MMEA2_PERFCOUNTER_RSLT_CNTL__CLEAR_ALL_MASK                                                           0x02000000L  #define MMEA2_PERFCOUNTER_RSLT_CNTL__STOP_ALL_ON_SATURATE_MASK                                                0x04000000L +//MMEA2_UE_ERR_STATUS_LO +#define MMEA2_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA2_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA2_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA2_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA2_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA2_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA2_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//MMEA2_UE_ERR_STATUS_HI +#define MMEA2_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA2_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define MMEA2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA2_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA2_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define MMEA2_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define MMEA2_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                         0x1d +#define MMEA2_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA2_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define MMEA2_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA2_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA2_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define MMEA2_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define MMEA2_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                           0xE0000000L  //MMEA2_DSM_CNTL  #define MMEA2_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                               0x0  #define MMEA2_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                              0x2 @@ -14614,12 +14732,35 @@  #define MMEA2_MISC2__DRAM_WR_THROTTLE_MASK                                                                    0x00020000L  #define MMEA2_MISC2__GMI_RD_THROTTLE_MASK                                                                     0x00040000L  #define MMEA2_MISC2__GMI_WR_THROTTLE_MASK                                                                     0x00080000L +//MMEA2_CE_ERR_STATUS_LO +#define MMEA2_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA2_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA2_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA2_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA2_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA2_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA2_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L  //MMEA2_MISC_AON  #define MMEA2_MISC_AON__LINKMGR_PARTACK_HYSTERESIS__SHIFT                                                     0x0  #define MMEA2_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE__SHIFT                                                  0x2  #define MMEA2_MISC_AON__LINKMGR_PARTACK_HYSTERESIS_MASK                                                       0x00000003L  #define MMEA2_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE_MASK                                                    0x00000004L - +//MMEA2_CE_ERR_STATUS_HI +#define MMEA2_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA2_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                        0x1 +#define MMEA2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA2_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA2_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define MMEA2_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define MMEA2_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                        0x1b +#define MMEA2_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA2_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                          0x00000002L +#define MMEA2_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA2_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA2_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define MMEA2_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define MMEA2_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                          0xF8000000L  // addressBlock: aid_mmhub_ea_mmeadec3  //MMEA3_DRAM_RD_CLI2GRP_MAP0 @@ -16314,6 +16455,30 @@  #define MMEA3_PERFCOUNTER_RSLT_CNTL__ENABLE_ANY_MASK                                                          0x01000000L  #define MMEA3_PERFCOUNTER_RSLT_CNTL__CLEAR_ALL_MASK                                                           0x02000000L  #define MMEA3_PERFCOUNTER_RSLT_CNTL__STOP_ALL_ON_SATURATE_MASK                                                0x04000000L +//MMEA3_UE_ERR_STATUS_LO +#define MMEA3_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA3_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA3_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA3_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA3_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA3_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA3_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA3_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//MMEA3_UE_ERR_STATUS_HI +#define MMEA3_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA3_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define MMEA3_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA3_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA3_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define MMEA3_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define MMEA3_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                         0x1d +#define MMEA3_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA3_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define MMEA3_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA3_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA3_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define MMEA3_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define MMEA3_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                           0xE0000000L  //MMEA3_DSM_CNTL  #define MMEA3_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                               0x0  #define MMEA3_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                              0x2 @@ -16562,12 +16727,35 @@  #define MMEA3_MISC2__DRAM_WR_THROTTLE_MASK                                                                    0x00020000L  #define MMEA3_MISC2__GMI_RD_THROTTLE_MASK                                                                     0x00040000L  #define MMEA3_MISC2__GMI_WR_THROTTLE_MASK                                                                     0x00080000L +//MMEA3_CE_ERR_STATUS_LO +#define MMEA3_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA3_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA3_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA3_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA3_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA3_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA3_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA3_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L  //MMEA3_MISC_AON  #define MMEA3_MISC_AON__LINKMGR_PARTACK_HYSTERESIS__SHIFT                                                     0x0  #define MMEA3_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE__SHIFT                                                  0x2  #define MMEA3_MISC_AON__LINKMGR_PARTACK_HYSTERESIS_MASK                                                       0x00000003L  #define MMEA3_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE_MASK                                                    0x00000004L - +//MMEA3_CE_ERR_STATUS_HI +#define MMEA3_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA3_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                        0x1 +#define MMEA3_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA3_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA3_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define MMEA3_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define MMEA3_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                        0x1b +#define MMEA3_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA3_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                          0x00000002L +#define MMEA3_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA3_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA3_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define MMEA3_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define MMEA3_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                          0xF8000000L  // addressBlock: aid_mmhub_ea_mmeadec4  //MMEA4_DRAM_RD_CLI2GRP_MAP0 @@ -18262,6 +18450,30 @@  #define MMEA4_PERFCOUNTER_RSLT_CNTL__ENABLE_ANY_MASK                                                          0x01000000L  #define MMEA4_PERFCOUNTER_RSLT_CNTL__CLEAR_ALL_MASK                                                           0x02000000L  #define MMEA4_PERFCOUNTER_RSLT_CNTL__STOP_ALL_ON_SATURATE_MASK                                                0x04000000L +//MMEA4_UE_ERR_STATUS_LO +#define MMEA4_UE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA4_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA4_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA4_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA4_UE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA4_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA4_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA4_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L +//MMEA4_UE_ERR_STATUS_HI +#define MMEA4_UE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA4_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                 0x1 +#define MMEA4_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA4_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA4_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                 0x17 +#define MMEA4_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                0x1a +#define MMEA4_UE_ERR_STATUS_HI__RESERVED_FIELD__SHIFT                                                         0x1d +#define MMEA4_UE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA4_UE_ERR_STATUS_HI__PARITY_MASK                                                                   0x00000002L +#define MMEA4_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA4_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA4_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                   0x03800000L +#define MMEA4_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                  0x1C000000L +#define MMEA4_UE_ERR_STATUS_HI__RESERVED_FIELD_MASK                                                           0xE0000000L  //MMEA4_DSM_CNTL  #define MMEA4_DSM_CNTL__DRAMRD_CMDMEM_DSM_IRRITATOR_DATA__SHIFT                                               0x0  #define MMEA4_DSM_CNTL__DRAMRD_CMDMEM_ENABLE_SINGLE_WRITE__SHIFT                                              0x2 @@ -18510,12 +18722,35 @@  #define MMEA4_MISC2__DRAM_WR_THROTTLE_MASK                                                                    0x00020000L  #define MMEA4_MISC2__GMI_RD_THROTTLE_MASK                                                                     0x00040000L  #define MMEA4_MISC2__GMI_WR_THROTTLE_MASK                                                                     0x00080000L +//MMEA4_CE_ERR_STATUS_LO +#define MMEA4_CE_ERR_STATUS_LO__STATUS_VALID_FLAG__SHIFT                                                      0x0 +#define MMEA4_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                     0x1 +#define MMEA4_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                0x2 +#define MMEA4_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                              0x18 +#define MMEA4_CE_ERR_STATUS_LO__STATUS_VALID_FLAG_MASK                                                        0x00000001L +#define MMEA4_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                       0x00000002L +#define MMEA4_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                  0x00FFFFFCL +#define MMEA4_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                0xFF000000L  //MMEA4_MISC_AON  #define MMEA4_MISC_AON__LINKMGR_PARTACK_HYSTERESIS__SHIFT                                                     0x0  #define MMEA4_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE__SHIFT                                                  0x2  #define MMEA4_MISC_AON__LINKMGR_PARTACK_HYSTERESIS_MASK                                                       0x00000003L  #define MMEA4_MISC_AON__LINKMGR_PARTACK_DEASSERT_MODE_MASK                                                    0x00000004L - +//MMEA4_CE_ERR_STATUS_HI +#define MMEA4_CE_ERR_STATUS_HI__ECC__SHIFT                                                                    0x0 +#define MMEA4_CE_ERR_STATUS_HI__RESERVED_FIELD0__SHIFT                                                        0x1 +#define MMEA4_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                    0x2 +#define MMEA4_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                               0x3 +#define MMEA4_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                                 0x17 +#define MMEA4_CE_ERR_STATUS_HI__POISON__SHIFT                                                                 0x1a +#define MMEA4_CE_ERR_STATUS_HI__RESERVED_FIELD1__SHIFT                                                        0x1b +#define MMEA4_CE_ERR_STATUS_HI__ECC_MASK                                                                      0x00000001L +#define MMEA4_CE_ERR_STATUS_HI__RESERVED_FIELD0_MASK                                                          0x00000002L +#define MMEA4_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                      0x00000004L +#define MMEA4_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                                 0x007FFFF8L +#define MMEA4_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                   0x03800000L +#define MMEA4_CE_ERR_STATUS_HI__POISON_MASK                                                                   0x04000000L +#define MMEA4_CE_ERR_STATUS_HI__RESERVED_FIELD1_MASK                                                          0xF8000000L  // addressBlock: aid_mmhub_pctldec0  //PCTL0_CTRL @@ -22311,5 +22546,83 @@  #define L2TLB_PERFCOUNTER_HI__COUNTER_HI_MASK                                                                 0x0000FFFFL  #define L2TLB_PERFCOUNTER_HI__COMPARE_VALUE_MASK                                                              0xFFFF0000L - +// addressBlock: aid_mmhub_mm_cane_mmcanedec +//MM_CANE_ICG_CTRL +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_IREQ0__SHIFT                                                          0x0 +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_ATRET__SHIFT                                                          0x1 +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_OREQ__SHIFT                                                           0x2 +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_REGISTER__SHIFT                                                       0x3 +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_SDPM_RETURN__SHIFT                                                    0x4 +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_IREQ0_MASK                                                            0x00000001L +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_ATRET_MASK                                                            0x00000002L +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_OREQ_MASK                                                             0x00000004L +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_REGISTER_MASK                                                         0x00000008L +#define MM_CANE_ICG_CTRL__SOFT_OVERRIDE_SDPM_RETURN_MASK                                                      0x00000010L +//MM_CANE_ERR_STATUS +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_STATUS__SHIFT                                                          0x0 +#define MM_CANE_ERR_STATUS__SDPM_WRRSP_STATUS__SHIFT                                                          0x4 +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_DATASTATUS__SHIFT                                                      0x8 +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_DATAPARITY_ERROR__SHIFT                                                0xa +#define MM_CANE_ERR_STATUS__SDPS_DAT_ERROR__SHIFT                                                             0xb +#define MM_CANE_ERR_STATUS__SDPS_DAT_PARITY_ERROR__SHIFT                                                      0xc +#define MM_CANE_ERR_STATUS__CLEAR_ERROR_STATUS__SHIFT                                                         0xd +#define MM_CANE_ERR_STATUS__BUSY_ON_ERROR__SHIFT                                                              0xe +#define MM_CANE_ERR_STATUS__BUSY_ON_UER_ERROR__SHIFT                                                          0xf +#define MM_CANE_ERR_STATUS__FUE_FLAG__SHIFT                                                                   0x10 +#define MM_CANE_ERR_STATUS__INTERRUPT_ON_FATAL__SHIFT                                                         0x11 +#define MM_CANE_ERR_STATUS__LEVEL_INTERRUPT__SHIFT                                                            0x12 +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_STATUS_MASK                                                            0x0000000FL +#define MM_CANE_ERR_STATUS__SDPM_WRRSP_STATUS_MASK                                                            0x000000F0L +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_DATASTATUS_MASK                                                        0x00000300L +#define MM_CANE_ERR_STATUS__SDPM_RDRSP_DATAPARITY_ERROR_MASK                                                  0x00000400L +#define MM_CANE_ERR_STATUS__SDPS_DAT_ERROR_MASK                                                               0x00000800L +#define MM_CANE_ERR_STATUS__SDPS_DAT_PARITY_ERROR_MASK                                                        0x00001000L +#define MM_CANE_ERR_STATUS__CLEAR_ERROR_STATUS_MASK                                                           0x00002000L +#define MM_CANE_ERR_STATUS__BUSY_ON_ERROR_MASK                                                                0x00004000L +#define MM_CANE_ERR_STATUS__BUSY_ON_UER_ERROR_MASK                                                            0x00008000L +#define MM_CANE_ERR_STATUS__FUE_FLAG_MASK                                                                     0x00010000L +#define MM_CANE_ERR_STATUS__INTERRUPT_ON_FATAL_MASK                                                           0x00020000L +#define MM_CANE_ERR_STATUS__LEVEL_INTERRUPT_MASK                                                              0x00040000L +//MM_CANE_UE_ERR_STATUS_LO +#define MM_CANE_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                0x0 +#define MM_CANE_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                   0x1 +#define MM_CANE_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                              0x2 +#define MM_CANE_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                            0x18 +#define MM_CANE_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                  0x00000001L +#define MM_CANE_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                     0x00000002L +#define MM_CANE_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                0x00FFFFFCL +#define MM_CANE_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                              0xFF000000L +//MM_CANE_UE_ERR_STATUS_HI +#define MM_CANE_UE_ERR_STATUS_HI__ECC__SHIFT                                                                  0x0 +#define MM_CANE_UE_ERR_STATUS_HI__PARITY__SHIFT                                                               0x1 +#define MM_CANE_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                  0x2 +#define MM_CANE_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                             0x3 +#define MM_CANE_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                               0x17 +#define MM_CANE_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                              0x1a +#define MM_CANE_UE_ERR_STATUS_HI__ECC_MASK                                                                    0x00000001L +#define MM_CANE_UE_ERR_STATUS_HI__PARITY_MASK                                                                 0x00000002L +#define MM_CANE_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                    0x00000004L +#define MM_CANE_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                               0x007FFFF8L +#define MM_CANE_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                 0x03800000L +#define MM_CANE_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                0x1C000000L +//MM_CANE_CE_ERR_STATUS_LO +#define MM_CANE_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                0x0 +#define MM_CANE_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                   0x1 +#define MM_CANE_CE_ERR_STATUS_LO__ADDRESS__SHIFT                                                              0x2 +#define MM_CANE_CE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                            0x18 +#define MM_CANE_CE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                  0x00000001L +#define MM_CANE_CE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                     0x00000002L +#define MM_CANE_CE_ERR_STATUS_LO__ADDRESS_MASK                                                                0x00FFFFFCL +#define MM_CANE_CE_ERR_STATUS_LO__MEMORY_ID_MASK                                                              0xFF000000L +//MM_CANE_CE_ERR_STATUS_HI +#define MM_CANE_CE_ERR_STATUS_HI__ECC__SHIFT                                                                  0x0 +#define MM_CANE_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                  0x2 +#define MM_CANE_CE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                             0x3 +#define MM_CANE_CE_ERR_STATUS_HI__CE_CNT__SHIFT                                                               0x17 +#define MM_CANE_CE_ERR_STATUS_HI__POISON__SHIFT                                                               0x1a +#define MM_CANE_CE_ERR_STATUS_HI__ECC_MASK                                                                    0x00000001L +#define MM_CANE_CE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                    0x00000004L +#define MM_CANE_CE_ERR_STATUS_HI__ERR_INFO_MASK                                                               0x007FFFF8L +#define MM_CANE_CE_ERR_STATUS_HI__CE_CNT_MASK                                                                 0x03800000L +#define MM_CANE_CE_ERR_STATUS_HI__POISON_MASK                                                                 0x04000000L  #endif diff --git a/drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_offset.h b/drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_offset.h index 033f2796c1e3..c8a15c8f4822 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/nbio/nbio_7_9_0_offset.h @@ -6201,6 +6201,8 @@  #define regNBIF_SHUB_TODET_SYNCFLOOD_CTRL2_BASE_IDX 8  #define regBIFC_BME_ERR_LOG_HB                                                                          0xe8ab  #define regBIFC_BME_ERR_LOG_HB_BASE_IDX 8 +#define regBIFC_GFX_INT_MONITOR_MASK                                                                    0xe8ad +#define regBIFC_GFX_INT_MONITOR_MASK_BASE_IDX 8  #define regBIFC_HRP_SDP_WRRSP_POOLCRED_ALLOC                                                            0xe8c0  #define regBIFC_HRP_SDP_WRRSP_POOLCRED_ALLOC_BASE_IDX 8  #define regBIFC_HRP_SDP_RDRSP_POOLCRED_ALLOC                                                            0xe8c1 diff --git a/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_offset.h b/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_offset.h index 31bef0776ded..ead81aeffd67 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_offset.h +++ b/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_offset.h @@ -211,6 +211,10 @@  #define regSDMA_RAS_STATUS_BASE_IDX                                                                     0  #define regSDMA_CLK_STATUS                                                                              0x0068  #define regSDMA_CLK_STATUS_BASE_IDX                                                                     0 +#define regSDMA_UE_ERR_STATUS_LO                                                                        0x0069 +#define regSDMA_UE_ERR_STATUS_LO_BASE_IDX                                                               0 +#define regSDMA_UE_ERR_STATUS_HI                                                                        0x006a +#define regSDMA_UE_ERR_STATUS_HI_BASE_IDX                                                               0  #define regSDMA_POWER_CNTL                                                                              0x006b  #define regSDMA_POWER_CNTL_BASE_IDX                                                                     0  #define regSDMA_CLK_CTRL                                                                                0x006c diff --git a/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_sh_mask.h index e46cb3339355..290953bdf1d6 100644 --- a/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_sh_mask.h +++ b/drivers/gpu/drm/amd/include/asic_reg/sdma/sdma_4_4_2_sh_mask.h @@ -1171,6 +1171,30 @@  #define SDMA_CLK_STATUS__F32_CLK_MASK                                                                         0x00000008L  #define SDMA_CLK_STATUS__CE_CLK_MASK                                                                          0x00000010L  #define SDMA_CLK_STATUS__PERF_CLK_MASK                                                                        0x00000020L +//SDMA_UE_ERR_STATUS_LO +#define SDMA_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG__SHIFT                                                   0x0 +#define SDMA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG__SHIFT                                                      0x1 +#define SDMA_UE_ERR_STATUS_LO__ADDRESS__SHIFT                                                                 0x2 +#define SDMA_UE_ERR_STATUS_LO__MEMORY_ID__SHIFT                                                               0x18 +#define SDMA_UE_ERR_STATUS_LO__ERR_STATUS_VALID_FLAG_MASK                                                     0x00000001L +#define SDMA_UE_ERR_STATUS_LO__ADDRESS_VALID_FLAG_MASK                                                        0x00000002L +#define SDMA_UE_ERR_STATUS_LO__ADDRESS_MASK                                                                   0x00FFFFFCL +#define SDMA_UE_ERR_STATUS_LO__MEMORY_ID_MASK                                                                 0xFF000000L +//SDMA_UE_ERR_STATUS_HI +#define SDMA_UE_ERR_STATUS_HI__ECC__SHIFT                                                                     0x0 +#define SDMA_UE_ERR_STATUS_HI__PARITY__SHIFT                                                                  0x1 +#define SDMA_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG__SHIFT                                                     0x2 +#define SDMA_UE_ERR_STATUS_HI__ERR_INFO__SHIFT                                                                0x3 +#define SDMA_UE_ERR_STATUS_HI__UE_CNT__SHIFT                                                                  0x17 +#define SDMA_UE_ERR_STATUS_HI__FED_CNT__SHIFT                                                                 0x1a +#define SDMA_UE_ERR_STATUS_HI__RESERVED__SHIFT                                                                0x1d +#define SDMA_UE_ERR_STATUS_HI__ECC_MASK                                                                       0x00000001L +#define SDMA_UE_ERR_STATUS_HI__PARITY_MASK                                                                    0x00000002L +#define SDMA_UE_ERR_STATUS_HI__ERR_INFO_VALID_FLAG_MASK                                                       0x00000004L +#define SDMA_UE_ERR_STATUS_HI__ERR_INFO_MASK                                                                  0x007FFFF8L +#define SDMA_UE_ERR_STATUS_HI__UE_CNT_MASK                                                                    0x03800000L +#define SDMA_UE_ERR_STATUS_HI__FED_CNT_MASK                                                                   0x1C000000L +#define SDMA_UE_ERR_STATUS_HI__RESERVED_MASK                                                                  0xE0000000L  //SDMA_POWER_CNTL  #define SDMA_POWER_CNTL__PG_CNTL_ENABLE__SHIFT                                                                0x0  #define SDMA_POWER_CNTL__EXT_PG_POWER_ON_REQ__SHIFT                                                           0x1 diff --git a/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_offset.h b/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_offset.h new file mode 100644 index 000000000000..b62b489402c5 --- /dev/null +++ b/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_offset.h @@ -0,0 +1,177 @@ +/* + * Copyright 2022 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. + * + */ +#ifndef _smuio_13_0_3_OFFSET_HEADER +#define _smuio_13_0_3_OFFSET_HEADER + + + +// addressBlock: aid_smuio_smuio_reset_SmuSmuioDec +// base address: 0x5a300 +#define regSMUIO_MP_RESET_INTR                                                                          0x00c1 +#define regSMUIO_MP_RESET_INTR_BASE_IDX                                                                 1 +#define regSMUIO_SOC_HALT                                                                               0x00c2 +#define regSMUIO_SOC_HALT_BASE_IDX                                                                      1 + + +// addressBlock: aid_smuio_smuio_tsc_SmuSmuioDec +// base address: 0x5a8a0 +#define regPWROK_REFCLK_GAP_CYCLES                                                                      0x0028 +#define regPWROK_REFCLK_GAP_CYCLES_BASE_IDX                                                             2 +#define regGOLDEN_TSC_INCREMENT_UPPER                                                                   0x002b +#define regGOLDEN_TSC_INCREMENT_UPPER_BASE_IDX                                                          2 +#define regGOLDEN_TSC_INCREMENT_LOWER                                                                   0x002c +#define regGOLDEN_TSC_INCREMENT_LOWER_BASE_IDX                                                          2 +#define regGOLDEN_TSC_COUNT_UPPER                                                                       0x002d +#define regGOLDEN_TSC_COUNT_UPPER_BASE_IDX                                                              2 +#define regGOLDEN_TSC_COUNT_LOWER                                                                       0x002e +#define regGOLDEN_TSC_COUNT_LOWER_BASE_IDX                                                              2 +#define regSOC_GOLDEN_TSC_SHADOW_UPPER                                                                  0x002f +#define regSOC_GOLDEN_TSC_SHADOW_UPPER_BASE_IDX                                                         2 +#define regSOC_GOLDEN_TSC_SHADOW_LOWER                                                                  0x0030 +#define regSOC_GOLDEN_TSC_SHADOW_LOWER_BASE_IDX                                                         2 +#define regSOC_GAP_PWROK                                                                                0x0031 +#define regSOC_GAP_PWROK_BASE_IDX                                                                       2 + + +// addressBlock: aid_smuio_smuio_swtimer_SmuSmuioDec +// base address: 0x5ac70 +#define regPWR_VIRT_RESET_REQ                                                                           0x011c +#define regPWR_VIRT_RESET_REQ_BASE_IDX                                                                  2 +#define regPWR_DISP_TIMER_CONTROL                                                                       0x011d +#define regPWR_DISP_TIMER_CONTROL_BASE_IDX                                                              2 +#define regPWR_DISP_TIMER_DEBUG                                                                         0x011e +#define regPWR_DISP_TIMER_DEBUG_BASE_IDX                                                                2 +#define regPWR_DISP_TIMER2_CONTROL                                                                      0x011f +#define regPWR_DISP_TIMER2_CONTROL_BASE_IDX                                                             2 +#define regPWR_DISP_TIMER2_DEBUG                                                                        0x0120 +#define regPWR_DISP_TIMER2_DEBUG_BASE_IDX                                                               2 +#define regPWR_DISP_TIMER_GLOBAL_CONTROL                                                                0x0121 +#define regPWR_DISP_TIMER_GLOBAL_CONTROL_BASE_IDX                                                       2 +#define regPWR_IH_CONTROL                                                                               0x0122 +#define regPWR_IH_CONTROL_BASE_IDX                                                                      2 + + +// addressBlock: aid_smuio_smuio_misc_SmuSmuioDec +// base address: 0x5a000 +#define regSMUIO_MCM_CONFIG                                                                             0x0023 +#define regSMUIO_MCM_CONFIG_BASE_IDX                                                                    1 +#define regIP_DISCOVERY_VERSION                                                                         0x0000 +#define regIP_DISCOVERY_VERSION_BASE_IDX                                                                2 +#define regSCRATCH_REGISTER0                                                                            0x01bd +#define regSCRATCH_REGISTER0_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER1                                                                            0x01be +#define regSCRATCH_REGISTER1_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER2                                                                            0x01bf +#define regSCRATCH_REGISTER2_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER3                                                                            0x01c0 +#define regSCRATCH_REGISTER3_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER4                                                                            0x01c1 +#define regSCRATCH_REGISTER4_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER5                                                                            0x01c2 +#define regSCRATCH_REGISTER5_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER6                                                                            0x01c3 +#define regSCRATCH_REGISTER6_BASE_IDX                                                                   2 +#define regSCRATCH_REGISTER7                                                                            0x01c4 +#define regSCRATCH_REGISTER7_BASE_IDX                                                                   2 + + +// addressBlock: aid_smuio_smuio_gpio_SmuSmuioDec +// base address: 0x5a500 +#define regSMU_GPIOPAD_SW_INT_STAT                                                                      0x0140 +#define regSMU_GPIOPAD_SW_INT_STAT_BASE_IDX                                                             1 +#define regSMU_GPIOPAD_MASK                                                                             0x0141 +#define regSMU_GPIOPAD_MASK_BASE_IDX                                                                    1 +#define regSMU_GPIOPAD_A                                                                                0x0142 +#define regSMU_GPIOPAD_A_BASE_IDX                                                                       1 +#define regSMU_GPIOPAD_TXIMPSEL                                                                         0x0143 +#define regSMU_GPIOPAD_TXIMPSEL_BASE_IDX                                                                1 +#define regSMU_GPIOPAD_EN                                                                               0x0144 +#define regSMU_GPIOPAD_EN_BASE_IDX                                                                      1 +#define regSMU_GPIOPAD_Y                                                                                0x0145 +#define regSMU_GPIOPAD_Y_BASE_IDX                                                                       1 +#define regSMU_GPIOPAD_RXEN                                                                             0x0146 +#define regSMU_GPIOPAD_RXEN_BASE_IDX                                                                    1 +#define regSMU_GPIOPAD_RCVR_SEL0                                                                        0x0147 +#define regSMU_GPIOPAD_RCVR_SEL0_BASE_IDX                                                               1 +#define regSMU_GPIOPAD_RCVR_SEL1                                                                        0x0148 +#define regSMU_GPIOPAD_RCVR_SEL1_BASE_IDX                                                               1 +#define regSMU_GPIOPAD_PU_EN                                                                            0x0149 +#define regSMU_GPIOPAD_PU_EN_BASE_IDX                                                                   1 +#define regSMU_GPIOPAD_PD_EN                                                                            0x014a +#define regSMU_GPIOPAD_PD_EN_BASE_IDX                                                                   1 +#define regSMU_GPIOPAD_PINSTRAPS                                                                        0x014b +#define regSMU_GPIOPAD_PINSTRAPS_BASE_IDX                                                               1 +#define regDFT_PINSTRAPS                                                                                0x014c +#define regDFT_PINSTRAPS_BASE_IDX                                                                       1 +#define regSMU_GPIOPAD_INT_STAT_EN                                                                      0x014d +#define regSMU_GPIOPAD_INT_STAT_EN_BASE_IDX                                                             1 +#define regSMU_GPIOPAD_INT_STAT                                                                         0x014e +#define regSMU_GPIOPAD_INT_STAT_BASE_IDX                                                                1 +#define regSMU_GPIOPAD_INT_STAT_AK                                                                      0x014f +#define regSMU_GPIOPAD_INT_STAT_AK_BASE_IDX                                                             1 +#define regSMU_GPIOPAD_INT_EN                                                                           0x0150 +#define regSMU_GPIOPAD_INT_EN_BASE_IDX                                                                  1 +#define regSMU_GPIOPAD_INT_TYPE                                                                         0x0151 +#define regSMU_GPIOPAD_INT_TYPE_BASE_IDX                                                                1 +#define regSMU_GPIOPAD_INT_POLARITY                                                                     0x0152 +#define regSMU_GPIOPAD_INT_POLARITY_BASE_IDX                                                            1 +#define regSMUIO_PCC_GPIO_SELECT                                                                        0x0155 +#define regSMUIO_PCC_GPIO_SELECT_BASE_IDX                                                               1 +#define regSMU_GPIOPAD_S0                                                                               0x0156 +#define regSMU_GPIOPAD_S0_BASE_IDX                                                                      1 +#define regSMU_GPIOPAD_S1                                                                               0x0157 +#define regSMU_GPIOPAD_S1_BASE_IDX                                                                      1 +#define regSMU_GPIOPAD_SCHMEN                                                                           0x0158 +#define regSMU_GPIOPAD_SCHMEN_BASE_IDX                                                                  1 +#define regSMU_GPIOPAD_SCL_EN                                                                           0x0159 +#define regSMU_GPIOPAD_SCL_EN_BASE_IDX                                                                  1 +#define regSMU_GPIOPAD_SDA_EN                                                                           0x015a +#define regSMU_GPIOPAD_SDA_EN_BASE_IDX                                                                  1 +#define regSMUIO_GPIO_INT0_SELECT                                                                       0x015b +#define regSMUIO_GPIO_INT0_SELECT_BASE_IDX                                                              1 +#define regSMUIO_GPIO_INT1_SELECT                                                                       0x015c +#define regSMUIO_GPIO_INT1_SELECT_BASE_IDX                                                              1 +#define regSMUIO_GPIO_INT2_SELECT                                                                       0x015d +#define regSMUIO_GPIO_INT2_SELECT_BASE_IDX                                                              1 +#define regSMUIO_GPIO_INT3_SELECT                                                                       0x015e +#define regSMUIO_GPIO_INT3_SELECT_BASE_IDX                                                              1 +#define regSMU_GPIOPAD_MP_INT0_STAT                                                                     0x015f +#define regSMU_GPIOPAD_MP_INT0_STAT_BASE_IDX                                                            1 +#define regSMU_GPIOPAD_MP_INT1_STAT                                                                     0x0160 +#define regSMU_GPIOPAD_MP_INT1_STAT_BASE_IDX                                                            1 +#define regSMU_GPIOPAD_MP_INT2_STAT                                                                     0x0161 +#define regSMU_GPIOPAD_MP_INT2_STAT_BASE_IDX                                                            1 +#define regSMU_GPIOPAD_MP_INT3_STAT                                                                     0x0162 +#define regSMU_GPIOPAD_MP_INT3_STAT_BASE_IDX                                                            1 +#define regSMIO_INDEX                                                                                   0x0163 +#define regSMIO_INDEX_BASE_IDX                                                                          1 +#define regS0_VID_SMIO_CNTL                                                                             0x0164 +#define regS0_VID_SMIO_CNTL_BASE_IDX                                                                    1 +#define regS1_VID_SMIO_CNTL                                                                             0x0165 +#define regS1_VID_SMIO_CNTL_BASE_IDX                                                                    1 +#define regOPEN_DRAIN_SELECT                                                                            0x0166 +#define regOPEN_DRAIN_SELECT_BASE_IDX                                                                   1 +#define regSMIO_ENABLE                                                                                  0x0167 +#define regSMIO_ENABLE_BASE_IDX                                                                         1 + +#endif diff --git a/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_sh_mask.h new file mode 100644 index 000000000000..be896f3089fe --- /dev/null +++ b/drivers/gpu/drm/amd/include/asic_reg/smuio/smuio_13_0_3_sh_mask.h @@ -0,0 +1,428 @@ +/* + * Copyright 2022 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. + * + */ +#ifndef _smuio_13_0_3_SH_MASK_HEADER +#define _smuio_13_0_3_SH_MASK_HEADER + + +// addressBlock: aid_smuio_smuio_reset_SmuSmuioDec +//SMUIO_MP_RESET_INTR +#define SMUIO_MP_RESET_INTR__SMUIO_MP_RESET_INTR__SHIFT                                                       0x0 +#define SMUIO_MP_RESET_INTR__SMUIO_MP_RESET_INTR_MASK                                                         0x00000001L +//SMUIO_SOC_HALT +#define SMUIO_SOC_HALT__WDT_FORCE_PWROK_EN__SHIFT                                                             0x2 +#define SMUIO_SOC_HALT__WDT_FORCE_RESETn_EN__SHIFT                                                            0x3 +#define SMUIO_SOC_HALT__WDT_FORCE_PWROK_EN_MASK                                                               0x00000004L +#define SMUIO_SOC_HALT__WDT_FORCE_RESETn_EN_MASK                                                              0x00000008L + + +// addressBlock: aid_smuio_smuio_tsc_SmuSmuioDec +//PWROK_REFCLK_GAP_CYCLES +#define PWROK_REFCLK_GAP_CYCLES__Pwrok_PreAssertion_clkgap_cycles__SHIFT                                      0x0 +#define PWROK_REFCLK_GAP_CYCLES__Pwrok_PostAssertion_clkgap_cycles__SHIFT                                     0x8 +#define PWROK_REFCLK_GAP_CYCLES__Pwrok_PreAssertion_clkgap_cycles_MASK                                        0x000000FFL +#define PWROK_REFCLK_GAP_CYCLES__Pwrok_PostAssertion_clkgap_cycles_MASK                                       0x0000FF00L +//GOLDEN_TSC_INCREMENT_UPPER +#define GOLDEN_TSC_INCREMENT_UPPER__GoldenTscIncrementUpper__SHIFT                                            0x0 +#define GOLDEN_TSC_INCREMENT_UPPER__GoldenTscIncrementUpper_MASK                                              0x00FFFFFFL +//GOLDEN_TSC_INCREMENT_LOWER +#define GOLDEN_TSC_INCREMENT_LOWER__GoldenTscIncrementLower__SHIFT                                            0x0 +#define GOLDEN_TSC_INCREMENT_LOWER__GoldenTscIncrementLower_MASK                                              0xFFFFFFFFL +//GOLDEN_TSC_COUNT_UPPER +#define GOLDEN_TSC_COUNT_UPPER__GoldenTscCountUpper__SHIFT                                                    0x0 +#define GOLDEN_TSC_COUNT_UPPER__GoldenTscCountUpper_MASK                                                      0x00FFFFFFL +//GOLDEN_TSC_COUNT_LOWER +#define GOLDEN_TSC_COUNT_LOWER__GoldenTscCountLower__SHIFT                                                    0x0 +#define GOLDEN_TSC_COUNT_LOWER__GoldenTscCountLower_MASK                                                      0xFFFFFFFFL +//SOC_GOLDEN_TSC_SHADOW_UPPER +#define SOC_GOLDEN_TSC_SHADOW_UPPER__SocGoldenTscShadowUpper__SHIFT                                           0x0 +#define SOC_GOLDEN_TSC_SHADOW_UPPER__SocGoldenTscShadowUpper_MASK                                             0x00FFFFFFL +//SOC_GOLDEN_TSC_SHADOW_LOWER +#define SOC_GOLDEN_TSC_SHADOW_LOWER__SocGoldenTscShadowLower__SHIFT                                           0x0 +#define SOC_GOLDEN_TSC_SHADOW_LOWER__SocGoldenTscShadowLower_MASK                                             0xFFFFFFFFL +//SOC_GAP_PWROK +#define SOC_GAP_PWROK__soc_gap_pwrok__SHIFT                                                                   0x0 +#define SOC_GAP_PWROK__soc_gap_pwrok_MASK                                                                     0x00000001L + + +// addressBlock: aid_smuio_smuio_swtimer_SmuSmuioDec +//PWR_VIRT_RESET_REQ +#define PWR_VIRT_RESET_REQ__VF_FLR__SHIFT                                                                     0x0 +#define PWR_VIRT_RESET_REQ__PF_FLR__SHIFT                                                                     0x1f +#define PWR_VIRT_RESET_REQ__VF_FLR_MASK                                                                       0x7FFFFFFFL +#define PWR_VIRT_RESET_REQ__PF_FLR_MASK                                                                       0x80000000L +//PWR_DISP_TIMER_CONTROL +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_COUNT__SHIFT                                                   0x0 +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_ENABLE__SHIFT                                                  0x19 +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_DISABLE__SHIFT                                                 0x1a +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_MASK__SHIFT                                                    0x1b +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_STAT_AK__SHIFT                                                 0x1c +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_TYPE__SHIFT                                                    0x1d +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_MODE__SHIFT                                                    0x1e +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_COUNT_MASK                                                     0x01FFFFFFL +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_ENABLE_MASK                                                    0x02000000L +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_DISABLE_MASK                                                   0x04000000L +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_MASK_MASK                                                      0x08000000L +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_STAT_AK_MASK                                                   0x10000000L +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_TYPE_MASK                                                      0x20000000L +#define PWR_DISP_TIMER_CONTROL__DISP_TIMER_INT_MODE_MASK                                                      0x40000000L +//PWR_DISP_TIMER_DEBUG +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT_RUNNING__SHIFT                                                   0x0 +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT_STAT__SHIFT                                                      0x1 +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT__SHIFT                                                           0x2 +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_RUN_VAL__SHIFT                                                       0x7 +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT_RUNNING_MASK                                                     0x00000001L +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT_STAT_MASK                                                        0x00000002L +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_INT_MASK                                                             0x00000004L +#define PWR_DISP_TIMER_DEBUG__DISP_TIMER_RUN_VAL_MASK                                                         0xFFFFFF80L +//PWR_DISP_TIMER2_CONTROL +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_COUNT__SHIFT                                                  0x0 +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_ENABLE__SHIFT                                                 0x19 +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_DISABLE__SHIFT                                                0x1a +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_MASK__SHIFT                                                   0x1b +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_STAT_AK__SHIFT                                                0x1c +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_TYPE__SHIFT                                                   0x1d +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_MODE__SHIFT                                                   0x1e +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_COUNT_MASK                                                    0x01FFFFFFL +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_ENABLE_MASK                                                   0x02000000L +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_DISABLE_MASK                                                  0x04000000L +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_MASK_MASK                                                     0x08000000L +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_STAT_AK_MASK                                                  0x10000000L +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_TYPE_MASK                                                     0x20000000L +#define PWR_DISP_TIMER2_CONTROL__DISP_TIMER_INT_MODE_MASK                                                     0x40000000L +//PWR_DISP_TIMER2_DEBUG +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT_RUNNING__SHIFT                                                  0x0 +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT_STAT__SHIFT                                                     0x1 +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT__SHIFT                                                          0x2 +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_RUN_VAL__SHIFT                                                      0x7 +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT_RUNNING_MASK                                                    0x00000001L +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT_STAT_MASK                                                       0x00000002L +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_INT_MASK                                                            0x00000004L +#define PWR_DISP_TIMER2_DEBUG__DISP_TIMER_RUN_VAL_MASK                                                        0xFFFFFF80L +//PWR_DISP_TIMER_GLOBAL_CONTROL +#define PWR_DISP_TIMER_GLOBAL_CONTROL__DISP_TIMER_PULSE_WIDTH__SHIFT                                          0x0 +#define PWR_DISP_TIMER_GLOBAL_CONTROL__DISP_TIMER_PULSE_EN__SHIFT                                             0xa +#define PWR_DISP_TIMER_GLOBAL_CONTROL__DISP_TIMER_PULSE_WIDTH_MASK                                            0x000003FFL +#define PWR_DISP_TIMER_GLOBAL_CONTROL__DISP_TIMER_PULSE_EN_MASK                                               0x00000400L +//PWR_IH_CONTROL +#define PWR_IH_CONTROL__MAX_CREDIT__SHIFT                                                                     0x0 +#define PWR_IH_CONTROL__DISP_TIMER_TRIGGER_MASK__SHIFT                                                        0x5 +#define PWR_IH_CONTROL__DISP_TIMER2_TRIGGER_MASK__SHIFT                                                       0x6 +#define PWR_IH_CONTROL__PWR_IH_CLK_GATE_EN__SHIFT                                                             0x1f +#define PWR_IH_CONTROL__MAX_CREDIT_MASK                                                                       0x0000001FL +#define PWR_IH_CONTROL__DISP_TIMER_TRIGGER_MASK_MASK                                                          0x00000020L +#define PWR_IH_CONTROL__DISP_TIMER2_TRIGGER_MASK_MASK                                                         0x00000040L +#define PWR_IH_CONTROL__PWR_IH_CLK_GATE_EN_MASK                                                               0x80000000L + + +// addressBlock: aid_smuio_smuio_misc_SmuSmuioDec +//SMUIO_MCM_CONFIG +#define SMUIO_MCM_CONFIG__DIE_ID__SHIFT                                                                       0x0 +#define SMUIO_MCM_CONFIG__PKG_TYPE__SHIFT                                                                     0x2 +#define SMUIO_MCM_CONFIG__SOCKET_ID__SHIFT                                                                    0x8 +#define SMUIO_MCM_CONFIG__PKG_SUBTYPE__SHIFT                                                                  0xc +#define SMUIO_MCM_CONFIG__CONSOLE_K__SHIFT                                                                    0x10 +#define SMUIO_MCM_CONFIG__CONSOLE_A__SHIFT                                                                    0x11 +#define SMUIO_MCM_CONFIG__TOPOLOGY_ID__SHIFT                                                                  0x12 +#define SMUIO_MCM_CONFIG__DIE_ID_MASK                                                                         0x00000003L +#define SMUIO_MCM_CONFIG__PKG_TYPE_MASK                                                                       0x0000003CL +#define SMUIO_MCM_CONFIG__SOCKET_ID_MASK                                                                      0x00000F00L +#define SMUIO_MCM_CONFIG__PKG_SUBTYPE_MASK                                                                    0x00001000L +#define SMUIO_MCM_CONFIG__CONSOLE_K_MASK                                                                      0x00010000L +#define SMUIO_MCM_CONFIG__CONSOLE_A_MASK                                                                      0x00020000L +#define SMUIO_MCM_CONFIG__TOPOLOGY_ID_MASK                                                                    0x007C0000L +//IP_DISCOVERY_VERSION +#define IP_DISCOVERY_VERSION__IP_DISCOVERY_VERSION__SHIFT                                                     0x0 +#define IP_DISCOVERY_VERSION__IP_DISCOVERY_VERSION_MASK                                                       0xFFFFFFFFL +//SCRATCH_REGISTER0 +#define SCRATCH_REGISTER0__ScratchPad0__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER0__ScratchPad0_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER1 +#define SCRATCH_REGISTER1__ScratchPad1__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER1__ScratchPad1_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER2 +#define SCRATCH_REGISTER2__ScratchPad2__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER2__ScratchPad2_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER3 +#define SCRATCH_REGISTER3__ScratchPad3__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER3__ScratchPad3_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER4 +#define SCRATCH_REGISTER4__ScratchPad4__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER4__ScratchPad4_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER5 +#define SCRATCH_REGISTER5__ScratchPad5__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER5__ScratchPad5_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER6 +#define SCRATCH_REGISTER6__ScratchPad6__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER6__ScratchPad6_MASK                                                                   0xFFFFFFFFL +//SCRATCH_REGISTER7 +#define SCRATCH_REGISTER7__ScratchPad7__SHIFT                                                                 0x0 +#define SCRATCH_REGISTER7__ScratchPad7_MASK                                                                   0xFFFFFFFFL + + +// addressBlock: aid_smuio_smuio_gpio_SmuSmuioDec +//SMU_GPIOPAD_SW_INT_STAT +#define SMU_GPIOPAD_SW_INT_STAT__SW_INT_STAT__SHIFT                                                           0x0 +#define SMU_GPIOPAD_SW_INT_STAT__SW_INT_STAT_MASK                                                             0x00000001L +//SMU_GPIOPAD_MASK +#define SMU_GPIOPAD_MASK__GPIO_MASK__SHIFT                                                                    0x0 +#define SMU_GPIOPAD_MASK__GPIO_MASK_MASK                                                                      0x7FFFFFFFL +//SMU_GPIOPAD_A +#define SMU_GPIOPAD_A__GPIO_A__SHIFT                                                                          0x0 +#define SMU_GPIOPAD_A__GPIO_A_MASK                                                                            0x7FFFFFFFL +//SMU_GPIOPAD_TXIMPSEL +#define SMU_GPIOPAD_TXIMPSEL__GPIO_TXIMPSEL__SHIFT                                                            0x0 +#define SMU_GPIOPAD_TXIMPSEL__GPIO_TXIMPSEL_MASK                                                              0x7FFFFFFFL +//SMU_GPIOPAD_EN +#define SMU_GPIOPAD_EN__GPIO_EN__SHIFT                                                                        0x0 +#define SMU_GPIOPAD_EN__GPIO_EN_MASK                                                                          0x7FFFFFFFL +//SMU_GPIOPAD_Y +#define SMU_GPIOPAD_Y__GPIO_Y__SHIFT                                                                          0x0 +#define SMU_GPIOPAD_Y__GPIO_Y_MASK                                                                            0x7FFFFFFFL +//SMU_GPIOPAD_RXEN +#define SMU_GPIOPAD_RXEN__GPIO_RXEN__SHIFT                                                                    0x0 +#define SMU_GPIOPAD_RXEN__GPIO_RXEN_MASK                                                                      0x7FFFFFFFL +//SMU_GPIOPAD_RCVR_SEL0 +#define SMU_GPIOPAD_RCVR_SEL0__GPIO_RCVR_SEL0__SHIFT                                                          0x0 +#define SMU_GPIOPAD_RCVR_SEL0__GPIO_RCVR_SEL0_MASK                                                            0x7FFFFFFFL +//SMU_GPIOPAD_RCVR_SEL1 +#define SMU_GPIOPAD_RCVR_SEL1__GPIO_RCVR_SEL1__SHIFT                                                          0x0 +#define SMU_GPIOPAD_RCVR_SEL1__GPIO_RCVR_SEL1_MASK                                                            0x7FFFFFFFL +//SMU_GPIOPAD_PU_EN +#define SMU_GPIOPAD_PU_EN__GPIO_PU_EN__SHIFT                                                                  0x0 +#define SMU_GPIOPAD_PU_EN__GPIO_PU_EN_MASK                                                                    0x7FFFFFFFL +//SMU_GPIOPAD_PD_EN +#define SMU_GPIOPAD_PD_EN__GPIO_PD_EN__SHIFT                                                                  0x0 +#define SMU_GPIOPAD_PD_EN__GPIO_PD_EN_MASK                                                                    0x7FFFFFFFL +//SMU_GPIOPAD_PINSTRAPS +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_0__SHIFT                                                         0x0 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_1__SHIFT                                                         0x1 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_2__SHIFT                                                         0x2 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_3__SHIFT                                                         0x3 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_4__SHIFT                                                         0x4 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_5__SHIFT                                                         0x5 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_6__SHIFT                                                         0x6 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_7__SHIFT                                                         0x7 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_8__SHIFT                                                         0x8 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_9__SHIFT                                                         0x9 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_10__SHIFT                                                        0xa +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_11__SHIFT                                                        0xb +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_12__SHIFT                                                        0xc +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_13__SHIFT                                                        0xd +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_14__SHIFT                                                        0xe +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_15__SHIFT                                                        0xf +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_16__SHIFT                                                        0x10 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_17__SHIFT                                                        0x11 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_18__SHIFT                                                        0x12 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_19__SHIFT                                                        0x13 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_20__SHIFT                                                        0x14 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_21__SHIFT                                                        0x15 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_22__SHIFT                                                        0x16 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_23__SHIFT                                                        0x17 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_24__SHIFT                                                        0x18 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_25__SHIFT                                                        0x19 +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_26__SHIFT                                                        0x1a +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_27__SHIFT                                                        0x1b +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_28__SHIFT                                                        0x1c +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_29__SHIFT                                                        0x1d +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_30__SHIFT                                                        0x1e +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_0_MASK                                                           0x00000001L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_1_MASK                                                           0x00000002L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_2_MASK                                                           0x00000004L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_3_MASK                                                           0x00000008L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_4_MASK                                                           0x00000010L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_5_MASK                                                           0x00000020L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_6_MASK                                                           0x00000040L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_7_MASK                                                           0x00000080L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_8_MASK                                                           0x00000100L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_9_MASK                                                           0x00000200L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_10_MASK                                                          0x00000400L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_11_MASK                                                          0x00000800L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_12_MASK                                                          0x00001000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_13_MASK                                                          0x00002000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_14_MASK                                                          0x00004000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_15_MASK                                                          0x00008000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_16_MASK                                                          0x00010000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_17_MASK                                                          0x00020000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_18_MASK                                                          0x00040000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_19_MASK                                                          0x00080000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_20_MASK                                                          0x00100000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_21_MASK                                                          0x00200000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_22_MASK                                                          0x00400000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_23_MASK                                                          0x00800000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_24_MASK                                                          0x01000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_25_MASK                                                          0x02000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_26_MASK                                                          0x04000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_27_MASK                                                          0x08000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_28_MASK                                                          0x10000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_29_MASK                                                          0x20000000L +#define SMU_GPIOPAD_PINSTRAPS__GPIO_PINSTRAP_30_MASK                                                          0x40000000L +//DFT_PINSTRAPS +#define DFT_PINSTRAPS__DFT_PINSTRAPS__SHIFT                                                                   0x0 +#define DFT_PINSTRAPS__DFT_PINSTRAPS_MASK                                                                     0x000003FFL +//SMU_GPIOPAD_INT_STAT_EN +#define SMU_GPIOPAD_INT_STAT_EN__GPIO_INT_STAT_EN__SHIFT                                                      0x0 +#define SMU_GPIOPAD_INT_STAT_EN__SW_INITIATED_INT_STAT_EN__SHIFT                                              0x1f +#define SMU_GPIOPAD_INT_STAT_EN__GPIO_INT_STAT_EN_MASK                                                        0x1FFFFFFFL +#define SMU_GPIOPAD_INT_STAT_EN__SW_INITIATED_INT_STAT_EN_MASK                                                0x80000000L +//SMU_GPIOPAD_INT_STAT +#define SMU_GPIOPAD_INT_STAT__GPIO_INT_STAT__SHIFT                                                            0x0 +#define SMU_GPIOPAD_INT_STAT__SW_INITIATED_INT_STAT__SHIFT                                                    0x1f +#define SMU_GPIOPAD_INT_STAT__GPIO_INT_STAT_MASK                                                              0x1FFFFFFFL +#define SMU_GPIOPAD_INT_STAT__SW_INITIATED_INT_STAT_MASK                                                      0x80000000L +//SMU_GPIOPAD_INT_STAT_AK +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_0__SHIFT                                                    0x0 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_1__SHIFT                                                    0x1 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_2__SHIFT                                                    0x2 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_3__SHIFT                                                    0x3 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_4__SHIFT                                                    0x4 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_5__SHIFT                                                    0x5 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_6__SHIFT                                                    0x6 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_7__SHIFT                                                    0x7 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_8__SHIFT                                                    0x8 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_9__SHIFT                                                    0x9 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_10__SHIFT                                                   0xa +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_11__SHIFT                                                   0xb +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_12__SHIFT                                                   0xc +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_13__SHIFT                                                   0xd +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_14__SHIFT                                                   0xe +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_15__SHIFT                                                   0xf +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_16__SHIFT                                                   0x10 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_17__SHIFT                                                   0x11 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_18__SHIFT                                                   0x12 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_19__SHIFT                                                   0x13 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_20__SHIFT                                                   0x14 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_21__SHIFT                                                   0x15 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_22__SHIFT                                                   0x16 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_23__SHIFT                                                   0x17 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_24__SHIFT                                                   0x18 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_25__SHIFT                                                   0x19 +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_26__SHIFT                                                   0x1a +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_27__SHIFT                                                   0x1b +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_28__SHIFT                                                   0x1c +#define SMU_GPIOPAD_INT_STAT_AK__SW_INITIATED_INT_STAT_AK__SHIFT                                              0x1f +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_0_MASK                                                      0x00000001L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_1_MASK                                                      0x00000002L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_2_MASK                                                      0x00000004L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_3_MASK                                                      0x00000008L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_4_MASK                                                      0x00000010L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_5_MASK                                                      0x00000020L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_6_MASK                                                      0x00000040L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_7_MASK                                                      0x00000080L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_8_MASK                                                      0x00000100L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_9_MASK                                                      0x00000200L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_10_MASK                                                     0x00000400L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_11_MASK                                                     0x00000800L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_12_MASK                                                     0x00001000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_13_MASK                                                     0x00002000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_14_MASK                                                     0x00004000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_15_MASK                                                     0x00008000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_16_MASK                                                     0x00010000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_17_MASK                                                     0x00020000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_18_MASK                                                     0x00040000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_19_MASK                                                     0x00080000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_20_MASK                                                     0x00100000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_21_MASK                                                     0x00200000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_22_MASK                                                     0x00400000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_23_MASK                                                     0x00800000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_24_MASK                                                     0x01000000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_25_MASK                                                     0x02000000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_26_MASK                                                     0x04000000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_27_MASK                                                     0x08000000L +#define SMU_GPIOPAD_INT_STAT_AK__GPIO_INT_STAT_AK_28_MASK                                                     0x10000000L +#define SMU_GPIOPAD_INT_STAT_AK__SW_INITIATED_INT_STAT_AK_MASK                                                0x80000000L +//SMU_GPIOPAD_INT_EN +#define SMU_GPIOPAD_INT_EN__GPIO_INT_EN__SHIFT                                                                0x0 +#define SMU_GPIOPAD_INT_EN__SW_INITIATED_INT_EN__SHIFT                                                        0x1f +#define SMU_GPIOPAD_INT_EN__GPIO_INT_EN_MASK                                                                  0x1FFFFFFFL +#define SMU_GPIOPAD_INT_EN__SW_INITIATED_INT_EN_MASK                                                          0x80000000L +//SMU_GPIOPAD_INT_TYPE +#define SMU_GPIOPAD_INT_TYPE__GPIO_INT_TYPE__SHIFT                                                            0x0 +#define SMU_GPIOPAD_INT_TYPE__SW_INITIATED_INT_TYPE__SHIFT                                                    0x1f +#define SMU_GPIOPAD_INT_TYPE__GPIO_INT_TYPE_MASK                                                              0x1FFFFFFFL +#define SMU_GPIOPAD_INT_TYPE__SW_INITIATED_INT_TYPE_MASK                                                      0x80000000L +//SMU_GPIOPAD_INT_POLARITY +#define SMU_GPIOPAD_INT_POLARITY__GPIO_INT_POLARITY__SHIFT                                                    0x0 +#define SMU_GPIOPAD_INT_POLARITY__SW_INITIATED_INT_POLARITY__SHIFT                                            0x1f +#define SMU_GPIOPAD_INT_POLARITY__GPIO_INT_POLARITY_MASK                                                      0x1FFFFFFFL +#define SMU_GPIOPAD_INT_POLARITY__SW_INITIATED_INT_POLARITY_MASK                                              0x80000000L +//SMUIO_PCC_GPIO_SELECT +#define SMUIO_PCC_GPIO_SELECT__GPIO__SHIFT                                                                    0x0 +#define SMUIO_PCC_GPIO_SELECT__GPIO_MASK                                                                      0xFFFFFFFFL +//SMU_GPIOPAD_S0 +#define SMU_GPIOPAD_S0__GPIO_S0__SHIFT                                                                        0x0 +#define SMU_GPIOPAD_S0__GPIO_S0_MASK                                                                          0x7FFFFFFFL +//SMU_GPIOPAD_S1 +#define SMU_GPIOPAD_S1__GPIO_S1__SHIFT                                                                        0x0 +#define SMU_GPIOPAD_S1__GPIO_S1_MASK                                                                          0x7FFFFFFFL +//SMU_GPIOPAD_SCHMEN +#define SMU_GPIOPAD_SCHMEN__GPIO_SCHMEN__SHIFT                                                                0x0 +#define SMU_GPIOPAD_SCHMEN__GPIO_SCHMEN_MASK                                                                  0x7FFFFFFFL +//SMU_GPIOPAD_SCL_EN +#define SMU_GPIOPAD_SCL_EN__GPIO_SCL_EN__SHIFT                                                                0x0 +#define SMU_GPIOPAD_SCL_EN__GPIO_SCL_EN_MASK                                                                  0x7FFFFFFFL +//SMU_GPIOPAD_SDA_EN +#define SMU_GPIOPAD_SDA_EN__GPIO_SDA_EN__SHIFT                                                                0x0 +#define SMU_GPIOPAD_SDA_EN__GPIO_SDA_EN_MASK                                                                  0x7FFFFFFFL +//SMUIO_GPIO_INT0_SELECT +#define SMUIO_GPIO_INT0_SELECT__GPIO_INT0_SELECT__SHIFT                                                       0x0 +#define SMUIO_GPIO_INT0_SELECT__GPIO_INT0_SELECT_MASK                                                         0xFFFFFFFFL +//SMUIO_GPIO_INT1_SELECT +#define SMUIO_GPIO_INT1_SELECT__GPIO_INT1_SELECT__SHIFT                                                       0x0 +#define SMUIO_GPIO_INT1_SELECT__GPIO_INT1_SELECT_MASK                                                         0xFFFFFFFFL +//SMUIO_GPIO_INT2_SELECT +#define SMUIO_GPIO_INT2_SELECT__GPIO_INT2_SELECT__SHIFT                                                       0x0 +#define SMUIO_GPIO_INT2_SELECT__GPIO_INT2_SELECT_MASK                                                         0xFFFFFFFFL +//SMUIO_GPIO_INT3_SELECT +#define SMUIO_GPIO_INT3_SELECT__GPIO_INT3_SELECT__SHIFT                                                       0x0 +#define SMUIO_GPIO_INT3_SELECT__GPIO_INT3_SELECT_MASK                                                         0xFFFFFFFFL +//SMU_GPIOPAD_MP_INT0_STAT +#define SMU_GPIOPAD_MP_INT0_STAT__GPIO_MP_INT0_STAT__SHIFT                                                    0x0 +#define SMU_GPIOPAD_MP_INT0_STAT__GPIO_MP_INT0_STAT_MASK                                                      0x1FFFFFFFL +//SMU_GPIOPAD_MP_INT1_STAT +#define SMU_GPIOPAD_MP_INT1_STAT__GPIO_MP_INT1_STAT__SHIFT                                                    0x0 +#define SMU_GPIOPAD_MP_INT1_STAT__GPIO_MP_INT1_STAT_MASK                                                      0x1FFFFFFFL +//SMU_GPIOPAD_MP_INT2_STAT +#define SMU_GPIOPAD_MP_INT2_STAT__GPIO_MP_INT2_STAT__SHIFT                                                    0x0 +#define SMU_GPIOPAD_MP_INT2_STAT__GPIO_MP_INT2_STAT_MASK                                                      0x1FFFFFFFL +//SMU_GPIOPAD_MP_INT3_STAT +#define SMU_GPIOPAD_MP_INT3_STAT__GPIO_MP_INT3_STAT__SHIFT                                                    0x0 +#define SMU_GPIOPAD_MP_INT3_STAT__GPIO_MP_INT3_STAT_MASK                                                      0x1FFFFFFFL +//SMIO_INDEX +#define SMIO_INDEX__SW_SMIO_INDEX__SHIFT                                                                      0x0 +#define SMIO_INDEX__SW_SMIO_INDEX_MASK                                                                        0x00000001L +//S0_VID_SMIO_CNTL +#define S0_VID_SMIO_CNTL__S0_SMIO_VALUES__SHIFT                                                               0x0 +#define S0_VID_SMIO_CNTL__S0_SMIO_VALUES_MASK                                                                 0xFFFFFFFFL +//S1_VID_SMIO_CNTL +#define S1_VID_SMIO_CNTL__S1_SMIO_VALUES__SHIFT                                                               0x0 +#define S1_VID_SMIO_CNTL__S1_SMIO_VALUES_MASK                                                                 0xFFFFFFFFL +//OPEN_DRAIN_SELECT +#define OPEN_DRAIN_SELECT__OPEN_DRAIN_SELECT__SHIFT                                                           0x0 +#define OPEN_DRAIN_SELECT__RESERVED__SHIFT                                                                    0x1f +#define OPEN_DRAIN_SELECT__OPEN_DRAIN_SELECT_MASK                                                             0x7FFFFFFFL +#define OPEN_DRAIN_SELECT__RESERVED_MASK                                                                      0x80000000L +//SMIO_ENABLE +#define SMIO_ENABLE__SMIO_ENABLE__SHIFT                                                                       0x0 +#define SMIO_ENABLE__SMIO_ENABLE_MASK                                                                         0xFFFFFFFFL + +#endif diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_offset.h b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_offset.h new file mode 100644 index 000000000000..e9742d10de1c --- /dev/null +++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_offset.h @@ -0,0 +1,2332 @@ +/* + * Copyright 2022 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. + * + */ +#ifndef _vcn_4_0_3_OFFSET_HEADER +#define _vcn_4_0_3_OFFSET_HEADER + + + +// addressBlock: aid_uvd0_uvddec +// base address: 0x1fb00 +#define regUVD_TOP_CTRL                                                                                 0x00c0 +#define regUVD_TOP_CTRL_BASE_IDX                                                                        1 +#define regUVD_CGC_GATE                                                                                 0x00c1 +#define regUVD_CGC_GATE_BASE_IDX                                                                        1 +#define regUVD_CGC_CTRL                                                                                 0x00c2 +#define regUVD_CGC_CTRL_BASE_IDX                                                                        1 +#define regAVM_SUVD_CGC_GATE                                                                            0x00c4 +#define regAVM_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regCDEFE_SUVD_CGC_GATE                                                                          0x00c4 +#define regCDEFE_SUVD_CGC_GATE_BASE_IDX                                                                 1 +#define regEFC_SUVD_CGC_GATE                                                                            0x00c4 +#define regEFC_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regENT_SUVD_CGC_GATE                                                                            0x00c4 +#define regENT_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regIME_SUVD_CGC_GATE                                                                            0x00c4 +#define regIME_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regPPU_SUVD_CGC_GATE                                                                            0x00c4 +#define regPPU_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regSAOE_SUVD_CGC_GATE                                                                           0x00c4 +#define regSAOE_SUVD_CGC_GATE_BASE_IDX                                                                  1 +#define regSCM_SUVD_CGC_GATE                                                                            0x00c4 +#define regSCM_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regSDB_SUVD_CGC_GATE                                                                            0x00c4 +#define regSDB_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regSIT0_NXT_SUVD_CGC_GATE                                                                       0x00c4 +#define regSIT0_NXT_SUVD_CGC_GATE_BASE_IDX                                                              1 +#define regSIT1_NXT_SUVD_CGC_GATE                                                                       0x00c4 +#define regSIT1_NXT_SUVD_CGC_GATE_BASE_IDX                                                              1 +#define regSIT2_NXT_SUVD_CGC_GATE                                                                       0x00c4 +#define regSIT2_NXT_SUVD_CGC_GATE_BASE_IDX                                                              1 +#define regSIT_SUVD_CGC_GATE                                                                            0x00c4 +#define regSIT_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regSMPA_SUVD_CGC_GATE                                                                           0x00c4 +#define regSMPA_SUVD_CGC_GATE_BASE_IDX                                                                  1 +#define regSMP_SUVD_CGC_GATE                                                                            0x00c4 +#define regSMP_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regSRE_SUVD_CGC_GATE                                                                            0x00c4 +#define regSRE_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regUVD_MPBE0_SUVD_CGC_GATE                                                                      0x00c4 +#define regUVD_MPBE0_SUVD_CGC_GATE_BASE_IDX                                                             1 +#define regUVD_MPBE1_SUVD_CGC_GATE                                                                      0x00c4 +#define regUVD_MPBE1_SUVD_CGC_GATE_BASE_IDX                                                             1 +#define regUVD_SUVD_CGC_GATE                                                                            0x00c4 +#define regUVD_SUVD_CGC_GATE_BASE_IDX                                                                   1 +#define regAVM_SUVD_CGC_GATE2                                                                           0x00c5 +#define regAVM_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regCDEFE_SUVD_CGC_GATE2                                                                         0x00c5 +#define regCDEFE_SUVD_CGC_GATE2_BASE_IDX                                                                1 +#define regDBR_SUVD_CGC_GATE2                                                                           0x00c5 +#define regDBR_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regENT_SUVD_CGC_GATE2                                                                           0x00c5 +#define regENT_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regIME_SUVD_CGC_GATE2                                                                           0x00c5 +#define regIME_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regMPC1_SUVD_CGC_GATE2                                                                          0x00c5 +#define regMPC1_SUVD_CGC_GATE2_BASE_IDX                                                                 1 +#define regSAOE_SUVD_CGC_GATE2                                                                          0x00c5 +#define regSAOE_SUVD_CGC_GATE2_BASE_IDX                                                                 1 +#define regSDB_SUVD_CGC_GATE2                                                                           0x00c5 +#define regSDB_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regSIT0_NXT_SUVD_CGC_GATE2                                                                      0x00c5 +#define regSIT0_NXT_SUVD_CGC_GATE2_BASE_IDX                                                             1 +#define regSIT1_NXT_SUVD_CGC_GATE2                                                                      0x00c5 +#define regSIT1_NXT_SUVD_CGC_GATE2_BASE_IDX                                                             1 +#define regSIT2_NXT_SUVD_CGC_GATE2                                                                      0x00c5 +#define regSIT2_NXT_SUVD_CGC_GATE2_BASE_IDX                                                             1 +#define regSIT_SUVD_CGC_GATE2                                                                           0x00c5 +#define regSIT_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regSMPA_SUVD_CGC_GATE2                                                                          0x00c5 +#define regSMPA_SUVD_CGC_GATE2_BASE_IDX                                                                 1 +#define regSMP_SUVD_CGC_GATE2                                                                           0x00c5 +#define regSMP_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regSRE_SUVD_CGC_GATE2                                                                           0x00c5 +#define regSRE_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regUVD_MPBE0_SUVD_CGC_GATE2                                                                     0x00c5 +#define regUVD_MPBE0_SUVD_CGC_GATE2_BASE_IDX                                                            1 +#define regUVD_MPBE1_SUVD_CGC_GATE2                                                                     0x00c5 +#define regUVD_MPBE1_SUVD_CGC_GATE2_BASE_IDX                                                            1 +#define regUVD_SUVD_CGC_GATE2                                                                           0x00c5 +#define regUVD_SUVD_CGC_GATE2_BASE_IDX                                                                  1 +#define regAVM_SUVD_CGC_CTRL                                                                            0x00c6 +#define regAVM_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regCDEFE_SUVD_CGC_CTRL                                                                          0x00c6 +#define regCDEFE_SUVD_CGC_CTRL_BASE_IDX                                                                 1 +#define regDBR_SUVD_CGC_CTRL                                                                            0x00c6 +#define regDBR_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regEFC_SUVD_CGC_CTRL                                                                            0x00c6 +#define regEFC_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regENT_SUVD_CGC_CTRL                                                                            0x00c6 +#define regENT_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regIME_SUVD_CGC_CTRL                                                                            0x00c6 +#define regIME_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regMPC1_SUVD_CGC_CTRL                                                                           0x00c6 +#define regMPC1_SUVD_CGC_CTRL_BASE_IDX                                                                  1 +#define regPPU_SUVD_CGC_CTRL                                                                            0x00c6 +#define regPPU_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regSAOE_SUVD_CGC_CTRL                                                                           0x00c6 +#define regSAOE_SUVD_CGC_CTRL_BASE_IDX                                                                  1 +#define regSCM_SUVD_CGC_CTRL                                                                            0x00c6 +#define regSCM_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regSDB_SUVD_CGC_CTRL                                                                            0x00c6 +#define regSDB_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regSIT0_NXT_SUVD_CGC_CTRL                                                                       0x00c6 +#define regSIT0_NXT_SUVD_CGC_CTRL_BASE_IDX                                                              1 +#define regSIT1_NXT_SUVD_CGC_CTRL                                                                       0x00c6 +#define regSIT1_NXT_SUVD_CGC_CTRL_BASE_IDX                                                              1 +#define regSIT2_NXT_SUVD_CGC_CTRL                                                                       0x00c6 +#define regSIT2_NXT_SUVD_CGC_CTRL_BASE_IDX                                                              1 +#define regSIT_SUVD_CGC_CTRL                                                                            0x00c6 +#define regSIT_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regSMPA_SUVD_CGC_CTRL                                                                           0x00c6 +#define regSMPA_SUVD_CGC_CTRL_BASE_IDX                                                                  1 +#define regSMP_SUVD_CGC_CTRL                                                                            0x00c6 +#define regSMP_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regSRE_SUVD_CGC_CTRL                                                                            0x00c6 +#define regSRE_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regUVD_MPBE0_SUVD_CGC_CTRL                                                                      0x00c6 +#define regUVD_MPBE0_SUVD_CGC_CTRL_BASE_IDX                                                             1 +#define regUVD_MPBE1_SUVD_CGC_CTRL                                                                      0x00c6 +#define regUVD_MPBE1_SUVD_CGC_CTRL_BASE_IDX                                                             1 +#define regUVD_SUVD_CGC_CTRL                                                                            0x00c6 +#define regUVD_SUVD_CGC_CTRL_BASE_IDX                                                                   1 +#define regUVD_CGC_CTRL3                                                                                0x00ca +#define regUVD_CGC_CTRL3_BASE_IDX                                                                       1 +#define regUVD_GPCOM_VCPU_DATA0                                                                         0x00d0 +#define regUVD_GPCOM_VCPU_DATA0_BASE_IDX                                                                1 +#define regUVD_GPCOM_VCPU_DATA1                                                                         0x00d1 +#define regUVD_GPCOM_VCPU_DATA1_BASE_IDX                                                                1 +#define regUVD_GPCOM_SYS_CMD                                                                            0x00d2 +#define regUVD_GPCOM_SYS_CMD_BASE_IDX                                                                   1 +#define regUVD_GPCOM_SYS_DATA0                                                                          0x00d3 +#define regUVD_GPCOM_SYS_DATA0_BASE_IDX                                                                 1 +#define regUVD_GPCOM_SYS_DATA1                                                                          0x00d4 +#define regUVD_GPCOM_SYS_DATA1_BASE_IDX                                                                 1 +#define regUVD_VCPU_INT_EN                                                                              0x00d5 +#define regUVD_VCPU_INT_EN_BASE_IDX                                                                     1 +#define regUVD_VCPU_INT_STATUS                                                                          0x00d6 +#define regUVD_VCPU_INT_STATUS_BASE_IDX                                                                 1 +#define regUVD_VCPU_INT_ACK                                                                             0x00d7 +#define regUVD_VCPU_INT_ACK_BASE_IDX                                                                    1 +#define regUVD_VCPU_INT_ROUTE                                                                           0x00d8 +#define regUVD_VCPU_INT_ROUTE_BASE_IDX                                                                  1 +#define regUVD_DRV_FW_MSG                                                                               0x00d9 +#define regUVD_DRV_FW_MSG_BASE_IDX                                                                      1 +#define regUVD_FW_DRV_MSG_ACK                                                                           0x00da +#define regUVD_FW_DRV_MSG_ACK_BASE_IDX                                                                  1 +#define regUVD_SUVD_INT_EN                                                                              0x00db +#define regUVD_SUVD_INT_EN_BASE_IDX                                                                     1 +#define regUVD_SUVD_INT_STATUS                                                                          0x00dc +#define regUVD_SUVD_INT_STATUS_BASE_IDX                                                                 1 +#define regUVD_SUVD_INT_ACK                                                                             0x00dd +#define regUVD_SUVD_INT_ACK_BASE_IDX                                                                    1 +#define regUVD_ENC_VCPU_INT_EN                                                                          0x00de +#define regUVD_ENC_VCPU_INT_EN_BASE_IDX                                                                 1 +#define regUVD_ENC_VCPU_INT_STATUS                                                                      0x00df +#define regUVD_ENC_VCPU_INT_STATUS_BASE_IDX                                                             1 +#define regUVD_ENC_VCPU_INT_ACK                                                                         0x00e0 +#define regUVD_ENC_VCPU_INT_ACK_BASE_IDX                                                                1 +#define regUVD_MASTINT_EN                                                                               0x00e1 +#define regUVD_MASTINT_EN_BASE_IDX                                                                      1 +#define regUVD_SYS_INT_EN                                                                               0x00e2 +#define regUVD_SYS_INT_EN_BASE_IDX                                                                      1 +#define regUVD_SYS_INT_STATUS                                                                           0x00e3 +#define regUVD_SYS_INT_STATUS_BASE_IDX                                                                  1 +#define regUVD_SYS_INT_ACK                                                                              0x00e4 +#define regUVD_SYS_INT_ACK_BASE_IDX                                                                     1 +#define regUVD_JOB_DONE                                                                                 0x00e5 +#define regUVD_JOB_DONE_BASE_IDX                                                                        1 +#define regUVD_CBUF_ID                                                                                  0x00e6 +#define regUVD_CBUF_ID_BASE_IDX                                                                         1 +#define regUVD_CONTEXT_ID                                                                               0x00e7 +#define regUVD_CONTEXT_ID_BASE_IDX                                                                      1 +#define regUVD_CONTEXT_ID2                                                                              0x00e8 +#define regUVD_CONTEXT_ID2_BASE_IDX                                                                     1 +#define regUVD_NO_OP                                                                                    0x00e9 +#define regUVD_NO_OP_BASE_IDX                                                                           1 +#define regUVD_RB_BASE_LO                                                                               0x00ea +#define regUVD_RB_BASE_LO_BASE_IDX                                                                      1 +#define regUVD_RB_BASE_HI                                                                               0x00eb +#define regUVD_RB_BASE_HI_BASE_IDX                                                                      1 +#define regUVD_RB_SIZE                                                                                  0x00ec +#define regUVD_RB_SIZE_BASE_IDX                                                                         1 +#define regUVD_RB_BASE_LO2                                                                              0x00ef +#define regUVD_RB_BASE_LO2_BASE_IDX                                                                     1 +#define regUVD_RB_BASE_HI2                                                                              0x00f0 +#define regUVD_RB_BASE_HI2_BASE_IDX                                                                     1 +#define regUVD_RB_SIZE2                                                                                 0x00f1 +#define regUVD_RB_SIZE2_BASE_IDX                                                                        1 +#define regUVD_RB_BASE_LO3                                                                              0x00f4 +#define regUVD_RB_BASE_LO3_BASE_IDX                                                                     1 +#define regUVD_RB_BASE_HI3                                                                              0x00f5 +#define regUVD_RB_BASE_HI3_BASE_IDX                                                                     1 +#define regUVD_RB_SIZE3                                                                                 0x00f6 +#define regUVD_RB_SIZE3_BASE_IDX                                                                        1 +#define regUVD_RB_BASE_LO4                                                                              0x00f9 +#define regUVD_RB_BASE_LO4_BASE_IDX                                                                     1 +#define regUVD_RB_BASE_HI4                                                                              0x00fa +#define regUVD_RB_BASE_HI4_BASE_IDX                                                                     1 +#define regUVD_RB_SIZE4                                                                                 0x00fb +#define regUVD_RB_SIZE4_BASE_IDX                                                                        1 +#define regUVD_OUT_RB_BASE_LO                                                                           0x00fe +#define regUVD_OUT_RB_BASE_LO_BASE_IDX                                                                  1 +#define regUVD_OUT_RB_BASE_HI                                                                           0x00ff +#define regUVD_OUT_RB_BASE_HI_BASE_IDX                                                                  1 +#define regUVD_OUT_RB_SIZE                                                                              0x0100 +#define regUVD_OUT_RB_SIZE_BASE_IDX                                                                     1 +#define regUVD_IOV_ACTIVE_FCN_ID                                                                        0x0103 +#define regUVD_IOV_ACTIVE_FCN_ID_BASE_IDX                                                               1 +#define regUVD_IOV_MAILBOX                                                                              0x0104 +#define regUVD_IOV_MAILBOX_BASE_IDX                                                                     1 +#define regUVD_IOV_MAILBOX_RESP                                                                         0x0105 +#define regUVD_IOV_MAILBOX_RESP_BASE_IDX                                                                1 +#define regUVD_RB_ARB_CTRL                                                                              0x0106 +#define regUVD_RB_ARB_CTRL_BASE_IDX                                                                     1 +#define regUVD_CTX_INDEX                                                                                0x0107 +#define regUVD_CTX_INDEX_BASE_IDX                                                                       1 +#define regUVD_CTX_DATA                                                                                 0x0108 +#define regUVD_CTX_DATA_BASE_IDX                                                                        1 +#define regUVD_CXW_WR                                                                                   0x0109 +#define regUVD_CXW_WR_BASE_IDX                                                                          1 +#define regUVD_CXW_WR_INT_ID                                                                            0x010a +#define regUVD_CXW_WR_INT_ID_BASE_IDX                                                                   1 +#define regUVD_CXW_WR_INT_CTX_ID                                                                        0x010b +#define regUVD_CXW_WR_INT_CTX_ID_BASE_IDX                                                               1 +#define regUVD_CXW_INT_ID                                                                               0x010c +#define regUVD_CXW_INT_ID_BASE_IDX                                                                      1 +#define regUVD_MPEG2_ERROR                                                                              0x010d +#define regUVD_MPEG2_ERROR_BASE_IDX                                                                     1 +#define regUVD_YBASE                                                                                    0x0110 +#define regUVD_YBASE_BASE_IDX                                                                           1 +#define regUVD_UVBASE                                                                                   0x0111 +#define regUVD_UVBASE_BASE_IDX                                                                          1 +#define regUVD_PITCH                                                                                    0x0112 +#define regUVD_PITCH_BASE_IDX                                                                           1 +#define regUVD_WIDTH                                                                                    0x0113 +#define regUVD_WIDTH_BASE_IDX                                                                           1 +#define regUVD_HEIGHT                                                                                   0x0114 +#define regUVD_HEIGHT_BASE_IDX                                                                          1 +#define regUVD_PICCOUNT                                                                                 0x0115 +#define regUVD_PICCOUNT_BASE_IDX                                                                        1 +#define regUVD_MPRD_INITIAL_XY                                                                          0x0116 +#define regUVD_MPRD_INITIAL_XY_BASE_IDX                                                                 1 +#define regUVD_MPEG2_CTRL                                                                               0x0117 +#define regUVD_MPEG2_CTRL_BASE_IDX                                                                      1 +#define regUVD_MB_CTL_BUF_BASE                                                                          0x0118 +#define regUVD_MB_CTL_BUF_BASE_BASE_IDX                                                                 1 +#define regUVD_PIC_CTL_BUF_BASE                                                                         0x0119 +#define regUVD_PIC_CTL_BUF_BASE_BASE_IDX                                                                1 +#define regUVD_DXVA_BUF_SIZE                                                                            0x011a +#define regUVD_DXVA_BUF_SIZE_BASE_IDX                                                                   1 +#define regUVD_SCRATCH_NP                                                                               0x011b +#define regUVD_SCRATCH_NP_BASE_IDX                                                                      1 +#define regUVD_CLK_SWT_HANDSHAKE                                                                        0x011c +#define regUVD_CLK_SWT_HANDSHAKE_BASE_IDX                                                               1 +#define regUVD_GP_SCRATCH0                                                                              0x011e +#define regUVD_GP_SCRATCH0_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH1                                                                              0x011f +#define regUVD_GP_SCRATCH1_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH2                                                                              0x0120 +#define regUVD_GP_SCRATCH2_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH3                                                                              0x0121 +#define regUVD_GP_SCRATCH3_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH4                                                                              0x0122 +#define regUVD_GP_SCRATCH4_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH5                                                                              0x0123 +#define regUVD_GP_SCRATCH5_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH6                                                                              0x0124 +#define regUVD_GP_SCRATCH6_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH7                                                                              0x0125 +#define regUVD_GP_SCRATCH7_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH8                                                                              0x0126 +#define regUVD_GP_SCRATCH8_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH9                                                                              0x0127 +#define regUVD_GP_SCRATCH9_BASE_IDX                                                                     1 +#define regUVD_GP_SCRATCH10                                                                             0x0128 +#define regUVD_GP_SCRATCH10_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH11                                                                             0x0129 +#define regUVD_GP_SCRATCH11_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH12                                                                             0x012a +#define regUVD_GP_SCRATCH12_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH13                                                                             0x012b +#define regUVD_GP_SCRATCH13_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH14                                                                             0x012c +#define regUVD_GP_SCRATCH14_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH15                                                                             0x012d +#define regUVD_GP_SCRATCH15_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH16                                                                             0x012e +#define regUVD_GP_SCRATCH16_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH17                                                                             0x012f +#define regUVD_GP_SCRATCH17_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH18                                                                             0x0130 +#define regUVD_GP_SCRATCH18_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH19                                                                             0x0131 +#define regUVD_GP_SCRATCH19_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH20                                                                             0x0132 +#define regUVD_GP_SCRATCH20_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH21                                                                             0x0133 +#define regUVD_GP_SCRATCH21_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH22                                                                             0x0134 +#define regUVD_GP_SCRATCH22_BASE_IDX                                                                    1 +#define regUVD_GP_SCRATCH23                                                                             0x0135 +#define regUVD_GP_SCRATCH23_BASE_IDX                                                                    1 +#define regUVD_AUDIO_RB_BASE_LO                                                                         0x0136 +#define regUVD_AUDIO_RB_BASE_LO_BASE_IDX                                                                1 +#define regUVD_AUDIO_RB_BASE_HI                                                                         0x0137 +#define regUVD_AUDIO_RB_BASE_HI_BASE_IDX                                                                1 +#define regUVD_AUDIO_RB_SIZE                                                                            0x0138 +#define regUVD_AUDIO_RB_SIZE_BASE_IDX                                                                   1 +#define regUVD_VCPU_INT_STATUS2                                                                         0x013b +#define regUVD_VCPU_INT_STATUS2_BASE_IDX                                                                1 +#define regUVD_VCPU_INT_ACK2                                                                            0x013c +#define regUVD_VCPU_INT_ACK2_BASE_IDX                                                                   1 +#define regUVD_VCPU_INT_EN2                                                                             0x013d +#define regUVD_VCPU_INT_EN2_BASE_IDX                                                                    1 +#define regUVD_SUVD_CGC_STATUS2                                                                         0x013e +#define regUVD_SUVD_CGC_STATUS2_BASE_IDX                                                                1 +#define regUVD_SUVD_INT_STATUS2                                                                         0x0140 +#define regUVD_SUVD_INT_STATUS2_BASE_IDX                                                                1 +#define regUVD_SUVD_INT_EN2                                                                             0x0141 +#define regUVD_SUVD_INT_EN2_BASE_IDX                                                                    1 +#define regUVD_SUVD_INT_ACK2                                                                            0x0142 +#define regUVD_SUVD_INT_ACK2_BASE_IDX                                                                   1 +#define regUVD_STATUS                                                                                   0x0143 +#define regUVD_STATUS_BASE_IDX                                                                          1 +#define regUVD_ENC_PIPE_BUSY                                                                            0x0144 +#define regUVD_ENC_PIPE_BUSY_BASE_IDX                                                                   1 +#define regUVD_FW_POWER_STATUS                                                                          0x0145 +#define regUVD_FW_POWER_STATUS_BASE_IDX                                                                 1 +#define regUVD_CNTL                                                                                     0x0146 +#define regUVD_CNTL_BASE_IDX                                                                            1 +#define regUVD_SOFT_RESET                                                                               0x0147 +#define regUVD_SOFT_RESET_BASE_IDX                                                                      1 +#define regUVD_SOFT_RESET2                                                                              0x0148 +#define regUVD_SOFT_RESET2_BASE_IDX                                                                     1 +#define regUVD_MMSCH_SOFT_RESET                                                                         0x0149 +#define regUVD_MMSCH_SOFT_RESET_BASE_IDX                                                                1 +#define regUVD_WIG_CTRL                                                                                 0x014a +#define regUVD_WIG_CTRL_BASE_IDX                                                                        1 +#define regUVD_CGC_STATUS                                                                               0x014c +#define regUVD_CGC_STATUS_BASE_IDX                                                                      1 +#define regUVD_CGC_UDEC_STATUS                                                                          0x014e +#define regUVD_CGC_UDEC_STATUS_BASE_IDX                                                                 1 +#define regUVD_SUVD_CGC_STATUS                                                                          0x0150 +#define regUVD_SUVD_CGC_STATUS_BASE_IDX                                                                 1 +#define regUVD_GPCOM_VCPU_CMD                                                                           0x0152 +#define regUVD_GPCOM_VCPU_CMD_BASE_IDX                                                                  1 + + +// addressBlock: aid_uvd0_ecpudec +// base address: 0x1fe00 +#define regUVD_VCPU_CACHE_OFFSET0                                                                       0x0180 +#define regUVD_VCPU_CACHE_OFFSET0_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE0                                                                         0x0181 +#define regUVD_VCPU_CACHE_SIZE0_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET1                                                                       0x0182 +#define regUVD_VCPU_CACHE_OFFSET1_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE1                                                                         0x0183 +#define regUVD_VCPU_CACHE_SIZE1_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET2                                                                       0x0184 +#define regUVD_VCPU_CACHE_OFFSET2_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE2                                                                         0x0185 +#define regUVD_VCPU_CACHE_SIZE2_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET3                                                                       0x0186 +#define regUVD_VCPU_CACHE_OFFSET3_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE3                                                                         0x0187 +#define regUVD_VCPU_CACHE_SIZE3_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET4                                                                       0x0188 +#define regUVD_VCPU_CACHE_OFFSET4_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE4                                                                         0x0189 +#define regUVD_VCPU_CACHE_SIZE4_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET5                                                                       0x018a +#define regUVD_VCPU_CACHE_OFFSET5_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE5                                                                         0x018b +#define regUVD_VCPU_CACHE_SIZE5_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET6                                                                       0x018c +#define regUVD_VCPU_CACHE_OFFSET6_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE6                                                                         0x018d +#define regUVD_VCPU_CACHE_SIZE6_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET7                                                                       0x018e +#define regUVD_VCPU_CACHE_OFFSET7_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE7                                                                         0x018f +#define regUVD_VCPU_CACHE_SIZE7_BASE_IDX                                                                1 +#define regUVD_VCPU_CACHE_OFFSET8                                                                       0x0190 +#define regUVD_VCPU_CACHE_OFFSET8_BASE_IDX                                                              1 +#define regUVD_VCPU_CACHE_SIZE8                                                                         0x0191 +#define regUVD_VCPU_CACHE_SIZE8_BASE_IDX                                                                1 +#define regUVD_VCPU_NONCACHE_OFFSET0                                                                    0x0192 +#define regUVD_VCPU_NONCACHE_OFFSET0_BASE_IDX                                                           1 +#define regUVD_VCPU_NONCACHE_SIZE0                                                                      0x0193 +#define regUVD_VCPU_NONCACHE_SIZE0_BASE_IDX                                                             1 +#define regUVD_VCPU_NONCACHE_OFFSET1                                                                    0x0194 +#define regUVD_VCPU_NONCACHE_OFFSET1_BASE_IDX                                                           1 +#define regUVD_VCPU_NONCACHE_SIZE1                                                                      0x0195 +#define regUVD_VCPU_NONCACHE_SIZE1_BASE_IDX                                                             1 +#define regUVD_VCPU_CNTL                                                                                0x0196 +#define regUVD_VCPU_CNTL_BASE_IDX                                                                       1 +#define regUVD_VCPU_PRID                                                                                0x0197 +#define regUVD_VCPU_PRID_BASE_IDX                                                                       1 +#define regUVD_VCPU_TRCE                                                                                0x0198 +#define regUVD_VCPU_TRCE_BASE_IDX                                                                       1 +#define regUVD_VCPU_TRCE_RD                                                                             0x0199 +#define regUVD_VCPU_TRCE_RD_BASE_IDX                                                                    1 +#define regUVD_VCPU_IND_INDEX                                                                           0x019b +#define regUVD_VCPU_IND_INDEX_BASE_IDX                                                                  1 +#define regUVD_VCPU_IND_DATA                                                                            0x019c +#define regUVD_VCPU_IND_DATA_BASE_IDX                                                                   1 + + +// addressBlock: aid_uvd0_uvd_mpcdec +// base address: 0x1ff30 +#define regUVD_MP_SWAP_CNTL                                                                             0x01cc +#define regUVD_MP_SWAP_CNTL_BASE_IDX                                                                    1 +#define regUVD_MP_SWAP_CNTL2                                                                            0x01cd +#define regUVD_MP_SWAP_CNTL2_BASE_IDX                                                                   1 +#define regUVD_MPC_LUMA_SRCH                                                                            0x01ce +#define regUVD_MPC_LUMA_SRCH_BASE_IDX                                                                   1 +#define regUVD_MPC_LUMA_HIT                                                                             0x01cf +#define regUVD_MPC_LUMA_HIT_BASE_IDX                                                                    1 +#define regUVD_MPC_LUMA_HITPEND                                                                         0x01d0 +#define regUVD_MPC_LUMA_HITPEND_BASE_IDX                                                                1 +#define regUVD_MPC_CHROMA_SRCH                                                                          0x01d1 +#define regUVD_MPC_CHROMA_SRCH_BASE_IDX                                                                 1 +#define regUVD_MPC_CHROMA_HIT                                                                           0x01d2 +#define regUVD_MPC_CHROMA_HIT_BASE_IDX                                                                  1 +#define regUVD_MPC_CHROMA_HITPEND                                                                       0x01d3 +#define regUVD_MPC_CHROMA_HITPEND_BASE_IDX                                                              1 +#define regUVD_MPC_CNTL                                                                                 0x01d4 +#define regUVD_MPC_CNTL_BASE_IDX                                                                        1 +#define regUVD_MPC_PITCH                                                                                0x01d5 +#define regUVD_MPC_PITCH_BASE_IDX                                                                       1 +#define regUVD_MPC_SET_MUXA0                                                                            0x01d6 +#define regUVD_MPC_SET_MUXA0_BASE_IDX                                                                   1 +#define regUVD_MPC_SET_MUXA1                                                                            0x01d7 +#define regUVD_MPC_SET_MUXA1_BASE_IDX                                                                   1 +#define regUVD_MPC_SET_MUXB0                                                                            0x01d8 +#define regUVD_MPC_SET_MUXB0_BASE_IDX                                                                   1 +#define regUVD_MPC_SET_MUXB1                                                                            0x01d9 +#define regUVD_MPC_SET_MUXB1_BASE_IDX                                                                   1 +#define regUVD_MPC_SET_MUX                                                                              0x01da +#define regUVD_MPC_SET_MUX_BASE_IDX                                                                     1 +#define regUVD_MPC_SET_ALU                                                                              0x01db +#define regUVD_MPC_SET_ALU_BASE_IDX                                                                     1 +#define regUVD_MPC_PERF0                                                                                0x01dc +#define regUVD_MPC_PERF0_BASE_IDX                                                                       1 +#define regUVD_MPC_PERF1                                                                                0x01dd +#define regUVD_MPC_PERF1_BASE_IDX                                                                       1 +#define regUVD_MPC_IND_INDEX                                                                            0x01de +#define regUVD_MPC_IND_INDEX_BASE_IDX                                                                   1 +#define regUVD_MPC_IND_DATA                                                                             0x01df +#define regUVD_MPC_IND_DATA_BASE_IDX                                                                    1 + + +// addressBlock: aid_uvd0_uvd_rbcdec +// base address: 0x1ff90 +#define regUVD_RBC_IB_SIZE                                                                              0x01e4 +#define regUVD_RBC_IB_SIZE_BASE_IDX                                                                     1 +#define regUVD_RBC_IB_SIZE_UPDATE                                                                       0x01e5 +#define regUVD_RBC_IB_SIZE_UPDATE_BASE_IDX                                                              1 +#define regUVD_RBC_RB_CNTL                                                                              0x01e6 +#define regUVD_RBC_RB_CNTL_BASE_IDX                                                                     1 +#define regUVD_RBC_RB_RPTR_ADDR                                                                         0x01e7 +#define regUVD_RBC_RB_RPTR_ADDR_BASE_IDX                                                                1 +#define regUVD_RBC_VCPU_ACCESS                                                                          0x01ea +#define regUVD_RBC_VCPU_ACCESS_BASE_IDX                                                                 1 +#define regUVD_FW_SEMAPHORE_CNTL                                                                        0x01eb +#define regUVD_FW_SEMAPHORE_CNTL_BASE_IDX                                                               1 +#define regUVD_RBC_READ_REQ_URGENT_CNTL                                                                 0x01ed +#define regUVD_RBC_READ_REQ_URGENT_CNTL_BASE_IDX                                                        1 +#define regUVD_RBC_RB_WPTR_CNTL                                                                         0x01ee +#define regUVD_RBC_RB_WPTR_CNTL_BASE_IDX                                                                1 +#define regUVD_RBC_WPTR_STATUS                                                                          0x01ef +#define regUVD_RBC_WPTR_STATUS_BASE_IDX                                                                 1 +#define regUVD_RBC_WPTR_POLL_CNTL                                                                       0x01f0 +#define regUVD_RBC_WPTR_POLL_CNTL_BASE_IDX                                                              1 +#define regUVD_RBC_WPTR_POLL_ADDR                                                                       0x01f1 +#define regUVD_RBC_WPTR_POLL_ADDR_BASE_IDX                                                              1 +#define regUVD_SEMA_CMD                                                                                 0x01f2 +#define regUVD_SEMA_CMD_BASE_IDX                                                                        1 +#define regUVD_SEMA_ADDR_LOW                                                                            0x01f3 +#define regUVD_SEMA_ADDR_LOW_BASE_IDX                                                                   1 +#define regUVD_SEMA_ADDR_HIGH                                                                           0x01f4 +#define regUVD_SEMA_ADDR_HIGH_BASE_IDX                                                                  1 +#define regUVD_ENGINE_CNTL                                                                              0x01f5 +#define regUVD_ENGINE_CNTL_BASE_IDX                                                                     1 +#define regUVD_SEMA_TIMEOUT_STATUS                                                                      0x01f6 +#define regUVD_SEMA_TIMEOUT_STATUS_BASE_IDX                                                             1 +#define regUVD_SEMA_CNTL                                                                                0x01f7 +#define regUVD_SEMA_CNTL_BASE_IDX                                                                       1 +#define regUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL                                                      0x01f8 +#define regUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL_BASE_IDX                                             1 +#define regUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL                                                             0x01f9 +#define regUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL_BASE_IDX                                                    1 +#define regUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL                                                        0x01fa +#define regUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL_BASE_IDX                                               1 +#define regUVD_JOB_START                                                                                0x01fb +#define regUVD_JOB_START_BASE_IDX                                                                       1 +#define regUVD_RBC_BUF_STATUS                                                                           0x01fc +#define regUVD_RBC_BUF_STATUS_BASE_IDX                                                                  1 +#define regUVD_RBC_SWAP_CNTL                                                                            0x01fd +#define regUVD_RBC_SWAP_CNTL_BASE_IDX                                                                   1 + + +// addressBlock: aid_uvd0_lmi_adpdec +// base address: 0x20090 +#define regUVD_LMI_RE_64BIT_BAR_LOW                                                                     0x0224 +#define regUVD_LMI_RE_64BIT_BAR_LOW_BASE_IDX                                                            1 +#define regUVD_LMI_RE_64BIT_BAR_HIGH                                                                    0x0225 +#define regUVD_LMI_RE_64BIT_BAR_HIGH_BASE_IDX                                                           1 +#define regUVD_LMI_IT_64BIT_BAR_LOW                                                                     0x0226 +#define regUVD_LMI_IT_64BIT_BAR_LOW_BASE_IDX                                                            1 +#define regUVD_LMI_IT_64BIT_BAR_HIGH                                                                    0x0227 +#define regUVD_LMI_IT_64BIT_BAR_HIGH_BASE_IDX                                                           1 +#define regUVD_LMI_MP_64BIT_BAR_LOW                                                                     0x0228 +#define regUVD_LMI_MP_64BIT_BAR_LOW_BASE_IDX                                                            1 +#define regUVD_LMI_MP_64BIT_BAR_HIGH                                                                    0x0229 +#define regUVD_LMI_MP_64BIT_BAR_HIGH_BASE_IDX                                                           1 +#define regUVD_LMI_CM_64BIT_BAR_LOW                                                                     0x022a +#define regUVD_LMI_CM_64BIT_BAR_LOW_BASE_IDX                                                            1 +#define regUVD_LMI_CM_64BIT_BAR_HIGH                                                                    0x022b +#define regUVD_LMI_CM_64BIT_BAR_HIGH_BASE_IDX                                                           1 +#define regUVD_LMI_DB_64BIT_BAR_LOW                                                                     0x022c +#define regUVD_LMI_DB_64BIT_BAR_LOW_BASE_IDX                                                            1 +#define regUVD_LMI_DB_64BIT_BAR_HIGH                                                                    0x022d +#define regUVD_LMI_DB_64BIT_BAR_HIGH_BASE_IDX                                                           1 +#define regUVD_LMI_DBW_64BIT_BAR_LOW                                                                    0x022e +#define regUVD_LMI_DBW_64BIT_BAR_LOW_BASE_IDX                                                           1 +#define regUVD_LMI_DBW_64BIT_BAR_HIGH                                                                   0x022f +#define regUVD_LMI_DBW_64BIT_BAR_HIGH_BASE_IDX                                                          1 +#define regUVD_LMI_IDCT_64BIT_BAR_LOW                                                                   0x0230 +#define regUVD_LMI_IDCT_64BIT_BAR_LOW_BASE_IDX                                                          1 +#define regUVD_LMI_IDCT_64BIT_BAR_HIGH                                                                  0x0231 +#define regUVD_LMI_IDCT_64BIT_BAR_HIGH_BASE_IDX                                                         1 +#define regUVD_LMI_MPRD_S0_64BIT_BAR_LOW                                                                0x0232 +#define regUVD_LMI_MPRD_S0_64BIT_BAR_LOW_BASE_IDX                                                       1 +#define regUVD_LMI_MPRD_S0_64BIT_BAR_HIGH                                                               0x0233 +#define regUVD_LMI_MPRD_S0_64BIT_BAR_HIGH_BASE_IDX                                                      1 +#define regUVD_LMI_MPRD_S1_64BIT_BAR_LOW                                                                0x0234 +#define regUVD_LMI_MPRD_S1_64BIT_BAR_LOW_BASE_IDX                                                       1 +#define regUVD_LMI_MPRD_S1_64BIT_BAR_HIGH                                                               0x0235 +#define regUVD_LMI_MPRD_S1_64BIT_BAR_HIGH_BASE_IDX                                                      1 +#define regUVD_LMI_MPRD_DBW_64BIT_BAR_LOW                                                               0x0236 +#define regUVD_LMI_MPRD_DBW_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MPRD_DBW_64BIT_BAR_HIGH                                                              0x0237 +#define regUVD_LMI_MPRD_DBW_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MPC_64BIT_BAR_LOW                                                                    0x0238 +#define regUVD_LMI_MPC_64BIT_BAR_LOW_BASE_IDX                                                           1 +#define regUVD_LMI_MPC_64BIT_BAR_HIGH                                                                   0x0239 +#define regUVD_LMI_MPC_64BIT_BAR_HIGH_BASE_IDX                                                          1 +#define regUVD_LMI_RBC_RB_64BIT_BAR_LOW                                                                 0x023a +#define regUVD_LMI_RBC_RB_64BIT_BAR_LOW_BASE_IDX                                                        1 +#define regUVD_LMI_RBC_RB_64BIT_BAR_HIGH                                                                0x023b +#define regUVD_LMI_RBC_RB_64BIT_BAR_HIGH_BASE_IDX                                                       1 +#define regUVD_LMI_RBC_IB_64BIT_BAR_LOW                                                                 0x023c +#define regUVD_LMI_RBC_IB_64BIT_BAR_LOW_BASE_IDX                                                        1 +#define regUVD_LMI_RBC_IB_64BIT_BAR_HIGH                                                                0x023d +#define regUVD_LMI_RBC_IB_64BIT_BAR_HIGH_BASE_IDX                                                       1 +#define regUVD_LMI_LBSI_64BIT_BAR_LOW                                                                   0x023e +#define regUVD_LMI_LBSI_64BIT_BAR_LOW_BASE_IDX                                                          1 +#define regUVD_LMI_LBSI_64BIT_BAR_HIGH                                                                  0x023f +#define regUVD_LMI_LBSI_64BIT_BAR_HIGH_BASE_IDX                                                         1 +#define regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW                                                               0x0240 +#define regUVD_LMI_VCPU_NC0_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH                                                              0x0241 +#define regUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_VCPU_NC1_64BIT_BAR_LOW                                                               0x0242 +#define regUVD_LMI_VCPU_NC1_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_VCPU_NC1_64BIT_BAR_HIGH                                                              0x0243 +#define regUVD_LMI_VCPU_NC1_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW                                                             0x0244 +#define regUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW_BASE_IDX                                                    1 +#define regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH                                                            0x0245 +#define regUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH_BASE_IDX                                                   1 +#define regUVD_LMI_CENC_64BIT_BAR_LOW                                                                   0x0246 +#define regUVD_LMI_CENC_64BIT_BAR_LOW_BASE_IDX                                                          1 +#define regUVD_LMI_CENC_64BIT_BAR_HIGH                                                                  0x0247 +#define regUVD_LMI_CENC_64BIT_BAR_HIGH_BASE_IDX                                                         1 +#define regUVD_LMI_SRE_64BIT_BAR_LOW                                                                    0x0248 +#define regUVD_LMI_SRE_64BIT_BAR_LOW_BASE_IDX                                                           1 +#define regUVD_LMI_SRE_64BIT_BAR_HIGH                                                                   0x0249 +#define regUVD_LMI_SRE_64BIT_BAR_HIGH_BASE_IDX                                                          1 +#define regUVD_LMI_MIF_GPGPU_64BIT_BAR_LOW                                                              0x024a +#define regUVD_LMI_MIF_GPGPU_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_GPGPU_64BIT_BAR_HIGH                                                             0x024b +#define regUVD_LMI_MIF_GPGPU_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MIF_CURR_LUMA_64BIT_BAR_LOW                                                          0x024c +#define regUVD_LMI_MIF_CURR_LUMA_64BIT_BAR_LOW_BASE_IDX                                                 1 +#define regUVD_LMI_MIF_CURR_LUMA_64BIT_BAR_HIGH                                                         0x024d +#define regUVD_LMI_MIF_CURR_LUMA_64BIT_BAR_HIGH_BASE_IDX                                                1 +#define regUVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_LOW                                                        0x024e +#define regUVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_LOW_BASE_IDX                                               1 +#define regUVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_HIGH                                                       0x024f +#define regUVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_HIGH_BASE_IDX                                              1 +#define regUVD_LMI_MIF_REF_64BIT_BAR_LOW                                                                0x0250 +#define regUVD_LMI_MIF_REF_64BIT_BAR_LOW_BASE_IDX                                                       1 +#define regUVD_LMI_MIF_REF_64BIT_BAR_HIGH                                                               0x0251 +#define regUVD_LMI_MIF_REF_64BIT_BAR_HIGH_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_DBW_64BIT_BAR_LOW                                                                0x0252 +#define regUVD_LMI_MIF_DBW_64BIT_BAR_LOW_BASE_IDX                                                       1 +#define regUVD_LMI_MIF_DBW_64BIT_BAR_HIGH                                                               0x0253 +#define regUVD_LMI_MIF_DBW_64BIT_BAR_HIGH_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_CM_COLOC_64BIT_BAR_LOW                                                           0x0254 +#define regUVD_LMI_MIF_CM_COLOC_64BIT_BAR_LOW_BASE_IDX                                                  1 +#define regUVD_LMI_MIF_CM_COLOC_64BIT_BAR_HIGH                                                          0x0255 +#define regUVD_LMI_MIF_CM_COLOC_64BIT_BAR_HIGH_BASE_IDX                                                 1 +#define regUVD_LMI_MIF_BSP0_64BIT_BAR_LOW                                                               0x0256 +#define regUVD_LMI_MIF_BSP0_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSP0_64BIT_BAR_HIGH                                                              0x0257 +#define regUVD_LMI_MIF_BSP0_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSP1_64BIT_BAR_LOW                                                               0x0258 +#define regUVD_LMI_MIF_BSP1_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSP1_64BIT_BAR_HIGH                                                              0x0259 +#define regUVD_LMI_MIF_BSP1_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSP2_64BIT_BAR_LOW                                                               0x025a +#define regUVD_LMI_MIF_BSP2_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSP2_64BIT_BAR_HIGH                                                              0x025b +#define regUVD_LMI_MIF_BSP2_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSP3_64BIT_BAR_LOW                                                               0x025c +#define regUVD_LMI_MIF_BSP3_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSP3_64BIT_BAR_HIGH                                                              0x025d +#define regUVD_LMI_MIF_BSP3_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSD0_64BIT_BAR_LOW                                                               0x025e +#define regUVD_LMI_MIF_BSD0_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSD0_64BIT_BAR_HIGH                                                              0x025f +#define regUVD_LMI_MIF_BSD0_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSD1_64BIT_BAR_LOW                                                               0x0260 +#define regUVD_LMI_MIF_BSD1_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSD1_64BIT_BAR_HIGH                                                              0x0261 +#define regUVD_LMI_MIF_BSD1_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSD2_64BIT_BAR_LOW                                                               0x0262 +#define regUVD_LMI_MIF_BSD2_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSD2_64BIT_BAR_HIGH                                                              0x0263 +#define regUVD_LMI_MIF_BSD2_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSD3_64BIT_BAR_LOW                                                               0x0264 +#define regUVD_LMI_MIF_BSD3_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSD3_64BIT_BAR_HIGH                                                              0x0265 +#define regUVD_LMI_MIF_BSD3_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_BSD4_64BIT_BAR_LOW                                                               0x0266 +#define regUVD_LMI_MIF_BSD4_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_BSD4_64BIT_BAR_HIGH                                                              0x0267 +#define regUVD_LMI_MIF_BSD4_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW                                                            0x0270 +#define regUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH                                                           0x0271 +#define regUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE8_64BIT_BAR_LOW                                                            0x0272 +#define regUVD_LMI_VCPU_CACHE8_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE8_64BIT_BAR_HIGH                                                           0x0273 +#define regUVD_LMI_VCPU_CACHE8_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW                                                            0x0274 +#define regUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH                                                           0x0275 +#define regUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE3_64BIT_BAR_LOW                                                            0x0276 +#define regUVD_LMI_VCPU_CACHE3_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE3_64BIT_BAR_HIGH                                                           0x0277 +#define regUVD_LMI_VCPU_CACHE3_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE4_64BIT_BAR_LOW                                                            0x0278 +#define regUVD_LMI_VCPU_CACHE4_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE4_64BIT_BAR_HIGH                                                           0x0279 +#define regUVD_LMI_VCPU_CACHE4_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE5_64BIT_BAR_LOW                                                            0x027a +#define regUVD_LMI_VCPU_CACHE5_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE5_64BIT_BAR_HIGH                                                           0x027b +#define regUVD_LMI_VCPU_CACHE5_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE6_64BIT_BAR_LOW                                                            0x027c +#define regUVD_LMI_VCPU_CACHE6_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE6_64BIT_BAR_HIGH                                                           0x027d +#define regUVD_LMI_VCPU_CACHE6_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_VCPU_CACHE7_64BIT_BAR_LOW                                                            0x027e +#define regUVD_LMI_VCPU_CACHE7_64BIT_BAR_LOW_BASE_IDX                                                   1 +#define regUVD_LMI_VCPU_CACHE7_64BIT_BAR_HIGH                                                           0x027f +#define regUVD_LMI_VCPU_CACHE7_64BIT_BAR_HIGH_BASE_IDX                                                  1 +#define regUVD_LMI_MIF_SCLR_64BIT_BAR_LOW                                                               0x0280 +#define regUVD_LMI_MIF_SCLR_64BIT_BAR_LOW_BASE_IDX                                                      1 +#define regUVD_LMI_MIF_SCLR_64BIT_BAR_HIGH                                                              0x0281 +#define regUVD_LMI_MIF_SCLR_64BIT_BAR_HIGH_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_SCLR2_64BIT_BAR_LOW                                                              0x0282 +#define regUVD_LMI_MIF_SCLR2_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MIF_SCLR2_64BIT_BAR_HIGH                                                             0x0283 +#define regUVD_LMI_MIF_SCLR2_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_SPH_64BIT_BAR_HIGH                                                                   0x0284 +#define regUVD_LMI_SPH_64BIT_BAR_HIGH_BASE_IDX                                                          1 +#define regUVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_LOW                                                    0x0298 +#define regUVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_LOW_BASE_IDX                                           1 +#define regUVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_HIGH                                                   0x0299 +#define regUVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_HIGH_BASE_IDX                                          1 +#define regUVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_LOW                                                  0x029a +#define regUVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_LOW_BASE_IDX                                         1 +#define regUVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_HIGH                                                 0x029b +#define regUVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_HIGH_BASE_IDX                                        1 +#define regUVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_LOW                                                       0x029c +#define regUVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_LOW_BASE_IDX                                              1 +#define regUVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_HIGH                                                      0x029d +#define regUVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_HIGH_BASE_IDX                                             1 +#define regUVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_LOW                                                     0x029e +#define regUVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_LOW_BASE_IDX                                            1 +#define regUVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_HIGH                                                    0x029f +#define regUVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_HIGH_BASE_IDX                                           1 +#define regUVD_ADP_ATOMIC_CONFIG                                                                        0x02a1 +#define regUVD_ADP_ATOMIC_CONFIG_BASE_IDX                                                               1 +#define regUVD_LMI_ARB_CTRL2                                                                            0x02a2 +#define regUVD_LMI_ARB_CTRL2_BASE_IDX                                                                   1 +#define regUVD_LMI_VCPU_CACHE_VMIDS_MULTI                                                               0x02a7 +#define regUVD_LMI_VCPU_CACHE_VMIDS_MULTI_BASE_IDX                                                      1 +#define regUVD_LMI_VCPU_NC_VMIDS_MULTI                                                                  0x02a8 +#define regUVD_LMI_VCPU_NC_VMIDS_MULTI_BASE_IDX                                                         1 +#define regUVD_LMI_LAT_CTRL                                                                             0x02a9 +#define regUVD_LMI_LAT_CTRL_BASE_IDX                                                                    1 +#define regUVD_LMI_LAT_CNTR                                                                             0x02aa +#define regUVD_LMI_LAT_CNTR_BASE_IDX                                                                    1 +#define regUVD_LMI_AVG_LAT_CNTR                                                                         0x02ab +#define regUVD_LMI_AVG_LAT_CNTR_BASE_IDX                                                                1 +#define regUVD_LMI_SPH                                                                                  0x02ac +#define regUVD_LMI_SPH_BASE_IDX                                                                         1 +#define regUVD_LMI_VCPU_CACHE_VMID                                                                      0x02ad +#define regUVD_LMI_VCPU_CACHE_VMID_BASE_IDX                                                             1 +#define regUVD_LMI_CTRL2                                                                                0x02ae +#define regUVD_LMI_CTRL2_BASE_IDX                                                                       1 +#define regUVD_LMI_URGENT_CTRL                                                                          0x02af +#define regUVD_LMI_URGENT_CTRL_BASE_IDX                                                                 1 +#define regUVD_LMI_CTRL                                                                                 0x02b0 +#define regUVD_LMI_CTRL_BASE_IDX                                                                        1 +#define regUVD_LMI_STATUS                                                                               0x02b1 +#define regUVD_LMI_STATUS_BASE_IDX                                                                      1 +#define regUVD_LMI_PERFMON_CTRL                                                                         0x02b4 +#define regUVD_LMI_PERFMON_CTRL_BASE_IDX                                                                1 +#define regUVD_LMI_PERFMON_COUNT_LO                                                                     0x02b5 +#define regUVD_LMI_PERFMON_COUNT_LO_BASE_IDX                                                            1 +#define regUVD_LMI_PERFMON_COUNT_HI                                                                     0x02b6 +#define regUVD_LMI_PERFMON_COUNT_HI_BASE_IDX                                                            1 +#define regUVD_LMI_ADP_SWAP_CNTL                                                                        0x02b7 +#define regUVD_LMI_ADP_SWAP_CNTL_BASE_IDX                                                               1 +#define regUVD_LMI_RBC_RB_VMID                                                                          0x02b8 +#define regUVD_LMI_RBC_RB_VMID_BASE_IDX                                                                 1 +#define regUVD_LMI_RBC_IB_VMID                                                                          0x02b9 +#define regUVD_LMI_RBC_IB_VMID_BASE_IDX                                                                 1 +#define regUVD_LMI_MC_CREDITS                                                                           0x02ba +#define regUVD_LMI_MC_CREDITS_BASE_IDX                                                                  1 +#define regUVD_LMI_ADP_IND_INDEX                                                                        0x02be +#define regUVD_LMI_ADP_IND_INDEX_BASE_IDX                                                               1 +#define regUVD_LMI_ADP_IND_DATA                                                                         0x02bf +#define regUVD_LMI_ADP_IND_DATA_BASE_IDX                                                                1 +#define regUVD_LMI_ADP_PF_EN                                                                            0x02c0 +#define regUVD_LMI_ADP_PF_EN_BASE_IDX                                                                   1 +#define regUVD_LMI_PREF_CTRL                                                                            0x02c2 +#define regUVD_LMI_PREF_CTRL_BASE_IDX                                                                   1 +#define regUVD_LMI_MIF_REF_LUMA_64BIT_BAR_LOW                                                           0x02dd +#define regUVD_LMI_MIF_REF_LUMA_64BIT_BAR_LOW_BASE_IDX                                                  1 +#define regUVD_LMI_MIF_REF_LUMA_64BIT_BAR_HIGH                                                          0x02de +#define regUVD_LMI_MIF_REF_LUMA_64BIT_BAR_HIGH_BASE_IDX                                                 1 +#define regVCN_RAS_CNTL                                                                                 0x02df +#define regVCN_RAS_CNTL_BASE_IDX                                                                        1 + + +// addressBlock: aid_uvd0_uvd_jpeg0_jpegnpdec +// base address: 0x20f00 +#define regUVD_JPEG_CNTL                                                                                0x05c0 +#define regUVD_JPEG_CNTL_BASE_IDX                                                                       1 +#define regUVD_JPEG_RB_BASE                                                                             0x05c1 +#define regUVD_JPEG_RB_BASE_BASE_IDX                                                                    1 +#define regUVD_JPEG_RB_WPTR                                                                             0x05c2 +#define regUVD_JPEG_RB_WPTR_BASE_IDX                                                                    1 +#define regUVD_JPEG_RB_RPTR                                                                             0x05c3 +#define regUVD_JPEG_RB_RPTR_BASE_IDX                                                                    1 +#define regUVD_JPEG_RB_SIZE                                                                             0x05c4 +#define regUVD_JPEG_RB_SIZE_BASE_IDX                                                                    1 +#define regUVD_JPEG_DEC_CNT                                                                             0x05c5 +#define regUVD_JPEG_DEC_CNT_BASE_IDX                                                                    1 +#define regUVD_JPEG_SPS_INFO                                                                            0x05c6 +#define regUVD_JPEG_SPS_INFO_BASE_IDX                                                                   1 +#define regUVD_JPEG_SPS1_INFO                                                                           0x05c7 +#define regUVD_JPEG_SPS1_INFO_BASE_IDX                                                                  1 +#define regUVD_JPEG_RE_TIMER                                                                            0x05c8 +#define regUVD_JPEG_RE_TIMER_BASE_IDX                                                                   1 +#define regUVD_JPEG_DEC_SCRATCH0                                                                        0x05c9 +#define regUVD_JPEG_DEC_SCRATCH0_BASE_IDX                                                               1 +#define regUVD_JPEG_INT_EN                                                                              0x05ca +#define regUVD_JPEG_INT_EN_BASE_IDX                                                                     1 +#define regUVD_JPEG_INT_STAT                                                                            0x05cb +#define regUVD_JPEG_INT_STAT_BASE_IDX                                                                   1 +#define regUVD_JPEG_TIER_CNTL0                                                                          0x05cc +#define regUVD_JPEG_TIER_CNTL0_BASE_IDX                                                                 1 +#define regUVD_JPEG_TIER_CNTL1                                                                          0x05cd +#define regUVD_JPEG_TIER_CNTL1_BASE_IDX                                                                 1 +#define regUVD_JPEG_TIER_CNTL2                                                                          0x05ce +#define regUVD_JPEG_TIER_CNTL2_BASE_IDX                                                                 1 +#define regUVD_JPEG_TIER_STATUS                                                                         0x05cf +#define regUVD_JPEG_TIER_STATUS_BASE_IDX                                                                1 + + +// addressBlock: aid_uvd0_uvd_jpeg_sclk0_jpegnpsclkdec +// base address: 0x21000 +#define regUVD_JPEG_OUTBUF_CNTL                                                                         0x0600 +#define regUVD_JPEG_OUTBUF_CNTL_BASE_IDX                                                                1 +#define regUVD_JPEG_OUTBUF_WPTR                                                                         0x0601 +#define regUVD_JPEG_OUTBUF_WPTR_BASE_IDX                                                                1 +#define regUVD_JPEG_OUTBUF_RPTR                                                                         0x0602 +#define regUVD_JPEG_OUTBUF_RPTR_BASE_IDX                                                                1 +#define regUVD_JPEG_PITCH                                                                               0x0603 +#define regUVD_JPEG_PITCH_BASE_IDX                                                                      1 +#define regUVD_JPEG_UV_PITCH                                                                            0x0604 +#define regUVD_JPEG_UV_PITCH_BASE_IDX                                                                   1 +#define regJPEG_DEC_Y_GFX8_TILING_SURFACE                                                               0x0605 +#define regJPEG_DEC_Y_GFX8_TILING_SURFACE_BASE_IDX                                                      1 +#define regJPEG_DEC_UV_GFX8_TILING_SURFACE                                                              0x0606 +#define regJPEG_DEC_UV_GFX8_TILING_SURFACE_BASE_IDX                                                     1 +#define regJPEG_DEC_GFX8_ADDR_CONFIG                                                                    0x0607 +#define regJPEG_DEC_GFX8_ADDR_CONFIG_BASE_IDX                                                           1 +#define regJPEG_DEC_Y_GFX10_TILING_SURFACE                                                              0x0608 +#define regJPEG_DEC_Y_GFX10_TILING_SURFACE_BASE_IDX                                                     1 +#define regJPEG_DEC_UV_GFX10_TILING_SURFACE                                                             0x0609 +#define regJPEG_DEC_UV_GFX10_TILING_SURFACE_BASE_IDX                                                    1 +#define regJPEG_DEC_GFX10_ADDR_CONFIG                                                                   0x060a +#define regJPEG_DEC_GFX10_ADDR_CONFIG_BASE_IDX                                                          1 +#define regJPEG_DEC_ADDR_MODE                                                                           0x060b +#define regJPEG_DEC_ADDR_MODE_BASE_IDX                                                                  1 +#define regUVD_JPEG_OUTPUT_XY                                                                           0x060c +#define regUVD_JPEG_OUTPUT_XY_BASE_IDX                                                                  1 +#define regUVD_JPEG_GPCOM_CMD                                                                           0x060d +#define regUVD_JPEG_GPCOM_CMD_BASE_IDX                                                                  1 +#define regUVD_JPEG_GPCOM_DATA0                                                                         0x060e +#define regUVD_JPEG_GPCOM_DATA0_BASE_IDX                                                                1 +#define regUVD_JPEG_GPCOM_DATA1                                                                         0x060f +#define regUVD_JPEG_GPCOM_DATA1_BASE_IDX                                                                1 +#define regUVD_JPEG_SCRATCH1                                                                            0x0610 +#define regUVD_JPEG_SCRATCH1_BASE_IDX                                                                   1 +#define regUVD_JPEG_DEC_SOFT_RST                                                                        0x0611 +#define regUVD_JPEG_DEC_SOFT_RST_BASE_IDX                                                               1 + + +// addressBlock: aid_uvd0_uvd_jrbc0_uvd_jrbc_dec +// base address: 0x21100 +#define regUVD_JRBC0_UVD_JRBC_RB_WPTR                                                                   0x0640 +#define regUVD_JRBC0_UVD_JRBC_RB_WPTR_BASE_IDX                                                          1 +#define regUVD_JRBC0_UVD_JRBC_RB_CNTL                                                                   0x0641 +#define regUVD_JRBC0_UVD_JRBC_RB_CNTL_BASE_IDX                                                          1 +#define regUVD_JRBC0_UVD_JRBC_IB_SIZE                                                                   0x0642 +#define regUVD_JRBC0_UVD_JRBC_IB_SIZE_BASE_IDX                                                          1 +#define regUVD_JRBC0_UVD_JRBC_URGENT_CNTL                                                               0x0643 +#define regUVD_JRBC0_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      1 +#define regUVD_JRBC0_UVD_JRBC_RB_REF_DATA                                                               0x0644 +#define regUVD_JRBC0_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      1 +#define regUVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0645 +#define regUVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 1 +#define regUVD_JRBC0_UVD_JRBC_SOFT_RESET                                                                0x0648 +#define regUVD_JRBC0_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       1 +#define regUVD_JRBC0_UVD_JRBC_STATUS                                                                    0x0649 +#define regUVD_JRBC0_UVD_JRBC_STATUS_BASE_IDX                                                           1 +#define regUVD_JRBC0_UVD_JRBC_RB_RPTR                                                                   0x064a +#define regUVD_JRBC0_UVD_JRBC_RB_RPTR_BASE_IDX                                                          1 +#define regUVD_JRBC0_UVD_JRBC_RB_BUF_STATUS                                                             0x064b +#define regUVD_JRBC0_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    1 +#define regUVD_JRBC0_UVD_JRBC_IB_BUF_STATUS                                                             0x064c +#define regUVD_JRBC0_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    1 +#define regUVD_JRBC0_UVD_JRBC_IB_SIZE_UPDATE                                                            0x064d +#define regUVD_JRBC0_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   1 +#define regUVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER                                                          0x064e +#define regUVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 1 +#define regUVD_JRBC0_UVD_JRBC_IB_REF_DATA                                                               0x064f +#define regUVD_JRBC0_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      1 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_CMD                                                               0x0650 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      1 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0651 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              1 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0652 +#define regUVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              1 +#define regUVD_JRBC0_UVD_JRBC_RB_SIZE                                                                   0x0653 +#define regUVD_JRBC0_UVD_JRBC_RB_SIZE_BASE_IDX                                                          1 +#define regUVD_JRBC0_UVD_JRBC_SCRATCH0                                                                  0x0654 +#define regUVD_JRBC0_UVD_JRBC_SCRATCH0_BASE_IDX                                                         1 + + +// addressBlock: aid_uvd0_uvd_jmi0_uvd_jmi_dec +// base address: 0x21180 +#define regUVD_JMI0_UVD_JPEG_DEC_PF_CTRL                                                                0x0660 +#define regUVD_JMI0_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       1 +#define regUVD_JMI0_UVD_LMI_JRBC_CTRL                                                                   0x0661 +#define regUVD_JMI0_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          1 +#define regUVD_JMI0_UVD_LMI_JPEG_CTRL                                                                   0x0662 +#define regUVD_JMI0_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          1 +#define regUVD_JMI0_JPEG_LMI_DROP                                                                       0x0663 +#define regUVD_JMI0_JPEG_LMI_DROP_BASE_IDX                                                              1 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_VMID                                                                0x0664 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       1 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_VMID                                                                0x0665 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       1 +#define regUVD_JMI0_UVD_LMI_JPEG_VMID                                                                   0x0666 +#define regUVD_JMI0_UVD_LMI_JPEG_VMID_BASE_IDX                                                          1 +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x0667 +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   1 +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x0668 +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  1 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x0669 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              1 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x066a +#define regUVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             1 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x066b +#define regUVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       1 +#define regUVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x066c +#define regUVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      1 +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x066d +#define regUVD_JMI0_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  1 +#define regUVD_JMI0_UVD_JMI_DEC_SWAP_CNTL                                                               0x066e +#define regUVD_JMI0_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      1 +#define regUVD_JMI0_UVD_JMI_ATOMIC_CNTL                                                                 0x066f +#define regUVD_JMI0_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        1 +#define regUVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x0670 +#define regUVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   1 +#define regUVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x0671 +#define regUVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  1 +#define regUVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x0672 +#define regUVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            1 +#define regUVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x0673 +#define regUVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           1 +#define regUVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x0674 +#define regUVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           1 +#define regUVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x0675 +#define regUVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          1 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x0676 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              1 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x0677 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             1 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x0678 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       1 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x0679 +#define regUVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      1 +#define regUVD_JMI0_UVD_JMI_ATOMIC_CNTL2                                                                0x067d +#define regUVD_JMI0_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       1 + + +// addressBlock: aid_uvd0_uvd_jmi_common_dec +// base address: 0x21300 +#define regUVD_JADP_MCIF_URGENT_CTRL                                                                    0x06c1 +#define regUVD_JADP_MCIF_URGENT_CTRL_BASE_IDX                                                           1 +#define regUVD_JMI_URGENT_CTRL                                                                          0x06c2 +#define regUVD_JMI_URGENT_CTRL_BASE_IDX                                                                 1 +#define regUVD_JMI_CTRL                                                                                 0x06c3 +#define regUVD_JMI_CTRL_BASE_IDX                                                                        1 +#define regJPEG_MEMCHECK_CLAMPING_CNTL                                                                  0x06c4 +#define regJPEG_MEMCHECK_CLAMPING_CNTL_BASE_IDX                                                         1 +#define regJPEG_MEMCHECK_SAFE_ADDR                                                                      0x06c5 +#define regJPEG_MEMCHECK_SAFE_ADDR_BASE_IDX                                                             1 +#define regJPEG_MEMCHECK_SAFE_ADDR_64BIT                                                                0x06c6 +#define regJPEG_MEMCHECK_SAFE_ADDR_64BIT_BASE_IDX                                                       1 +#define regUVD_JMI_LAT_CTRL                                                                             0x06c7 +#define regUVD_JMI_LAT_CTRL_BASE_IDX                                                                    1 +#define regUVD_JMI_LAT_CNTR                                                                             0x06c8 +#define regUVD_JMI_LAT_CNTR_BASE_IDX                                                                    1 +#define regUVD_JMI_AVG_LAT_CNTR                                                                         0x06c9 +#define regUVD_JMI_AVG_LAT_CNTR_BASE_IDX                                                                1 +#define regUVD_JMI_PERFMON_CTRL                                                                         0x06ca +#define regUVD_JMI_PERFMON_CTRL_BASE_IDX                                                                1 +#define regUVD_JMI_PERFMON_COUNT_LO                                                                     0x06cb +#define regUVD_JMI_PERFMON_COUNT_LO_BASE_IDX                                                            1 +#define regUVD_JMI_PERFMON_COUNT_HI                                                                     0x06cc +#define regUVD_JMI_PERFMON_COUNT_HI_BASE_IDX                                                            1 +#define regUVD_JMI_CLEAN_STATUS                                                                         0x06cd +#define regUVD_JMI_CLEAN_STATUS_BASE_IDX                                                                1 +#define regUVD_JMI_CNTL                                                                                 0x06ce +#define regUVD_JMI_CNTL_BASE_IDX                                                                        1 + + +// addressBlock: aid_uvd0_uvd_jpeg_common_dec +// base address: 0x21400 +#define regJPEG_SOFT_RESET_STATUS                                                                       0x0700 +#define regJPEG_SOFT_RESET_STATUS_BASE_IDX                                                              1 +#define regJPEG_SYS_INT_EN                                                                              0x0701 +#define regJPEG_SYS_INT_EN_BASE_IDX                                                                     1 +#define regJPEG_SYS_INT_EN1                                                                             0x0702 +#define regJPEG_SYS_INT_EN1_BASE_IDX                                                                    1 +#define regJPEG_SYS_INT_STATUS                                                                          0x0703 +#define regJPEG_SYS_INT_STATUS_BASE_IDX                                                                 1 +#define regJPEG_SYS_INT_STATUS1                                                                         0x0704 +#define regJPEG_SYS_INT_STATUS1_BASE_IDX                                                                1 +#define regJPEG_SYS_INT_ACK                                                                             0x0705 +#define regJPEG_SYS_INT_ACK_BASE_IDX                                                                    1 +#define regJPEG_SYS_INT_ACK1                                                                            0x0706 +#define regJPEG_SYS_INT_ACK1_BASE_IDX                                                                   1 +#define regJPEG_MEMCHECK_SYS_INT_EN                                                                     0x0707 +#define regJPEG_MEMCHECK_SYS_INT_EN_BASE_IDX                                                            1 +#define regJPEG_MEMCHECK_SYS_INT_EN1                                                                    0x0708 +#define regJPEG_MEMCHECK_SYS_INT_EN1_BASE_IDX                                                           1 +#define regJPEG_MEMCHECK_SYS_INT_STAT                                                                   0x0709 +#define regJPEG_MEMCHECK_SYS_INT_STAT_BASE_IDX                                                          1 +#define regJPEG_MEMCHECK_SYS_INT_STAT1                                                                  0x070a +#define regJPEG_MEMCHECK_SYS_INT_STAT1_BASE_IDX                                                         1 +#define regJPEG_MEMCHECK_SYS_INT_STAT2                                                                  0x070b +#define regJPEG_MEMCHECK_SYS_INT_STAT2_BASE_IDX                                                         1 +#define regJPEG_MEMCHECK_SYS_INT_ACK                                                                    0x070c +#define regJPEG_MEMCHECK_SYS_INT_ACK_BASE_IDX                                                           1 +#define regJPEG_MEMCHECK_SYS_INT_ACK1                                                                   0x070d +#define regJPEG_MEMCHECK_SYS_INT_ACK1_BASE_IDX                                                          1 +#define regJPEG_MEMCHECK_SYS_INT_ACK2                                                                   0x070e +#define regJPEG_MEMCHECK_SYS_INT_ACK2_BASE_IDX                                                          1 +#define regJPEG_MASTINT_EN                                                                              0x0710 +#define regJPEG_MASTINT_EN_BASE_IDX                                                                     1 +#define regJPEG_IH_CTRL                                                                                 0x0711 +#define regJPEG_IH_CTRL_BASE_IDX                                                                        1 +#define regJRBBM_ARB_CTRL                                                                               0x0713 +#define regJRBBM_ARB_CTRL_BASE_IDX                                                                      1 + + +// addressBlock: aid_uvd0_uvd_jpeg_common_sclk_dec +// base address: 0x21480 +#define regJPEG_CGC_GATE                                                                                0x0720 +#define regJPEG_CGC_GATE_BASE_IDX                                                                       1 +#define regJPEG_CGC_CTRL                                                                                0x0721 +#define regJPEG_CGC_CTRL_BASE_IDX                                                                       1 +#define regJPEG_CGC_STATUS                                                                              0x0722 +#define regJPEG_CGC_STATUS_BASE_IDX                                                                     1 +#define regJPEG_COMN_CGC_MEM_CTRL                                                                       0x0723 +#define regJPEG_COMN_CGC_MEM_CTRL_BASE_IDX                                                              1 +#define regJPEG_DEC_CGC_MEM_CTRL                                                                        0x0724 +#define regJPEG_DEC_CGC_MEM_CTRL_BASE_IDX                                                               1 +#define regJPEG_ENC_CGC_MEM_CTRL                                                                        0x0726 +#define regJPEG_ENC_CGC_MEM_CTRL_BASE_IDX                                                               1 +#define regJPEG_PERF_BANK_CONF                                                                          0x0727 +#define regJPEG_PERF_BANK_CONF_BASE_IDX                                                                 1 +#define regJPEG_PERF_BANK_EVENT_SEL                                                                     0x0728 +#define regJPEG_PERF_BANK_EVENT_SEL_BASE_IDX                                                            1 +#define regJPEG_PERF_BANK_COUNT0                                                                        0x0729 +#define regJPEG_PERF_BANK_COUNT0_BASE_IDX                                                               1 +#define regJPEG_PERF_BANK_COUNT1                                                                        0x072a +#define regJPEG_PERF_BANK_COUNT1_BASE_IDX                                                               1 +#define regJPEG_PERF_BANK_COUNT2                                                                        0x072b +#define regJPEG_PERF_BANK_COUNT2_BASE_IDX                                                               1 +#define regJPEG_PERF_BANK_COUNT3                                                                        0x072c +#define regJPEG_PERF_BANK_COUNT3_BASE_IDX                                                               1 + + +// addressBlock: aid_uvd0_uvd_pg_dec +// base address: 0x1f800 +#define regUVD_PGFSM_CONFIG                                                                             0x0000 +#define regUVD_PGFSM_CONFIG_BASE_IDX                                                                    1 +#define regUVD_PGFSM_STATUS                                                                             0x0001 +#define regUVD_PGFSM_STATUS_BASE_IDX                                                                    1 +#define regUVD_POWER_STATUS                                                                             0x0002 +#define regUVD_POWER_STATUS_BASE_IDX                                                                    1 +#define regUVD_JPEG_POWER_STATUS                                                                        0x0003 +#define regUVD_JPEG_POWER_STATUS_BASE_IDX                                                               1 +#define regUVD_MC_DJPEG_RD_SPACE                                                                        0x0006 +#define regUVD_MC_DJPEG_RD_SPACE_BASE_IDX                                                               1 +#define regUVD_MC_DJPEG_WR_SPACE                                                                        0x0007 +#define regUVD_MC_DJPEG_WR_SPACE_BASE_IDX                                                               1 +#define regUVD_MC_EJPEG_RD_SPACE                                                                        0x0008 +#define regUVD_MC_EJPEG_RD_SPACE_BASE_IDX                                                               1 +#define regUVD_MC_EJPEG_WR_SPACE                                                                        0x0009 +#define regUVD_MC_EJPEG_WR_SPACE_BASE_IDX                                                               1 +#define regUVD_PG_IND_INDEX                                                                             0x000c +#define regUVD_PG_IND_INDEX_BASE_IDX                                                                    1 +#define regUVD_PG_IND_DATA                                                                              0x000e +#define regUVD_PG_IND_DATA_BASE_IDX                                                                     1 +#define regCC_UVD_HARVESTING                                                                            0x000f +#define regCC_UVD_HARVESTING_BASE_IDX                                                                   1 +#define regUVD_DPG_LMA_CTL                                                                              0x0011 +#define regUVD_DPG_LMA_CTL_BASE_IDX                                                                     1 +#define regUVD_DPG_LMA_DATA                                                                             0x0012 +#define regUVD_DPG_LMA_DATA_BASE_IDX                                                                    1 +#define regUVD_DPG_LMA_MASK                                                                             0x0013 +#define regUVD_DPG_LMA_MASK_BASE_IDX                                                                    1 +#define regUVD_DPG_PAUSE                                                                                0x0014 +#define regUVD_DPG_PAUSE_BASE_IDX                                                                       1 +#define regUVD_SCRATCH1                                                                                 0x0015 +#define regUVD_SCRATCH1_BASE_IDX                                                                        1 +#define regUVD_SCRATCH2                                                                                 0x0016 +#define regUVD_SCRATCH2_BASE_IDX                                                                        1 +#define regUVD_SCRATCH3                                                                                 0x0017 +#define regUVD_SCRATCH3_BASE_IDX                                                                        1 +#define regUVD_SCRATCH4                                                                                 0x0018 +#define regUVD_SCRATCH4_BASE_IDX                                                                        1 +#define regUVD_SCRATCH5                                                                                 0x0019 +#define regUVD_SCRATCH5_BASE_IDX                                                                        1 +#define regUVD_SCRATCH6                                                                                 0x001a +#define regUVD_SCRATCH6_BASE_IDX                                                                        1 +#define regUVD_SCRATCH7                                                                                 0x001b +#define regUVD_SCRATCH7_BASE_IDX                                                                        1 +#define regUVD_SCRATCH8                                                                                 0x001c +#define regUVD_SCRATCH8_BASE_IDX                                                                        1 +#define regUVD_SCRATCH9                                                                                 0x001d +#define regUVD_SCRATCH9_BASE_IDX                                                                        1 +#define regUVD_SCRATCH10                                                                                0x001e +#define regUVD_SCRATCH10_BASE_IDX                                                                       1 +#define regUVD_SCRATCH11                                                                                0x001f +#define regUVD_SCRATCH11_BASE_IDX                                                                       1 +#define regUVD_SCRATCH12                                                                                0x0020 +#define regUVD_SCRATCH12_BASE_IDX                                                                       1 +#define regUVD_SCRATCH13                                                                                0x0021 +#define regUVD_SCRATCH13_BASE_IDX                                                                       1 +#define regUVD_SCRATCH14                                                                                0x0022 +#define regUVD_SCRATCH14_BASE_IDX                                                                       1 +#define regUVD_FREE_COUNTER_REG                                                                         0x0023 +#define regUVD_FREE_COUNTER_REG_BASE_IDX                                                                1 +#define regUVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_LOW                                                         0x0024 +#define regUVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_LOW_BASE_IDX                                                1 +#define regUVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_HIGH                                                        0x0025 +#define regUVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_HIGH_BASE_IDX                                               1 +#define regUVD_DPG_VCPU_CACHE_OFFSET0                                                                   0x0026 +#define regUVD_DPG_VCPU_CACHE_OFFSET0_BASE_IDX                                                          1 +#define regUVD_DPG_LMI_VCPU_CACHE_VMID                                                                  0x0027 +#define regUVD_DPG_LMI_VCPU_CACHE_VMID_BASE_IDX                                                         1 +#define regUVD_REG_FILTER_EN                                                                            0x0028 +#define regUVD_REG_FILTER_EN_BASE_IDX                                                                   1 +#define regUVD_SECURITY_REG_VIO_REPORT                                                                  0x0029 +#define regUVD_SECURITY_REG_VIO_REPORT_BASE_IDX                                                         1 +#define regUVD_FW_VERSION                                                                               0x002a +#define regUVD_FW_VERSION_BASE_IDX                                                                      1 +#define regUVD_PF_STATUS                                                                                0x002c +#define regUVD_PF_STATUS_BASE_IDX                                                                       1 +#define regUVD_DPG_CLK_EN_VCPU_REPORT                                                                   0x002e +#define regUVD_DPG_CLK_EN_VCPU_REPORT_BASE_IDX                                                          1 +#define regCC_UVD_VCPU_ERR_DETECT_BOT_LO                                                                0x002f +#define regCC_UVD_VCPU_ERR_DETECT_BOT_LO_BASE_IDX                                                       1 +#define regCC_UVD_VCPU_ERR_DETECT_BOT_HI                                                                0x0030 +#define regCC_UVD_VCPU_ERR_DETECT_BOT_HI_BASE_IDX                                                       1 +#define regCC_UVD_VCPU_ERR_DETECT_TOP_LO                                                                0x0031 +#define regCC_UVD_VCPU_ERR_DETECT_TOP_LO_BASE_IDX                                                       1 +#define regCC_UVD_VCPU_ERR_DETECT_TOP_HI                                                                0x0032 +#define regCC_UVD_VCPU_ERR_DETECT_TOP_HI_BASE_IDX                                                       1 +#define regCC_UVD_VCPU_ERR                                                                              0x0033 +#define regCC_UVD_VCPU_ERR_BASE_IDX                                                                     1 +#define regCC_UVD_VCPU_ERR_INST_ADDR_LO                                                                 0x0034 +#define regCC_UVD_VCPU_ERR_INST_ADDR_LO_BASE_IDX                                                        1 +#define regCC_UVD_VCPU_ERR_INST_ADDR_HI                                                                 0x0035 +#define regCC_UVD_VCPU_ERR_INST_ADDR_HI_BASE_IDX                                                        1 +#define regUVD_LMI_MMSCH_NC_SPACE                                                                       0x003d +#define regUVD_LMI_MMSCH_NC_SPACE_BASE_IDX                                                              1 +#define regUVD_LMI_ATOMIC_SPACE                                                                         0x003e +#define regUVD_LMI_ATOMIC_SPACE_BASE_IDX                                                                1 +#define regUVD_GFX8_ADDR_CONFIG                                                                         0x0041 +#define regUVD_GFX8_ADDR_CONFIG_BASE_IDX                                                                1 +#define regUVD_GFX10_ADDR_CONFIG                                                                        0x0042 +#define regUVD_GFX10_ADDR_CONFIG_BASE_IDX                                                               1 +#define regUVD_GPCNT2_CNTL                                                                              0x0043 +#define regUVD_GPCNT2_CNTL_BASE_IDX                                                                     1 +#define regUVD_GPCNT2_TARGET_LOWER                                                                      0x0044 +#define regUVD_GPCNT2_TARGET_LOWER_BASE_IDX                                                             1 +#define regUVD_GPCNT2_STATUS_LOWER                                                                      0x0045 +#define regUVD_GPCNT2_STATUS_LOWER_BASE_IDX                                                             1 +#define regUVD_GPCNT2_TARGET_UPPER                                                                      0x0046 +#define regUVD_GPCNT2_TARGET_UPPER_BASE_IDX                                                             1 +#define regUVD_GPCNT2_STATUS_UPPER                                                                      0x0047 +#define regUVD_GPCNT2_STATUS_UPPER_BASE_IDX                                                             1 +#define regUVD_GPCNT3_CNTL                                                                              0x0048 +#define regUVD_GPCNT3_CNTL_BASE_IDX                                                                     1 +#define regUVD_GPCNT3_TARGET_LOWER                                                                      0x0049 +#define regUVD_GPCNT3_TARGET_LOWER_BASE_IDX                                                             1 +#define regUVD_GPCNT3_STATUS_LOWER                                                                      0x004a +#define regUVD_GPCNT3_STATUS_LOWER_BASE_IDX                                                             1 +#define regUVD_GPCNT3_TARGET_UPPER                                                                      0x004b +#define regUVD_GPCNT3_TARGET_UPPER_BASE_IDX                                                             1 +#define regUVD_GPCNT3_STATUS_UPPER                                                                      0x004c +#define regUVD_GPCNT3_STATUS_UPPER_BASE_IDX                                                             1 +#define regUVD_VCLK_DS_CNTL                                                                             0x004d +#define regUVD_VCLK_DS_CNTL_BASE_IDX                                                                    1 +#define regUVD_DCLK_DS_CNTL                                                                             0x004e +#define regUVD_DCLK_DS_CNTL_BASE_IDX                                                                    1 +#define regUVD_TSC_LOWER                                                                                0x004f +#define regUVD_TSC_LOWER_BASE_IDX                                                                       1 +#define regUVD_TSC_UPPER                                                                                0x0050 +#define regUVD_TSC_UPPER_BASE_IDX                                                                       1 +#define regVCN_FEATURES                                                                                 0x0051 +#define regVCN_FEATURES_BASE_IDX                                                                        1 +#define regUVD_GPUIOV_STATUS                                                                            0x0055 +#define regUVD_GPUIOV_STATUS_BASE_IDX                                                                   1 +#define regUVD_RAS_VCPU_VCODEC_STATUS                                                                   0x0057 +#define regUVD_RAS_VCPU_VCODEC_STATUS_BASE_IDX                                                          1 +#define regUVD_RAS_MMSCH_FATAL_ERROR                                                                    0x0058 +#define regUVD_RAS_MMSCH_FATAL_ERROR_BASE_IDX                                                           1 +#define regUVD_RAS_JPEG0_STATUS                                                                         0x0059 +#define regUVD_RAS_JPEG0_STATUS_BASE_IDX                                                                1 +#define regUVD_RAS_JPEG1_STATUS                                                                         0x005a +#define regUVD_RAS_JPEG1_STATUS_BASE_IDX                                                                1 +#define regUVD_RAS_CNTL_PMI_ARB                                                                         0x005b +#define regUVD_RAS_CNTL_PMI_ARB_BASE_IDX                                                                1 +#define regUVD_SCRATCH15                                                                                0x005c +#define regUVD_SCRATCH15_BASE_IDX                                                                       1 +#define regVCN_JPEG_DB_CTRL1                                                                            0x005d +#define regVCN_JPEG_DB_CTRL1_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL2                                                                            0x005e +#define regVCN_JPEG_DB_CTRL2_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL3                                                                            0x005f +#define regVCN_JPEG_DB_CTRL3_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL4                                                                            0x0060 +#define regVCN_JPEG_DB_CTRL4_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL5                                                                            0x0061 +#define regVCN_JPEG_DB_CTRL5_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL6                                                                            0x0062 +#define regVCN_JPEG_DB_CTRL6_BASE_IDX                                                                   1 +#define regVCN_JPEG_DB_CTRL7                                                                            0x0063 +#define regVCN_JPEG_DB_CTRL7_BASE_IDX                                                                   1 +#define regUVD_SCRATCH32                                                                                0x006d +#define regUVD_SCRATCH32_BASE_IDX                                                                       1 +#define regUVD_VERSION                                                                                  0x006e +#define regUVD_VERSION_BASE_IDX                                                                         1 +#define regVCN_RB_DB_CTRL                                                                               0x0070 +#define regVCN_RB_DB_CTRL_BASE_IDX                                                                      1 +#define regVCN_JPEG_DB_CTRL                                                                             0x0071 +#define regVCN_JPEG_DB_CTRL_BASE_IDX                                                                    1 +#define regVCN_RB1_DB_CTRL                                                                              0x0072 +#define regVCN_RB1_DB_CTRL_BASE_IDX                                                                     1 +#define regVCN_RB2_DB_CTRL                                                                              0x0073 +#define regVCN_RB2_DB_CTRL_BASE_IDX                                                                     1 +#define regVCN_RB3_DB_CTRL                                                                              0x0074 +#define regVCN_RB3_DB_CTRL_BASE_IDX                                                                     1 +#define regVCN_RB4_DB_CTRL                                                                              0x0075 +#define regVCN_RB4_DB_CTRL_BASE_IDX                                                                     1 +#define regVCN_RB_ENABLE                                                                                0x0085 +#define regVCN_RB_ENABLE_BASE_IDX                                                                       1 +#define regVCN_RB_WPTR_CTRL                                                                             0x0086 +#define regVCN_RB_WPTR_CTRL_BASE_IDX                                                                    1 +#define regUVD_RB_RPTR                                                                                  0x00ac +#define regUVD_RB_RPTR_BASE_IDX                                                                         1 +#define regUVD_RB_WPTR                                                                                  0x00ad +#define regUVD_RB_WPTR_BASE_IDX                                                                         1 +#define regUVD_RB_RPTR2                                                                                 0x00ae +#define regUVD_RB_RPTR2_BASE_IDX                                                                        1 +#define regUVD_RB_WPTR2                                                                                 0x00af +#define regUVD_RB_WPTR2_BASE_IDX                                                                        1 +#define regUVD_RB_RPTR3                                                                                 0x00b0 +#define regUVD_RB_RPTR3_BASE_IDX                                                                        1 +#define regUVD_RB_WPTR3                                                                                 0x00b1 +#define regUVD_RB_WPTR3_BASE_IDX                                                                        1 +#define regUVD_RB_RPTR4                                                                                 0x00b2 +#define regUVD_RB_RPTR4_BASE_IDX                                                                        1 +#define regUVD_RB_WPTR4                                                                                 0x00b3 +#define regUVD_RB_WPTR4_BASE_IDX                                                                        1 +#define regUVD_OUT_RB_RPTR                                                                              0x00b4 +#define regUVD_OUT_RB_RPTR_BASE_IDX                                                                     1 +#define regUVD_OUT_RB_WPTR                                                                              0x00b5 +#define regUVD_OUT_RB_WPTR_BASE_IDX                                                                     1 +#define regUVD_AUDIO_RB_RPTR                                                                            0x00b6 +#define regUVD_AUDIO_RB_RPTR_BASE_IDX                                                                   1 +#define regUVD_AUDIO_RB_WPTR                                                                            0x00b7 +#define regUVD_AUDIO_RB_WPTR_BASE_IDX                                                                   1 +#define regUVD_RBC_RB_RPTR                                                                              0x00b8 +#define regUVD_RBC_RB_RPTR_BASE_IDX                                                                     1 +#define regUVD_RBC_RB_WPTR                                                                              0x00b9 +#define regUVD_RBC_RB_WPTR_BASE_IDX                                                                     1 +#define regUVD_DPG_LMA_CTL2                                                                             0x00bb +#define regUVD_DPG_LMA_CTL2_BASE_IDX                                                                    1 + + +// addressBlock: aid_uvd0_mmsch_dec +// base address: 0x20d00 +#define regMMSCH_UCODE_ADDR                                                                             0x0540 +#define regMMSCH_UCODE_ADDR_BASE_IDX                                                                    1 +#define regMMSCH_UCODE_DATA                                                                             0x0541 +#define regMMSCH_UCODE_DATA_BASE_IDX                                                                    1 +#define regMMSCH_SRAM_ADDR                                                                              0x0542 +#define regMMSCH_SRAM_ADDR_BASE_IDX                                                                     1 +#define regMMSCH_SRAM_DATA                                                                              0x0543 +#define regMMSCH_SRAM_DATA_BASE_IDX                                                                     1 +#define regMMSCH_VF_SRAM_OFFSET                                                                         0x0544 +#define regMMSCH_VF_SRAM_OFFSET_BASE_IDX                                                                1 +#define regMMSCH_DB_SRAM_OFFSET                                                                         0x0545 +#define regMMSCH_DB_SRAM_OFFSET_BASE_IDX                                                                1 +#define regMMSCH_CTX_SRAM_OFFSET                                                                        0x0546 +#define regMMSCH_CTX_SRAM_OFFSET_BASE_IDX                                                               1 +#define regMMSCH_CTL                                                                                    0x0547 +#define regMMSCH_CTL_BASE_IDX                                                                           1 +#define regMMSCH_INTR                                                                                   0x0548 +#define regMMSCH_INTR_BASE_IDX                                                                          1 +#define regMMSCH_INTR_ACK                                                                               0x0549 +#define regMMSCH_INTR_ACK_BASE_IDX                                                                      1 +#define regMMSCH_INTR_STATUS                                                                            0x054a +#define regMMSCH_INTR_STATUS_BASE_IDX                                                                   1 +#define regMMSCH_VF_VMID                                                                                0x054b +#define regMMSCH_VF_VMID_BASE_IDX                                                                       1 +#define regMMSCH_VF_CTX_ADDR_LO                                                                         0x054c +#define regMMSCH_VF_CTX_ADDR_LO_BASE_IDX                                                                1 +#define regMMSCH_VF_CTX_ADDR_HI                                                                         0x054d +#define regMMSCH_VF_CTX_ADDR_HI_BASE_IDX                                                                1 +#define regMMSCH_VF_CTX_SIZE                                                                            0x054e +#define regMMSCH_VF_CTX_SIZE_BASE_IDX                                                                   1 +#define regMMSCH_VF_GPCOM_ADDR_LO                                                                       0x054f +#define regMMSCH_VF_GPCOM_ADDR_LO_BASE_IDX                                                              1 +#define regMMSCH_VF_GPCOM_ADDR_HI                                                                       0x0550 +#define regMMSCH_VF_GPCOM_ADDR_HI_BASE_IDX                                                              1 +#define regMMSCH_VF_GPCOM_SIZE                                                                          0x0551 +#define regMMSCH_VF_GPCOM_SIZE_BASE_IDX                                                                 1 +#define regMMSCH_VF_MAILBOX_HOST                                                                        0x0552 +#define regMMSCH_VF_MAILBOX_HOST_BASE_IDX                                                               1 +#define regMMSCH_VF_MAILBOX_RESP                                                                        0x0553 +#define regMMSCH_VF_MAILBOX_RESP_BASE_IDX                                                               1 +#define regMMSCH_VF_MAILBOX_0                                                                           0x0554 +#define regMMSCH_VF_MAILBOX_0_BASE_IDX                                                                  1 +#define regMMSCH_VF_MAILBOX_0_RESP                                                                      0x0555 +#define regMMSCH_VF_MAILBOX_0_RESP_BASE_IDX                                                             1 +#define regMMSCH_VF_MAILBOX_1                                                                           0x0556 +#define regMMSCH_VF_MAILBOX_1_BASE_IDX                                                                  1 +#define regMMSCH_VF_MAILBOX_1_RESP                                                                      0x0557 +#define regMMSCH_VF_MAILBOX_1_RESP_BASE_IDX                                                             1 +#define regMMSCH_CNTL                                                                                   0x055c +#define regMMSCH_CNTL_BASE_IDX                                                                          1 +#define regMMSCH_NONCACHE_OFFSET0                                                                       0x055d +#define regMMSCH_NONCACHE_OFFSET0_BASE_IDX                                                              1 +#define regMMSCH_NONCACHE_SIZE0                                                                         0x055e +#define regMMSCH_NONCACHE_SIZE0_BASE_IDX                                                                1 +#define regMMSCH_NONCACHE_OFFSET1                                                                       0x055f +#define regMMSCH_NONCACHE_OFFSET1_BASE_IDX                                                              1 +#define regMMSCH_NONCACHE_SIZE1                                                                         0x0560 +#define regMMSCH_NONCACHE_SIZE1_BASE_IDX                                                                1 +#define regMMSCH_PROC_STATE1                                                                            0x0566 +#define regMMSCH_PROC_STATE1_BASE_IDX                                                                   1 +#define regMMSCH_LAST_MC_ADDR                                                                           0x0567 +#define regMMSCH_LAST_MC_ADDR_BASE_IDX                                                                  1 +#define regMMSCH_LAST_MEM_ACCESS_HI                                                                     0x0568 +#define regMMSCH_LAST_MEM_ACCESS_HI_BASE_IDX                                                            1 +#define regMMSCH_LAST_MEM_ACCESS_LO                                                                     0x0569 +#define regMMSCH_LAST_MEM_ACCESS_LO_BASE_IDX                                                            1 +#define regMMSCH_IOV_ACTIVE_FCN_ID                                                                      0x056a +#define regMMSCH_IOV_ACTIVE_FCN_ID_BASE_IDX                                                             1 +#define regMMSCH_SCRATCH_0                                                                              0x056b +#define regMMSCH_SCRATCH_0_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_1                                                                              0x056c +#define regMMSCH_SCRATCH_1_BASE_IDX                                                                     1 +#define regMMSCH_GPUIOV_SCH_BLOCK_0                                                                     0x056d +#define regMMSCH_GPUIOV_SCH_BLOCK_0_BASE_IDX                                                            1 +#define regMMSCH_GPUIOV_CMD_CONTROL_0                                                                   0x056e +#define regMMSCH_GPUIOV_CMD_CONTROL_0_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_CMD_STATUS_0                                                                    0x056f +#define regMMSCH_GPUIOV_CMD_STATUS_0_BASE_IDX                                                           1 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_0                                                                0x0570 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_0_BASE_IDX                                                       1 +#define regMMSCH_GPUIOV_ACTIVE_FCNS_0                                                                   0x0571 +#define regMMSCH_GPUIOV_ACTIVE_FCNS_0_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_0                                                                 0x0572 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_0_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_DW6_0                                                                           0x0573 +#define regMMSCH_GPUIOV_DW6_0_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW7_0                                                                           0x0574 +#define regMMSCH_GPUIOV_DW7_0_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW8_0                                                                           0x0575 +#define regMMSCH_GPUIOV_DW8_0_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_SCH_BLOCK_1                                                                     0x0576 +#define regMMSCH_GPUIOV_SCH_BLOCK_1_BASE_IDX                                                            1 +#define regMMSCH_GPUIOV_CMD_CONTROL_1                                                                   0x0577 +#define regMMSCH_GPUIOV_CMD_CONTROL_1_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_CMD_STATUS_1                                                                    0x0578 +#define regMMSCH_GPUIOV_CMD_STATUS_1_BASE_IDX                                                           1 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_1                                                                0x0579 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_1_BASE_IDX                                                       1 +#define regMMSCH_GPUIOV_ACTIVE_FCNS_1                                                                   0x057a +#define regMMSCH_GPUIOV_ACTIVE_FCNS_1_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_1                                                                 0x057b +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_1_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_DW6_1                                                                           0x057c +#define regMMSCH_GPUIOV_DW6_1_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW7_1                                                                           0x057d +#define regMMSCH_GPUIOV_DW7_1_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW8_1                                                                           0x057e +#define regMMSCH_GPUIOV_DW8_1_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_CNTXT                                                                           0x057f +#define regMMSCH_GPUIOV_CNTXT_BASE_IDX                                                                  1 +#define regMMSCH_SCRATCH_2                                                                              0x0580 +#define regMMSCH_SCRATCH_2_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_3                                                                              0x0581 +#define regMMSCH_SCRATCH_3_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_4                                                                              0x0582 +#define regMMSCH_SCRATCH_4_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_5                                                                              0x0583 +#define regMMSCH_SCRATCH_5_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_6                                                                              0x0584 +#define regMMSCH_SCRATCH_6_BASE_IDX                                                                     1 +#define regMMSCH_SCRATCH_7                                                                              0x0585 +#define regMMSCH_SCRATCH_7_BASE_IDX                                                                     1 +#define regMMSCH_VFID_FIFO_HEAD_0                                                                       0x0586 +#define regMMSCH_VFID_FIFO_HEAD_0_BASE_IDX                                                              1 +#define regMMSCH_VFID_FIFO_TAIL_0                                                                       0x0587 +#define regMMSCH_VFID_FIFO_TAIL_0_BASE_IDX                                                              1 +#define regMMSCH_VFID_FIFO_HEAD_1                                                                       0x0588 +#define regMMSCH_VFID_FIFO_HEAD_1_BASE_IDX                                                              1 +#define regMMSCH_VFID_FIFO_TAIL_1                                                                       0x0589 +#define regMMSCH_VFID_FIFO_TAIL_1_BASE_IDX                                                              1 +#define regMMSCH_NACK_STATUS                                                                            0x058a +#define regMMSCH_NACK_STATUS_BASE_IDX                                                                   1 +#define regMMSCH_VF_MAILBOX0_DATA                                                                       0x058b +#define regMMSCH_VF_MAILBOX0_DATA_BASE_IDX                                                              1 +#define regMMSCH_VF_MAILBOX1_DATA                                                                       0x058c +#define regMMSCH_VF_MAILBOX1_DATA_BASE_IDX                                                              1 +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_0                                                                  0x058d +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_0_BASE_IDX                                                         1 +#define regMMSCH_GPUIOV_CMD_STATUS_IP_0                                                                 0x058e +#define regMMSCH_GPUIOV_CMD_STATUS_IP_0_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0                                                              0x058f +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0_BASE_IDX                                                     1 +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_1                                                                  0x0590 +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_1_BASE_IDX                                                         1 +#define regMMSCH_GPUIOV_CMD_STATUS_IP_1                                                                 0x0591 +#define regMMSCH_GPUIOV_CMD_STATUS_IP_1_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1                                                              0x0592 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1_BASE_IDX                                                     1 +#define regMMSCH_GPUIOV_CNTXT_IP                                                                        0x0593 +#define regMMSCH_GPUIOV_CNTXT_IP_BASE_IDX                                                               1 +#define regMMSCH_GPUIOV_SCH_BLOCK_2                                                                     0x0594 +#define regMMSCH_GPUIOV_SCH_BLOCK_2_BASE_IDX                                                            1 +#define regMMSCH_GPUIOV_CMD_CONTROL_2                                                                   0x0595 +#define regMMSCH_GPUIOV_CMD_CONTROL_2_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_CMD_STATUS_2                                                                    0x0596 +#define regMMSCH_GPUIOV_CMD_STATUS_2_BASE_IDX                                                           1 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_2                                                                0x0597 +#define regMMSCH_GPUIOV_VM_BUSY_STATUS_2_BASE_IDX                                                       1 +#define regMMSCH_GPUIOV_ACTIVE_FCNS_2                                                                   0x0598 +#define regMMSCH_GPUIOV_ACTIVE_FCNS_2_BASE_IDX                                                          1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_2                                                                 0x0599 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_2_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_DW6_2                                                                           0x059a +#define regMMSCH_GPUIOV_DW6_2_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW7_2                                                                           0x059b +#define regMMSCH_GPUIOV_DW7_2_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_DW8_2                                                                           0x059c +#define regMMSCH_GPUIOV_DW8_2_BASE_IDX                                                                  1 +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_2                                                                  0x059d +#define regMMSCH_GPUIOV_SCH_BLOCK_IP_2_BASE_IDX                                                         1 +#define regMMSCH_GPUIOV_CMD_STATUS_IP_2                                                                 0x059e +#define regMMSCH_GPUIOV_CMD_STATUS_IP_2_BASE_IDX                                                        1 +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2                                                              0x059f +#define regMMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2_BASE_IDX                                                     1 +#define regMMSCH_VFID_FIFO_HEAD_2                                                                       0x05a0 +#define regMMSCH_VFID_FIFO_HEAD_2_BASE_IDX                                                              1 +#define regMMSCH_VFID_FIFO_TAIL_2                                                                       0x05a1 +#define regMMSCH_VFID_FIFO_TAIL_2_BASE_IDX                                                              1 +#define regMMSCH_VM_BUSY_STATUS_0                                                                       0x05a2 +#define regMMSCH_VM_BUSY_STATUS_0_BASE_IDX                                                              1 +#define regMMSCH_VM_BUSY_STATUS_1                                                                       0x05a3 +#define regMMSCH_VM_BUSY_STATUS_1_BASE_IDX                                                              1 +#define regMMSCH_VM_BUSY_STATUS_2                                                                       0x05a4 +#define regMMSCH_VM_BUSY_STATUS_2_BASE_IDX                                                              1 + + +// addressBlock: aid_uvd0_slmi_adpdec +// base address: 0x21c00 +#define regUVD_LMI_MMSCH_NC0_64BIT_BAR_LOW                                                              0x0900 +#define regUVD_LMI_MMSCH_NC0_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC0_64BIT_BAR_HIGH                                                             0x0901 +#define regUVD_LMI_MMSCH_NC0_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC1_64BIT_BAR_LOW                                                              0x0902 +#define regUVD_LMI_MMSCH_NC1_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC1_64BIT_BAR_HIGH                                                             0x0903 +#define regUVD_LMI_MMSCH_NC1_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC2_64BIT_BAR_LOW                                                              0x0904 +#define regUVD_LMI_MMSCH_NC2_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC2_64BIT_BAR_HIGH                                                             0x0905 +#define regUVD_LMI_MMSCH_NC2_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC3_64BIT_BAR_LOW                                                              0x0906 +#define regUVD_LMI_MMSCH_NC3_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC3_64BIT_BAR_HIGH                                                             0x0907 +#define regUVD_LMI_MMSCH_NC3_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC4_64BIT_BAR_LOW                                                              0x0908 +#define regUVD_LMI_MMSCH_NC4_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC4_64BIT_BAR_HIGH                                                             0x0909 +#define regUVD_LMI_MMSCH_NC4_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC5_64BIT_BAR_LOW                                                              0x090a +#define regUVD_LMI_MMSCH_NC5_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC5_64BIT_BAR_HIGH                                                             0x090b +#define regUVD_LMI_MMSCH_NC5_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC6_64BIT_BAR_LOW                                                              0x090c +#define regUVD_LMI_MMSCH_NC6_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC6_64BIT_BAR_HIGH                                                             0x090d +#define regUVD_LMI_MMSCH_NC6_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC7_64BIT_BAR_LOW                                                              0x090e +#define regUVD_LMI_MMSCH_NC7_64BIT_BAR_LOW_BASE_IDX                                                     1 +#define regUVD_LMI_MMSCH_NC7_64BIT_BAR_HIGH                                                             0x090f +#define regUVD_LMI_MMSCH_NC7_64BIT_BAR_HIGH_BASE_IDX                                                    1 +#define regUVD_LMI_MMSCH_NC_VMID                                                                        0x0910 +#define regUVD_LMI_MMSCH_NC_VMID_BASE_IDX                                                               1 +#define regUVD_LMI_MMSCH_CTRL                                                                           0x0911 +#define regUVD_LMI_MMSCH_CTRL_BASE_IDX                                                                  1 +#define regUVD_MMSCH_LMI_STATUS                                                                         0x0912 +#define regUVD_MMSCH_LMI_STATUS_BASE_IDX                                                                1 +#define regVCN_RAS_CNTL_MMSCH                                                                           0x0914 +#define regVCN_RAS_CNTL_MMSCH_BASE_IDX                                                                  1 + +// addressBlock: aid_uvd0_vcn_edcc_dec +// base address: 0x21d20 +#define regVCN_UE_ERR_STATUS_LO_VIDD                                                                    0x094c +#define regVCN_UE_ERR_STATUS_LO_VIDD_BASE_IDX                                                           1 +#define regVCN_UE_ERR_STATUS_HI_VIDD                                                                    0x094d +#define regVCN_UE_ERR_STATUS_HI_VIDD_BASE_IDX                                                           1 +#define regVCN_UE_ERR_STATUS_LO_VIDV                                                                    0x094e +#define regVCN_UE_ERR_STATUS_LO_VIDV_BASE_IDX                                                           1 +#define regVCN_UE_ERR_STATUS_HI_VIDV                                                                    0x094f +#define regVCN_UE_ERR_STATUS_HI_VIDV_BASE_IDX                                                           1 +#define regVCN_CE_ERR_STATUS_LO_MMSCHD                                                                  0x0950 +#define regVCN_CE_ERR_STATUS_LO_MMSCHD_BASE_IDX                                                         1 +#define regVCN_CE_ERR_STATUS_HI_MMSCHD                                                                  0x0951 +#define regVCN_CE_ERR_STATUS_HI_MMSCHD_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG0S                                                                  0x0952 +#define regVCN_UE_ERR_STATUS_LO_JPEG0S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG0S                                                                  0x0953 +#define regVCN_UE_ERR_STATUS_HI_JPEG0S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG0D                                                                  0x0954 +#define regVCN_UE_ERR_STATUS_LO_JPEG0D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG0D                                                                  0x0955 +#define regVCN_UE_ERR_STATUS_HI_JPEG0D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG1S                                                                  0x0956 +#define regVCN_UE_ERR_STATUS_LO_JPEG1S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG1S                                                                  0x0957 +#define regVCN_UE_ERR_STATUS_HI_JPEG1S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG1D                                                                  0x0958 +#define regVCN_UE_ERR_STATUS_LO_JPEG1D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG1D                                                                  0x0959 +#define regVCN_UE_ERR_STATUS_HI_JPEG1D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG2S                                                                  0x095a +#define regVCN_UE_ERR_STATUS_LO_JPEG2S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG2S                                                                  0x095b +#define regVCN_UE_ERR_STATUS_HI_JPEG2S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG2D                                                                  0x095c +#define regVCN_UE_ERR_STATUS_LO_JPEG2D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG2D                                                                  0x095d +#define regVCN_UE_ERR_STATUS_HI_JPEG2D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG3S                                                                  0x095e +#define regVCN_UE_ERR_STATUS_LO_JPEG3S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG3S                                                                  0x095f +#define regVCN_UE_ERR_STATUS_HI_JPEG3S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG3D                                                                  0x0960 +#define regVCN_UE_ERR_STATUS_LO_JPEG3D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG3D                                                                  0x0961 +#define regVCN_UE_ERR_STATUS_HI_JPEG3D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG4S                                                                  0x0962 +#define regVCN_UE_ERR_STATUS_LO_JPEG4S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG4S                                                                  0x0963 +#define regVCN_UE_ERR_STATUS_HI_JPEG4S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG4D                                                                  0x0964 +#define regVCN_UE_ERR_STATUS_LO_JPEG4D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG4D                                                                  0x0965 +#define regVCN_UE_ERR_STATUS_HI_JPEG4D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG5S                                                                  0x0966 +#define regVCN_UE_ERR_STATUS_LO_JPEG5S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG5S                                                                  0x0967 +#define regVCN_UE_ERR_STATUS_HI_JPEG5S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG5D                                                                  0x0968 +#define regVCN_UE_ERR_STATUS_LO_JPEG5D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG5D                                                                  0x0969 +#define regVCN_UE_ERR_STATUS_HI_JPEG5D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG6S                                                                  0x096a +#define regVCN_UE_ERR_STATUS_LO_JPEG6S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG6S                                                                  0x096b +#define regVCN_UE_ERR_STATUS_HI_JPEG6S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG6D                                                                  0x096c +#define regVCN_UE_ERR_STATUS_LO_JPEG6D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG6D                                                                  0x096d +#define regVCN_UE_ERR_STATUS_HI_JPEG6D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG7S                                                                  0x096e +#define regVCN_UE_ERR_STATUS_LO_JPEG7S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG7S                                                                  0x096f +#define regVCN_UE_ERR_STATUS_HI_JPEG7S_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_LO_JPEG7D                                                                  0x0970 +#define regVCN_UE_ERR_STATUS_LO_JPEG7D_BASE_IDX                                                         1 +#define regVCN_UE_ERR_STATUS_HI_JPEG7D                                                                  0x0971 +#define regVCN_UE_ERR_STATUS_HI_JPEG7D_BASE_IDX                                                         1 + +// addressBlock: aid_uvd0_uvd_jrbc1_uvd_jrbc_dec +// base address: 0x1e000 +#define regUVD_JRBC1_UVD_JRBC_RB_WPTR                                                                   0x0000 +#define regUVD_JRBC1_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC1_UVD_JRBC_RB_CNTL                                                                   0x0001 +#define regUVD_JRBC1_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC1_UVD_JRBC_IB_SIZE                                                                   0x0002 +#define regUVD_JRBC1_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC1_UVD_JRBC_URGENT_CNTL                                                               0x0003 +#define regUVD_JRBC1_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC1_UVD_JRBC_RB_REF_DATA                                                               0x0004 +#define regUVD_JRBC1_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0005 +#define regUVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC1_UVD_JRBC_SOFT_RESET                                                                0x0008 +#define regUVD_JRBC1_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC1_UVD_JRBC_STATUS                                                                    0x0009 +#define regUVD_JRBC1_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC1_UVD_JRBC_RB_RPTR                                                                   0x000a +#define regUVD_JRBC1_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC1_UVD_JRBC_RB_BUF_STATUS                                                             0x000b +#define regUVD_JRBC1_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC1_UVD_JRBC_IB_BUF_STATUS                                                             0x000c +#define regUVD_JRBC1_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC1_UVD_JRBC_IB_SIZE_UPDATE                                                            0x000d +#define regUVD_JRBC1_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER                                                          0x000e +#define regUVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC1_UVD_JRBC_IB_REF_DATA                                                               0x000f +#define regUVD_JRBC1_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_CMD                                                               0x0010 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0011 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0012 +#define regUVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC1_UVD_JRBC_RB_SIZE                                                                   0x0013 +#define regUVD_JRBC1_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC1_UVD_JRBC_SCRATCH0                                                                  0x0014 +#define regUVD_JRBC1_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc2_uvd_jrbc_dec +// base address: 0x1e100 +#define regUVD_JRBC2_UVD_JRBC_RB_WPTR                                                                   0x0040 +#define regUVD_JRBC2_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC2_UVD_JRBC_RB_CNTL                                                                   0x0041 +#define regUVD_JRBC2_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC2_UVD_JRBC_IB_SIZE                                                                   0x0042 +#define regUVD_JRBC2_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC2_UVD_JRBC_URGENT_CNTL                                                               0x0043 +#define regUVD_JRBC2_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC2_UVD_JRBC_RB_REF_DATA                                                               0x0044 +#define regUVD_JRBC2_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0045 +#define regUVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC2_UVD_JRBC_SOFT_RESET                                                                0x0048 +#define regUVD_JRBC2_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC2_UVD_JRBC_STATUS                                                                    0x0049 +#define regUVD_JRBC2_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC2_UVD_JRBC_RB_RPTR                                                                   0x004a +#define regUVD_JRBC2_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC2_UVD_JRBC_RB_BUF_STATUS                                                             0x004b +#define regUVD_JRBC2_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC2_UVD_JRBC_IB_BUF_STATUS                                                             0x004c +#define regUVD_JRBC2_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC2_UVD_JRBC_IB_SIZE_UPDATE                                                            0x004d +#define regUVD_JRBC2_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER                                                          0x004e +#define regUVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC2_UVD_JRBC_IB_REF_DATA                                                               0x004f +#define regUVD_JRBC2_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_CMD                                                               0x0050 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0051 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0052 +#define regUVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC2_UVD_JRBC_RB_SIZE                                                                   0x0053 +#define regUVD_JRBC2_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC2_UVD_JRBC_SCRATCH0                                                                  0x0054 +#define regUVD_JRBC2_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc3_uvd_jrbc_dec +// base address: 0x1e200 +#define regUVD_JRBC3_UVD_JRBC_RB_WPTR                                                                   0x0080 +#define regUVD_JRBC3_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC3_UVD_JRBC_RB_CNTL                                                                   0x0081 +#define regUVD_JRBC3_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC3_UVD_JRBC_IB_SIZE                                                                   0x0082 +#define regUVD_JRBC3_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC3_UVD_JRBC_URGENT_CNTL                                                               0x0083 +#define regUVD_JRBC3_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC3_UVD_JRBC_RB_REF_DATA                                                               0x0084 +#define regUVD_JRBC3_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0085 +#define regUVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC3_UVD_JRBC_SOFT_RESET                                                                0x0088 +#define regUVD_JRBC3_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC3_UVD_JRBC_STATUS                                                                    0x0089 +#define regUVD_JRBC3_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC3_UVD_JRBC_RB_RPTR                                                                   0x008a +#define regUVD_JRBC3_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC3_UVD_JRBC_RB_BUF_STATUS                                                             0x008b +#define regUVD_JRBC3_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC3_UVD_JRBC_IB_BUF_STATUS                                                             0x008c +#define regUVD_JRBC3_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC3_UVD_JRBC_IB_SIZE_UPDATE                                                            0x008d +#define regUVD_JRBC3_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER                                                          0x008e +#define regUVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC3_UVD_JRBC_IB_REF_DATA                                                               0x008f +#define regUVD_JRBC3_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_CMD                                                               0x0090 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0091 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0092 +#define regUVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC3_UVD_JRBC_RB_SIZE                                                                   0x0093 +#define regUVD_JRBC3_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC3_UVD_JRBC_SCRATCH0                                                                  0x0094 +#define regUVD_JRBC3_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc4_uvd_jrbc_dec +// base address: 0x1e300 +#define regUVD_JRBC4_UVD_JRBC_RB_WPTR                                                                   0x00c0 +#define regUVD_JRBC4_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC4_UVD_JRBC_RB_CNTL                                                                   0x00c1 +#define regUVD_JRBC4_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC4_UVD_JRBC_IB_SIZE                                                                   0x00c2 +#define regUVD_JRBC4_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC4_UVD_JRBC_URGENT_CNTL                                                               0x00c3 +#define regUVD_JRBC4_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC4_UVD_JRBC_RB_REF_DATA                                                               0x00c4 +#define regUVD_JRBC4_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER                                                          0x00c5 +#define regUVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC4_UVD_JRBC_SOFT_RESET                                                                0x00c8 +#define regUVD_JRBC4_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC4_UVD_JRBC_STATUS                                                                    0x00c9 +#define regUVD_JRBC4_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC4_UVD_JRBC_RB_RPTR                                                                   0x00ca +#define regUVD_JRBC4_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC4_UVD_JRBC_RB_BUF_STATUS                                                             0x00cb +#define regUVD_JRBC4_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC4_UVD_JRBC_IB_BUF_STATUS                                                             0x00cc +#define regUVD_JRBC4_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC4_UVD_JRBC_IB_SIZE_UPDATE                                                            0x00cd +#define regUVD_JRBC4_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER                                                          0x00ce +#define regUVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC4_UVD_JRBC_IB_REF_DATA                                                               0x00cf +#define regUVD_JRBC4_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_CMD                                                               0x00d0 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x00d1 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x00d2 +#define regUVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC4_UVD_JRBC_RB_SIZE                                                                   0x00d3 +#define regUVD_JRBC4_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC4_UVD_JRBC_SCRATCH0                                                                  0x00d4 +#define regUVD_JRBC4_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc5_uvd_jrbc_dec +// base address: 0x1e400 +#define regUVD_JRBC5_UVD_JRBC_RB_WPTR                                                                   0x0100 +#define regUVD_JRBC5_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC5_UVD_JRBC_RB_CNTL                                                                   0x0101 +#define regUVD_JRBC5_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC5_UVD_JRBC_IB_SIZE                                                                   0x0102 +#define regUVD_JRBC5_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC5_UVD_JRBC_URGENT_CNTL                                                               0x0103 +#define regUVD_JRBC5_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC5_UVD_JRBC_RB_REF_DATA                                                               0x0104 +#define regUVD_JRBC5_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0105 +#define regUVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC5_UVD_JRBC_SOFT_RESET                                                                0x0108 +#define regUVD_JRBC5_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC5_UVD_JRBC_STATUS                                                                    0x0109 +#define regUVD_JRBC5_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC5_UVD_JRBC_RB_RPTR                                                                   0x010a +#define regUVD_JRBC5_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC5_UVD_JRBC_RB_BUF_STATUS                                                             0x010b +#define regUVD_JRBC5_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC5_UVD_JRBC_IB_BUF_STATUS                                                             0x010c +#define regUVD_JRBC5_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC5_UVD_JRBC_IB_SIZE_UPDATE                                                            0x010d +#define regUVD_JRBC5_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER                                                          0x010e +#define regUVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC5_UVD_JRBC_IB_REF_DATA                                                               0x010f +#define regUVD_JRBC5_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_CMD                                                               0x0110 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0111 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0112 +#define regUVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC5_UVD_JRBC_RB_SIZE                                                                   0x0113 +#define regUVD_JRBC5_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC5_UVD_JRBC_SCRATCH0                                                                  0x0114 +#define regUVD_JRBC5_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc6_uvd_jrbc_dec +// base address: 0x1e500 +#define regUVD_JRBC6_UVD_JRBC_RB_WPTR                                                                   0x0140 +#define regUVD_JRBC6_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC6_UVD_JRBC_RB_CNTL                                                                   0x0141 +#define regUVD_JRBC6_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC6_UVD_JRBC_IB_SIZE                                                                   0x0142 +#define regUVD_JRBC6_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC6_UVD_JRBC_URGENT_CNTL                                                               0x0143 +#define regUVD_JRBC6_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC6_UVD_JRBC_RB_REF_DATA                                                               0x0144 +#define regUVD_JRBC6_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0145 +#define regUVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC6_UVD_JRBC_SOFT_RESET                                                                0x0148 +#define regUVD_JRBC6_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC6_UVD_JRBC_STATUS                                                                    0x0149 +#define regUVD_JRBC6_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC6_UVD_JRBC_RB_RPTR                                                                   0x014a +#define regUVD_JRBC6_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC6_UVD_JRBC_RB_BUF_STATUS                                                             0x014b +#define regUVD_JRBC6_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC6_UVD_JRBC_IB_BUF_STATUS                                                             0x014c +#define regUVD_JRBC6_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC6_UVD_JRBC_IB_SIZE_UPDATE                                                            0x014d +#define regUVD_JRBC6_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER                                                          0x014e +#define regUVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC6_UVD_JRBC_IB_REF_DATA                                                               0x014f +#define regUVD_JRBC6_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_CMD                                                               0x0150 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0151 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0152 +#define regUVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC6_UVD_JRBC_RB_SIZE                                                                   0x0153 +#define regUVD_JRBC6_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC6_UVD_JRBC_SCRATCH0                                                                  0x0154 +#define regUVD_JRBC6_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jrbc7_uvd_jrbc_dec +// base address: 0x1e600 +#define regUVD_JRBC7_UVD_JRBC_RB_WPTR                                                                   0x0180 +#define regUVD_JRBC7_UVD_JRBC_RB_WPTR_BASE_IDX                                                          0 +#define regUVD_JRBC7_UVD_JRBC_RB_CNTL                                                                   0x0181 +#define regUVD_JRBC7_UVD_JRBC_RB_CNTL_BASE_IDX                                                          0 +#define regUVD_JRBC7_UVD_JRBC_IB_SIZE                                                                   0x0182 +#define regUVD_JRBC7_UVD_JRBC_IB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC7_UVD_JRBC_URGENT_CNTL                                                               0x0183 +#define regUVD_JRBC7_UVD_JRBC_URGENT_CNTL_BASE_IDX                                                      0 +#define regUVD_JRBC7_UVD_JRBC_RB_REF_DATA                                                               0x0184 +#define regUVD_JRBC7_UVD_JRBC_RB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER                                                          0x0185 +#define regUVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC7_UVD_JRBC_SOFT_RESET                                                                0x0188 +#define regUVD_JRBC7_UVD_JRBC_SOFT_RESET_BASE_IDX                                                       0 +#define regUVD_JRBC7_UVD_JRBC_STATUS                                                                    0x0189 +#define regUVD_JRBC7_UVD_JRBC_STATUS_BASE_IDX                                                           0 +#define regUVD_JRBC7_UVD_JRBC_RB_RPTR                                                                   0x018a +#define regUVD_JRBC7_UVD_JRBC_RB_RPTR_BASE_IDX                                                          0 +#define regUVD_JRBC7_UVD_JRBC_RB_BUF_STATUS                                                             0x018b +#define regUVD_JRBC7_UVD_JRBC_RB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC7_UVD_JRBC_IB_BUF_STATUS                                                             0x018c +#define regUVD_JRBC7_UVD_JRBC_IB_BUF_STATUS_BASE_IDX                                                    0 +#define regUVD_JRBC7_UVD_JRBC_IB_SIZE_UPDATE                                                            0x018d +#define regUVD_JRBC7_UVD_JRBC_IB_SIZE_UPDATE_BASE_IDX                                                   0 +#define regUVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER                                                          0x018e +#define regUVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER_BASE_IDX                                                 0 +#define regUVD_JRBC7_UVD_JRBC_IB_REF_DATA                                                               0x018f +#define regUVD_JRBC7_UVD_JRBC_IB_REF_DATA_BASE_IDX                                                      0 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_CMD                                                               0x0190 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_CMD_BASE_IDX                                                      0 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA0                                                       0x0191 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA0_BASE_IDX                                              0 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA1                                                       0x0192 +#define regUVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA1_BASE_IDX                                              0 +#define regUVD_JRBC7_UVD_JRBC_RB_SIZE                                                                   0x0193 +#define regUVD_JRBC7_UVD_JRBC_RB_SIZE_BASE_IDX                                                          0 +#define regUVD_JRBC7_UVD_JRBC_SCRATCH0                                                                  0x0194 +#define regUVD_JRBC7_UVD_JRBC_SCRATCH0_BASE_IDX                                                         0 + + +// addressBlock: aid_uvd0_uvd_jmi1_uvd_jmi_dec +// base address: 0x1e080 +#define regUVD_JMI1_UVD_JPEG_DEC_PF_CTRL                                                                0x0020 +#define regUVD_JMI1_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI1_UVD_LMI_JRBC_CTRL                                                                   0x0021 +#define regUVD_JMI1_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI1_UVD_LMI_JPEG_CTRL                                                                   0x0022 +#define regUVD_JMI1_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI1_JPEG_LMI_DROP                                                                       0x0023 +#define regUVD_JMI1_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_VMID                                                                0x0024 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_VMID                                                                0x0025 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI1_UVD_LMI_JPEG_VMID                                                                   0x0026 +#define regUVD_JMI1_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x0027 +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x0028 +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x0029 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x002a +#define regUVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x002b +#define regUVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x002c +#define regUVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x002d +#define regUVD_JMI1_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI1_UVD_JMI_DEC_SWAP_CNTL                                                               0x002e +#define regUVD_JMI1_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI1_UVD_JMI_ATOMIC_CNTL                                                                 0x002f +#define regUVD_JMI1_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x0030 +#define regUVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x0031 +#define regUVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x0032 +#define regUVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x0033 +#define regUVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x0034 +#define regUVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x0035 +#define regUVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x0036 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x0037 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x0038 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x0039 +#define regUVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI1_UVD_JMI_ATOMIC_CNTL2                                                                0x003d +#define regUVD_JMI1_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi2_uvd_jmi_dec +// base address: 0x1e180 +#define regUVD_JMI2_UVD_JPEG_DEC_PF_CTRL                                                                0x0060 +#define regUVD_JMI2_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI2_UVD_LMI_JRBC_CTRL                                                                   0x0061 +#define regUVD_JMI2_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI2_UVD_LMI_JPEG_CTRL                                                                   0x0062 +#define regUVD_JMI2_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI2_JPEG_LMI_DROP                                                                       0x0063 +#define regUVD_JMI2_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_VMID                                                                0x0064 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_VMID                                                                0x0065 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI2_UVD_LMI_JPEG_VMID                                                                   0x0066 +#define regUVD_JMI2_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x0067 +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x0068 +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x0069 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x006a +#define regUVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x006b +#define regUVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x006c +#define regUVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x006d +#define regUVD_JMI2_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI2_UVD_JMI_DEC_SWAP_CNTL                                                               0x006e +#define regUVD_JMI2_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI2_UVD_JMI_ATOMIC_CNTL                                                                 0x006f +#define regUVD_JMI2_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x0070 +#define regUVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x0071 +#define regUVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x0072 +#define regUVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x0073 +#define regUVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x0074 +#define regUVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x0075 +#define regUVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x0076 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x0077 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x0078 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x0079 +#define regUVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI2_UVD_JMI_ATOMIC_CNTL2                                                                0x007d +#define regUVD_JMI2_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi3_uvd_jmi_dec +// base address: 0x1e280 +#define regUVD_JMI3_UVD_JPEG_DEC_PF_CTRL                                                                0x00a0 +#define regUVD_JMI3_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI3_UVD_LMI_JRBC_CTRL                                                                   0x00a1 +#define regUVD_JMI3_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI3_UVD_LMI_JPEG_CTRL                                                                   0x00a2 +#define regUVD_JMI3_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI3_JPEG_LMI_DROP                                                                       0x00a3 +#define regUVD_JMI3_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_VMID                                                                0x00a4 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_VMID                                                                0x00a5 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI3_UVD_LMI_JPEG_VMID                                                                   0x00a6 +#define regUVD_JMI3_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x00a7 +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x00a8 +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x00a9 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x00aa +#define regUVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x00ab +#define regUVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x00ac +#define regUVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x00ad +#define regUVD_JMI3_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI3_UVD_JMI_DEC_SWAP_CNTL                                                               0x00ae +#define regUVD_JMI3_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI3_UVD_JMI_ATOMIC_CNTL                                                                 0x00af +#define regUVD_JMI3_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x00b0 +#define regUVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x00b1 +#define regUVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x00b2 +#define regUVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x00b3 +#define regUVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x00b4 +#define regUVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x00b5 +#define regUVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x00b6 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x00b7 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x00b8 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x00b9 +#define regUVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI3_UVD_JMI_ATOMIC_CNTL2                                                                0x00bd +#define regUVD_JMI3_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi4_uvd_jmi_dec +// base address: 0x1e380 +#define regUVD_JMI4_UVD_JPEG_DEC_PF_CTRL                                                                0x00e0 +#define regUVD_JMI4_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI4_UVD_LMI_JRBC_CTRL                                                                   0x00e1 +#define regUVD_JMI4_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI4_UVD_LMI_JPEG_CTRL                                                                   0x00e2 +#define regUVD_JMI4_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI4_JPEG_LMI_DROP                                                                       0x00e3 +#define regUVD_JMI4_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_VMID                                                                0x00e4 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_VMID                                                                0x00e5 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI4_UVD_LMI_JPEG_VMID                                                                   0x00e6 +#define regUVD_JMI4_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x00e7 +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x00e8 +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x00e9 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x00ea +#define regUVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x00eb +#define regUVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x00ec +#define regUVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x00ed +#define regUVD_JMI4_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI4_UVD_JMI_DEC_SWAP_CNTL                                                               0x00ee +#define regUVD_JMI4_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI4_UVD_JMI_ATOMIC_CNTL                                                                 0x00ef +#define regUVD_JMI4_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x00f0 +#define regUVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x00f1 +#define regUVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x00f2 +#define regUVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x00f3 +#define regUVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x00f4 +#define regUVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x00f5 +#define regUVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x00f6 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x00f7 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x00f8 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x00f9 +#define regUVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI4_UVD_JMI_ATOMIC_CNTL2                                                                0x00fd +#define regUVD_JMI4_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi5_uvd_jmi_dec +// base address: 0x1e480 +#define regUVD_JMI5_UVD_JPEG_DEC_PF_CTRL                                                                0x0120 +#define regUVD_JMI5_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI5_UVD_LMI_JRBC_CTRL                                                                   0x0121 +#define regUVD_JMI5_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI5_UVD_LMI_JPEG_CTRL                                                                   0x0122 +#define regUVD_JMI5_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI5_JPEG_LMI_DROP                                                                       0x0123 +#define regUVD_JMI5_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_VMID                                                                0x0124 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_VMID                                                                0x0125 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI5_UVD_LMI_JPEG_VMID                                                                   0x0126 +#define regUVD_JMI5_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x0127 +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x0128 +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x0129 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x012a +#define regUVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x012b +#define regUVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x012c +#define regUVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x012d +#define regUVD_JMI5_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI5_UVD_JMI_DEC_SWAP_CNTL                                                               0x012e +#define regUVD_JMI5_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI5_UVD_JMI_ATOMIC_CNTL                                                                 0x012f +#define regUVD_JMI5_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x0130 +#define regUVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x0131 +#define regUVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x0132 +#define regUVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x0133 +#define regUVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x0134 +#define regUVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x0135 +#define regUVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x0136 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x0137 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x0138 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x0139 +#define regUVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI5_UVD_JMI_ATOMIC_CNTL2                                                                0x013d +#define regUVD_JMI5_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi6_uvd_jmi_dec +// base address: 0x1e580 +#define regUVD_JMI6_UVD_JPEG_DEC_PF_CTRL                                                                0x0160 +#define regUVD_JMI6_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI6_UVD_LMI_JRBC_CTRL                                                                   0x0161 +#define regUVD_JMI6_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI6_UVD_LMI_JPEG_CTRL                                                                   0x0162 +#define regUVD_JMI6_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI6_JPEG_LMI_DROP                                                                       0x0163 +#define regUVD_JMI6_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_VMID                                                                0x0164 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_VMID                                                                0x0165 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI6_UVD_LMI_JPEG_VMID                                                                   0x0166 +#define regUVD_JMI6_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x0167 +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x0168 +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x0169 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x016a +#define regUVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x016b +#define regUVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x016c +#define regUVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x016d +#define regUVD_JMI6_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI6_UVD_JMI_DEC_SWAP_CNTL                                                               0x016e +#define regUVD_JMI6_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI6_UVD_JMI_ATOMIC_CNTL                                                                 0x016f +#define regUVD_JMI6_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x0170 +#define regUVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x0171 +#define regUVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x0172 +#define regUVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x0173 +#define regUVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x0174 +#define regUVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x0175 +#define regUVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x0176 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x0177 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x0178 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x0179 +#define regUVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI6_UVD_JMI_ATOMIC_CNTL2                                                                0x017d +#define regUVD_JMI6_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: aid_uvd0_uvd_jmi7_uvd_jmi_dec +// base address: 0x1e680 +#define regUVD_JMI7_UVD_JPEG_DEC_PF_CTRL                                                                0x01a0 +#define regUVD_JMI7_UVD_JPEG_DEC_PF_CTRL_BASE_IDX                                                       0 +#define regUVD_JMI7_UVD_LMI_JRBC_CTRL                                                                   0x01a1 +#define regUVD_JMI7_UVD_LMI_JRBC_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI7_UVD_LMI_JPEG_CTRL                                                                   0x01a2 +#define regUVD_JMI7_UVD_LMI_JPEG_CTRL_BASE_IDX                                                          0 +#define regUVD_JMI7_JPEG_LMI_DROP                                                                       0x01a3 +#define regUVD_JMI7_JPEG_LMI_DROP_BASE_IDX                                                              0 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_VMID                                                                0x01a4 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_VMID                                                                0x01a5 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_VMID_BASE_IDX                                                       0 +#define regUVD_JMI7_UVD_LMI_JPEG_VMID                                                                   0x01a6 +#define regUVD_JMI7_UVD_LMI_JPEG_VMID_BASE_IDX                                                          0 +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW                                            0x01a7 +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH                                           0x01a8 +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_LOW                                                       0x01a9 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH                                                      0x01aa +#define regUVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW                                                0x01ab +#define regUVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH                                               0x01ac +#define regUVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_VMID                                                           0x01ad +#define regUVD_JMI7_UVD_LMI_JPEG_PREEMPT_VMID_BASE_IDX                                                  0 +#define regUVD_JMI7_UVD_JMI_DEC_SWAP_CNTL                                                               0x01ae +#define regUVD_JMI7_UVD_JMI_DEC_SWAP_CNTL_BASE_IDX                                                      0 +#define regUVD_JMI7_UVD_JMI_ATOMIC_CNTL                                                                 0x01af +#define regUVD_JMI7_UVD_JMI_ATOMIC_CNTL_BASE_IDX                                                        0 +#define regUVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW                                            0x01b0 +#define regUVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW_BASE_IDX                                   0 +#define regUVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH                                           0x01b1 +#define regUVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH_BASE_IDX                                  0 +#define regUVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_LOW                                                     0x01b2 +#define regUVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_LOW_BASE_IDX                                            0 +#define regUVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH                                                    0x01b3 +#define regUVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH_BASE_IDX                                           0 +#define regUVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW                                                    0x01b4 +#define regUVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW_BASE_IDX                                           0 +#define regUVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH                                                   0x01b5 +#define regUVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH_BASE_IDX                                          0 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_LOW                                                       0x01b6 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_LOW_BASE_IDX                                              0 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH                                                      0x01b7 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH_BASE_IDX                                             0 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW                                                0x01b8 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW_BASE_IDX                                       0 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH                                               0x01b9 +#define regUVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH_BASE_IDX                                      0 +#define regUVD_JMI7_UVD_JMI_ATOMIC_CNTL2                                                                0x01bd +#define regUVD_JMI7_UVD_JMI_ATOMIC_CNTL2_BASE_IDX                                                       0 + + +// addressBlock: uvdctxind +// base address: 0x0 +#define ixUVD_CGC_MEM_CTRL                                                                             0x0000 +#define ixUVD_CGC_CTRL2                                                                                0x0001 +#define ixUVD_CGC_MEM_DS_CTRL                                                                          0x0002 +#define ixUVD_CGC_MEM_SD_CTRL                                                                          0x0003 +#define ixUVD_SW_SCRATCH_00                                                                            0x0004 +#define ixUVD_SW_SCRATCH_01                                                                            0x0005 +#define ixUVD_SW_SCRATCH_02                                                                            0x0006 +#define ixUVD_SW_SCRATCH_03                                                                            0x0007 +#define ixUVD_SW_SCRATCH_04                                                                            0x0008 +#define ixUVD_SW_SCRATCH_05                                                                            0x0009 +#define ixUVD_SW_SCRATCH_06                                                                            0x000a +#define ixUVD_SW_SCRATCH_07                                                                            0x000b +#define ixUVD_SW_SCRATCH_08                                                                            0x000c +#define ixUVD_SW_SCRATCH_09                                                                            0x000d +#define ixUVD_SW_SCRATCH_10                                                                            0x000e +#define ixUVD_SW_SCRATCH_11                                                                            0x000f +#define ixUVD_SW_SCRATCH_12                                                                            0x0010 +#define ixUVD_SW_SCRATCH_13                                                                            0x0011 +#define ixUVD_SW_SCRATCH_14                                                                            0x0012 +#define ixUVD_SW_SCRATCH_15                                                                            0x0013 +#define ixUVD_IH_SEM_CTRL                                                                              0x001e + + +// addressBlock: lmi_adp_indirect +// base address: 0x0 +#define ixUVD_LMI_CRC0                                                                                 0x0000 +#define ixUVD_LMI_CRC1                                                                                 0x0001 +#define ixUVD_LMI_CRC2                                                                                 0x0002 +#define ixUVD_LMI_CRC3                                                                                 0x0003 +#define ixUVD_LMI_CRC10                                                                                0x000a +#define ixUVD_LMI_CRC11                                                                                0x000b +#define ixUVD_LMI_CRC12                                                                                0x000c +#define ixUVD_LMI_CRC13                                                                                0x000d +#define ixUVD_LMI_CRC14                                                                                0x000e +#define ixUVD_LMI_CRC15                                                                                0x000f +#define ixUVD_LMI_SWAP_CNTL2                                                                           0x0029 +#define ixUVD_MEMCHECK_SYS_INT_EN                                                                      0x0134 +#define ixUVD_MEMCHECK_SYS_INT_STAT                                                                    0x0135 +#define ixUVD_MEMCHECK_SYS_INT_ACK                                                                     0x0136 +#define ixUVD_MEMCHECK_VCPU_INT_EN                                                                     0x0137 +#define ixUVD_MEMCHECK_VCPU_INT_STAT                                                                   0x0138 +#define ixUVD_MEMCHECK_VCPU_INT_ACK                                                                    0x0139 +#define ixUVD_MEMCHECK2_SYS_INT_STAT                                                                   0x0140 +#define ixUVD_MEMCHECK2_SYS_INT_ACK                                                                    0x0141 +#define ixUVD_MEMCHECK2_VCPU_INT_STAT                                                                  0x0142 +#define ixUVD_MEMCHECK2_VCPU_INT_ACK                                                                   0x0143 + + +#endif diff --git a/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_sh_mask.h new file mode 100644 index 000000000000..5bd8111bf04a --- /dev/null +++ b/drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_4_0_3_sh_mask.h @@ -0,0 +1,10919 @@ +/* + * Copyright 2022 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. + * + */ +#ifndef _vcn_4_0_3_SH_MASK_HEADER +#define _vcn_4_0_3_SH_MASK_HEADER + + +// addressBlock: aid_uvd0_uvddec +//UVD_TOP_CTRL +#define UVD_TOP_CTRL__STANDARD__SHIFT                                                                         0x0 +#define UVD_TOP_CTRL__STD_VERSION__SHIFT                                                                      0x4 +#define UVD_TOP_CTRL__STANDARD_MASK                                                                           0x0000000FL +#define UVD_TOP_CTRL__STD_VERSION_MASK                                                                        0x00000010L +//UVD_CGC_GATE +#define UVD_CGC_GATE__SYS__SHIFT                                                                              0x0 +#define UVD_CGC_GATE__UDEC__SHIFT                                                                             0x1 +#define UVD_CGC_GATE__MPEG2__SHIFT                                                                            0x2 +#define UVD_CGC_GATE__REGS__SHIFT                                                                             0x3 +#define UVD_CGC_GATE__RBC__SHIFT                                                                              0x4 +#define UVD_CGC_GATE__LMI_MC__SHIFT                                                                           0x5 +#define UVD_CGC_GATE__LMI_UMC__SHIFT                                                                          0x6 +#define UVD_CGC_GATE__IDCT__SHIFT                                                                             0x7 +#define UVD_CGC_GATE__MPRD__SHIFT                                                                             0x8 +#define UVD_CGC_GATE__MPC__SHIFT                                                                              0x9 +#define UVD_CGC_GATE__LBSI__SHIFT                                                                             0xa +#define UVD_CGC_GATE__LRBBM__SHIFT                                                                            0xb +#define UVD_CGC_GATE__UDEC_RE__SHIFT                                                                          0xc +#define UVD_CGC_GATE__UDEC_CM__SHIFT                                                                          0xd +#define UVD_CGC_GATE__UDEC_IT__SHIFT                                                                          0xe +#define UVD_CGC_GATE__UDEC_DB__SHIFT                                                                          0xf +#define UVD_CGC_GATE__UDEC_MP__SHIFT                                                                          0x10 +#define UVD_CGC_GATE__WCB__SHIFT                                                                              0x11 +#define UVD_CGC_GATE__VCPU__SHIFT                                                                             0x12 +#define UVD_CGC_GATE__MMSCH__SHIFT                                                                            0x14 +#define UVD_CGC_GATE__LCM0__SHIFT                                                                             0x15 +#define UVD_CGC_GATE__LCM1__SHIFT                                                                             0x16 +#define UVD_CGC_GATE__MIF__SHIFT                                                                              0x17 +#define UVD_CGC_GATE__VREG__SHIFT                                                                             0x18 +#define UVD_CGC_GATE__PE__SHIFT                                                                               0x19 +#define UVD_CGC_GATE__PPU__SHIFT                                                                              0x1a +#define UVD_CGC_GATE__SYS_MASK                                                                                0x00000001L +#define UVD_CGC_GATE__UDEC_MASK                                                                               0x00000002L +#define UVD_CGC_GATE__MPEG2_MASK                                                                              0x00000004L +#define UVD_CGC_GATE__REGS_MASK                                                                               0x00000008L +#define UVD_CGC_GATE__RBC_MASK                                                                                0x00000010L +#define UVD_CGC_GATE__LMI_MC_MASK                                                                             0x00000020L +#define UVD_CGC_GATE__LMI_UMC_MASK                                                                            0x00000040L +#define UVD_CGC_GATE__IDCT_MASK                                                                               0x00000080L +#define UVD_CGC_GATE__MPRD_MASK                                                                               0x00000100L +#define UVD_CGC_GATE__MPC_MASK                                                                                0x00000200L +#define UVD_CGC_GATE__LBSI_MASK                                                                               0x00000400L +#define UVD_CGC_GATE__LRBBM_MASK                                                                              0x00000800L +#define UVD_CGC_GATE__UDEC_RE_MASK                                                                            0x00001000L +#define UVD_CGC_GATE__UDEC_CM_MASK                                                                            0x00002000L +#define UVD_CGC_GATE__UDEC_IT_MASK                                                                            0x00004000L +#define UVD_CGC_GATE__UDEC_DB_MASK                                                                            0x00008000L +#define UVD_CGC_GATE__UDEC_MP_MASK                                                                            0x00010000L +#define UVD_CGC_GATE__WCB_MASK                                                                                0x00020000L +#define UVD_CGC_GATE__VCPU_MASK                                                                               0x00040000L +#define UVD_CGC_GATE__MMSCH_MASK                                                                              0x00100000L +#define UVD_CGC_GATE__LCM0_MASK                                                                               0x00200000L +#define UVD_CGC_GATE__LCM1_MASK                                                                               0x00400000L +#define UVD_CGC_GATE__MIF_MASK                                                                                0x00800000L +#define UVD_CGC_GATE__VREG_MASK                                                                               0x01000000L +#define UVD_CGC_GATE__PE_MASK                                                                                 0x02000000L +#define UVD_CGC_GATE__PPU_MASK                                                                                0x04000000L +//UVD_CGC_CTRL +#define UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT                                                                   0x0 +#define UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT                                                               0x2 +#define UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT                                                                    0x6 +#define UVD_CGC_CTRL__UDEC_RE_MODE__SHIFT                                                                     0xb +#define UVD_CGC_CTRL__UDEC_CM_MODE__SHIFT                                                                     0xc +#define UVD_CGC_CTRL__UDEC_IT_MODE__SHIFT                                                                     0xd +#define UVD_CGC_CTRL__UDEC_DB_MODE__SHIFT                                                                     0xe +#define UVD_CGC_CTRL__UDEC_MP_MODE__SHIFT                                                                     0xf +#define UVD_CGC_CTRL__SYS_MODE__SHIFT                                                                         0x10 +#define UVD_CGC_CTRL__UDEC_MODE__SHIFT                                                                        0x11 +#define UVD_CGC_CTRL__MPEG2_MODE__SHIFT                                                                       0x12 +#define UVD_CGC_CTRL__REGS_MODE__SHIFT                                                                        0x13 +#define UVD_CGC_CTRL__RBC_MODE__SHIFT                                                                         0x14 +#define UVD_CGC_CTRL__LMI_MC_MODE__SHIFT                                                                      0x15 +#define UVD_CGC_CTRL__LMI_UMC_MODE__SHIFT                                                                     0x16 +#define UVD_CGC_CTRL__IDCT_MODE__SHIFT                                                                        0x17 +#define UVD_CGC_CTRL__MPRD_MODE__SHIFT                                                                        0x18 +#define UVD_CGC_CTRL__MPC_MODE__SHIFT                                                                         0x19 +#define UVD_CGC_CTRL__LBSI_MODE__SHIFT                                                                        0x1a +#define UVD_CGC_CTRL__LRBBM_MODE__SHIFT                                                                       0x1b +#define UVD_CGC_CTRL__WCB_MODE__SHIFT                                                                         0x1c +#define UVD_CGC_CTRL__VCPU_MODE__SHIFT                                                                        0x1d +#define UVD_CGC_CTRL__MMSCH_MODE__SHIFT                                                                       0x1f +#define UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK                                                                     0x00000001L +#define UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK                                                                 0x0000003CL +#define UVD_CGC_CTRL__CLK_OFF_DELAY_MASK                                                                      0x000007C0L +#define UVD_CGC_CTRL__UDEC_RE_MODE_MASK                                                                       0x00000800L +#define UVD_CGC_CTRL__UDEC_CM_MODE_MASK                                                                       0x00001000L +#define UVD_CGC_CTRL__UDEC_IT_MODE_MASK                                                                       0x00002000L +#define UVD_CGC_CTRL__UDEC_DB_MODE_MASK                                                                       0x00004000L +#define UVD_CGC_CTRL__UDEC_MP_MODE_MASK                                                                       0x00008000L +#define UVD_CGC_CTRL__SYS_MODE_MASK                                                                           0x00010000L +#define UVD_CGC_CTRL__UDEC_MODE_MASK                                                                          0x00020000L +#define UVD_CGC_CTRL__MPEG2_MODE_MASK                                                                         0x00040000L +#define UVD_CGC_CTRL__REGS_MODE_MASK                                                                          0x00080000L +#define UVD_CGC_CTRL__RBC_MODE_MASK                                                                           0x00100000L +#define UVD_CGC_CTRL__LMI_MC_MODE_MASK                                                                        0x00200000L +#define UVD_CGC_CTRL__LMI_UMC_MODE_MASK                                                                       0x00400000L +#define UVD_CGC_CTRL__IDCT_MODE_MASK                                                                          0x00800000L +#define UVD_CGC_CTRL__MPRD_MODE_MASK                                                                          0x01000000L +#define UVD_CGC_CTRL__MPC_MODE_MASK                                                                           0x02000000L +#define UVD_CGC_CTRL__LBSI_MODE_MASK                                                                          0x04000000L +#define UVD_CGC_CTRL__LRBBM_MODE_MASK                                                                         0x08000000L +#define UVD_CGC_CTRL__WCB_MODE_MASK                                                                           0x10000000L +#define UVD_CGC_CTRL__VCPU_MODE_MASK                                                                          0x20000000L +#define UVD_CGC_CTRL__MMSCH_MODE_MASK                                                                         0x80000000L +//AVM_SUVD_CGC_GATE +#define AVM_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define AVM_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define AVM_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define AVM_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define AVM_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define AVM_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define AVM_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define AVM_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define AVM_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define AVM_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define AVM_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define AVM_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define AVM_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define AVM_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define AVM_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define AVM_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define AVM_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define AVM_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define AVM_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define AVM_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define AVM_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define AVM_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define AVM_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define AVM_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define AVM_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define AVM_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define AVM_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define AVM_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define AVM_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define AVM_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define AVM_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define AVM_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define AVM_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define AVM_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define AVM_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define AVM_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define AVM_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define AVM_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define AVM_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define AVM_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define AVM_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define AVM_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define AVM_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define AVM_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define AVM_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define AVM_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define AVM_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define AVM_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define AVM_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define AVM_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define AVM_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define AVM_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define AVM_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define AVM_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define AVM_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define AVM_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define AVM_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define AVM_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define AVM_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define AVM_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define AVM_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define AVM_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define AVM_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define AVM_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//CDEFE_SUVD_CGC_GATE +#define CDEFE_SUVD_CGC_GATE__SRE__SHIFT                                                                       0x0 +#define CDEFE_SUVD_CGC_GATE__SIT__SHIFT                                                                       0x1 +#define CDEFE_SUVD_CGC_GATE__SMP__SHIFT                                                                       0x2 +#define CDEFE_SUVD_CGC_GATE__SCM__SHIFT                                                                       0x3 +#define CDEFE_SUVD_CGC_GATE__SDB__SHIFT                                                                       0x4 +#define CDEFE_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                  0x5 +#define CDEFE_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                  0x6 +#define CDEFE_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                  0x7 +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                  0x8 +#define CDEFE_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                  0x9 +#define CDEFE_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                  0xa +#define CDEFE_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                  0xb +#define CDEFE_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                  0xc +#define CDEFE_SUVD_CGC_GATE__SCLR__SHIFT                                                                      0xd +#define CDEFE_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                    0xe +#define CDEFE_SUVD_CGC_GATE__ENT__SHIFT                                                                       0xf +#define CDEFE_SUVD_CGC_GATE__IME__SHIFT                                                                       0x10 +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                              0x11 +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                              0x12 +#define CDEFE_SUVD_CGC_GATE__SITE__SHIFT                                                                      0x13 +#define CDEFE_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                   0x14 +#define CDEFE_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                   0x15 +#define CDEFE_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                               0x16 +#define CDEFE_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                   0x17 +#define CDEFE_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                  0x18 +#define CDEFE_SUVD_CGC_GATE__EFC__SHIFT                                                                       0x19 +#define CDEFE_SUVD_CGC_GATE__SAOE__SHIFT                                                                      0x1a +#define CDEFE_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                   0x1b +#define CDEFE_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                  0x1c +#define CDEFE_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                  0x1d +#define CDEFE_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                   0x1e +#define CDEFE_SUVD_CGC_GATE__SMPA__SHIFT                                                                      0x1f +#define CDEFE_SUVD_CGC_GATE__SRE_MASK                                                                         0x00000001L +#define CDEFE_SUVD_CGC_GATE__SIT_MASK                                                                         0x00000002L +#define CDEFE_SUVD_CGC_GATE__SMP_MASK                                                                         0x00000004L +#define CDEFE_SUVD_CGC_GATE__SCM_MASK                                                                         0x00000008L +#define CDEFE_SUVD_CGC_GATE__SDB_MASK                                                                         0x00000010L +#define CDEFE_SUVD_CGC_GATE__SRE_H264_MASK                                                                    0x00000020L +#define CDEFE_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                    0x00000040L +#define CDEFE_SUVD_CGC_GATE__SIT_H264_MASK                                                                    0x00000080L +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                    0x00000100L +#define CDEFE_SUVD_CGC_GATE__SCM_H264_MASK                                                                    0x00000200L +#define CDEFE_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                    0x00000400L +#define CDEFE_SUVD_CGC_GATE__SDB_H264_MASK                                                                    0x00000800L +#define CDEFE_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                    0x00001000L +#define CDEFE_SUVD_CGC_GATE__SCLR_MASK                                                                        0x00002000L +#define CDEFE_SUVD_CGC_GATE__UVD_SC_MASK                                                                      0x00004000L +#define CDEFE_SUVD_CGC_GATE__ENT_MASK                                                                         0x00008000L +#define CDEFE_SUVD_CGC_GATE__IME_MASK                                                                         0x00010000L +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                0x00020000L +#define CDEFE_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                0x00040000L +#define CDEFE_SUVD_CGC_GATE__SITE_MASK                                                                        0x00080000L +#define CDEFE_SUVD_CGC_GATE__SRE_VP9_MASK                                                                     0x00100000L +#define CDEFE_SUVD_CGC_GATE__SCM_VP9_MASK                                                                     0x00200000L +#define CDEFE_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                 0x00400000L +#define CDEFE_SUVD_CGC_GATE__SDB_VP9_MASK                                                                     0x00800000L +#define CDEFE_SUVD_CGC_GATE__IME_HEVC_MASK                                                                    0x01000000L +#define CDEFE_SUVD_CGC_GATE__EFC_MASK                                                                         0x02000000L +#define CDEFE_SUVD_CGC_GATE__SAOE_MASK                                                                        0x04000000L +#define CDEFE_SUVD_CGC_GATE__SRE_AV1_MASK                                                                     0x08000000L +#define CDEFE_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                    0x10000000L +#define CDEFE_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                    0x20000000L +#define CDEFE_SUVD_CGC_GATE__SCM_AV1_MASK                                                                     0x40000000L +#define CDEFE_SUVD_CGC_GATE__SMPA_MASK                                                                        0x80000000L +//EFC_SUVD_CGC_GATE +#define EFC_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define EFC_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define EFC_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define EFC_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define EFC_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define EFC_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define EFC_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define EFC_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define EFC_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define EFC_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define EFC_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define EFC_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define EFC_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define EFC_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define EFC_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define EFC_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define EFC_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define EFC_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define EFC_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define EFC_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define EFC_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define EFC_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define EFC_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define EFC_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define EFC_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define EFC_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define EFC_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define EFC_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define EFC_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define EFC_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define EFC_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define EFC_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define EFC_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define EFC_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define EFC_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define EFC_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define EFC_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define EFC_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define EFC_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define EFC_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define EFC_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define EFC_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define EFC_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define EFC_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define EFC_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define EFC_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define EFC_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define EFC_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define EFC_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define EFC_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define EFC_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define EFC_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define EFC_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define EFC_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define EFC_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define EFC_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define EFC_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define EFC_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define EFC_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define EFC_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define EFC_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define EFC_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define EFC_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define EFC_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//ENT_SUVD_CGC_GATE +#define ENT_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define ENT_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define ENT_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define ENT_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define ENT_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define ENT_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define ENT_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define ENT_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define ENT_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define ENT_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define ENT_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define ENT_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define ENT_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define ENT_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define ENT_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define ENT_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define ENT_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define ENT_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define ENT_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define ENT_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define ENT_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define ENT_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define ENT_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define ENT_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define ENT_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define ENT_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define ENT_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define ENT_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define ENT_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define ENT_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define ENT_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define ENT_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define ENT_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define ENT_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define ENT_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define ENT_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define ENT_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define ENT_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define ENT_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define ENT_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define ENT_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define ENT_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define ENT_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define ENT_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define ENT_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define ENT_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define ENT_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define ENT_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define ENT_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define ENT_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define ENT_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define ENT_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define ENT_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define ENT_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define ENT_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define ENT_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define ENT_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define ENT_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define ENT_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define ENT_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define ENT_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define ENT_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define ENT_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define ENT_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//IME_SUVD_CGC_GATE +#define IME_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define IME_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define IME_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define IME_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define IME_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define IME_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define IME_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define IME_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define IME_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define IME_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define IME_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define IME_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define IME_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define IME_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define IME_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define IME_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define IME_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define IME_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define IME_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define IME_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define IME_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define IME_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define IME_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define IME_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define IME_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define IME_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define IME_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define IME_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define IME_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define IME_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define IME_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define IME_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define IME_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define IME_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define IME_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define IME_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define IME_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define IME_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define IME_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define IME_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define IME_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define IME_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define IME_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define IME_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define IME_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define IME_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define IME_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define IME_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define IME_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define IME_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define IME_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define IME_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define IME_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define IME_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define IME_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define IME_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define IME_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define IME_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define IME_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define IME_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define IME_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define IME_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define IME_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define IME_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//PPU_SUVD_CGC_GATE +#define PPU_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define PPU_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define PPU_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define PPU_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define PPU_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define PPU_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define PPU_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define PPU_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define PPU_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define PPU_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define PPU_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define PPU_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define PPU_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define PPU_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define PPU_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define PPU_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define PPU_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define PPU_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define PPU_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define PPU_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define PPU_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define PPU_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define PPU_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define PPU_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define PPU_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define PPU_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define PPU_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define PPU_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define PPU_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define PPU_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define PPU_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define PPU_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define PPU_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define PPU_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define PPU_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define PPU_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define PPU_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define PPU_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define PPU_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define PPU_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define PPU_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define PPU_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define PPU_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define PPU_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define PPU_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define PPU_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define PPU_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define PPU_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define PPU_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define PPU_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define PPU_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define PPU_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define PPU_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define PPU_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define PPU_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define PPU_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define PPU_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define PPU_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define PPU_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define PPU_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define PPU_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define PPU_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define PPU_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define PPU_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//SAOE_SUVD_CGC_GATE +#define SAOE_SUVD_CGC_GATE__SRE__SHIFT                                                                        0x0 +#define SAOE_SUVD_CGC_GATE__SIT__SHIFT                                                                        0x1 +#define SAOE_SUVD_CGC_GATE__SMP__SHIFT                                                                        0x2 +#define SAOE_SUVD_CGC_GATE__SCM__SHIFT                                                                        0x3 +#define SAOE_SUVD_CGC_GATE__SDB__SHIFT                                                                        0x4 +#define SAOE_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                   0x5 +#define SAOE_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                   0x6 +#define SAOE_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                   0x7 +#define SAOE_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                   0x8 +#define SAOE_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                   0x9 +#define SAOE_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                   0xa +#define SAOE_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                   0xb +#define SAOE_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                   0xc +#define SAOE_SUVD_CGC_GATE__SCLR__SHIFT                                                                       0xd +#define SAOE_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                     0xe +#define SAOE_SUVD_CGC_GATE__ENT__SHIFT                                                                        0xf +#define SAOE_SUVD_CGC_GATE__IME__SHIFT                                                                        0x10 +#define SAOE_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                               0x11 +#define SAOE_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                               0x12 +#define SAOE_SUVD_CGC_GATE__SITE__SHIFT                                                                       0x13 +#define SAOE_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                    0x14 +#define SAOE_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                    0x15 +#define SAOE_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                0x16 +#define SAOE_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                    0x17 +#define SAOE_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                   0x18 +#define SAOE_SUVD_CGC_GATE__EFC__SHIFT                                                                        0x19 +#define SAOE_SUVD_CGC_GATE__SAOE__SHIFT                                                                       0x1a +#define SAOE_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                    0x1b +#define SAOE_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                   0x1c +#define SAOE_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                   0x1d +#define SAOE_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                    0x1e +#define SAOE_SUVD_CGC_GATE__SMPA__SHIFT                                                                       0x1f +#define SAOE_SUVD_CGC_GATE__SRE_MASK                                                                          0x00000001L +#define SAOE_SUVD_CGC_GATE__SIT_MASK                                                                          0x00000002L +#define SAOE_SUVD_CGC_GATE__SMP_MASK                                                                          0x00000004L +#define SAOE_SUVD_CGC_GATE__SCM_MASK                                                                          0x00000008L +#define SAOE_SUVD_CGC_GATE__SDB_MASK                                                                          0x00000010L +#define SAOE_SUVD_CGC_GATE__SRE_H264_MASK                                                                     0x00000020L +#define SAOE_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                     0x00000040L +#define SAOE_SUVD_CGC_GATE__SIT_H264_MASK                                                                     0x00000080L +#define SAOE_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                     0x00000100L +#define SAOE_SUVD_CGC_GATE__SCM_H264_MASK                                                                     0x00000200L +#define SAOE_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                     0x00000400L +#define SAOE_SUVD_CGC_GATE__SDB_H264_MASK                                                                     0x00000800L +#define SAOE_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                     0x00001000L +#define SAOE_SUVD_CGC_GATE__SCLR_MASK                                                                         0x00002000L +#define SAOE_SUVD_CGC_GATE__UVD_SC_MASK                                                                       0x00004000L +#define SAOE_SUVD_CGC_GATE__ENT_MASK                                                                          0x00008000L +#define SAOE_SUVD_CGC_GATE__IME_MASK                                                                          0x00010000L +#define SAOE_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                 0x00020000L +#define SAOE_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                 0x00040000L +#define SAOE_SUVD_CGC_GATE__SITE_MASK                                                                         0x00080000L +#define SAOE_SUVD_CGC_GATE__SRE_VP9_MASK                                                                      0x00100000L +#define SAOE_SUVD_CGC_GATE__SCM_VP9_MASK                                                                      0x00200000L +#define SAOE_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                  0x00400000L +#define SAOE_SUVD_CGC_GATE__SDB_VP9_MASK                                                                      0x00800000L +#define SAOE_SUVD_CGC_GATE__IME_HEVC_MASK                                                                     0x01000000L +#define SAOE_SUVD_CGC_GATE__EFC_MASK                                                                          0x02000000L +#define SAOE_SUVD_CGC_GATE__SAOE_MASK                                                                         0x04000000L +#define SAOE_SUVD_CGC_GATE__SRE_AV1_MASK                                                                      0x08000000L +#define SAOE_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                     0x10000000L +#define SAOE_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                     0x20000000L +#define SAOE_SUVD_CGC_GATE__SCM_AV1_MASK                                                                      0x40000000L +#define SAOE_SUVD_CGC_GATE__SMPA_MASK                                                                         0x80000000L +//SCM_SUVD_CGC_GATE +#define SCM_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define SCM_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define SCM_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define SCM_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define SCM_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define SCM_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define SCM_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define SCM_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define SCM_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define SCM_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define SCM_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define SCM_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define SCM_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define SCM_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define SCM_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define SCM_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define SCM_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define SCM_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define SCM_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define SCM_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define SCM_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define SCM_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define SCM_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define SCM_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define SCM_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define SCM_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define SCM_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define SCM_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define SCM_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define SCM_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define SCM_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define SCM_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define SCM_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define SCM_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define SCM_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define SCM_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define SCM_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define SCM_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define SCM_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define SCM_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define SCM_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define SCM_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define SCM_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define SCM_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define SCM_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define SCM_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define SCM_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define SCM_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define SCM_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define SCM_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define SCM_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define SCM_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define SCM_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define SCM_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define SCM_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define SCM_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define SCM_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define SCM_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define SCM_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define SCM_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define SCM_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define SCM_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define SCM_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define SCM_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//SDB_SUVD_CGC_GATE +#define SDB_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define SDB_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define SDB_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define SDB_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define SDB_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define SDB_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define SDB_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define SDB_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define SDB_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define SDB_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define SDB_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define SDB_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define SDB_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define SDB_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define SDB_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define SDB_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define SDB_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define SDB_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define SDB_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define SDB_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define SDB_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define SDB_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define SDB_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define SDB_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define SDB_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define SDB_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define SDB_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define SDB_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define SDB_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define SDB_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define SDB_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define SDB_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define SDB_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define SDB_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define SDB_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define SDB_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define SDB_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define SDB_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define SDB_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define SDB_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define SDB_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define SDB_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define SDB_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define SDB_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define SDB_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define SDB_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define SDB_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define SDB_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define SDB_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define SDB_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define SDB_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define SDB_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define SDB_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define SDB_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define SDB_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define SDB_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define SDB_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define SDB_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define SDB_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define SDB_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define SDB_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define SDB_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define SDB_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define SDB_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//SIT0_NXT_SUVD_CGC_GATE +#define SIT0_NXT_SUVD_CGC_GATE__SRE__SHIFT                                                                    0x0 +#define SIT0_NXT_SUVD_CGC_GATE__SIT__SHIFT                                                                    0x1 +#define SIT0_NXT_SUVD_CGC_GATE__SMP__SHIFT                                                                    0x2 +#define SIT0_NXT_SUVD_CGC_GATE__SCM__SHIFT                                                                    0x3 +#define SIT0_NXT_SUVD_CGC_GATE__SDB__SHIFT                                                                    0x4 +#define SIT0_NXT_SUVD_CGC_GATE__SRE_H264__SHIFT                                                               0x5 +#define SIT0_NXT_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                               0x6 +#define SIT0_NXT_SUVD_CGC_GATE__SIT_H264__SHIFT                                                               0x7 +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                               0x8 +#define SIT0_NXT_SUVD_CGC_GATE__SCM_H264__SHIFT                                                               0x9 +#define SIT0_NXT_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                               0xa +#define SIT0_NXT_SUVD_CGC_GATE__SDB_H264__SHIFT                                                               0xb +#define SIT0_NXT_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                               0xc +#define SIT0_NXT_SUVD_CGC_GATE__SCLR__SHIFT                                                                   0xd +#define SIT0_NXT_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                 0xe +#define SIT0_NXT_SUVD_CGC_GATE__ENT__SHIFT                                                                    0xf +#define SIT0_NXT_SUVD_CGC_GATE__IME__SHIFT                                                                    0x10 +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                           0x11 +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                           0x12 +#define SIT0_NXT_SUVD_CGC_GATE__SITE__SHIFT                                                                   0x13 +#define SIT0_NXT_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                0x14 +#define SIT0_NXT_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                0x15 +#define SIT0_NXT_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                            0x16 +#define SIT0_NXT_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                0x17 +#define SIT0_NXT_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                               0x18 +#define SIT0_NXT_SUVD_CGC_GATE__EFC__SHIFT                                                                    0x19 +#define SIT0_NXT_SUVD_CGC_GATE__SAOE__SHIFT                                                                   0x1a +#define SIT0_NXT_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                0x1b +#define SIT0_NXT_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                               0x1c +#define SIT0_NXT_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                               0x1d +#define SIT0_NXT_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                0x1e +#define SIT0_NXT_SUVD_CGC_GATE__SMPA__SHIFT                                                                   0x1f +#define SIT0_NXT_SUVD_CGC_GATE__SRE_MASK                                                                      0x00000001L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_MASK                                                                      0x00000002L +#define SIT0_NXT_SUVD_CGC_GATE__SMP_MASK                                                                      0x00000004L +#define SIT0_NXT_SUVD_CGC_GATE__SCM_MASK                                                                      0x00000008L +#define SIT0_NXT_SUVD_CGC_GATE__SDB_MASK                                                                      0x00000010L +#define SIT0_NXT_SUVD_CGC_GATE__SRE_H264_MASK                                                                 0x00000020L +#define SIT0_NXT_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                 0x00000040L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_H264_MASK                                                                 0x00000080L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                 0x00000100L +#define SIT0_NXT_SUVD_CGC_GATE__SCM_H264_MASK                                                                 0x00000200L +#define SIT0_NXT_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                 0x00000400L +#define SIT0_NXT_SUVD_CGC_GATE__SDB_H264_MASK                                                                 0x00000800L +#define SIT0_NXT_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                 0x00001000L +#define SIT0_NXT_SUVD_CGC_GATE__SCLR_MASK                                                                     0x00002000L +#define SIT0_NXT_SUVD_CGC_GATE__UVD_SC_MASK                                                                   0x00004000L +#define SIT0_NXT_SUVD_CGC_GATE__ENT_MASK                                                                      0x00008000L +#define SIT0_NXT_SUVD_CGC_GATE__IME_MASK                                                                      0x00010000L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                             0x00020000L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                             0x00040000L +#define SIT0_NXT_SUVD_CGC_GATE__SITE_MASK                                                                     0x00080000L +#define SIT0_NXT_SUVD_CGC_GATE__SRE_VP9_MASK                                                                  0x00100000L +#define SIT0_NXT_SUVD_CGC_GATE__SCM_VP9_MASK                                                                  0x00200000L +#define SIT0_NXT_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                              0x00400000L +#define SIT0_NXT_SUVD_CGC_GATE__SDB_VP9_MASK                                                                  0x00800000L +#define SIT0_NXT_SUVD_CGC_GATE__IME_HEVC_MASK                                                                 0x01000000L +#define SIT0_NXT_SUVD_CGC_GATE__EFC_MASK                                                                      0x02000000L +#define SIT0_NXT_SUVD_CGC_GATE__SAOE_MASK                                                                     0x04000000L +#define SIT0_NXT_SUVD_CGC_GATE__SRE_AV1_MASK                                                                  0x08000000L +#define SIT0_NXT_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT0_NXT_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT0_NXT_SUVD_CGC_GATE__SCM_AV1_MASK                                                                  0x40000000L +#define SIT0_NXT_SUVD_CGC_GATE__SMPA_MASK                                                                     0x80000000L +//SIT1_NXT_SUVD_CGC_GATE +#define SIT1_NXT_SUVD_CGC_GATE__SRE__SHIFT                                                                    0x0 +#define SIT1_NXT_SUVD_CGC_GATE__SIT__SHIFT                                                                    0x1 +#define SIT1_NXT_SUVD_CGC_GATE__SMP__SHIFT                                                                    0x2 +#define SIT1_NXT_SUVD_CGC_GATE__SCM__SHIFT                                                                    0x3 +#define SIT1_NXT_SUVD_CGC_GATE__SDB__SHIFT                                                                    0x4 +#define SIT1_NXT_SUVD_CGC_GATE__SRE_H264__SHIFT                                                               0x5 +#define SIT1_NXT_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                               0x6 +#define SIT1_NXT_SUVD_CGC_GATE__SIT_H264__SHIFT                                                               0x7 +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                               0x8 +#define SIT1_NXT_SUVD_CGC_GATE__SCM_H264__SHIFT                                                               0x9 +#define SIT1_NXT_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                               0xa +#define SIT1_NXT_SUVD_CGC_GATE__SDB_H264__SHIFT                                                               0xb +#define SIT1_NXT_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                               0xc +#define SIT1_NXT_SUVD_CGC_GATE__SCLR__SHIFT                                                                   0xd +#define SIT1_NXT_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                 0xe +#define SIT1_NXT_SUVD_CGC_GATE__ENT__SHIFT                                                                    0xf +#define SIT1_NXT_SUVD_CGC_GATE__IME__SHIFT                                                                    0x10 +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                           0x11 +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                           0x12 +#define SIT1_NXT_SUVD_CGC_GATE__SITE__SHIFT                                                                   0x13 +#define SIT1_NXT_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                0x14 +#define SIT1_NXT_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                0x15 +#define SIT1_NXT_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                            0x16 +#define SIT1_NXT_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                0x17 +#define SIT1_NXT_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                               0x18 +#define SIT1_NXT_SUVD_CGC_GATE__EFC__SHIFT                                                                    0x19 +#define SIT1_NXT_SUVD_CGC_GATE__SAOE__SHIFT                                                                   0x1a +#define SIT1_NXT_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                0x1b +#define SIT1_NXT_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                               0x1c +#define SIT1_NXT_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                               0x1d +#define SIT1_NXT_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                0x1e +#define SIT1_NXT_SUVD_CGC_GATE__SMPA__SHIFT                                                                   0x1f +#define SIT1_NXT_SUVD_CGC_GATE__SRE_MASK                                                                      0x00000001L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_MASK                                                                      0x00000002L +#define SIT1_NXT_SUVD_CGC_GATE__SMP_MASK                                                                      0x00000004L +#define SIT1_NXT_SUVD_CGC_GATE__SCM_MASK                                                                      0x00000008L +#define SIT1_NXT_SUVD_CGC_GATE__SDB_MASK                                                                      0x00000010L +#define SIT1_NXT_SUVD_CGC_GATE__SRE_H264_MASK                                                                 0x00000020L +#define SIT1_NXT_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                 0x00000040L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_H264_MASK                                                                 0x00000080L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                 0x00000100L +#define SIT1_NXT_SUVD_CGC_GATE__SCM_H264_MASK                                                                 0x00000200L +#define SIT1_NXT_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                 0x00000400L +#define SIT1_NXT_SUVD_CGC_GATE__SDB_H264_MASK                                                                 0x00000800L +#define SIT1_NXT_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                 0x00001000L +#define SIT1_NXT_SUVD_CGC_GATE__SCLR_MASK                                                                     0x00002000L +#define SIT1_NXT_SUVD_CGC_GATE__UVD_SC_MASK                                                                   0x00004000L +#define SIT1_NXT_SUVD_CGC_GATE__ENT_MASK                                                                      0x00008000L +#define SIT1_NXT_SUVD_CGC_GATE__IME_MASK                                                                      0x00010000L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                             0x00020000L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                             0x00040000L +#define SIT1_NXT_SUVD_CGC_GATE__SITE_MASK                                                                     0x00080000L +#define SIT1_NXT_SUVD_CGC_GATE__SRE_VP9_MASK                                                                  0x00100000L +#define SIT1_NXT_SUVD_CGC_GATE__SCM_VP9_MASK                                                                  0x00200000L +#define SIT1_NXT_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                              0x00400000L +#define SIT1_NXT_SUVD_CGC_GATE__SDB_VP9_MASK                                                                  0x00800000L +#define SIT1_NXT_SUVD_CGC_GATE__IME_HEVC_MASK                                                                 0x01000000L +#define SIT1_NXT_SUVD_CGC_GATE__EFC_MASK                                                                      0x02000000L +#define SIT1_NXT_SUVD_CGC_GATE__SAOE_MASK                                                                     0x04000000L +#define SIT1_NXT_SUVD_CGC_GATE__SRE_AV1_MASK                                                                  0x08000000L +#define SIT1_NXT_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT1_NXT_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT1_NXT_SUVD_CGC_GATE__SCM_AV1_MASK                                                                  0x40000000L +#define SIT1_NXT_SUVD_CGC_GATE__SMPA_MASK                                                                     0x80000000L +//SIT2_NXT_SUVD_CGC_GATE +#define SIT2_NXT_SUVD_CGC_GATE__SRE__SHIFT                                                                    0x0 +#define SIT2_NXT_SUVD_CGC_GATE__SIT__SHIFT                                                                    0x1 +#define SIT2_NXT_SUVD_CGC_GATE__SMP__SHIFT                                                                    0x2 +#define SIT2_NXT_SUVD_CGC_GATE__SCM__SHIFT                                                                    0x3 +#define SIT2_NXT_SUVD_CGC_GATE__SDB__SHIFT                                                                    0x4 +#define SIT2_NXT_SUVD_CGC_GATE__SRE_H264__SHIFT                                                               0x5 +#define SIT2_NXT_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                               0x6 +#define SIT2_NXT_SUVD_CGC_GATE__SIT_H264__SHIFT                                                               0x7 +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                               0x8 +#define SIT2_NXT_SUVD_CGC_GATE__SCM_H264__SHIFT                                                               0x9 +#define SIT2_NXT_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                               0xa +#define SIT2_NXT_SUVD_CGC_GATE__SDB_H264__SHIFT                                                               0xb +#define SIT2_NXT_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                               0xc +#define SIT2_NXT_SUVD_CGC_GATE__SCLR__SHIFT                                                                   0xd +#define SIT2_NXT_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                 0xe +#define SIT2_NXT_SUVD_CGC_GATE__ENT__SHIFT                                                                    0xf +#define SIT2_NXT_SUVD_CGC_GATE__IME__SHIFT                                                                    0x10 +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                           0x11 +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                           0x12 +#define SIT2_NXT_SUVD_CGC_GATE__SITE__SHIFT                                                                   0x13 +#define SIT2_NXT_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                0x14 +#define SIT2_NXT_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                0x15 +#define SIT2_NXT_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                            0x16 +#define SIT2_NXT_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                0x17 +#define SIT2_NXT_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                               0x18 +#define SIT2_NXT_SUVD_CGC_GATE__EFC__SHIFT                                                                    0x19 +#define SIT2_NXT_SUVD_CGC_GATE__SAOE__SHIFT                                                                   0x1a +#define SIT2_NXT_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                0x1b +#define SIT2_NXT_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                               0x1c +#define SIT2_NXT_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                               0x1d +#define SIT2_NXT_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                0x1e +#define SIT2_NXT_SUVD_CGC_GATE__SMPA__SHIFT                                                                   0x1f +#define SIT2_NXT_SUVD_CGC_GATE__SRE_MASK                                                                      0x00000001L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_MASK                                                                      0x00000002L +#define SIT2_NXT_SUVD_CGC_GATE__SMP_MASK                                                                      0x00000004L +#define SIT2_NXT_SUVD_CGC_GATE__SCM_MASK                                                                      0x00000008L +#define SIT2_NXT_SUVD_CGC_GATE__SDB_MASK                                                                      0x00000010L +#define SIT2_NXT_SUVD_CGC_GATE__SRE_H264_MASK                                                                 0x00000020L +#define SIT2_NXT_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                 0x00000040L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_H264_MASK                                                                 0x00000080L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                 0x00000100L +#define SIT2_NXT_SUVD_CGC_GATE__SCM_H264_MASK                                                                 0x00000200L +#define SIT2_NXT_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                 0x00000400L +#define SIT2_NXT_SUVD_CGC_GATE__SDB_H264_MASK                                                                 0x00000800L +#define SIT2_NXT_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                 0x00001000L +#define SIT2_NXT_SUVD_CGC_GATE__SCLR_MASK                                                                     0x00002000L +#define SIT2_NXT_SUVD_CGC_GATE__UVD_SC_MASK                                                                   0x00004000L +#define SIT2_NXT_SUVD_CGC_GATE__ENT_MASK                                                                      0x00008000L +#define SIT2_NXT_SUVD_CGC_GATE__IME_MASK                                                                      0x00010000L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                             0x00020000L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                             0x00040000L +#define SIT2_NXT_SUVD_CGC_GATE__SITE_MASK                                                                     0x00080000L +#define SIT2_NXT_SUVD_CGC_GATE__SRE_VP9_MASK                                                                  0x00100000L +#define SIT2_NXT_SUVD_CGC_GATE__SCM_VP9_MASK                                                                  0x00200000L +#define SIT2_NXT_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                              0x00400000L +#define SIT2_NXT_SUVD_CGC_GATE__SDB_VP9_MASK                                                                  0x00800000L +#define SIT2_NXT_SUVD_CGC_GATE__IME_HEVC_MASK                                                                 0x01000000L +#define SIT2_NXT_SUVD_CGC_GATE__EFC_MASK                                                                      0x02000000L +#define SIT2_NXT_SUVD_CGC_GATE__SAOE_MASK                                                                     0x04000000L +#define SIT2_NXT_SUVD_CGC_GATE__SRE_AV1_MASK                                                                  0x08000000L +#define SIT2_NXT_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT2_NXT_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT2_NXT_SUVD_CGC_GATE__SCM_AV1_MASK                                                                  0x40000000L +#define SIT2_NXT_SUVD_CGC_GATE__SMPA_MASK                                                                     0x80000000L +//SIT_SUVD_CGC_GATE +#define SIT_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define SIT_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define SIT_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define SIT_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define SIT_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define SIT_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define SIT_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define SIT_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define SIT_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define SIT_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define SIT_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define SIT_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define SIT_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define SIT_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define SIT_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define SIT_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define SIT_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define SIT_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define SIT_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define SIT_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define SIT_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define SIT_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define SIT_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define SIT_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define SIT_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define SIT_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define SIT_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define SIT_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define SIT_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define SIT_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define SIT_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define SIT_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define SIT_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define SIT_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define SIT_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define SIT_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define SIT_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define SIT_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define SIT_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define SIT_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define SIT_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define SIT_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define SIT_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define SIT_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define SIT_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define SIT_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define SIT_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define SIT_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define SIT_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define SIT_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define SIT_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define SIT_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define SIT_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define SIT_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define SIT_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define SIT_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define SIT_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define SIT_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define SIT_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define SIT_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define SIT_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define SIT_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define SIT_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define SIT_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//SMPA_SUVD_CGC_GATE +#define SMPA_SUVD_CGC_GATE__SRE__SHIFT                                                                        0x0 +#define SMPA_SUVD_CGC_GATE__SIT__SHIFT                                                                        0x1 +#define SMPA_SUVD_CGC_GATE__SMP__SHIFT                                                                        0x2 +#define SMPA_SUVD_CGC_GATE__SCM__SHIFT                                                                        0x3 +#define SMPA_SUVD_CGC_GATE__SDB__SHIFT                                                                        0x4 +#define SMPA_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                   0x5 +#define SMPA_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                   0x6 +#define SMPA_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                   0x7 +#define SMPA_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                   0x8 +#define SMPA_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                   0x9 +#define SMPA_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                   0xa +#define SMPA_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                   0xb +#define SMPA_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                   0xc +#define SMPA_SUVD_CGC_GATE__SCLR__SHIFT                                                                       0xd +#define SMPA_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                     0xe +#define SMPA_SUVD_CGC_GATE__ENT__SHIFT                                                                        0xf +#define SMPA_SUVD_CGC_GATE__IME__SHIFT                                                                        0x10 +#define SMPA_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                               0x11 +#define SMPA_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                               0x12 +#define SMPA_SUVD_CGC_GATE__SITE__SHIFT                                                                       0x13 +#define SMPA_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                    0x14 +#define SMPA_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                    0x15 +#define SMPA_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                0x16 +#define SMPA_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                    0x17 +#define SMPA_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                   0x18 +#define SMPA_SUVD_CGC_GATE__EFC__SHIFT                                                                        0x19 +#define SMPA_SUVD_CGC_GATE__SAOE__SHIFT                                                                       0x1a +#define SMPA_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                    0x1b +#define SMPA_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                   0x1c +#define SMPA_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                   0x1d +#define SMPA_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                    0x1e +#define SMPA_SUVD_CGC_GATE__SMPA__SHIFT                                                                       0x1f +#define SMPA_SUVD_CGC_GATE__SRE_MASK                                                                          0x00000001L +#define SMPA_SUVD_CGC_GATE__SIT_MASK                                                                          0x00000002L +#define SMPA_SUVD_CGC_GATE__SMP_MASK                                                                          0x00000004L +#define SMPA_SUVD_CGC_GATE__SCM_MASK                                                                          0x00000008L +#define SMPA_SUVD_CGC_GATE__SDB_MASK                                                                          0x00000010L +#define SMPA_SUVD_CGC_GATE__SRE_H264_MASK                                                                     0x00000020L +#define SMPA_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                     0x00000040L +#define SMPA_SUVD_CGC_GATE__SIT_H264_MASK                                                                     0x00000080L +#define SMPA_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                     0x00000100L +#define SMPA_SUVD_CGC_GATE__SCM_H264_MASK                                                                     0x00000200L +#define SMPA_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                     0x00000400L +#define SMPA_SUVD_CGC_GATE__SDB_H264_MASK                                                                     0x00000800L +#define SMPA_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                     0x00001000L +#define SMPA_SUVD_CGC_GATE__SCLR_MASK                                                                         0x00002000L +#define SMPA_SUVD_CGC_GATE__UVD_SC_MASK                                                                       0x00004000L +#define SMPA_SUVD_CGC_GATE__ENT_MASK                                                                          0x00008000L +#define SMPA_SUVD_CGC_GATE__IME_MASK                                                                          0x00010000L +#define SMPA_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                 0x00020000L +#define SMPA_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                 0x00040000L +#define SMPA_SUVD_CGC_GATE__SITE_MASK                                                                         0x00080000L +#define SMPA_SUVD_CGC_GATE__SRE_VP9_MASK                                                                      0x00100000L +#define SMPA_SUVD_CGC_GATE__SCM_VP9_MASK                                                                      0x00200000L +#define SMPA_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                  0x00400000L +#define SMPA_SUVD_CGC_GATE__SDB_VP9_MASK                                                                      0x00800000L +#define SMPA_SUVD_CGC_GATE__IME_HEVC_MASK                                                                     0x01000000L +#define SMPA_SUVD_CGC_GATE__EFC_MASK                                                                          0x02000000L +#define SMPA_SUVD_CGC_GATE__SAOE_MASK                                                                         0x04000000L +#define SMPA_SUVD_CGC_GATE__SRE_AV1_MASK                                                                      0x08000000L +#define SMPA_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                     0x10000000L +#define SMPA_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                     0x20000000L +#define SMPA_SUVD_CGC_GATE__SCM_AV1_MASK                                                                      0x40000000L +#define SMPA_SUVD_CGC_GATE__SMPA_MASK                                                                         0x80000000L +//SMP_SUVD_CGC_GATE +#define SMP_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define SMP_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define SMP_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define SMP_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define SMP_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define SMP_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define SMP_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define SMP_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define SMP_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define SMP_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define SMP_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define SMP_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define SMP_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define SMP_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define SMP_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define SMP_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define SMP_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define SMP_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define SMP_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define SMP_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define SMP_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define SMP_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define SMP_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define SMP_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define SMP_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define SMP_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define SMP_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define SMP_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define SMP_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define SMP_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define SMP_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define SMP_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define SMP_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define SMP_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define SMP_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define SMP_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define SMP_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define SMP_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define SMP_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define SMP_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define SMP_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define SMP_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define SMP_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define SMP_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define SMP_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define SMP_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define SMP_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define SMP_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define SMP_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define SMP_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define SMP_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define SMP_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define SMP_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define SMP_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define SMP_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define SMP_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define SMP_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define SMP_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define SMP_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define SMP_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define SMP_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define SMP_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define SMP_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define SMP_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//SRE_SUVD_CGC_GATE +#define SRE_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define SRE_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define SRE_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define SRE_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define SRE_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define SRE_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define SRE_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define SRE_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define SRE_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define SRE_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define SRE_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define SRE_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define SRE_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define SRE_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define SRE_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define SRE_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define SRE_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define SRE_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define SRE_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define SRE_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define SRE_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define SRE_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define SRE_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define SRE_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define SRE_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define SRE_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define SRE_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define SRE_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define SRE_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define SRE_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define SRE_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define SRE_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define SRE_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define SRE_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define SRE_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define SRE_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define SRE_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define SRE_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define SRE_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define SRE_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define SRE_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define SRE_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define SRE_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define SRE_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define SRE_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define SRE_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define SRE_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define SRE_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define SRE_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define SRE_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define SRE_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define SRE_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define SRE_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define SRE_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define SRE_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define SRE_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define SRE_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define SRE_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define SRE_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define SRE_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define SRE_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define SRE_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define SRE_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define SRE_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//UVD_MPBE0_SUVD_CGC_GATE +#define UVD_MPBE0_SUVD_CGC_GATE__SRE__SHIFT                                                                   0x0 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT__SHIFT                                                                   0x1 +#define UVD_MPBE0_SUVD_CGC_GATE__SMP__SHIFT                                                                   0x2 +#define UVD_MPBE0_SUVD_CGC_GATE__SCM__SHIFT                                                                   0x3 +#define UVD_MPBE0_SUVD_CGC_GATE__SDB__SHIFT                                                                   0x4 +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_H264__SHIFT                                                              0x5 +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                              0x6 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_H264__SHIFT                                                              0x7 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                              0x8 +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_H264__SHIFT                                                              0x9 +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                              0xa +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_H264__SHIFT                                                              0xb +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                              0xc +#define UVD_MPBE0_SUVD_CGC_GATE__SCLR__SHIFT                                                                  0xd +#define UVD_MPBE0_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                0xe +#define UVD_MPBE0_SUVD_CGC_GATE__ENT__SHIFT                                                                   0xf +#define UVD_MPBE0_SUVD_CGC_GATE__IME__SHIFT                                                                   0x10 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                          0x11 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                          0x12 +#define UVD_MPBE0_SUVD_CGC_GATE__SITE__SHIFT                                                                  0x13 +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                               0x14 +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                               0x15 +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                           0x16 +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                               0x17 +#define UVD_MPBE0_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                              0x18 +#define UVD_MPBE0_SUVD_CGC_GATE__EFC__SHIFT                                                                   0x19 +#define UVD_MPBE0_SUVD_CGC_GATE__SAOE__SHIFT                                                                  0x1a +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                               0x1b +#define UVD_MPBE0_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                              0x1c +#define UVD_MPBE0_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                              0x1d +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                               0x1e +#define UVD_MPBE0_SUVD_CGC_GATE__SMPA__SHIFT                                                                  0x1f +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_MASK                                                                     0x00000001L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_MASK                                                                     0x00000002L +#define UVD_MPBE0_SUVD_CGC_GATE__SMP_MASK                                                                     0x00000004L +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_MASK                                                                     0x00000008L +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_MASK                                                                     0x00000010L +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_H264_MASK                                                                0x00000020L +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                0x00000040L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_H264_MASK                                                                0x00000080L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                0x00000100L +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_H264_MASK                                                                0x00000200L +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                0x00000400L +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_H264_MASK                                                                0x00000800L +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                0x00001000L +#define UVD_MPBE0_SUVD_CGC_GATE__SCLR_MASK                                                                    0x00002000L +#define UVD_MPBE0_SUVD_CGC_GATE__UVD_SC_MASK                                                                  0x00004000L +#define UVD_MPBE0_SUVD_CGC_GATE__ENT_MASK                                                                     0x00008000L +#define UVD_MPBE0_SUVD_CGC_GATE__IME_MASK                                                                     0x00010000L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                            0x00020000L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                            0x00040000L +#define UVD_MPBE0_SUVD_CGC_GATE__SITE_MASK                                                                    0x00080000L +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_VP9_MASK                                                                 0x00100000L +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_VP9_MASK                                                                 0x00200000L +#define UVD_MPBE0_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                             0x00400000L +#define UVD_MPBE0_SUVD_CGC_GATE__SDB_VP9_MASK                                                                 0x00800000L +#define UVD_MPBE0_SUVD_CGC_GATE__IME_HEVC_MASK                                                                0x01000000L +#define UVD_MPBE0_SUVD_CGC_GATE__EFC_MASK                                                                     0x02000000L +#define UVD_MPBE0_SUVD_CGC_GATE__SAOE_MASK                                                                    0x04000000L +#define UVD_MPBE0_SUVD_CGC_GATE__SRE_AV1_MASK                                                                 0x08000000L +#define UVD_MPBE0_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                0x10000000L +#define UVD_MPBE0_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                0x20000000L +#define UVD_MPBE0_SUVD_CGC_GATE__SCM_AV1_MASK                                                                 0x40000000L +#define UVD_MPBE0_SUVD_CGC_GATE__SMPA_MASK                                                                    0x80000000L +//UVD_MPBE1_SUVD_CGC_GATE +#define UVD_MPBE1_SUVD_CGC_GATE__SRE__SHIFT                                                                   0x0 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT__SHIFT                                                                   0x1 +#define UVD_MPBE1_SUVD_CGC_GATE__SMP__SHIFT                                                                   0x2 +#define UVD_MPBE1_SUVD_CGC_GATE__SCM__SHIFT                                                                   0x3 +#define UVD_MPBE1_SUVD_CGC_GATE__SDB__SHIFT                                                                   0x4 +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_H264__SHIFT                                                              0x5 +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                              0x6 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_H264__SHIFT                                                              0x7 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                              0x8 +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_H264__SHIFT                                                              0x9 +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                              0xa +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_H264__SHIFT                                                              0xb +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                              0xc +#define UVD_MPBE1_SUVD_CGC_GATE__SCLR__SHIFT                                                                  0xd +#define UVD_MPBE1_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                0xe +#define UVD_MPBE1_SUVD_CGC_GATE__ENT__SHIFT                                                                   0xf +#define UVD_MPBE1_SUVD_CGC_GATE__IME__SHIFT                                                                   0x10 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                          0x11 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                          0x12 +#define UVD_MPBE1_SUVD_CGC_GATE__SITE__SHIFT                                                                  0x13 +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                               0x14 +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                               0x15 +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                           0x16 +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                               0x17 +#define UVD_MPBE1_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                              0x18 +#define UVD_MPBE1_SUVD_CGC_GATE__EFC__SHIFT                                                                   0x19 +#define UVD_MPBE1_SUVD_CGC_GATE__SAOE__SHIFT                                                                  0x1a +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                               0x1b +#define UVD_MPBE1_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                              0x1c +#define UVD_MPBE1_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                              0x1d +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                               0x1e +#define UVD_MPBE1_SUVD_CGC_GATE__SMPA__SHIFT                                                                  0x1f +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_MASK                                                                     0x00000001L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_MASK                                                                     0x00000002L +#define UVD_MPBE1_SUVD_CGC_GATE__SMP_MASK                                                                     0x00000004L +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_MASK                                                                     0x00000008L +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_MASK                                                                     0x00000010L +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_H264_MASK                                                                0x00000020L +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                0x00000040L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_H264_MASK                                                                0x00000080L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                0x00000100L +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_H264_MASK                                                                0x00000200L +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                0x00000400L +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_H264_MASK                                                                0x00000800L +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                0x00001000L +#define UVD_MPBE1_SUVD_CGC_GATE__SCLR_MASK                                                                    0x00002000L +#define UVD_MPBE1_SUVD_CGC_GATE__UVD_SC_MASK                                                                  0x00004000L +#define UVD_MPBE1_SUVD_CGC_GATE__ENT_MASK                                                                     0x00008000L +#define UVD_MPBE1_SUVD_CGC_GATE__IME_MASK                                                                     0x00010000L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                            0x00020000L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                            0x00040000L +#define UVD_MPBE1_SUVD_CGC_GATE__SITE_MASK                                                                    0x00080000L +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_VP9_MASK                                                                 0x00100000L +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_VP9_MASK                                                                 0x00200000L +#define UVD_MPBE1_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                             0x00400000L +#define UVD_MPBE1_SUVD_CGC_GATE__SDB_VP9_MASK                                                                 0x00800000L +#define UVD_MPBE1_SUVD_CGC_GATE__IME_HEVC_MASK                                                                0x01000000L +#define UVD_MPBE1_SUVD_CGC_GATE__EFC_MASK                                                                     0x02000000L +#define UVD_MPBE1_SUVD_CGC_GATE__SAOE_MASK                                                                    0x04000000L +#define UVD_MPBE1_SUVD_CGC_GATE__SRE_AV1_MASK                                                                 0x08000000L +#define UVD_MPBE1_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                0x10000000L +#define UVD_MPBE1_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                0x20000000L +#define UVD_MPBE1_SUVD_CGC_GATE__SCM_AV1_MASK                                                                 0x40000000L +#define UVD_MPBE1_SUVD_CGC_GATE__SMPA_MASK                                                                    0x80000000L +//UVD_SUVD_CGC_GATE +#define UVD_SUVD_CGC_GATE__SRE__SHIFT                                                                         0x0 +#define UVD_SUVD_CGC_GATE__SIT__SHIFT                                                                         0x1 +#define UVD_SUVD_CGC_GATE__SMP__SHIFT                                                                         0x2 +#define UVD_SUVD_CGC_GATE__SCM__SHIFT                                                                         0x3 +#define UVD_SUVD_CGC_GATE__SDB__SHIFT                                                                         0x4 +#define UVD_SUVD_CGC_GATE__SRE_H264__SHIFT                                                                    0x5 +#define UVD_SUVD_CGC_GATE__SRE_HEVC__SHIFT                                                                    0x6 +#define UVD_SUVD_CGC_GATE__SIT_H264__SHIFT                                                                    0x7 +#define UVD_SUVD_CGC_GATE__SIT_HEVC__SHIFT                                                                    0x8 +#define UVD_SUVD_CGC_GATE__SCM_H264__SHIFT                                                                    0x9 +#define UVD_SUVD_CGC_GATE__SCM_HEVC__SHIFT                                                                    0xa +#define UVD_SUVD_CGC_GATE__SDB_H264__SHIFT                                                                    0xb +#define UVD_SUVD_CGC_GATE__SDB_HEVC__SHIFT                                                                    0xc +#define UVD_SUVD_CGC_GATE__SCLR__SHIFT                                                                        0xd +#define UVD_SUVD_CGC_GATE__UVD_SC__SHIFT                                                                      0xe +#define UVD_SUVD_CGC_GATE__ENT__SHIFT                                                                         0xf +#define UVD_SUVD_CGC_GATE__IME__SHIFT                                                                         0x10 +#define UVD_SUVD_CGC_GATE__SIT_HEVC_DEC__SHIFT                                                                0x11 +#define UVD_SUVD_CGC_GATE__SIT_HEVC_ENC__SHIFT                                                                0x12 +#define UVD_SUVD_CGC_GATE__SITE__SHIFT                                                                        0x13 +#define UVD_SUVD_CGC_GATE__SRE_VP9__SHIFT                                                                     0x14 +#define UVD_SUVD_CGC_GATE__SCM_VP9__SHIFT                                                                     0x15 +#define UVD_SUVD_CGC_GATE__SIT_VP9_DEC__SHIFT                                                                 0x16 +#define UVD_SUVD_CGC_GATE__SDB_VP9__SHIFT                                                                     0x17 +#define UVD_SUVD_CGC_GATE__IME_HEVC__SHIFT                                                                    0x18 +#define UVD_SUVD_CGC_GATE__EFC__SHIFT                                                                         0x19 +#define UVD_SUVD_CGC_GATE__SAOE__SHIFT                                                                        0x1a +#define UVD_SUVD_CGC_GATE__SRE_AV1__SHIFT                                                                     0x1b +#define UVD_SUVD_CGC_GATE__FBC_PCLK__SHIFT                                                                    0x1c +#define UVD_SUVD_CGC_GATE__FBC_CCLK__SHIFT                                                                    0x1d +#define UVD_SUVD_CGC_GATE__SCM_AV1__SHIFT                                                                     0x1e +#define UVD_SUVD_CGC_GATE__SMPA__SHIFT                                                                        0x1f +#define UVD_SUVD_CGC_GATE__SRE_MASK                                                                           0x00000001L +#define UVD_SUVD_CGC_GATE__SIT_MASK                                                                           0x00000002L +#define UVD_SUVD_CGC_GATE__SMP_MASK                                                                           0x00000004L +#define UVD_SUVD_CGC_GATE__SCM_MASK                                                                           0x00000008L +#define UVD_SUVD_CGC_GATE__SDB_MASK                                                                           0x00000010L +#define UVD_SUVD_CGC_GATE__SRE_H264_MASK                                                                      0x00000020L +#define UVD_SUVD_CGC_GATE__SRE_HEVC_MASK                                                                      0x00000040L +#define UVD_SUVD_CGC_GATE__SIT_H264_MASK                                                                      0x00000080L +#define UVD_SUVD_CGC_GATE__SIT_HEVC_MASK                                                                      0x00000100L +#define UVD_SUVD_CGC_GATE__SCM_H264_MASK                                                                      0x00000200L +#define UVD_SUVD_CGC_GATE__SCM_HEVC_MASK                                                                      0x00000400L +#define UVD_SUVD_CGC_GATE__SDB_H264_MASK                                                                      0x00000800L +#define UVD_SUVD_CGC_GATE__SDB_HEVC_MASK                                                                      0x00001000L +#define UVD_SUVD_CGC_GATE__SCLR_MASK                                                                          0x00002000L +#define UVD_SUVD_CGC_GATE__UVD_SC_MASK                                                                        0x00004000L +#define UVD_SUVD_CGC_GATE__ENT_MASK                                                                           0x00008000L +#define UVD_SUVD_CGC_GATE__IME_MASK                                                                           0x00010000L +#define UVD_SUVD_CGC_GATE__SIT_HEVC_DEC_MASK                                                                  0x00020000L +#define UVD_SUVD_CGC_GATE__SIT_HEVC_ENC_MASK                                                                  0x00040000L +#define UVD_SUVD_CGC_GATE__SITE_MASK                                                                          0x00080000L +#define UVD_SUVD_CGC_GATE__SRE_VP9_MASK                                                                       0x00100000L +#define UVD_SUVD_CGC_GATE__SCM_VP9_MASK                                                                       0x00200000L +#define UVD_SUVD_CGC_GATE__SIT_VP9_DEC_MASK                                                                   0x00400000L +#define UVD_SUVD_CGC_GATE__SDB_VP9_MASK                                                                       0x00800000L +#define UVD_SUVD_CGC_GATE__IME_HEVC_MASK                                                                      0x01000000L +#define UVD_SUVD_CGC_GATE__EFC_MASK                                                                           0x02000000L +#define UVD_SUVD_CGC_GATE__SAOE_MASK                                                                          0x04000000L +#define UVD_SUVD_CGC_GATE__SRE_AV1_MASK                                                                       0x08000000L +#define UVD_SUVD_CGC_GATE__FBC_PCLK_MASK                                                                      0x10000000L +#define UVD_SUVD_CGC_GATE__FBC_CCLK_MASK                                                                      0x20000000L +#define UVD_SUVD_CGC_GATE__SCM_AV1_MASK                                                                       0x40000000L +#define UVD_SUVD_CGC_GATE__SMPA_MASK                                                                          0x80000000L +//AVM_SUVD_CGC_GATE2 +#define AVM_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define AVM_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define AVM_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define AVM_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define AVM_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define AVM_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define AVM_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define AVM_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define AVM_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define AVM_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define AVM_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define AVM_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define AVM_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define AVM_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define AVM_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define AVM_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define AVM_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define AVM_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define AVM_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define AVM_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define AVM_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define AVM_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define AVM_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define AVM_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//CDEFE_SUVD_CGC_GATE2 +#define CDEFE_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                    0x0 +#define CDEFE_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                    0x1 +#define CDEFE_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                  0x2 +#define CDEFE_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                  0x3 +#define CDEFE_SUVD_CGC_GATE2__MPC1__SHIFT                                                                     0x4 +#define CDEFE_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                              0x5 +#define CDEFE_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                    0x6 +#define CDEFE_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                    0x7 +#define CDEFE_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                    0x8 +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                              0x9 +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                              0xa +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                              0xb +#define CDEFE_SUVD_CGC_GATE2__MPBE0_MASK                                                                      0x00000001L +#define CDEFE_SUVD_CGC_GATE2__MPBE1_MASK                                                                      0x00000002L +#define CDEFE_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                    0x00000004L +#define CDEFE_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                    0x00000008L +#define CDEFE_SUVD_CGC_GATE2__MPC1_MASK                                                                       0x00000010L +#define CDEFE_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                0x00000020L +#define CDEFE_SUVD_CGC_GATE2__CDEFE_MASK                                                                      0x00000040L +#define CDEFE_SUVD_CGC_GATE2__AVM_0_MASK                                                                      0x00000080L +#define CDEFE_SUVD_CGC_GATE2__AVM_1_MASK                                                                      0x00000100L +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                0x00000200L +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                0x00000400L +#define CDEFE_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                0x00000800L +//DBR_SUVD_CGC_GATE2 +#define DBR_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define DBR_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define DBR_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define DBR_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define DBR_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define DBR_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define DBR_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define DBR_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define DBR_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define DBR_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define DBR_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define DBR_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define DBR_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define DBR_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define DBR_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define DBR_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define DBR_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define DBR_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define DBR_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define DBR_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define DBR_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define DBR_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define DBR_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define DBR_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//ENT_SUVD_CGC_GATE2 +#define ENT_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define ENT_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define ENT_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define ENT_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define ENT_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define ENT_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define ENT_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define ENT_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define ENT_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define ENT_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define ENT_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define ENT_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define ENT_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define ENT_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define ENT_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define ENT_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define ENT_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define ENT_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define ENT_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define ENT_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define ENT_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define ENT_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define ENT_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define ENT_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//IME_SUVD_CGC_GATE2 +#define IME_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define IME_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define IME_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define IME_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define IME_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define IME_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define IME_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define IME_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define IME_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define IME_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define IME_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define IME_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define IME_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define IME_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define IME_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define IME_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define IME_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define IME_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define IME_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define IME_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define IME_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define IME_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define IME_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define IME_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//MPC1_SUVD_CGC_GATE2 +#define MPC1_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                     0x0 +#define MPC1_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                     0x1 +#define MPC1_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                   0x2 +#define MPC1_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                   0x3 +#define MPC1_SUVD_CGC_GATE2__MPC1__SHIFT                                                                      0x4 +#define MPC1_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                               0x5 +#define MPC1_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                     0x6 +#define MPC1_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                     0x7 +#define MPC1_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                     0x8 +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                               0x9 +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                               0xa +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                               0xb +#define MPC1_SUVD_CGC_GATE2__MPBE0_MASK                                                                       0x00000001L +#define MPC1_SUVD_CGC_GATE2__MPBE1_MASK                                                                       0x00000002L +#define MPC1_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                     0x00000004L +#define MPC1_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                     0x00000008L +#define MPC1_SUVD_CGC_GATE2__MPC1_MASK                                                                        0x00000010L +#define MPC1_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                 0x00000020L +#define MPC1_SUVD_CGC_GATE2__CDEFE_MASK                                                                       0x00000040L +#define MPC1_SUVD_CGC_GATE2__AVM_0_MASK                                                                       0x00000080L +#define MPC1_SUVD_CGC_GATE2__AVM_1_MASK                                                                       0x00000100L +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                 0x00000200L +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                 0x00000400L +#define MPC1_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                 0x00000800L +//SAOE_SUVD_CGC_GATE2 +#define SAOE_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                     0x0 +#define SAOE_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                     0x1 +#define SAOE_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                   0x2 +#define SAOE_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                   0x3 +#define SAOE_SUVD_CGC_GATE2__MPC1__SHIFT                                                                      0x4 +#define SAOE_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                               0x5 +#define SAOE_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                     0x6 +#define SAOE_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                     0x7 +#define SAOE_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                     0x8 +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                               0x9 +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                               0xa +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                               0xb +#define SAOE_SUVD_CGC_GATE2__MPBE0_MASK                                                                       0x00000001L +#define SAOE_SUVD_CGC_GATE2__MPBE1_MASK                                                                       0x00000002L +#define SAOE_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                     0x00000004L +#define SAOE_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                     0x00000008L +#define SAOE_SUVD_CGC_GATE2__MPC1_MASK                                                                        0x00000010L +#define SAOE_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                 0x00000020L +#define SAOE_SUVD_CGC_GATE2__CDEFE_MASK                                                                       0x00000040L +#define SAOE_SUVD_CGC_GATE2__AVM_0_MASK                                                                       0x00000080L +#define SAOE_SUVD_CGC_GATE2__AVM_1_MASK                                                                       0x00000100L +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                 0x00000200L +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                 0x00000400L +#define SAOE_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                 0x00000800L +//SDB_SUVD_CGC_GATE2 +#define SDB_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define SDB_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define SDB_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define SDB_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define SDB_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define SDB_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define SDB_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define SDB_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define SDB_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define SDB_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define SDB_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define SDB_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define SDB_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define SDB_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define SDB_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define SDB_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define SDB_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define SDB_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define SDB_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define SDB_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define SDB_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define SDB_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define SDB_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define SDB_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//SIT0_NXT_SUVD_CGC_GATE2 +#define SIT0_NXT_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                 0x0 +#define SIT0_NXT_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                 0x1 +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                               0x2 +#define SIT0_NXT_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                               0x3 +#define SIT0_NXT_SUVD_CGC_GATE2__MPC1__SHIFT                                                                  0x4 +#define SIT0_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                           0x5 +#define SIT0_NXT_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                 0x6 +#define SIT0_NXT_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                 0x7 +#define SIT0_NXT_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                 0x8 +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                           0x9 +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                           0xa +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                           0xb +#define SIT0_NXT_SUVD_CGC_GATE2__MPBE0_MASK                                                                   0x00000001L +#define SIT0_NXT_SUVD_CGC_GATE2__MPBE1_MASK                                                                   0x00000002L +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                 0x00000004L +#define SIT0_NXT_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                 0x00000008L +#define SIT0_NXT_SUVD_CGC_GATE2__MPC1_MASK                                                                    0x00000010L +#define SIT0_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                             0x00000020L +#define SIT0_NXT_SUVD_CGC_GATE2__CDEFE_MASK                                                                   0x00000040L +#define SIT0_NXT_SUVD_CGC_GATE2__AVM_0_MASK                                                                   0x00000080L +#define SIT0_NXT_SUVD_CGC_GATE2__AVM_1_MASK                                                                   0x00000100L +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                             0x00000200L +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                             0x00000400L +#define SIT0_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                             0x00000800L +//SIT1_NXT_SUVD_CGC_GATE2 +#define SIT1_NXT_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                 0x0 +#define SIT1_NXT_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                 0x1 +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                               0x2 +#define SIT1_NXT_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                               0x3 +#define SIT1_NXT_SUVD_CGC_GATE2__MPC1__SHIFT                                                                  0x4 +#define SIT1_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                           0x5 +#define SIT1_NXT_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                 0x6 +#define SIT1_NXT_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                 0x7 +#define SIT1_NXT_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                 0x8 +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                           0x9 +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                           0xa +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                           0xb +#define SIT1_NXT_SUVD_CGC_GATE2__MPBE0_MASK                                                                   0x00000001L +#define SIT1_NXT_SUVD_CGC_GATE2__MPBE1_MASK                                                                   0x00000002L +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                 0x00000004L +#define SIT1_NXT_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                 0x00000008L +#define SIT1_NXT_SUVD_CGC_GATE2__MPC1_MASK                                                                    0x00000010L +#define SIT1_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                             0x00000020L +#define SIT1_NXT_SUVD_CGC_GATE2__CDEFE_MASK                                                                   0x00000040L +#define SIT1_NXT_SUVD_CGC_GATE2__AVM_0_MASK                                                                   0x00000080L +#define SIT1_NXT_SUVD_CGC_GATE2__AVM_1_MASK                                                                   0x00000100L +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                             0x00000200L +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                             0x00000400L +#define SIT1_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                             0x00000800L +//SIT2_NXT_SUVD_CGC_GATE2 +#define SIT2_NXT_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                 0x0 +#define SIT2_NXT_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                 0x1 +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                               0x2 +#define SIT2_NXT_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                               0x3 +#define SIT2_NXT_SUVD_CGC_GATE2__MPC1__SHIFT                                                                  0x4 +#define SIT2_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                           0x5 +#define SIT2_NXT_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                 0x6 +#define SIT2_NXT_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                 0x7 +#define SIT2_NXT_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                 0x8 +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                           0x9 +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                           0xa +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                           0xb +#define SIT2_NXT_SUVD_CGC_GATE2__MPBE0_MASK                                                                   0x00000001L +#define SIT2_NXT_SUVD_CGC_GATE2__MPBE1_MASK                                                                   0x00000002L +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                 0x00000004L +#define SIT2_NXT_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                 0x00000008L +#define SIT2_NXT_SUVD_CGC_GATE2__MPC1_MASK                                                                    0x00000010L +#define SIT2_NXT_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                             0x00000020L +#define SIT2_NXT_SUVD_CGC_GATE2__CDEFE_MASK                                                                   0x00000040L +#define SIT2_NXT_SUVD_CGC_GATE2__AVM_0_MASK                                                                   0x00000080L +#define SIT2_NXT_SUVD_CGC_GATE2__AVM_1_MASK                                                                   0x00000100L +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                             0x00000200L +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                             0x00000400L +#define SIT2_NXT_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                             0x00000800L +//SIT_SUVD_CGC_GATE2 +#define SIT_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define SIT_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define SIT_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define SIT_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define SIT_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define SIT_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define SIT_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define SIT_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define SIT_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define SIT_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define SIT_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define SIT_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define SIT_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define SIT_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define SIT_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define SIT_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define SIT_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define SIT_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define SIT_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define SIT_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define SIT_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define SIT_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define SIT_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define SIT_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//SMPA_SUVD_CGC_GATE2 +#define SMPA_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                     0x0 +#define SMPA_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                     0x1 +#define SMPA_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                   0x2 +#define SMPA_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                   0x3 +#define SMPA_SUVD_CGC_GATE2__MPC1__SHIFT                                                                      0x4 +#define SMPA_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                               0x5 +#define SMPA_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                     0x6 +#define SMPA_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                     0x7 +#define SMPA_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                     0x8 +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                               0x9 +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                               0xa +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                               0xb +#define SMPA_SUVD_CGC_GATE2__MPBE0_MASK                                                                       0x00000001L +#define SMPA_SUVD_CGC_GATE2__MPBE1_MASK                                                                       0x00000002L +#define SMPA_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                     0x00000004L +#define SMPA_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                     0x00000008L +#define SMPA_SUVD_CGC_GATE2__MPC1_MASK                                                                        0x00000010L +#define SMPA_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                 0x00000020L +#define SMPA_SUVD_CGC_GATE2__CDEFE_MASK                                                                       0x00000040L +#define SMPA_SUVD_CGC_GATE2__AVM_0_MASK                                                                       0x00000080L +#define SMPA_SUVD_CGC_GATE2__AVM_1_MASK                                                                       0x00000100L +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                 0x00000200L +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                 0x00000400L +#define SMPA_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                 0x00000800L +//SMP_SUVD_CGC_GATE2 +#define SMP_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define SMP_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define SMP_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define SMP_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define SMP_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define SMP_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define SMP_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define SMP_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define SMP_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define SMP_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define SMP_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define SMP_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define SMP_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define SMP_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define SMP_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define SMP_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define SMP_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define SMP_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define SMP_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define SMP_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define SMP_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define SMP_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define SMP_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define SMP_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//SRE_SUVD_CGC_GATE2 +#define SRE_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define SRE_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define SRE_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define SRE_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define SRE_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define SRE_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define SRE_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define SRE_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define SRE_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define SRE_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define SRE_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define SRE_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define SRE_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define SRE_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define SRE_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define SRE_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define SRE_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define SRE_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define SRE_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define SRE_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define SRE_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define SRE_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define SRE_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define SRE_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//UVD_MPBE0_SUVD_CGC_GATE2 +#define UVD_MPBE0_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                0x0 +#define UVD_MPBE0_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                0x1 +#define UVD_MPBE0_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                              0x2 +#define UVD_MPBE0_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                              0x3 +#define UVD_MPBE0_SUVD_CGC_GATE2__MPC1__SHIFT                                                                 0x4 +#define UVD_MPBE0_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                          0x5 +#define UVD_MPBE0_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                0x6 +#define UVD_MPBE0_SUVD_CGC_GATE2__MPBE0_MASK                                                                  0x00000001L +#define UVD_MPBE0_SUVD_CGC_GATE2__MPBE1_MASK                                                                  0x00000002L +#define UVD_MPBE0_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                0x00000004L +#define UVD_MPBE0_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                0x00000008L +#define UVD_MPBE0_SUVD_CGC_GATE2__MPC1_MASK                                                                   0x00000010L +#define UVD_MPBE0_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                            0x00000020L +#define UVD_MPBE0_SUVD_CGC_GATE2__CDEFE_MASK                                                                  0x00000040L +//UVD_MPBE1_SUVD_CGC_GATE2 +#define UVD_MPBE1_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                0x0 +#define UVD_MPBE1_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                0x1 +#define UVD_MPBE1_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                              0x2 +#define UVD_MPBE1_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                              0x3 +#define UVD_MPBE1_SUVD_CGC_GATE2__MPC1__SHIFT                                                                 0x4 +#define UVD_MPBE1_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                          0x5 +#define UVD_MPBE1_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                0x6 +#define UVD_MPBE1_SUVD_CGC_GATE2__MPBE0_MASK                                                                  0x00000001L +#define UVD_MPBE1_SUVD_CGC_GATE2__MPBE1_MASK                                                                  0x00000002L +#define UVD_MPBE1_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                0x00000004L +#define UVD_MPBE1_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                0x00000008L +#define UVD_MPBE1_SUVD_CGC_GATE2__MPC1_MASK                                                                   0x00000010L +#define UVD_MPBE1_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                            0x00000020L +#define UVD_MPBE1_SUVD_CGC_GATE2__CDEFE_MASK                                                                  0x00000040L +//UVD_SUVD_CGC_GATE2 +#define UVD_SUVD_CGC_GATE2__MPBE0__SHIFT                                                                      0x0 +#define UVD_SUVD_CGC_GATE2__MPBE1__SHIFT                                                                      0x1 +#define UVD_SUVD_CGC_GATE2__SIT_AV1__SHIFT                                                                    0x2 +#define UVD_SUVD_CGC_GATE2__SDB_AV1__SHIFT                                                                    0x3 +#define UVD_SUVD_CGC_GATE2__MPC1__SHIFT                                                                       0x4 +#define UVD_SUVD_CGC_GATE2__SRE_AV1_ENC__SHIFT                                                                0x5 +#define UVD_SUVD_CGC_GATE2__CDEFE__SHIFT                                                                      0x6 +#define UVD_SUVD_CGC_GATE2__AVM_0__SHIFT                                                                      0x7 +#define UVD_SUVD_CGC_GATE2__AVM_1__SHIFT                                                                      0x8 +#define UVD_SUVD_CGC_GATE2__SIT_NXT_CMN__SHIFT                                                                0x9 +#define UVD_SUVD_CGC_GATE2__SIT_NXT_DEC__SHIFT                                                                0xa +#define UVD_SUVD_CGC_GATE2__SIT_NXT_ENC__SHIFT                                                                0xb +#define UVD_SUVD_CGC_GATE2__MPBE0_MASK                                                                        0x00000001L +#define UVD_SUVD_CGC_GATE2__MPBE1_MASK                                                                        0x00000002L +#define UVD_SUVD_CGC_GATE2__SIT_AV1_MASK                                                                      0x00000004L +#define UVD_SUVD_CGC_GATE2__SDB_AV1_MASK                                                                      0x00000008L +#define UVD_SUVD_CGC_GATE2__MPC1_MASK                                                                         0x00000010L +#define UVD_SUVD_CGC_GATE2__SRE_AV1_ENC_MASK                                                                  0x00000020L +#define UVD_SUVD_CGC_GATE2__CDEFE_MASK                                                                        0x00000040L +#define UVD_SUVD_CGC_GATE2__AVM_0_MASK                                                                        0x00000080L +#define UVD_SUVD_CGC_GATE2__AVM_1_MASK                                                                        0x00000100L +#define UVD_SUVD_CGC_GATE2__SIT_NXT_CMN_MASK                                                                  0x00000200L +#define UVD_SUVD_CGC_GATE2__SIT_NXT_DEC_MASK                                                                  0x00000400L +#define UVD_SUVD_CGC_GATE2__SIT_NXT_ENC_MASK                                                                  0x00000800L +//AVM_SUVD_CGC_CTRL +#define AVM_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define AVM_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define AVM_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define AVM_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define AVM_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define AVM_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define AVM_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define AVM_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define AVM_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define AVM_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define AVM_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define AVM_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define AVM_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define AVM_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define AVM_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define AVM_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define AVM_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define AVM_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define AVM_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define AVM_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define AVM_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define AVM_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define AVM_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define AVM_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define AVM_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define AVM_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define AVM_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define AVM_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define AVM_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define AVM_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define AVM_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define AVM_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define AVM_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define AVM_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define AVM_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define AVM_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define AVM_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define AVM_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define AVM_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define AVM_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define AVM_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define AVM_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define AVM_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define AVM_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define AVM_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define AVM_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define AVM_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define AVM_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define AVM_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define AVM_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define AVM_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define AVM_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//CDEFE_SUVD_CGC_CTRL +#define CDEFE_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                  0x0 +#define CDEFE_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                  0x1 +#define CDEFE_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                  0x2 +#define CDEFE_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                  0x3 +#define CDEFE_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                  0x4 +#define CDEFE_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                 0x5 +#define CDEFE_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                               0x6 +#define CDEFE_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                  0x7 +#define CDEFE_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                  0x8 +#define CDEFE_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                 0x9 +#define CDEFE_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                  0xa +#define CDEFE_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                 0xb +#define CDEFE_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                 0xc +#define CDEFE_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                0xd +#define CDEFE_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                0xe +#define CDEFE_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                              0xf +#define CDEFE_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                              0x10 +#define CDEFE_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                 0x11 +#define CDEFE_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                0x12 +#define CDEFE_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                0x13 +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                          0x14 +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                          0x15 +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                          0x16 +#define CDEFE_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                  0x1c +#define CDEFE_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                  0x1d +#define CDEFE_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                0x1e +#define CDEFE_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                    0x00000001L +#define CDEFE_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                    0x00000002L +#define CDEFE_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                    0x00000004L +#define CDEFE_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                    0x00000008L +#define CDEFE_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                    0x00000010L +#define CDEFE_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                   0x00000020L +#define CDEFE_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                 0x00000040L +#define CDEFE_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                    0x00000080L +#define CDEFE_SUVD_CGC_CTRL__IME_MODE_MASK                                                                    0x00000100L +#define CDEFE_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                   0x00000200L +#define CDEFE_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                    0x00000400L +#define CDEFE_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                   0x00000800L +#define CDEFE_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                   0x00001000L +#define CDEFE_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                  0x00002000L +#define CDEFE_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                  0x00004000L +#define CDEFE_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                0x00008000L +#define CDEFE_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                0x00010000L +#define CDEFE_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                   0x00020000L +#define CDEFE_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                  0x00040000L +#define CDEFE_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                  0x00080000L +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                            0x00100000L +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                            0x00200000L +#define CDEFE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                            0x00400000L +#define CDEFE_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                    0x10000000L +#define CDEFE_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                    0x20000000L +#define CDEFE_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                  0x40000000L +//DBR_SUVD_CGC_CTRL +#define DBR_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define DBR_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define DBR_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define DBR_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define DBR_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define DBR_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define DBR_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define DBR_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define DBR_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define DBR_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define DBR_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define DBR_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define DBR_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define DBR_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define DBR_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define DBR_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define DBR_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define DBR_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define DBR_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define DBR_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define DBR_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define DBR_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define DBR_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define DBR_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define DBR_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define DBR_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define DBR_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define DBR_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define DBR_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define DBR_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define DBR_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define DBR_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define DBR_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define DBR_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define DBR_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define DBR_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define DBR_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define DBR_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define DBR_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define DBR_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define DBR_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define DBR_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define DBR_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define DBR_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define DBR_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define DBR_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define DBR_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define DBR_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define DBR_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define DBR_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define DBR_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define DBR_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//EFC_SUVD_CGC_CTRL +#define EFC_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define EFC_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define EFC_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define EFC_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define EFC_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define EFC_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define EFC_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define EFC_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define EFC_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define EFC_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define EFC_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define EFC_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define EFC_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define EFC_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define EFC_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define EFC_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define EFC_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define EFC_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define EFC_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define EFC_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define EFC_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define EFC_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define EFC_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define EFC_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define EFC_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define EFC_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define EFC_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define EFC_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define EFC_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define EFC_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define EFC_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define EFC_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define EFC_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define EFC_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define EFC_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define EFC_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define EFC_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define EFC_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define EFC_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define EFC_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define EFC_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define EFC_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define EFC_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define EFC_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define EFC_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define EFC_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define EFC_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define EFC_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define EFC_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define EFC_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define EFC_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define EFC_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//ENT_SUVD_CGC_CTRL +#define ENT_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define ENT_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define ENT_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define ENT_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define ENT_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define ENT_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define ENT_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define ENT_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define ENT_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define ENT_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define ENT_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define ENT_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define ENT_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define ENT_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define ENT_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define ENT_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define ENT_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define ENT_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define ENT_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define ENT_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define ENT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define ENT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define ENT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define ENT_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define ENT_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define ENT_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define ENT_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define ENT_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define ENT_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define ENT_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define ENT_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define ENT_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define ENT_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define ENT_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define ENT_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define ENT_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define ENT_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define ENT_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define ENT_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define ENT_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define ENT_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define ENT_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define ENT_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define ENT_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define ENT_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define ENT_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define ENT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define ENT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define ENT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define ENT_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define ENT_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define ENT_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//IME_SUVD_CGC_CTRL +#define IME_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define IME_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define IME_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define IME_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define IME_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define IME_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define IME_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define IME_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define IME_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define IME_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define IME_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define IME_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define IME_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define IME_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define IME_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define IME_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define IME_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define IME_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define IME_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define IME_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define IME_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define IME_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define IME_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define IME_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define IME_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define IME_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define IME_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define IME_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define IME_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define IME_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define IME_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define IME_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define IME_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define IME_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define IME_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define IME_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define IME_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define IME_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define IME_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define IME_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define IME_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define IME_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define IME_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define IME_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define IME_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define IME_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define IME_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define IME_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define IME_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define IME_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define IME_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define IME_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//MPC1_SUVD_CGC_CTRL +#define MPC1_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                   0x0 +#define MPC1_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                   0x1 +#define MPC1_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                   0x2 +#define MPC1_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                   0x3 +#define MPC1_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                   0x4 +#define MPC1_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                  0x5 +#define MPC1_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                0x6 +#define MPC1_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                   0x7 +#define MPC1_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                   0x8 +#define MPC1_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                  0x9 +#define MPC1_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                   0xa +#define MPC1_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                  0xb +#define MPC1_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                  0xc +#define MPC1_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                 0xd +#define MPC1_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                 0xe +#define MPC1_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                               0xf +#define MPC1_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                               0x10 +#define MPC1_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                  0x11 +#define MPC1_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                 0x12 +#define MPC1_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                 0x13 +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                           0x14 +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                           0x15 +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                           0x16 +#define MPC1_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                   0x1c +#define MPC1_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                   0x1d +#define MPC1_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                 0x1e +#define MPC1_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                     0x00000001L +#define MPC1_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                     0x00000002L +#define MPC1_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                     0x00000004L +#define MPC1_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                     0x00000008L +#define MPC1_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                     0x00000010L +#define MPC1_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                    0x00000020L +#define MPC1_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                  0x00000040L +#define MPC1_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                     0x00000080L +#define MPC1_SUVD_CGC_CTRL__IME_MODE_MASK                                                                     0x00000100L +#define MPC1_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                    0x00000200L +#define MPC1_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                     0x00000400L +#define MPC1_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                    0x00000800L +#define MPC1_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                    0x00001000L +#define MPC1_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                   0x00002000L +#define MPC1_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                   0x00004000L +#define MPC1_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                 0x00008000L +#define MPC1_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                 0x00010000L +#define MPC1_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                    0x00020000L +#define MPC1_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                   0x00040000L +#define MPC1_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                   0x00080000L +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                             0x00100000L +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                             0x00200000L +#define MPC1_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                             0x00400000L +#define MPC1_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                     0x10000000L +#define MPC1_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                     0x20000000L +#define MPC1_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                   0x40000000L +//PPU_SUVD_CGC_CTRL +#define PPU_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define PPU_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define PPU_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define PPU_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define PPU_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define PPU_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define PPU_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define PPU_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define PPU_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define PPU_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define PPU_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define PPU_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define PPU_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define PPU_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define PPU_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define PPU_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define PPU_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define PPU_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define PPU_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define PPU_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define PPU_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define PPU_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define PPU_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define PPU_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define PPU_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define PPU_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define PPU_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define PPU_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define PPU_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define PPU_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define PPU_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define PPU_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define PPU_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define PPU_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define PPU_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define PPU_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define PPU_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define PPU_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define PPU_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define PPU_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define PPU_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define PPU_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define PPU_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define PPU_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define PPU_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define PPU_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define PPU_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define PPU_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define PPU_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define PPU_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define PPU_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define PPU_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//SAOE_SUVD_CGC_CTRL +#define SAOE_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                   0x0 +#define SAOE_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                   0x1 +#define SAOE_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                   0x2 +#define SAOE_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                   0x3 +#define SAOE_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                   0x4 +#define SAOE_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                  0x5 +#define SAOE_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                0x6 +#define SAOE_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                   0x7 +#define SAOE_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                   0x8 +#define SAOE_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                  0x9 +#define SAOE_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                   0xa +#define SAOE_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                  0xb +#define SAOE_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                  0xc +#define SAOE_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                 0xd +#define SAOE_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                 0xe +#define SAOE_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                               0xf +#define SAOE_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                               0x10 +#define SAOE_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                  0x11 +#define SAOE_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                 0x12 +#define SAOE_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                 0x13 +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                           0x14 +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                           0x15 +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                           0x16 +#define SAOE_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                   0x1c +#define SAOE_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                   0x1d +#define SAOE_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                 0x1e +#define SAOE_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                     0x00000001L +#define SAOE_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                     0x00000002L +#define SAOE_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                     0x00000004L +#define SAOE_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                     0x00000008L +#define SAOE_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                     0x00000010L +#define SAOE_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                    0x00000020L +#define SAOE_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                  0x00000040L +#define SAOE_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                     0x00000080L +#define SAOE_SUVD_CGC_CTRL__IME_MODE_MASK                                                                     0x00000100L +#define SAOE_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                    0x00000200L +#define SAOE_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                     0x00000400L +#define SAOE_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                    0x00000800L +#define SAOE_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                    0x00001000L +#define SAOE_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                   0x00002000L +#define SAOE_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                   0x00004000L +#define SAOE_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                 0x00008000L +#define SAOE_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                 0x00010000L +#define SAOE_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                    0x00020000L +#define SAOE_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                   0x00040000L +#define SAOE_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                   0x00080000L +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                             0x00100000L +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                             0x00200000L +#define SAOE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                             0x00400000L +#define SAOE_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                     0x10000000L +#define SAOE_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                     0x20000000L +#define SAOE_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                   0x40000000L +//SCM_SUVD_CGC_CTRL +#define SCM_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define SCM_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define SCM_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define SCM_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define SCM_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define SCM_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define SCM_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define SCM_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define SCM_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define SCM_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define SCM_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define SCM_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define SCM_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define SCM_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define SCM_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define SCM_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define SCM_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define SCM_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define SCM_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define SCM_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define SCM_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define SCM_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define SCM_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define SCM_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define SCM_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define SCM_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define SCM_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define SCM_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define SCM_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define SCM_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define SCM_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define SCM_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define SCM_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define SCM_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define SCM_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define SCM_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define SCM_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define SCM_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define SCM_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define SCM_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define SCM_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define SCM_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define SCM_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define SCM_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define SCM_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define SCM_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define SCM_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define SCM_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define SCM_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define SCM_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define SCM_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define SCM_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//SDB_SUVD_CGC_CTRL +#define SDB_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define SDB_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define SDB_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define SDB_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define SDB_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define SDB_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define SDB_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define SDB_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define SDB_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define SDB_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define SDB_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define SDB_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define SDB_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define SDB_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define SDB_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define SDB_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define SDB_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define SDB_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define SDB_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define SDB_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define SDB_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define SDB_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define SDB_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define SDB_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define SDB_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define SDB_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define SDB_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define SDB_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define SDB_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define SDB_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define SDB_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define SDB_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define SDB_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define SDB_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define SDB_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define SDB_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define SDB_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define SDB_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define SDB_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define SDB_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define SDB_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define SDB_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define SDB_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define SDB_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define SDB_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define SDB_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define SDB_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define SDB_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define SDB_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define SDB_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define SDB_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define SDB_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//SIT0_NXT_SUVD_CGC_CTRL +#define SIT0_NXT_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                               0x0 +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                               0x1 +#define SIT0_NXT_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                               0x2 +#define SIT0_NXT_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                               0x3 +#define SIT0_NXT_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                               0x4 +#define SIT0_NXT_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                              0x5 +#define SIT0_NXT_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                            0x6 +#define SIT0_NXT_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                               0x7 +#define SIT0_NXT_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                               0x8 +#define SIT0_NXT_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                              0x9 +#define SIT0_NXT_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                               0xa +#define SIT0_NXT_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                              0xb +#define SIT0_NXT_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                              0xc +#define SIT0_NXT_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                             0xd +#define SIT0_NXT_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                             0xe +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                           0xf +#define SIT0_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                           0x10 +#define SIT0_NXT_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                              0x11 +#define SIT0_NXT_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                             0x12 +#define SIT0_NXT_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                             0x13 +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                       0x14 +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                       0x15 +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                       0x16 +#define SIT0_NXT_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                               0x1c +#define SIT0_NXT_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                               0x1d +#define SIT0_NXT_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                             0x1e +#define SIT0_NXT_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                 0x00000001L +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                 0x00000002L +#define SIT0_NXT_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                 0x00000004L +#define SIT0_NXT_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                 0x00000008L +#define SIT0_NXT_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                 0x00000010L +#define SIT0_NXT_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                0x00000020L +#define SIT0_NXT_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                              0x00000040L +#define SIT0_NXT_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                 0x00000080L +#define SIT0_NXT_SUVD_CGC_CTRL__IME_MODE_MASK                                                                 0x00000100L +#define SIT0_NXT_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                0x00000200L +#define SIT0_NXT_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                 0x00000400L +#define SIT0_NXT_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                0x00000800L +#define SIT0_NXT_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                0x00001000L +#define SIT0_NXT_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                               0x00002000L +#define SIT0_NXT_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                               0x00004000L +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                             0x00008000L +#define SIT0_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                             0x00010000L +#define SIT0_NXT_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                0x00020000L +#define SIT0_NXT_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                               0x00040000L +#define SIT0_NXT_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                               0x00080000L +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                         0x00100000L +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                         0x00200000L +#define SIT0_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                         0x00400000L +#define SIT0_NXT_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT0_NXT_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT0_NXT_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                               0x40000000L +//SIT1_NXT_SUVD_CGC_CTRL +#define SIT1_NXT_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                               0x0 +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                               0x1 +#define SIT1_NXT_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                               0x2 +#define SIT1_NXT_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                               0x3 +#define SIT1_NXT_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                               0x4 +#define SIT1_NXT_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                              0x5 +#define SIT1_NXT_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                            0x6 +#define SIT1_NXT_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                               0x7 +#define SIT1_NXT_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                               0x8 +#define SIT1_NXT_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                              0x9 +#define SIT1_NXT_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                               0xa +#define SIT1_NXT_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                              0xb +#define SIT1_NXT_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                              0xc +#define SIT1_NXT_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                             0xd +#define SIT1_NXT_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                             0xe +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                           0xf +#define SIT1_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                           0x10 +#define SIT1_NXT_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                              0x11 +#define SIT1_NXT_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                             0x12 +#define SIT1_NXT_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                             0x13 +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                       0x14 +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                       0x15 +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                       0x16 +#define SIT1_NXT_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                               0x1c +#define SIT1_NXT_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                               0x1d +#define SIT1_NXT_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                             0x1e +#define SIT1_NXT_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                 0x00000001L +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                 0x00000002L +#define SIT1_NXT_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                 0x00000004L +#define SIT1_NXT_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                 0x00000008L +#define SIT1_NXT_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                 0x00000010L +#define SIT1_NXT_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                0x00000020L +#define SIT1_NXT_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                              0x00000040L +#define SIT1_NXT_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                 0x00000080L +#define SIT1_NXT_SUVD_CGC_CTRL__IME_MODE_MASK                                                                 0x00000100L +#define SIT1_NXT_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                0x00000200L +#define SIT1_NXT_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                 0x00000400L +#define SIT1_NXT_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                0x00000800L +#define SIT1_NXT_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                0x00001000L +#define SIT1_NXT_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                               0x00002000L +#define SIT1_NXT_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                               0x00004000L +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                             0x00008000L +#define SIT1_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                             0x00010000L +#define SIT1_NXT_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                0x00020000L +#define SIT1_NXT_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                               0x00040000L +#define SIT1_NXT_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                               0x00080000L +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                         0x00100000L +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                         0x00200000L +#define SIT1_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                         0x00400000L +#define SIT1_NXT_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT1_NXT_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT1_NXT_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                               0x40000000L +//SIT2_NXT_SUVD_CGC_CTRL +#define SIT2_NXT_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                               0x0 +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                               0x1 +#define SIT2_NXT_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                               0x2 +#define SIT2_NXT_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                               0x3 +#define SIT2_NXT_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                               0x4 +#define SIT2_NXT_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                              0x5 +#define SIT2_NXT_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                            0x6 +#define SIT2_NXT_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                               0x7 +#define SIT2_NXT_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                               0x8 +#define SIT2_NXT_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                              0x9 +#define SIT2_NXT_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                               0xa +#define SIT2_NXT_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                              0xb +#define SIT2_NXT_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                              0xc +#define SIT2_NXT_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                             0xd +#define SIT2_NXT_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                             0xe +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                           0xf +#define SIT2_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                           0x10 +#define SIT2_NXT_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                              0x11 +#define SIT2_NXT_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                             0x12 +#define SIT2_NXT_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                             0x13 +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                       0x14 +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                       0x15 +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                       0x16 +#define SIT2_NXT_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                               0x1c +#define SIT2_NXT_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                               0x1d +#define SIT2_NXT_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                             0x1e +#define SIT2_NXT_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                 0x00000001L +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                 0x00000002L +#define SIT2_NXT_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                 0x00000004L +#define SIT2_NXT_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                 0x00000008L +#define SIT2_NXT_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                 0x00000010L +#define SIT2_NXT_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                0x00000020L +#define SIT2_NXT_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                              0x00000040L +#define SIT2_NXT_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                 0x00000080L +#define SIT2_NXT_SUVD_CGC_CTRL__IME_MODE_MASK                                                                 0x00000100L +#define SIT2_NXT_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                0x00000200L +#define SIT2_NXT_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                 0x00000400L +#define SIT2_NXT_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                0x00000800L +#define SIT2_NXT_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                0x00001000L +#define SIT2_NXT_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                               0x00002000L +#define SIT2_NXT_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                               0x00004000L +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                             0x00008000L +#define SIT2_NXT_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                             0x00010000L +#define SIT2_NXT_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                0x00020000L +#define SIT2_NXT_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                               0x00040000L +#define SIT2_NXT_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                               0x00080000L +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                         0x00100000L +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                         0x00200000L +#define SIT2_NXT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                         0x00400000L +#define SIT2_NXT_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                 0x10000000L +#define SIT2_NXT_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                 0x20000000L +#define SIT2_NXT_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                               0x40000000L +//SIT_SUVD_CGC_CTRL +#define SIT_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define SIT_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define SIT_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define SIT_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define SIT_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define SIT_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define SIT_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define SIT_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define SIT_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define SIT_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define SIT_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define SIT_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define SIT_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define SIT_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define SIT_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define SIT_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define SIT_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define SIT_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define SIT_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define SIT_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define SIT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define SIT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define SIT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define SIT_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define SIT_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define SIT_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define SIT_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define SIT_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define SIT_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define SIT_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define SIT_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define SIT_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define SIT_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define SIT_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define SIT_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define SIT_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define SIT_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define SIT_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define SIT_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define SIT_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define SIT_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define SIT_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define SIT_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define SIT_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define SIT_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define SIT_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define SIT_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define SIT_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define SIT_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define SIT_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define SIT_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define SIT_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//SMPA_SUVD_CGC_CTRL +#define SMPA_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                   0x0 +#define SMPA_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                   0x1 +#define SMPA_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                   0x2 +#define SMPA_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                   0x3 +#define SMPA_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                   0x4 +#define SMPA_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                  0x5 +#define SMPA_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                0x6 +#define SMPA_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                   0x7 +#define SMPA_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                   0x8 +#define SMPA_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                  0x9 +#define SMPA_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                   0xa +#define SMPA_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                  0xb +#define SMPA_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                  0xc +#define SMPA_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                 0xd +#define SMPA_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                 0xe +#define SMPA_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                               0xf +#define SMPA_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                               0x10 +#define SMPA_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                  0x11 +#define SMPA_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                 0x12 +#define SMPA_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                 0x13 +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                           0x14 +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                           0x15 +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                           0x16 +#define SMPA_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                   0x1c +#define SMPA_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                   0x1d +#define SMPA_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                 0x1e +#define SMPA_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                     0x00000001L +#define SMPA_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                     0x00000002L +#define SMPA_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                     0x00000004L +#define SMPA_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                     0x00000008L +#define SMPA_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                     0x00000010L +#define SMPA_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                    0x00000020L +#define SMPA_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                  0x00000040L +#define SMPA_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                     0x00000080L +#define SMPA_SUVD_CGC_CTRL__IME_MODE_MASK                                                                     0x00000100L +#define SMPA_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                    0x00000200L +#define SMPA_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                     0x00000400L +#define SMPA_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                    0x00000800L +#define SMPA_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                    0x00001000L +#define SMPA_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                   0x00002000L +#define SMPA_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                   0x00004000L +#define SMPA_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                 0x00008000L +#define SMPA_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                 0x00010000L +#define SMPA_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                    0x00020000L +#define SMPA_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                   0x00040000L +#define SMPA_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                   0x00080000L +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                             0x00100000L +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                             0x00200000L +#define SMPA_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                             0x00400000L +#define SMPA_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                     0x10000000L +#define SMPA_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                     0x20000000L +#define SMPA_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                   0x40000000L +//SMP_SUVD_CGC_CTRL +#define SMP_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define SMP_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define SMP_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define SMP_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define SMP_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define SMP_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define SMP_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define SMP_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define SMP_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define SMP_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define SMP_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define SMP_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define SMP_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define SMP_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define SMP_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define SMP_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define SMP_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define SMP_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define SMP_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define SMP_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define SMP_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define SMP_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define SMP_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define SMP_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define SMP_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define SMP_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define SMP_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define SMP_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define SMP_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define SMP_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define SMP_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define SMP_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define SMP_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define SMP_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define SMP_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define SMP_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define SMP_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define SMP_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define SMP_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define SMP_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define SMP_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define SMP_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define SMP_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define SMP_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define SMP_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define SMP_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define SMP_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define SMP_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define SMP_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define SMP_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define SMP_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define SMP_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//SRE_SUVD_CGC_CTRL +#define SRE_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define SRE_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define SRE_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define SRE_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define SRE_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define SRE_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define SRE_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define SRE_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define SRE_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define SRE_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define SRE_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define SRE_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define SRE_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define SRE_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define SRE_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define SRE_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define SRE_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define SRE_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define SRE_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define SRE_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define SRE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define SRE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define SRE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define SRE_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define SRE_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define SRE_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define SRE_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define SRE_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define SRE_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define SRE_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define SRE_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define SRE_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define SRE_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define SRE_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define SRE_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define SRE_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define SRE_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define SRE_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define SRE_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define SRE_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define SRE_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define SRE_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define SRE_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define SRE_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define SRE_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define SRE_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define SRE_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define SRE_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define SRE_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define SRE_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define SRE_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define SRE_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//UVD_MPBE0_SUVD_CGC_CTRL +#define UVD_MPBE0_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                              0x0 +#define UVD_MPBE0_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                              0x1 +#define UVD_MPBE0_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                              0x2 +#define UVD_MPBE0_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                              0x3 +#define UVD_MPBE0_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                              0x4 +#define UVD_MPBE0_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                             0x5 +#define UVD_MPBE0_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                           0x6 +#define UVD_MPBE0_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                              0x7 +#define UVD_MPBE0_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                              0x8 +#define UVD_MPBE0_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                             0x9 +#define UVD_MPBE0_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                              0xa +#define UVD_MPBE0_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                             0xb +#define UVD_MPBE0_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                             0xc +#define UVD_MPBE0_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                            0xd +#define UVD_MPBE0_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                            0xe +#define UVD_MPBE0_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                          0xf +#define UVD_MPBE0_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                          0x10 +#define UVD_MPBE0_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                             0x11 +#define UVD_MPBE0_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                              0x1c +#define UVD_MPBE0_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                              0x1d +#define UVD_MPBE0_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                            0x1e +#define UVD_MPBE0_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                0x00000001L +#define UVD_MPBE0_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                0x00000002L +#define UVD_MPBE0_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                0x00000004L +#define UVD_MPBE0_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                0x00000008L +#define UVD_MPBE0_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                0x00000010L +#define UVD_MPBE0_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                               0x00000020L +#define UVD_MPBE0_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                             0x00000040L +#define UVD_MPBE0_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                0x00000080L +#define UVD_MPBE0_SUVD_CGC_CTRL__IME_MODE_MASK                                                                0x00000100L +#define UVD_MPBE0_SUVD_CGC_CTRL__SITE_MODE_MASK                                                               0x00000200L +#define UVD_MPBE0_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                0x00000400L +#define UVD_MPBE0_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                               0x00000800L +#define UVD_MPBE0_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                               0x00001000L +#define UVD_MPBE0_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                              0x00002000L +#define UVD_MPBE0_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                              0x00004000L +#define UVD_MPBE0_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                            0x00008000L +#define UVD_MPBE0_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                            0x00010000L +#define UVD_MPBE0_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                               0x00020000L +#define UVD_MPBE0_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                0x10000000L +#define UVD_MPBE0_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                0x20000000L +#define UVD_MPBE0_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                              0x40000000L +//UVD_MPBE1_SUVD_CGC_CTRL +#define UVD_MPBE1_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                              0x0 +#define UVD_MPBE1_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                              0x1 +#define UVD_MPBE1_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                              0x2 +#define UVD_MPBE1_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                              0x3 +#define UVD_MPBE1_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                              0x4 +#define UVD_MPBE1_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                             0x5 +#define UVD_MPBE1_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                           0x6 +#define UVD_MPBE1_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                              0x7 +#define UVD_MPBE1_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                              0x8 +#define UVD_MPBE1_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                             0x9 +#define UVD_MPBE1_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                              0xa +#define UVD_MPBE1_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                             0xb +#define UVD_MPBE1_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                             0xc +#define UVD_MPBE1_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                            0xd +#define UVD_MPBE1_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                            0xe +#define UVD_MPBE1_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                          0xf +#define UVD_MPBE1_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                          0x10 +#define UVD_MPBE1_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                             0x11 +#define UVD_MPBE1_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                              0x1c +#define UVD_MPBE1_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                              0x1d +#define UVD_MPBE1_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                            0x1e +#define UVD_MPBE1_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                0x00000001L +#define UVD_MPBE1_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                0x00000002L +#define UVD_MPBE1_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                0x00000004L +#define UVD_MPBE1_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                0x00000008L +#define UVD_MPBE1_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                0x00000010L +#define UVD_MPBE1_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                               0x00000020L +#define UVD_MPBE1_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                             0x00000040L +#define UVD_MPBE1_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                0x00000080L +#define UVD_MPBE1_SUVD_CGC_CTRL__IME_MODE_MASK                                                                0x00000100L +#define UVD_MPBE1_SUVD_CGC_CTRL__SITE_MODE_MASK                                                               0x00000200L +#define UVD_MPBE1_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                0x00000400L +#define UVD_MPBE1_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                               0x00000800L +#define UVD_MPBE1_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                               0x00001000L +#define UVD_MPBE1_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                              0x00002000L +#define UVD_MPBE1_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                              0x00004000L +#define UVD_MPBE1_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                            0x00008000L +#define UVD_MPBE1_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                            0x00010000L +#define UVD_MPBE1_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                               0x00020000L +#define UVD_MPBE1_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                0x10000000L +#define UVD_MPBE1_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                0x20000000L +#define UVD_MPBE1_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                              0x40000000L +//UVD_SUVD_CGC_CTRL +#define UVD_SUVD_CGC_CTRL__SRE_MODE__SHIFT                                                                    0x0 +#define UVD_SUVD_CGC_CTRL__SIT_MODE__SHIFT                                                                    0x1 +#define UVD_SUVD_CGC_CTRL__SMP_MODE__SHIFT                                                                    0x2 +#define UVD_SUVD_CGC_CTRL__SCM_MODE__SHIFT                                                                    0x3 +#define UVD_SUVD_CGC_CTRL__SDB_MODE__SHIFT                                                                    0x4 +#define UVD_SUVD_CGC_CTRL__SCLR_MODE__SHIFT                                                                   0x5 +#define UVD_SUVD_CGC_CTRL__UVD_SC_MODE__SHIFT                                                                 0x6 +#define UVD_SUVD_CGC_CTRL__ENT_MODE__SHIFT                                                                    0x7 +#define UVD_SUVD_CGC_CTRL__IME_MODE__SHIFT                                                                    0x8 +#define UVD_SUVD_CGC_CTRL__SITE_MODE__SHIFT                                                                   0x9 +#define UVD_SUVD_CGC_CTRL__EFC_MODE__SHIFT                                                                    0xa +#define UVD_SUVD_CGC_CTRL__SAOE_MODE__SHIFT                                                                   0xb +#define UVD_SUVD_CGC_CTRL__SMPA_MODE__SHIFT                                                                   0xc +#define UVD_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT                                                                  0xd +#define UVD_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT                                                                  0xe +#define UVD_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT                                                                0xf +#define UVD_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT                                                                0x10 +#define UVD_SUVD_CGC_CTRL__MPC1_MODE__SHIFT                                                                   0x11 +#define UVD_SUVD_CGC_CTRL__AVM_0_MODE__SHIFT                                                                  0x12 +#define UVD_SUVD_CGC_CTRL__AVM_1_MODE__SHIFT                                                                  0x13 +#define UVD_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE__SHIFT                                                            0x14 +#define UVD_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE__SHIFT                                                            0x15 +#define UVD_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE__SHIFT                                                            0x16 +#define UVD_SUVD_CGC_CTRL__FBC_PCLK__SHIFT                                                                    0x1c +#define UVD_SUVD_CGC_CTRL__FBC_CCLK__SHIFT                                                                    0x1d +#define UVD_SUVD_CGC_CTRL__CDEFE_MODE__SHIFT                                                                  0x1e +#define UVD_SUVD_CGC_CTRL__SRE_MODE_MASK                                                                      0x00000001L +#define UVD_SUVD_CGC_CTRL__SIT_MODE_MASK                                                                      0x00000002L +#define UVD_SUVD_CGC_CTRL__SMP_MODE_MASK                                                                      0x00000004L +#define UVD_SUVD_CGC_CTRL__SCM_MODE_MASK                                                                      0x00000008L +#define UVD_SUVD_CGC_CTRL__SDB_MODE_MASK                                                                      0x00000010L +#define UVD_SUVD_CGC_CTRL__SCLR_MODE_MASK                                                                     0x00000020L +#define UVD_SUVD_CGC_CTRL__UVD_SC_MODE_MASK                                                                   0x00000040L +#define UVD_SUVD_CGC_CTRL__ENT_MODE_MASK                                                                      0x00000080L +#define UVD_SUVD_CGC_CTRL__IME_MODE_MASK                                                                      0x00000100L +#define UVD_SUVD_CGC_CTRL__SITE_MODE_MASK                                                                     0x00000200L +#define UVD_SUVD_CGC_CTRL__EFC_MODE_MASK                                                                      0x00000400L +#define UVD_SUVD_CGC_CTRL__SAOE_MODE_MASK                                                                     0x00000800L +#define UVD_SUVD_CGC_CTRL__SMPA_MODE_MASK                                                                     0x00001000L +#define UVD_SUVD_CGC_CTRL__MPBE0_MODE_MASK                                                                    0x00002000L +#define UVD_SUVD_CGC_CTRL__MPBE1_MODE_MASK                                                                    0x00004000L +#define UVD_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK                                                                  0x00008000L +#define UVD_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK                                                                  0x00010000L +#define UVD_SUVD_CGC_CTRL__MPC1_MODE_MASK                                                                     0x00020000L +#define UVD_SUVD_CGC_CTRL__AVM_0_MODE_MASK                                                                    0x00040000L +#define UVD_SUVD_CGC_CTRL__AVM_1_MODE_MASK                                                                    0x00080000L +#define UVD_SUVD_CGC_CTRL__SIT_NXT_CMN_MODE_MASK                                                              0x00100000L +#define UVD_SUVD_CGC_CTRL__SIT_NXT_DEC_MODE_MASK                                                              0x00200000L +#define UVD_SUVD_CGC_CTRL__SIT_NXT_ENC_MODE_MASK                                                              0x00400000L +#define UVD_SUVD_CGC_CTRL__FBC_PCLK_MASK                                                                      0x10000000L +#define UVD_SUVD_CGC_CTRL__FBC_CCLK_MASK                                                                      0x20000000L +#define UVD_SUVD_CGC_CTRL__CDEFE_MODE_MASK                                                                    0x40000000L +//UVD_CGC_CTRL3 +#define UVD_CGC_CTRL3__CGC_CLK_OFF_DELAY__SHIFT                                                               0x0 +#define UVD_CGC_CTRL3__LCM0_MODE__SHIFT                                                                       0xb +#define UVD_CGC_CTRL3__LCM1_MODE__SHIFT                                                                       0xc +#define UVD_CGC_CTRL3__MIF_MODE__SHIFT                                                                        0xd +#define UVD_CGC_CTRL3__VREG_MODE__SHIFT                                                                       0xe +#define UVD_CGC_CTRL3__PE_MODE__SHIFT                                                                         0xf +#define UVD_CGC_CTRL3__PPU_MODE__SHIFT                                                                        0x10 +#define UVD_CGC_CTRL3__CGC_CLK_OFF_DELAY_MASK                                                                 0x000000FFL +#define UVD_CGC_CTRL3__LCM0_MODE_MASK                                                                         0x00000800L +#define UVD_CGC_CTRL3__LCM1_MODE_MASK                                                                         0x00001000L +#define UVD_CGC_CTRL3__MIF_MODE_MASK                                                                          0x00002000L +#define UVD_CGC_CTRL3__VREG_MODE_MASK                                                                         0x00004000L +#define UVD_CGC_CTRL3__PE_MODE_MASK                                                                           0x00008000L +#define UVD_CGC_CTRL3__PPU_MODE_MASK                                                                          0x00010000L +//UVD_GPCOM_VCPU_DATA0 +#define UVD_GPCOM_VCPU_DATA0__DATA0__SHIFT                                                                    0x0 +#define UVD_GPCOM_VCPU_DATA0__DATA0_MASK                                                                      0xFFFFFFFFL +//UVD_GPCOM_VCPU_DATA1 +#define UVD_GPCOM_VCPU_DATA1__DATA1__SHIFT                                                                    0x0 +#define UVD_GPCOM_VCPU_DATA1__DATA1_MASK                                                                      0xFFFFFFFFL +//UVD_GPCOM_SYS_CMD +#define UVD_GPCOM_SYS_CMD__CMD_SEND__SHIFT                                                                    0x0 +#define UVD_GPCOM_SYS_CMD__CMD__SHIFT                                                                         0x1 +#define UVD_GPCOM_SYS_CMD__CMD_SOURCE__SHIFT                                                                  0x1f +#define UVD_GPCOM_SYS_CMD__CMD_SEND_MASK                                                                      0x00000001L +#define UVD_GPCOM_SYS_CMD__CMD_MASK                                                                           0x7FFFFFFEL +#define UVD_GPCOM_SYS_CMD__CMD_SOURCE_MASK                                                                    0x80000000L +//UVD_GPCOM_SYS_DATA0 +#define UVD_GPCOM_SYS_DATA0__DATA0__SHIFT                                                                     0x0 +#define UVD_GPCOM_SYS_DATA0__DATA0_MASK                                                                       0xFFFFFFFFL +//UVD_GPCOM_SYS_DATA1 +#define UVD_GPCOM_SYS_DATA1__DATA1__SHIFT                                                                     0x0 +#define UVD_GPCOM_SYS_DATA1__DATA1_MASK                                                                       0xFFFFFFFFL +//UVD_VCPU_INT_EN +#define UVD_VCPU_INT_EN__PIF_ADDR_ERR_EN__SHIFT                                                               0x0 +#define UVD_VCPU_INT_EN__SEMA_WAIT_FAULT_TIMEOUT_EN__SHIFT                                                    0x1 +#define UVD_VCPU_INT_EN__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_EN__SHIFT                                             0x2 +#define UVD_VCPU_INT_EN__NJ_PF_RPT_EN__SHIFT                                                                  0x3 +#define UVD_VCPU_INT_EN__SW_RB1_INT_EN__SHIFT                                                                 0x4 +#define UVD_VCPU_INT_EN__SW_RB2_INT_EN__SHIFT                                                                 0x5 +#define UVD_VCPU_INT_EN__RBC_REG_PRIV_FAULT_EN__SHIFT                                                         0x6 +#define UVD_VCPU_INT_EN__SW_RB3_INT_EN__SHIFT                                                                 0x7 +#define UVD_VCPU_INT_EN__SW_RB4_INT_EN__SHIFT                                                                 0x9 +#define UVD_VCPU_INT_EN__SW_RB5_INT_EN__SHIFT                                                                 0xa +#define UVD_VCPU_INT_EN__LBSI_EN__SHIFT                                                                       0xb +#define UVD_VCPU_INT_EN__UDEC_EN__SHIFT                                                                       0xc +#define UVD_VCPU_INT_EN__LMI_AXI_UNSUPPORTED_LEN_EN__SHIFT                                                    0xd +#define UVD_VCPU_INT_EN__LMI_AXI_UNSUPPORTED_ADR_ALIGN_EN__SHIFT                                              0xe +#define UVD_VCPU_INT_EN__SUVD_EN__SHIFT                                                                       0xf +#define UVD_VCPU_INT_EN__RPTR_WR_EN__SHIFT                                                                    0x10 +#define UVD_VCPU_INT_EN__JOB_START_EN__SHIFT                                                                  0x11 +#define UVD_VCPU_INT_EN__NJ_PF_EN__SHIFT                                                                      0x12 +#define UVD_VCPU_INT_EN__SEMA_WAIT_FAIL_SIG_EN__SHIFT                                                         0x17 +#define UVD_VCPU_INT_EN__IDCT_EN__SHIFT                                                                       0x18 +#define UVD_VCPU_INT_EN__MPRD_EN__SHIFT                                                                       0x19 +#define UVD_VCPU_INT_EN__AVM_INT_EN__SHIFT                                                                    0x1a +#define UVD_VCPU_INT_EN__CLK_SWT_EN__SHIFT                                                                    0x1b +#define UVD_VCPU_INT_EN__MIF_HWINT_EN__SHIFT                                                                  0x1c +#define UVD_VCPU_INT_EN__MPRD_ERR_EN__SHIFT                                                                   0x1d +#define UVD_VCPU_INT_EN__DRV_FW_REQ_EN__SHIFT                                                                 0x1e +#define UVD_VCPU_INT_EN__DRV_FW_ACK_EN__SHIFT                                                                 0x1f +#define UVD_VCPU_INT_EN__PIF_ADDR_ERR_EN_MASK                                                                 0x00000001L +#define UVD_VCPU_INT_EN__SEMA_WAIT_FAULT_TIMEOUT_EN_MASK                                                      0x00000002L +#define UVD_VCPU_INT_EN__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_EN_MASK                                               0x00000004L +#define UVD_VCPU_INT_EN__NJ_PF_RPT_EN_MASK                                                                    0x00000008L +#define UVD_VCPU_INT_EN__SW_RB1_INT_EN_MASK                                                                   0x00000010L +#define UVD_VCPU_INT_EN__SW_RB2_INT_EN_MASK                                                                   0x00000020L +#define UVD_VCPU_INT_EN__RBC_REG_PRIV_FAULT_EN_MASK                                                           0x00000040L +#define UVD_VCPU_INT_EN__SW_RB3_INT_EN_MASK                                                                   0x00000080L +#define UVD_VCPU_INT_EN__SW_RB4_INT_EN_MASK                                                                   0x00000200L +#define UVD_VCPU_INT_EN__SW_RB5_INT_EN_MASK                                                                   0x00000400L +#define UVD_VCPU_INT_EN__LBSI_EN_MASK                                                                         0x00000800L +#define UVD_VCPU_INT_EN__UDEC_EN_MASK                                                                         0x00001000L +#define UVD_VCPU_INT_EN__LMI_AXI_UNSUPPORTED_LEN_EN_MASK                                                      0x00002000L +#define UVD_VCPU_INT_EN__LMI_AXI_UNSUPPORTED_ADR_ALIGN_EN_MASK                                                0x00004000L +#define UVD_VCPU_INT_EN__SUVD_EN_MASK                                                                         0x00008000L +#define UVD_VCPU_INT_EN__RPTR_WR_EN_MASK                                                                      0x00010000L +#define UVD_VCPU_INT_EN__JOB_START_EN_MASK                                                                    0x00020000L +#define UVD_VCPU_INT_EN__NJ_PF_EN_MASK                                                                        0x00040000L +#define UVD_VCPU_INT_EN__SEMA_WAIT_FAIL_SIG_EN_MASK                                                           0x00800000L +#define UVD_VCPU_INT_EN__IDCT_EN_MASK                                                                         0x01000000L +#define UVD_VCPU_INT_EN__MPRD_EN_MASK                                                                         0x02000000L +#define UVD_VCPU_INT_EN__AVM_INT_EN_MASK                                                                      0x04000000L +#define UVD_VCPU_INT_EN__CLK_SWT_EN_MASK                                                                      0x08000000L +#define UVD_VCPU_INT_EN__MIF_HWINT_EN_MASK                                                                    0x10000000L +#define UVD_VCPU_INT_EN__MPRD_ERR_EN_MASK                                                                     0x20000000L +#define UVD_VCPU_INT_EN__DRV_FW_REQ_EN_MASK                                                                   0x40000000L +#define UVD_VCPU_INT_EN__DRV_FW_ACK_EN_MASK                                                                   0x80000000L +//UVD_VCPU_INT_STATUS +#define UVD_VCPU_INT_STATUS__PIF_ADDR_ERR_INT__SHIFT                                                          0x0 +#define UVD_VCPU_INT_STATUS__SEMA_WAIT_FAULT_TIMEOUT_INT__SHIFT                                               0x1 +#define UVD_VCPU_INT_STATUS__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_INT__SHIFT                                        0x2 +#define UVD_VCPU_INT_STATUS__NJ_PF_RPT_INT__SHIFT                                                             0x3 +#define UVD_VCPU_INT_STATUS__SW_RB1_INT__SHIFT                                                                0x4 +#define UVD_VCPU_INT_STATUS__SW_RB2_INT__SHIFT                                                                0x5 +#define UVD_VCPU_INT_STATUS__RBC_REG_PRIV_FAULT_INT__SHIFT                                                    0x6 +#define UVD_VCPU_INT_STATUS__SW_RB3_INT__SHIFT                                                                0x7 +#define UVD_VCPU_INT_STATUS__SW_RB4_INT__SHIFT                                                                0x9 +#define UVD_VCPU_INT_STATUS__SW_RB5_INT__SHIFT                                                                0xa +#define UVD_VCPU_INT_STATUS__LBSI_INT__SHIFT                                                                  0xb +#define UVD_VCPU_INT_STATUS__UDEC_INT__SHIFT                                                                  0xc +#define UVD_VCPU_INT_STATUS__LMI_AXI_UNSUPPORTED_LEN_INT__SHIFT                                               0xd +#define UVD_VCPU_INT_STATUS__LMI_AXI_UNSUPPORTED_ADR_ALIGN_INT__SHIFT                                         0xe +#define UVD_VCPU_INT_STATUS__SUVD_INT__SHIFT                                                                  0xf +#define UVD_VCPU_INT_STATUS__RPTR_WR_INT__SHIFT                                                               0x10 +#define UVD_VCPU_INT_STATUS__JOB_START_INT__SHIFT                                                             0x11 +#define UVD_VCPU_INT_STATUS__NJ_PF_INT__SHIFT                                                                 0x12 +#define UVD_VCPU_INT_STATUS__GPCOM_INT__SHIFT                                                                 0x14 +#define UVD_VCPU_INT_STATUS__SEMA_WAIT_FAIL_SIG_INT__SHIFT                                                    0x17 +#define UVD_VCPU_INT_STATUS__IDCT_INT__SHIFT                                                                  0x18 +#define UVD_VCPU_INT_STATUS__MPRD_INT__SHIFT                                                                  0x19 +#define UVD_VCPU_INT_STATUS__AVM_INT__SHIFT                                                                   0x1a +#define UVD_VCPU_INT_STATUS__CLK_SWT_INT__SHIFT                                                               0x1b +#define UVD_VCPU_INT_STATUS__MIF_HWINT__SHIFT                                                                 0x1c +#define UVD_VCPU_INT_STATUS__MPRD_ERR_INT__SHIFT                                                              0x1d +#define UVD_VCPU_INT_STATUS__DRV_FW_REQ_INT__SHIFT                                                            0x1e +#define UVD_VCPU_INT_STATUS__DRV_FW_ACK_INT__SHIFT                                                            0x1f +#define UVD_VCPU_INT_STATUS__PIF_ADDR_ERR_INT_MASK                                                            0x00000001L +#define UVD_VCPU_INT_STATUS__SEMA_WAIT_FAULT_TIMEOUT_INT_MASK                                                 0x00000002L +#define UVD_VCPU_INT_STATUS__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_INT_MASK                                          0x00000004L +#define UVD_VCPU_INT_STATUS__NJ_PF_RPT_INT_MASK                                                               0x00000008L +#define UVD_VCPU_INT_STATUS__SW_RB1_INT_MASK                                                                  0x00000010L +#define UVD_VCPU_INT_STATUS__SW_RB2_INT_MASK                                                                  0x00000020L +#define UVD_VCPU_INT_STATUS__RBC_REG_PRIV_FAULT_INT_MASK                                                      0x00000040L +#define UVD_VCPU_INT_STATUS__SW_RB3_INT_MASK                                                                  0x00000080L +#define UVD_VCPU_INT_STATUS__SW_RB4_INT_MASK                                                                  0x00000200L +#define UVD_VCPU_INT_STATUS__SW_RB5_INT_MASK                                                                  0x00000400L +#define UVD_VCPU_INT_STATUS__LBSI_INT_MASK                                                                    0x00000800L +#define UVD_VCPU_INT_STATUS__UDEC_INT_MASK                                                                    0x00001000L +#define UVD_VCPU_INT_STATUS__LMI_AXI_UNSUPPORTED_LEN_INT_MASK                                                 0x00002000L +#define UVD_VCPU_INT_STATUS__LMI_AXI_UNSUPPORTED_ADR_ALIGN_INT_MASK                                           0x00004000L +#define UVD_VCPU_INT_STATUS__SUVD_INT_MASK                                                                    0x00008000L +#define UVD_VCPU_INT_STATUS__RPTR_WR_INT_MASK                                                                 0x00010000L +#define UVD_VCPU_INT_STATUS__JOB_START_INT_MASK                                                               0x00020000L +#define UVD_VCPU_INT_STATUS__NJ_PF_INT_MASK                                                                   0x00040000L +#define UVD_VCPU_INT_STATUS__GPCOM_INT_MASK                                                                   0x00100000L +#define UVD_VCPU_INT_STATUS__SEMA_WAIT_FAIL_SIG_INT_MASK                                                      0x00800000L +#define UVD_VCPU_INT_STATUS__IDCT_INT_MASK                                                                    0x01000000L +#define UVD_VCPU_INT_STATUS__MPRD_INT_MASK                                                                    0x02000000L +#define UVD_VCPU_INT_STATUS__AVM_INT_MASK                                                                     0x04000000L +#define UVD_VCPU_INT_STATUS__CLK_SWT_INT_MASK                                                                 0x08000000L +#define UVD_VCPU_INT_STATUS__MIF_HWINT_MASK                                                                   0x10000000L +#define UVD_VCPU_INT_STATUS__MPRD_ERR_INT_MASK                                                                0x20000000L +#define UVD_VCPU_INT_STATUS__DRV_FW_REQ_INT_MASK                                                              0x40000000L +#define UVD_VCPU_INT_STATUS__DRV_FW_ACK_INT_MASK                                                              0x80000000L +//UVD_VCPU_INT_ACK +#define UVD_VCPU_INT_ACK__PIF_ADDR_ERR_ACK__SHIFT                                                             0x0 +#define UVD_VCPU_INT_ACK__SEMA_WAIT_FAULT_TIMEOUT_ACK__SHIFT                                                  0x1 +#define UVD_VCPU_INT_ACK__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_ACK__SHIFT                                           0x2 +#define UVD_VCPU_INT_ACK__NJ_PF_RPT_ACK__SHIFT                                                                0x3 +#define UVD_VCPU_INT_ACK__SW_RB1_INT_ACK__SHIFT                                                               0x4 +#define UVD_VCPU_INT_ACK__SW_RB2_INT_ACK__SHIFT                                                               0x5 +#define UVD_VCPU_INT_ACK__RBC_REG_PRIV_FAULT_ACK__SHIFT                                                       0x6 +#define UVD_VCPU_INT_ACK__SW_RB3_INT_ACK__SHIFT                                                               0x7 +#define UVD_VCPU_INT_ACK__SW_RB4_INT_ACK__SHIFT                                                               0x9 +#define UVD_VCPU_INT_ACK__SW_RB5_INT_ACK__SHIFT                                                               0xa +#define UVD_VCPU_INT_ACK__LBSI_ACK__SHIFT                                                                     0xb +#define UVD_VCPU_INT_ACK__UDEC_ACK__SHIFT                                                                     0xc +#define UVD_VCPU_INT_ACK__LMI_AXI_UNSUPPORTED_LEN_ACK__SHIFT                                                  0xd +#define UVD_VCPU_INT_ACK__LMI_AXI_UNSUPPORTED_ADR_ALIGN_ACK__SHIFT                                            0xe +#define UVD_VCPU_INT_ACK__SUVD_ACK__SHIFT                                                                     0xf +#define UVD_VCPU_INT_ACK__RPTR_WR_ACK__SHIFT                                                                  0x10 +#define UVD_VCPU_INT_ACK__JOB_START_ACK__SHIFT                                                                0x11 +#define UVD_VCPU_INT_ACK__NJ_PF_ACK__SHIFT                                                                    0x12 +#define UVD_VCPU_INT_ACK__SEMA_WAIT_FAIL_SIG_ACK__SHIFT                                                       0x17 +#define UVD_VCPU_INT_ACK__IDCT_ACK__SHIFT                                                                     0x18 +#define UVD_VCPU_INT_ACK__MPRD_ACK__SHIFT                                                                     0x19 +#define UVD_VCPU_INT_ACK__AVM_INT_ACK__SHIFT                                                                  0x1a +#define UVD_VCPU_INT_ACK__CLK_SWT_ACK__SHIFT                                                                  0x1b +#define UVD_VCPU_INT_ACK__MIF_HWINT_ACK__SHIFT                                                                0x1c +#define UVD_VCPU_INT_ACK__MPRD_ERR_ACK__SHIFT                                                                 0x1d +#define UVD_VCPU_INT_ACK__DRV_FW_REQ_ACK__SHIFT                                                               0x1e +#define UVD_VCPU_INT_ACK__DRV_FW_ACK_ACK__SHIFT                                                               0x1f +#define UVD_VCPU_INT_ACK__PIF_ADDR_ERR_ACK_MASK                                                               0x00000001L +#define UVD_VCPU_INT_ACK__SEMA_WAIT_FAULT_TIMEOUT_ACK_MASK                                                    0x00000002L +#define UVD_VCPU_INT_ACK__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_ACK_MASK                                             0x00000004L +#define UVD_VCPU_INT_ACK__NJ_PF_RPT_ACK_MASK                                                                  0x00000008L +#define UVD_VCPU_INT_ACK__SW_RB1_INT_ACK_MASK                                                                 0x00000010L +#define UVD_VCPU_INT_ACK__SW_RB2_INT_ACK_MASK                                                                 0x00000020L +#define UVD_VCPU_INT_ACK__RBC_REG_PRIV_FAULT_ACK_MASK                                                         0x00000040L +#define UVD_VCPU_INT_ACK__SW_RB3_INT_ACK_MASK                                                                 0x00000080L +#define UVD_VCPU_INT_ACK__SW_RB4_INT_ACK_MASK                                                                 0x00000200L +#define UVD_VCPU_INT_ACK__SW_RB5_INT_ACK_MASK                                                                 0x00000400L +#define UVD_VCPU_INT_ACK__LBSI_ACK_MASK                                                                       0x00000800L +#define UVD_VCPU_INT_ACK__UDEC_ACK_MASK                                                                       0x00001000L +#define UVD_VCPU_INT_ACK__LMI_AXI_UNSUPPORTED_LEN_ACK_MASK                                                    0x00002000L +#define UVD_VCPU_INT_ACK__LMI_AXI_UNSUPPORTED_ADR_ALIGN_ACK_MASK                                              0x00004000L +#define UVD_VCPU_INT_ACK__SUVD_ACK_MASK                                                                       0x00008000L +#define UVD_VCPU_INT_ACK__RPTR_WR_ACK_MASK                                                                    0x00010000L +#define UVD_VCPU_INT_ACK__JOB_START_ACK_MASK                                                                  0x00020000L +#define UVD_VCPU_INT_ACK__NJ_PF_ACK_MASK                                                                      0x00040000L +#define UVD_VCPU_INT_ACK__SEMA_WAIT_FAIL_SIG_ACK_MASK                                                         0x00800000L +#define UVD_VCPU_INT_ACK__IDCT_ACK_MASK                                                                       0x01000000L +#define UVD_VCPU_INT_ACK__MPRD_ACK_MASK                                                                       0x02000000L +#define UVD_VCPU_INT_ACK__AVM_INT_ACK_MASK                                                                    0x04000000L +#define UVD_VCPU_INT_ACK__CLK_SWT_ACK_MASK                                                                    0x08000000L +#define UVD_VCPU_INT_ACK__MIF_HWINT_ACK_MASK                                                                  0x10000000L +#define UVD_VCPU_INT_ACK__MPRD_ERR_ACK_MASK                                                                   0x20000000L +#define UVD_VCPU_INT_ACK__DRV_FW_REQ_ACK_MASK                                                                 0x40000000L +#define UVD_VCPU_INT_ACK__DRV_FW_ACK_ACK_MASK                                                                 0x80000000L +//UVD_VCPU_INT_ROUTE +#define UVD_VCPU_INT_ROUTE__DRV_FW_MSG__SHIFT                                                                 0x0 +#define UVD_VCPU_INT_ROUTE__FW_DRV_MSG_ACK__SHIFT                                                             0x1 +#define UVD_VCPU_INT_ROUTE__VCPU_GPCOM__SHIFT                                                                 0x2 +#define UVD_VCPU_INT_ROUTE__DRV_FW_MSG_MASK                                                                   0x00000001L +#define UVD_VCPU_INT_ROUTE__FW_DRV_MSG_ACK_MASK                                                               0x00000002L +#define UVD_VCPU_INT_ROUTE__VCPU_GPCOM_MASK                                                                   0x00000004L +//UVD_DRV_FW_MSG +#define UVD_DRV_FW_MSG__MSG__SHIFT                                                                            0x0 +#define UVD_DRV_FW_MSG__MSG_MASK                                                                              0xFFFFFFFFL +//UVD_FW_DRV_MSG_ACK +#define UVD_FW_DRV_MSG_ACK__ACK__SHIFT                                                                        0x0 +#define UVD_FW_DRV_MSG_ACK__ACK_MASK                                                                          0x00000001L +//UVD_SUVD_INT_EN +#define UVD_SUVD_INT_EN__SRE_FUNC_INT_EN__SHIFT                                                               0x0 +#define UVD_SUVD_INT_EN__SRE_ERR_INT_EN__SHIFT                                                                0x5 +#define UVD_SUVD_INT_EN__SIT_FUNC_INT_EN__SHIFT                                                               0x6 +#define UVD_SUVD_INT_EN__SIT_ERR_INT_EN__SHIFT                                                                0xb +#define UVD_SUVD_INT_EN__SMP_FUNC_INT_EN__SHIFT                                                               0xc +#define UVD_SUVD_INT_EN__SMP_ERR_INT_EN__SHIFT                                                                0x11 +#define UVD_SUVD_INT_EN__SCM_FUNC_INT_EN__SHIFT                                                               0x12 +#define UVD_SUVD_INT_EN__SCM_ERR_INT_EN__SHIFT                                                                0x17 +#define UVD_SUVD_INT_EN__SDB_FUNC_INT_EN__SHIFT                                                               0x18 +#define UVD_SUVD_INT_EN__SDB_ERR_INT_EN__SHIFT                                                                0x1d +#define UVD_SUVD_INT_EN__FBC_ERR_INT_EN__SHIFT                                                                0x1e +#define UVD_SUVD_INT_EN__SRE_FUNC_INT_EN_MASK                                                                 0x0000001FL +#define UVD_SUVD_INT_EN__SRE_ERR_INT_EN_MASK                                                                  0x00000020L +#define UVD_SUVD_INT_EN__SIT_FUNC_INT_EN_MASK                                                                 0x000007C0L +#define UVD_SUVD_INT_EN__SIT_ERR_INT_EN_MASK                                                                  0x00000800L +#define UVD_SUVD_INT_EN__SMP_FUNC_INT_EN_MASK                                                                 0x0001F000L +#define UVD_SUVD_INT_EN__SMP_ERR_INT_EN_MASK                                                                  0x00020000L +#define UVD_SUVD_INT_EN__SCM_FUNC_INT_EN_MASK                                                                 0x007C0000L +#define UVD_SUVD_INT_EN__SCM_ERR_INT_EN_MASK                                                                  0x00800000L +#define UVD_SUVD_INT_EN__SDB_FUNC_INT_EN_MASK                                                                 0x1F000000L +#define UVD_SUVD_INT_EN__SDB_ERR_INT_EN_MASK                                                                  0x20000000L +#define UVD_SUVD_INT_EN__FBC_ERR_INT_EN_MASK                                                                  0x40000000L +//UVD_SUVD_INT_STATUS +#define UVD_SUVD_INT_STATUS__SRE_FUNC_INT__SHIFT                                                              0x0 +#define UVD_SUVD_INT_STATUS__SRE_ERR_INT__SHIFT                                                               0x5 +#define UVD_SUVD_INT_STATUS__SIT_FUNC_INT__SHIFT                                                              0x6 +#define UVD_SUVD_INT_STATUS__SIT_ERR_INT__SHIFT                                                               0xb +#define UVD_SUVD_INT_STATUS__SMP_FUNC_INT__SHIFT                                                              0xc +#define UVD_SUVD_INT_STATUS__SMP_ERR_INT__SHIFT                                                               0x11 +#define UVD_SUVD_INT_STATUS__SCM_FUNC_INT__SHIFT                                                              0x12 +#define UVD_SUVD_INT_STATUS__SCM_ERR_INT__SHIFT                                                               0x17 +#define UVD_SUVD_INT_STATUS__SDB_FUNC_INT__SHIFT                                                              0x18 +#define UVD_SUVD_INT_STATUS__SDB_ERR_INT__SHIFT                                                               0x1d +#define UVD_SUVD_INT_STATUS__FBC_ERR_INT__SHIFT                                                               0x1e +#define UVD_SUVD_INT_STATUS__SRE_FUNC_INT_MASK                                                                0x0000001FL +#define UVD_SUVD_INT_STATUS__SRE_ERR_INT_MASK                                                                 0x00000020L +#define UVD_SUVD_INT_STATUS__SIT_FUNC_INT_MASK                                                                0x000007C0L +#define UVD_SUVD_INT_STATUS__SIT_ERR_INT_MASK                                                                 0x00000800L +#define UVD_SUVD_INT_STATUS__SMP_FUNC_INT_MASK                                                                0x0001F000L +#define UVD_SUVD_INT_STATUS__SMP_ERR_INT_MASK                                                                 0x00020000L +#define UVD_SUVD_INT_STATUS__SCM_FUNC_INT_MASK                                                                0x007C0000L +#define UVD_SUVD_INT_STATUS__SCM_ERR_INT_MASK                                                                 0x00800000L +#define UVD_SUVD_INT_STATUS__SDB_FUNC_INT_MASK                                                                0x1F000000L +#define UVD_SUVD_INT_STATUS__SDB_ERR_INT_MASK                                                                 0x20000000L +#define UVD_SUVD_INT_STATUS__FBC_ERR_INT_MASK                                                                 0x40000000L +//UVD_SUVD_INT_ACK +#define UVD_SUVD_INT_ACK__SRE_FUNC_INT_ACK__SHIFT                                                             0x0 +#define UVD_SUVD_INT_ACK__SRE_ERR_INT_ACK__SHIFT                                                              0x5 +#define UVD_SUVD_INT_ACK__SIT_FUNC_INT_ACK__SHIFT                                                             0x6 +#define UVD_SUVD_INT_ACK__SIT_ERR_INT_ACK__SHIFT                                                              0xb +#define UVD_SUVD_INT_ACK__SMP_FUNC_INT_ACK__SHIFT                                                             0xc +#define UVD_SUVD_INT_ACK__SMP_ERR_INT_ACK__SHIFT                                                              0x11 +#define UVD_SUVD_INT_ACK__SCM_FUNC_INT_ACK__SHIFT                                                             0x12 +#define UVD_SUVD_INT_ACK__SCM_ERR_INT_ACK__SHIFT                                                              0x17 +#define UVD_SUVD_INT_ACK__SDB_FUNC_INT_ACK__SHIFT                                                             0x18 +#define UVD_SUVD_INT_ACK__SDB_ERR_INT_ACK__SHIFT                                                              0x1d +#define UVD_SUVD_INT_ACK__FBC_ERR_INT_ACK__SHIFT                                                              0x1e +#define UVD_SUVD_INT_ACK__SRE_FUNC_INT_ACK_MASK                                                               0x0000001FL +#define UVD_SUVD_INT_ACK__SRE_ERR_INT_ACK_MASK                                                                0x00000020L +#define UVD_SUVD_INT_ACK__SIT_FUNC_INT_ACK_MASK                                                               0x000007C0L +#define UVD_SUVD_INT_ACK__SIT_ERR_INT_ACK_MASK                                                                0x00000800L +#define UVD_SUVD_INT_ACK__SMP_FUNC_INT_ACK_MASK                                                               0x0001F000L +#define UVD_SUVD_INT_ACK__SMP_ERR_INT_ACK_MASK                                                                0x00020000L +#define UVD_SUVD_INT_ACK__SCM_FUNC_INT_ACK_MASK                                                               0x007C0000L +#define UVD_SUVD_INT_ACK__SCM_ERR_INT_ACK_MASK                                                                0x00800000L +#define UVD_SUVD_INT_ACK__SDB_FUNC_INT_ACK_MASK                                                               0x1F000000L +#define UVD_SUVD_INT_ACK__SDB_ERR_INT_ACK_MASK                                                                0x20000000L +#define UVD_SUVD_INT_ACK__FBC_ERR_INT_ACK_MASK                                                                0x40000000L +//UVD_ENC_VCPU_INT_EN +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR_EN__SHIFT                                                 0x0 +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR2_EN__SHIFT                                                0x1 +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR3_EN__SHIFT                                                0x2 +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR_EN_MASK                                                   0x00000001L +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR2_EN_MASK                                                  0x00000002L +#define UVD_ENC_VCPU_INT_EN__DCE_UVD_SCAN_IN_BUFMGR3_EN_MASK                                                  0x00000004L +//UVD_ENC_VCPU_INT_STATUS +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR_INT__SHIFT                                            0x0 +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR2_INT__SHIFT                                           0x1 +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR3_INT__SHIFT                                           0x2 +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR_INT_MASK                                              0x00000001L +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR2_INT_MASK                                             0x00000002L +#define UVD_ENC_VCPU_INT_STATUS__DCE_UVD_SCAN_IN_BUFMGR3_INT_MASK                                             0x00000004L +//UVD_ENC_VCPU_INT_ACK +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR_ACK__SHIFT                                               0x0 +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR2_ACK__SHIFT                                              0x1 +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR3_ACK__SHIFT                                              0x2 +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR_ACK_MASK                                                 0x00000001L +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR2_ACK_MASK                                                0x00000002L +#define UVD_ENC_VCPU_INT_ACK__DCE_UVD_SCAN_IN_BUFMGR3_ACK_MASK                                                0x00000004L +//UVD_MASTINT_EN +#define UVD_MASTINT_EN__OVERRUN_RST__SHIFT                                                                    0x0 +#define UVD_MASTINT_EN__VCPU_EN__SHIFT                                                                        0x1 +#define UVD_MASTINT_EN__SYS_EN__SHIFT                                                                         0x2 +#define UVD_MASTINT_EN__INT_OVERRUN__SHIFT                                                                    0x4 +#define UVD_MASTINT_EN__OVERRUN_RST_MASK                                                                      0x00000001L +#define UVD_MASTINT_EN__VCPU_EN_MASK                                                                          0x00000002L +#define UVD_MASTINT_EN__SYS_EN_MASK                                                                           0x00000004L +#define UVD_MASTINT_EN__INT_OVERRUN_MASK                                                                      0x00FFFFF0L +//UVD_SYS_INT_EN +#define UVD_SYS_INT_EN__PIF_ADDR_ERR_EN__SHIFT                                                                0x0 +#define UVD_SYS_INT_EN__SEMA_WAIT_FAULT_TIMEOUT_EN__SHIFT                                                     0x1 +#define UVD_SYS_INT_EN__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_EN__SHIFT                                              0x2 +#define UVD_SYS_INT_EN__CXW_WR_EN__SHIFT                                                                      0x3 +#define UVD_SYS_INT_EN__RBC_REG_PRIV_FAULT_EN__SHIFT                                                          0x6 +#define UVD_SYS_INT_EN__LBSI_EN__SHIFT                                                                        0xb +#define UVD_SYS_INT_EN__UDEC_EN__SHIFT                                                                        0xc +#define UVD_SYS_INT_EN__LMI_AXI_UNSUPPORTED_LEN_EN__SHIFT                                                     0xd +#define UVD_SYS_INT_EN__LMI_AXI_UNSUPPORTED_ADR_ALIGN_EN__SHIFT                                               0xe +#define UVD_SYS_INT_EN__SUVD_EN__SHIFT                                                                        0xf +#define UVD_SYS_INT_EN__JOB_DONE_EN__SHIFT                                                                    0x10 +#define UVD_SYS_INT_EN__SEMA_WAIT_FAIL_SIG_EN__SHIFT                                                          0x17 +#define UVD_SYS_INT_EN__IDCT_EN__SHIFT                                                                        0x18 +#define UVD_SYS_INT_EN__MPRD_EN__SHIFT                                                                        0x19 +#define UVD_SYS_INT_EN__RASCNTL_VCPU_VCODEC_EN__SHIFT                                                         0x1a +#define UVD_SYS_INT_EN__CLK_SWT_EN__SHIFT                                                                     0x1b +#define UVD_SYS_INT_EN__MIF_HWINT_EN__SHIFT                                                                   0x1c +#define UVD_SYS_INT_EN__MPRD_ERR_EN__SHIFT                                                                    0x1d +#define UVD_SYS_INT_EN__AVM_INT_EN__SHIFT                                                                     0x1f +#define UVD_SYS_INT_EN__PIF_ADDR_ERR_EN_MASK                                                                  0x00000001L +#define UVD_SYS_INT_EN__SEMA_WAIT_FAULT_TIMEOUT_EN_MASK                                                       0x00000002L +#define UVD_SYS_INT_EN__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_EN_MASK                                                0x00000004L +#define UVD_SYS_INT_EN__CXW_WR_EN_MASK                                                                        0x00000008L +#define UVD_SYS_INT_EN__RBC_REG_PRIV_FAULT_EN_MASK                                                            0x00000040L +#define UVD_SYS_INT_EN__LBSI_EN_MASK                                                                          0x00000800L +#define UVD_SYS_INT_EN__UDEC_EN_MASK                                                                          0x00001000L +#define UVD_SYS_INT_EN__LMI_AXI_UNSUPPORTED_LEN_EN_MASK                                                       0x00002000L +#define UVD_SYS_INT_EN__LMI_AXI_UNSUPPORTED_ADR_ALIGN_EN_MASK                                                 0x00004000L +#define UVD_SYS_INT_EN__SUVD_EN_MASK                                                                          0x00008000L +#define UVD_SYS_INT_EN__JOB_DONE_EN_MASK                                                                      0x00010000L +#define UVD_SYS_INT_EN__SEMA_WAIT_FAIL_SIG_EN_MASK                                                            0x00800000L +#define UVD_SYS_INT_EN__IDCT_EN_MASK                                                                          0x01000000L +#define UVD_SYS_INT_EN__MPRD_EN_MASK                                                                          0x02000000L +#define UVD_SYS_INT_EN__RASCNTL_VCPU_VCODEC_EN_MASK                                                           0x04000000L +#define UVD_SYS_INT_EN__CLK_SWT_EN_MASK                                                                       0x08000000L +#define UVD_SYS_INT_EN__MIF_HWINT_EN_MASK                                                                     0x10000000L +#define UVD_SYS_INT_EN__MPRD_ERR_EN_MASK                                                                      0x20000000L +#define UVD_SYS_INT_EN__AVM_INT_EN_MASK                                                                       0x80000000L +//UVD_SYS_INT_STATUS +#define UVD_SYS_INT_STATUS__PIF_ADDR_ERR_INT__SHIFT                                                           0x0 +#define UVD_SYS_INT_STATUS__SEMA_WAIT_FAULT_TIMEOUT_INT__SHIFT                                                0x1 +#define UVD_SYS_INT_STATUS__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_INT__SHIFT                                         0x2 +#define UVD_SYS_INT_STATUS__CXW_WR_INT__SHIFT                                                                 0x3 +#define UVD_SYS_INT_STATUS__RBC_REG_PRIV_FAULT_INT__SHIFT                                                     0x6 +#define UVD_SYS_INT_STATUS__LBSI_INT__SHIFT                                                                   0xb +#define UVD_SYS_INT_STATUS__UDEC_INT__SHIFT                                                                   0xc +#define UVD_SYS_INT_STATUS__LMI_AXI_UNSUPPORTED_LEN_INT__SHIFT                                                0xd +#define UVD_SYS_INT_STATUS__LMI_AXI_UNSUPPORTED_ADR_ALIGN_INT__SHIFT                                          0xe +#define UVD_SYS_INT_STATUS__SUVD_INT__SHIFT                                                                   0xf +#define UVD_SYS_INT_STATUS__JOB_DONE_INT__SHIFT                                                               0x10 +#define UVD_SYS_INT_STATUS__GPCOM_INT__SHIFT                                                                  0x12 +#define UVD_SYS_INT_STATUS__SEMA_WAIT_FAIL_SIG_INT__SHIFT                                                     0x17 +#define UVD_SYS_INT_STATUS__IDCT_INT__SHIFT                                                                   0x18 +#define UVD_SYS_INT_STATUS__MPRD_INT__SHIFT                                                                   0x19 +#define UVD_SYS_INT_STATUS__CLK_SWT_INT__SHIFT                                                                0x1b +#define UVD_SYS_INT_STATUS__MIF_HWINT__SHIFT                                                                  0x1c +#define UVD_SYS_INT_STATUS__MPRD_ERR_INT__SHIFT                                                               0x1d +#define UVD_SYS_INT_STATUS__RASCNTL_VCPU_VCODEC_INT__SHIFT                                                    0x1e +#define UVD_SYS_INT_STATUS__AVM_INT__SHIFT                                                                    0x1f +#define UVD_SYS_INT_STATUS__PIF_ADDR_ERR_INT_MASK                                                             0x00000001L +#define UVD_SYS_INT_STATUS__SEMA_WAIT_FAULT_TIMEOUT_INT_MASK                                                  0x00000002L +#define UVD_SYS_INT_STATUS__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_INT_MASK                                           0x00000004L +#define UVD_SYS_INT_STATUS__CXW_WR_INT_MASK                                                                   0x00000008L +#define UVD_SYS_INT_STATUS__RBC_REG_PRIV_FAULT_INT_MASK                                                       0x00000040L +#define UVD_SYS_INT_STATUS__LBSI_INT_MASK                                                                     0x00000800L +#define UVD_SYS_INT_STATUS__UDEC_INT_MASK                                                                     0x00001000L +#define UVD_SYS_INT_STATUS__LMI_AXI_UNSUPPORTED_LEN_INT_MASK                                                  0x00002000L +#define UVD_SYS_INT_STATUS__LMI_AXI_UNSUPPORTED_ADR_ALIGN_INT_MASK                                            0x00004000L +#define UVD_SYS_INT_STATUS__SUVD_INT_MASK                                                                     0x00008000L +#define UVD_SYS_INT_STATUS__JOB_DONE_INT_MASK                                                                 0x00010000L +#define UVD_SYS_INT_STATUS__GPCOM_INT_MASK                                                                    0x00040000L +#define UVD_SYS_INT_STATUS__SEMA_WAIT_FAIL_SIG_INT_MASK                                                       0x00800000L +#define UVD_SYS_INT_STATUS__IDCT_INT_MASK                                                                     0x01000000L +#define UVD_SYS_INT_STATUS__MPRD_INT_MASK                                                                     0x02000000L +#define UVD_SYS_INT_STATUS__CLK_SWT_INT_MASK                                                                  0x08000000L +#define UVD_SYS_INT_STATUS__MIF_HWINT_MASK                                                                    0x10000000L +#define UVD_SYS_INT_STATUS__MPRD_ERR_INT_MASK                                                                 0x20000000L +#define UVD_SYS_INT_STATUS__RASCNTL_VCPU_VCODEC_INT_MASK                                                      0x40000000L +#define UVD_SYS_INT_STATUS__AVM_INT_MASK                                                                      0x80000000L +//UVD_SYS_INT_ACK +#define UVD_SYS_INT_ACK__PIF_ADDR_ERR_ACK__SHIFT                                                              0x0 +#define UVD_SYS_INT_ACK__SEMA_WAIT_FAULT_TIMEOUT_ACK__SHIFT                                                   0x1 +#define UVD_SYS_INT_ACK__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_ACK__SHIFT                                            0x2 +#define UVD_SYS_INT_ACK__CXW_WR_ACK__SHIFT                                                                    0x3 +#define UVD_SYS_INT_ACK__RBC_REG_PRIV_FAULT_ACK__SHIFT                                                        0x6 +#define UVD_SYS_INT_ACK__LBSI_ACK__SHIFT                                                                      0xb +#define UVD_SYS_INT_ACK__UDEC_ACK__SHIFT                                                                      0xc +#define UVD_SYS_INT_ACK__LMI_AXI_UNSUPPORTED_LEN_ACK__SHIFT                                                   0xd +#define UVD_SYS_INT_ACK__LMI_AXI_UNSUPPORTED_ADR_ALIGN_ACK__SHIFT                                             0xe +#define UVD_SYS_INT_ACK__SUVD_ACK__SHIFT                                                                      0xf +#define UVD_SYS_INT_ACK__JOB_DONE_ACK__SHIFT                                                                  0x10 +#define UVD_SYS_INT_ACK__SEMA_WAIT_FAIL_SIG_ACK__SHIFT                                                        0x17 +#define UVD_SYS_INT_ACK__IDCT_ACK__SHIFT                                                                      0x18 +#define UVD_SYS_INT_ACK__MPRD_ACK__SHIFT                                                                      0x19 +#define UVD_SYS_INT_ACK__CLK_SWT_ACK__SHIFT                                                                   0x1b +#define UVD_SYS_INT_ACK__MIF_HWINT_ACK__SHIFT                                                                 0x1c +#define UVD_SYS_INT_ACK__MPRD_ERR_ACK__SHIFT                                                                  0x1d +#define UVD_SYS_INT_ACK__RASCNTL_VCPU_VCODEC_ACK__SHIFT                                                       0x1e +#define UVD_SYS_INT_ACK__AVM_INT_ACK__SHIFT                                                                   0x1f +#define UVD_SYS_INT_ACK__PIF_ADDR_ERR_ACK_MASK                                                                0x00000001L +#define UVD_SYS_INT_ACK__SEMA_WAIT_FAULT_TIMEOUT_ACK_MASK                                                     0x00000002L +#define UVD_SYS_INT_ACK__SEMA_SIGNAL_INCOMPLETE_TIMEOUT_ACK_MASK                                              0x00000004L +#define UVD_SYS_INT_ACK__CXW_WR_ACK_MASK                                                                      0x00000008L +#define UVD_SYS_INT_ACK__RBC_REG_PRIV_FAULT_ACK_MASK                                                          0x00000040L +#define UVD_SYS_INT_ACK__LBSI_ACK_MASK                                                                        0x00000800L +#define UVD_SYS_INT_ACK__UDEC_ACK_MASK                                                                        0x00001000L +#define UVD_SYS_INT_ACK__LMI_AXI_UNSUPPORTED_LEN_ACK_MASK                                                     0x00002000L +#define UVD_SYS_INT_ACK__LMI_AXI_UNSUPPORTED_ADR_ALIGN_ACK_MASK                                               0x00004000L +#define UVD_SYS_INT_ACK__SUVD_ACK_MASK                                                                        0x00008000L +#define UVD_SYS_INT_ACK__JOB_DONE_ACK_MASK                                                                    0x00010000L +#define UVD_SYS_INT_ACK__SEMA_WAIT_FAIL_SIG_ACK_MASK                                                          0x00800000L +#define UVD_SYS_INT_ACK__IDCT_ACK_MASK                                                                        0x01000000L +#define UVD_SYS_INT_ACK__MPRD_ACK_MASK                                                                        0x02000000L +#define UVD_SYS_INT_ACK__CLK_SWT_ACK_MASK                                                                     0x08000000L +#define UVD_SYS_INT_ACK__MIF_HWINT_ACK_MASK                                                                   0x10000000L +#define UVD_SYS_INT_ACK__MPRD_ERR_ACK_MASK                                                                    0x20000000L +#define UVD_SYS_INT_ACK__RASCNTL_VCPU_VCODEC_ACK_MASK                                                         0x40000000L +#define UVD_SYS_INT_ACK__AVM_INT_ACK_MASK                                                                     0x80000000L +//UVD_JOB_DONE +#define UVD_JOB_DONE__JOB_DONE__SHIFT                                                                         0x0 +#define UVD_JOB_DONE__JOB_DONE_MASK                                                                           0x00000003L +//UVD_CBUF_ID +#define UVD_CBUF_ID__CBUF_ID__SHIFT                                                                           0x0 +#define UVD_CBUF_ID__CBUF_ID_MASK                                                                             0xFFFFFFFFL +//UVD_CONTEXT_ID +#define UVD_CONTEXT_ID__CONTEXT_ID__SHIFT                                                                     0x0 +#define UVD_CONTEXT_ID__CONTEXT_ID_MASK                                                                       0xFFFFFFFFL +//UVD_CONTEXT_ID2 +#define UVD_CONTEXT_ID2__CONTEXT_ID2__SHIFT                                                                   0x0 +#define UVD_CONTEXT_ID2__CONTEXT_ID2_MASK                                                                     0xFFFFFFFFL +//UVD_NO_OP +#define UVD_NO_OP__NO_OP__SHIFT                                                                               0x0 +#define UVD_NO_OP__NO_OP_MASK                                                                                 0xFFFFFFFFL +//UVD_RB_BASE_LO +#define UVD_RB_BASE_LO__RB_BASE_LO__SHIFT                                                                     0x6 +#define UVD_RB_BASE_LO__RB_BASE_LO_MASK                                                                       0xFFFFFFC0L +//UVD_RB_BASE_HI +#define UVD_RB_BASE_HI__RB_BASE_HI__SHIFT                                                                     0x0 +#define UVD_RB_BASE_HI__RB_BASE_HI_MASK                                                                       0xFFFFFFFFL +//UVD_RB_SIZE +#define UVD_RB_SIZE__RB_SIZE__SHIFT                                                                           0x4 +#define UVD_RB_SIZE__RB_SIZE_MASK                                                                             0x007FFFF0L +//UVD_RB_BASE_LO2 +#define UVD_RB_BASE_LO2__RB_BASE_LO__SHIFT                                                                    0x6 +#define UVD_RB_BASE_LO2__RB_BASE_LO_MASK                                                                      0xFFFFFFC0L +//UVD_RB_BASE_HI2 +#define UVD_RB_BASE_HI2__RB_BASE_HI__SHIFT                                                                    0x0 +#define UVD_RB_BASE_HI2__RB_BASE_HI_MASK                                                                      0xFFFFFFFFL +//UVD_RB_SIZE2 +#define UVD_RB_SIZE2__RB_SIZE__SHIFT                                                                          0x4 +#define UVD_RB_SIZE2__RB_SIZE_MASK                                                                            0x007FFFF0L +//UVD_RB_BASE_LO3 +#define UVD_RB_BASE_LO3__RB_BASE_LO__SHIFT                                                                    0x6 +#define UVD_RB_BASE_LO3__RB_BASE_LO_MASK                                                                      0xFFFFFFC0L +//UVD_RB_BASE_HI3 +#define UVD_RB_BASE_HI3__RB_BASE_HI__SHIFT                                                                    0x0 +#define UVD_RB_BASE_HI3__RB_BASE_HI_MASK                                                                      0xFFFFFFFFL +//UVD_RB_SIZE3 +#define UVD_RB_SIZE3__RB_SIZE__SHIFT                                                                          0x4 +#define UVD_RB_SIZE3__RB_SIZE_MASK                                                                            0x007FFFF0L +//UVD_RB_BASE_LO4 +#define UVD_RB_BASE_LO4__RB_BASE_LO__SHIFT                                                                    0x6 +#define UVD_RB_BASE_LO4__RB_BASE_LO_MASK                                                                      0xFFFFFFC0L +//UVD_RB_BASE_HI4 +#define UVD_RB_BASE_HI4__RB_BASE_HI__SHIFT                                                                    0x0 +#define UVD_RB_BASE_HI4__RB_BASE_HI_MASK                                                                      0xFFFFFFFFL +//UVD_RB_SIZE4 +#define UVD_RB_SIZE4__RB_SIZE__SHIFT                                                                          0x4 +#define UVD_RB_SIZE4__RB_SIZE_MASK                                                                            0x007FFFF0L +//UVD_OUT_RB_BASE_LO +#define UVD_OUT_RB_BASE_LO__RB_BASE_LO__SHIFT                                                                 0x6 +#define UVD_OUT_RB_BASE_LO__RB_BASE_LO_MASK                                                                   0xFFFFFFC0L +//UVD_OUT_RB_BASE_HI +#define UVD_OUT_RB_BASE_HI__RB_BASE_HI__SHIFT                                                                 0x0 +#define UVD_OUT_RB_BASE_HI__RB_BASE_HI_MASK                                                                   0xFFFFFFFFL +//UVD_OUT_RB_SIZE +#define UVD_OUT_RB_SIZE__RB_SIZE__SHIFT                                                                       0x4 +#define UVD_OUT_RB_SIZE__RB_SIZE_MASK                                                                         0x007FFFF0L +//UVD_IOV_ACTIVE_FCN_ID +#define UVD_IOV_ACTIVE_FCN_ID__VF_ID__SHIFT                                                                   0x0 +#define UVD_IOV_ACTIVE_FCN_ID__PF_VF__SHIFT                                                                   0x1f +#define UVD_IOV_ACTIVE_FCN_ID__VF_ID_MASK                                                                     0x0000003FL +#define UVD_IOV_ACTIVE_FCN_ID__PF_VF_MASK                                                                     0x80000000L +//UVD_IOV_MAILBOX +#define UVD_IOV_MAILBOX__MAILBOX__SHIFT                                                                       0x0 +#define UVD_IOV_MAILBOX__MAILBOX_MASK                                                                         0xFFFFFFFFL +//UVD_IOV_MAILBOX_RESP +#define UVD_IOV_MAILBOX_RESP__RESP__SHIFT                                                                     0x0 +#define UVD_IOV_MAILBOX_RESP__RESP_MASK                                                                       0xFFFFFFFFL +//UVD_RB_ARB_CTRL +#define UVD_RB_ARB_CTRL__SRBM_DROP__SHIFT                                                                     0x0 +#define UVD_RB_ARB_CTRL__SRBM_DIS__SHIFT                                                                      0x1 +#define UVD_RB_ARB_CTRL__VCPU_DROP__SHIFT                                                                     0x2 +#define UVD_RB_ARB_CTRL__VCPU_DIS__SHIFT                                                                      0x3 +#define UVD_RB_ARB_CTRL__RBC_DROP__SHIFT                                                                      0x4 +#define UVD_RB_ARB_CTRL__RBC_DIS__SHIFT                                                                       0x5 +#define UVD_RB_ARB_CTRL__FWOFLD_DROP__SHIFT                                                                   0x6 +#define UVD_RB_ARB_CTRL__FWOFLD_DIS__SHIFT                                                                    0x7 +#define UVD_RB_ARB_CTRL__FAST_PATH_EN__SHIFT                                                                  0x8 +#define UVD_RB_ARB_CTRL__UVD_RB_DBG_EN__SHIFT                                                                 0x9 +#define UVD_RB_ARB_CTRL__SRBM_DROP_MASK                                                                       0x00000001L +#define UVD_RB_ARB_CTRL__SRBM_DIS_MASK                                                                        0x00000002L +#define UVD_RB_ARB_CTRL__VCPU_DROP_MASK                                                                       0x00000004L +#define UVD_RB_ARB_CTRL__VCPU_DIS_MASK                                                                        0x00000008L +#define UVD_RB_ARB_CTRL__RBC_DROP_MASK                                                                        0x00000010L +#define UVD_RB_ARB_CTRL__RBC_DIS_MASK                                                                         0x00000020L +#define UVD_RB_ARB_CTRL__FWOFLD_DROP_MASK                                                                     0x00000040L +#define UVD_RB_ARB_CTRL__FWOFLD_DIS_MASK                                                                      0x00000080L +#define UVD_RB_ARB_CTRL__FAST_PATH_EN_MASK                                                                    0x00000100L +#define UVD_RB_ARB_CTRL__UVD_RB_DBG_EN_MASK                                                                   0x00000200L +//UVD_CTX_INDEX +#define UVD_CTX_INDEX__INDEX__SHIFT                                                                           0x0 +#define UVD_CTX_INDEX__INDEX_MASK                                                                             0x000001FFL +//UVD_CTX_DATA +#define UVD_CTX_DATA__DATA__SHIFT                                                                             0x0 +#define UVD_CTX_DATA__DATA_MASK                                                                               0xFFFFFFFFL +//UVD_CXW_WR +#define UVD_CXW_WR__DAT__SHIFT                                                                                0x0 +#define UVD_CXW_WR__STAT__SHIFT                                                                               0x1f +#define UVD_CXW_WR__DAT_MASK                                                                                  0x0FFFFFFFL +#define UVD_CXW_WR__STAT_MASK                                                                                 0x80000000L +//UVD_CXW_WR_INT_ID +#define UVD_CXW_WR_INT_ID__ID__SHIFT                                                                          0x0 +#define UVD_CXW_WR_INT_ID__ID_MASK                                                                            0x000000FFL +//UVD_CXW_WR_INT_CTX_ID +#define UVD_CXW_WR_INT_CTX_ID__ID__SHIFT                                                                      0x0 +#define UVD_CXW_WR_INT_CTX_ID__ID_MASK                                                                        0x0FFFFFFFL +//UVD_CXW_INT_ID +#define UVD_CXW_INT_ID__ID__SHIFT                                                                             0x0 +#define UVD_CXW_INT_ID__ID_MASK                                                                               0x000000FFL +//UVD_MPEG2_ERROR +#define UVD_MPEG2_ERROR__STATUS__SHIFT                                                                        0x0 +#define UVD_MPEG2_ERROR__STATUS_MASK                                                                          0xFFFFFFFFL +//UVD_YBASE +#define UVD_YBASE__DUM__SHIFT                                                                                 0x0 +#define UVD_YBASE__DUM_MASK                                                                                   0xFFFFFFFFL +//UVD_UVBASE +#define UVD_UVBASE__DUM__SHIFT                                                                                0x0 +#define UVD_UVBASE__DUM_MASK                                                                                  0xFFFFFFFFL +//UVD_PITCH +#define UVD_PITCH__DUM__SHIFT                                                                                 0x0 +#define UVD_PITCH__DUM_MASK                                                                                   0xFFFFFFFFL +//UVD_WIDTH +#define UVD_WIDTH__DUM__SHIFT                                                                                 0x0 +#define UVD_WIDTH__DUM_MASK                                                                                   0xFFFFFFFFL +//UVD_HEIGHT +#define UVD_HEIGHT__DUM__SHIFT                                                                                0x0 +#define UVD_HEIGHT__DUM_MASK                                                                                  0xFFFFFFFFL +//UVD_PICCOUNT +#define UVD_PICCOUNT__DUM__SHIFT                                                                              0x0 +#define UVD_PICCOUNT__DUM_MASK                                                                                0xFFFFFFFFL +//UVD_MPRD_INITIAL_XY +#define UVD_MPRD_INITIAL_XY__MPRD_SCREEN_X__SHIFT                                                             0x0 +#define UVD_MPRD_INITIAL_XY__MPRD_SCREEN_Y__SHIFT                                                             0x10 +#define UVD_MPRD_INITIAL_XY__MPRD_SCREEN_X_MASK                                                               0x00000FFFL +#define UVD_MPRD_INITIAL_XY__MPRD_SCREEN_Y_MASK                                                               0x0FFF0000L +//UVD_MPEG2_CTRL +#define UVD_MPEG2_CTRL__EN__SHIFT                                                                             0x0 +#define UVD_MPEG2_CTRL__TRICK_MODE__SHIFT                                                                     0x1 +#define UVD_MPEG2_CTRL__NUM_MB_PER_JOB__SHIFT                                                                 0x10 +#define UVD_MPEG2_CTRL__EN_MASK                                                                               0x00000001L +#define UVD_MPEG2_CTRL__TRICK_MODE_MASK                                                                       0x00000002L +#define UVD_MPEG2_CTRL__NUM_MB_PER_JOB_MASK                                                                   0xFFFF0000L +//UVD_MB_CTL_BUF_BASE +#define UVD_MB_CTL_BUF_BASE__BASE__SHIFT                                                                      0x0 +#define UVD_MB_CTL_BUF_BASE__BASE_MASK                                                                        0xFFFFFFFFL +//UVD_PIC_CTL_BUF_BASE +#define UVD_PIC_CTL_BUF_BASE__BASE__SHIFT                                                                     0x0 +#define UVD_PIC_CTL_BUF_BASE__BASE_MASK                                                                       0xFFFFFFFFL +//UVD_DXVA_BUF_SIZE +#define UVD_DXVA_BUF_SIZE__PIC_SIZE__SHIFT                                                                    0x0 +#define UVD_DXVA_BUF_SIZE__MB_SIZE__SHIFT                                                                     0x10 +#define UVD_DXVA_BUF_SIZE__PIC_SIZE_MASK                                                                      0x0000FFFFL +#define UVD_DXVA_BUF_SIZE__MB_SIZE_MASK                                                                       0xFFFF0000L +//UVD_SCRATCH_NP +#define UVD_SCRATCH_NP__DATA__SHIFT                                                                           0x0 +#define UVD_SCRATCH_NP__DATA_MASK                                                                             0xFFFFFFFFL +//UVD_CLK_SWT_HANDSHAKE +#define UVD_CLK_SWT_HANDSHAKE__CLK_SWT_TYPE__SHIFT                                                            0x0 +#define UVD_CLK_SWT_HANDSHAKE__CLK_DOMAIN_SWT__SHIFT                                                          0x8 +#define UVD_CLK_SWT_HANDSHAKE__CLK_SWT_TYPE_MASK                                                              0x00000003L +#define UVD_CLK_SWT_HANDSHAKE__CLK_DOMAIN_SWT_MASK                                                            0x00000300L +//UVD_GP_SCRATCH0 +#define UVD_GP_SCRATCH0__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH0__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH1 +#define UVD_GP_SCRATCH1__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH1__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH2 +#define UVD_GP_SCRATCH2__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH2__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH3 +#define UVD_GP_SCRATCH3__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH3__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH4 +#define UVD_GP_SCRATCH4__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH4__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH5 +#define UVD_GP_SCRATCH5__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH5__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH6 +#define UVD_GP_SCRATCH6__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH6__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH7 +#define UVD_GP_SCRATCH7__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH7__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH8 +#define UVD_GP_SCRATCH8__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH8__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH9 +#define UVD_GP_SCRATCH9__DATA__SHIFT                                                                          0x0 +#define UVD_GP_SCRATCH9__DATA_MASK                                                                            0xFFFFFFFFL +//UVD_GP_SCRATCH10 +#define UVD_GP_SCRATCH10__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH10__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH11 +#define UVD_GP_SCRATCH11__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH11__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH12 +#define UVD_GP_SCRATCH12__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH12__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH13 +#define UVD_GP_SCRATCH13__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH13__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH14 +#define UVD_GP_SCRATCH14__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH14__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH15 +#define UVD_GP_SCRATCH15__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH15__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH16 +#define UVD_GP_SCRATCH16__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH16__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH17 +#define UVD_GP_SCRATCH17__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH17__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH18 +#define UVD_GP_SCRATCH18__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH18__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH19 +#define UVD_GP_SCRATCH19__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH19__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH20 +#define UVD_GP_SCRATCH20__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH20__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH21 +#define UVD_GP_SCRATCH21__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH21__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH22 +#define UVD_GP_SCRATCH22__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH22__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_GP_SCRATCH23 +#define UVD_GP_SCRATCH23__DATA__SHIFT                                                                         0x0 +#define UVD_GP_SCRATCH23__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_AUDIO_RB_BASE_LO +#define UVD_AUDIO_RB_BASE_LO__RB_BASE_LO__SHIFT                                                               0x6 +#define UVD_AUDIO_RB_BASE_LO__RB_BASE_LO_MASK                                                                 0xFFFFFFC0L +//UVD_AUDIO_RB_BASE_HI +#define UVD_AUDIO_RB_BASE_HI__RB_BASE_HI__SHIFT                                                               0x0 +#define UVD_AUDIO_RB_BASE_HI__RB_BASE_HI_MASK                                                                 0xFFFFFFFFL +//UVD_AUDIO_RB_SIZE +#define UVD_AUDIO_RB_SIZE__RB_SIZE__SHIFT                                                                     0x4 +#define UVD_AUDIO_RB_SIZE__RB_SIZE_MASK                                                                       0x007FFFF0L +//UVD_VCPU_INT_STATUS2 +#define UVD_VCPU_INT_STATUS2__SW_RB6_INT__SHIFT                                                               0x0 +#define UVD_VCPU_INT_STATUS2__RASCNTL_VCPU_VCODEC_INT__SHIFT                                                  0x15 +#define UVD_VCPU_INT_STATUS2__SW_RB6_INT_MASK                                                                 0x00000001L +#define UVD_VCPU_INT_STATUS2__RASCNTL_VCPU_VCODEC_INT_MASK                                                    0x00200000L +//UVD_VCPU_INT_ACK2 +#define UVD_VCPU_INT_ACK2__SW_RB6_INT_ACK__SHIFT                                                              0x0 +#define UVD_VCPU_INT_ACK2__RASCNTL_VCPU_VCODEC_ACK__SHIFT                                                     0x16 +#define UVD_VCPU_INT_ACK2__SW_RB6_INT_ACK_MASK                                                                0x00000001L +#define UVD_VCPU_INT_ACK2__RASCNTL_VCPU_VCODEC_ACK_MASK                                                       0x00400000L +//UVD_VCPU_INT_EN2 +#define UVD_VCPU_INT_EN2__SW_RB6_INT_EN__SHIFT                                                                0x0 +#define UVD_VCPU_INT_EN2__RASCNTL_VCPU_VCODEC_EN__SHIFT                                                       0x1 +#define UVD_VCPU_INT_EN2__SW_RB6_INT_EN_MASK                                                                  0x00000001L +#define UVD_VCPU_INT_EN2__RASCNTL_VCPU_VCODEC_EN_MASK                                                         0x00000002L +//UVD_SUVD_CGC_STATUS2 +#define UVD_SUVD_CGC_STATUS2__SMPA_VCLK__SHIFT                                                                0x0 +#define UVD_SUVD_CGC_STATUS2__SMPA_DCLK__SHIFT                                                                0x1 +#define UVD_SUVD_CGC_STATUS2__MPBE1_DCLK__SHIFT                                                               0x3 +#define UVD_SUVD_CGC_STATUS2__SIT_AV1_DCLK__SHIFT                                                             0x4 +#define UVD_SUVD_CGC_STATUS2__SDB_AV1_DCLK__SHIFT                                                             0x5 +#define UVD_SUVD_CGC_STATUS2__MPC1_DCLK__SHIFT                                                                0x6 +#define UVD_SUVD_CGC_STATUS2__MPC1_SCLK__SHIFT                                                                0x7 +#define UVD_SUVD_CGC_STATUS2__MPC1_VCLK__SHIFT                                                                0x8 +#define UVD_SUVD_CGC_STATUS2__SRE_AV1_ENC_DCLK__SHIFT                                                         0x9 +#define UVD_SUVD_CGC_STATUS2__CDEFE_DCLK__SHIFT                                                               0xa +#define UVD_SUVD_CGC_STATUS2__SIT0_DCLK__SHIFT                                                                0xb +#define UVD_SUVD_CGC_STATUS2__SIT1_DCLK__SHIFT                                                                0xc +#define UVD_SUVD_CGC_STATUS2__SIT2_DCLK__SHIFT                                                                0xd +#define UVD_SUVD_CGC_STATUS2__FBC_PCLK__SHIFT                                                                 0x1c +#define UVD_SUVD_CGC_STATUS2__FBC_CCLK__SHIFT                                                                 0x1d +#define UVD_SUVD_CGC_STATUS2__SMPA_VCLK_MASK                                                                  0x00000001L +#define UVD_SUVD_CGC_STATUS2__SMPA_DCLK_MASK                                                                  0x00000002L +#define UVD_SUVD_CGC_STATUS2__MPBE1_DCLK_MASK                                                                 0x00000008L +#define UVD_SUVD_CGC_STATUS2__SIT_AV1_DCLK_MASK                                                               0x00000010L +#define UVD_SUVD_CGC_STATUS2__SDB_AV1_DCLK_MASK                                                               0x00000020L +#define UVD_SUVD_CGC_STATUS2__MPC1_DCLK_MASK                                                                  0x00000040L +#define UVD_SUVD_CGC_STATUS2__MPC1_SCLK_MASK                                                                  0x00000080L +#define UVD_SUVD_CGC_STATUS2__MPC1_VCLK_MASK                                                                  0x00000100L +#define UVD_SUVD_CGC_STATUS2__SRE_AV1_ENC_DCLK_MASK                                                           0x00000200L +#define UVD_SUVD_CGC_STATUS2__CDEFE_DCLK_MASK                                                                 0x00000400L +#define UVD_SUVD_CGC_STATUS2__SIT0_DCLK_MASK                                                                  0x00000800L +#define UVD_SUVD_CGC_STATUS2__SIT1_DCLK_MASK                                                                  0x00001000L +#define UVD_SUVD_CGC_STATUS2__SIT2_DCLK_MASK                                                                  0x00002000L +#define UVD_SUVD_CGC_STATUS2__FBC_PCLK_MASK                                                                   0x10000000L +#define UVD_SUVD_CGC_STATUS2__FBC_CCLK_MASK                                                                   0x20000000L +//UVD_SUVD_INT_STATUS2 +#define UVD_SUVD_INT_STATUS2__SMPA_FUNC_INT__SHIFT                                                            0x0 +#define UVD_SUVD_INT_STATUS2__SMPA_ERR_INT__SHIFT                                                             0x5 +#define UVD_SUVD_INT_STATUS2__SDB_AV1_FUNC_INT__SHIFT                                                         0x6 +#define UVD_SUVD_INT_STATUS2__SDB_AV1_ERR_INT__SHIFT                                                          0xb +#define UVD_SUVD_INT_STATUS2__SMPA_FUNC_INT_MASK                                                              0x0000001FL +#define UVD_SUVD_INT_STATUS2__SMPA_ERR_INT_MASK                                                               0x00000020L +#define UVD_SUVD_INT_STATUS2__SDB_AV1_FUNC_INT_MASK                                                           0x000007C0L +#define UVD_SUVD_INT_STATUS2__SDB_AV1_ERR_INT_MASK                                                            0x00000800L +//UVD_SUVD_INT_EN2 +#define UVD_SUVD_INT_EN2__SMPA_FUNC_INT_EN__SHIFT                                                             0x0 +#define UVD_SUVD_INT_EN2__SMPA_ERR_INT_EN__SHIFT                                                              0x5 +#define UVD_SUVD_INT_EN2__SDB_AV1_FUNC_INT_EN__SHIFT                                                          0x6 +#define UVD_SUVD_INT_EN2__SDB_AV1_ERR_INT_EN__SHIFT                                                           0xb +#define UVD_SUVD_INT_EN2__SMPA_FUNC_INT_EN_MASK                                                               0x0000001FL +#define UVD_SUVD_INT_EN2__SMPA_ERR_INT_EN_MASK                                                                0x00000020L +#define UVD_SUVD_INT_EN2__SDB_AV1_FUNC_INT_EN_MASK                                                            0x000007C0L +#define UVD_SUVD_INT_EN2__SDB_AV1_ERR_INT_EN_MASK                                                             0x00000800L +//UVD_SUVD_INT_ACK2 +#define UVD_SUVD_INT_ACK2__SMPA_FUNC_INT_ACK__SHIFT                                                           0x0 +#define UVD_SUVD_INT_ACK2__SMPA_ERR_INT_ACK__SHIFT                                                            0x5 +#define UVD_SUVD_INT_ACK2__SDB_AV1_FUNC_INT_ACK__SHIFT                                                        0x6 +#define UVD_SUVD_INT_ACK2__SDB_AV1_ERR_INT_ACK__SHIFT                                                         0xb +#define UVD_SUVD_INT_ACK2__SMPA_FUNC_INT_ACK_MASK                                                             0x0000001FL +#define UVD_SUVD_INT_ACK2__SMPA_ERR_INT_ACK_MASK                                                              0x00000020L +#define UVD_SUVD_INT_ACK2__SDB_AV1_FUNC_INT_ACK_MASK                                                          0x000007C0L +#define UVD_SUVD_INT_ACK2__SDB_AV1_ERR_INT_ACK_MASK                                                           0x00000800L +//UVD_STATUS +#define UVD_STATUS__RBC_BUSY__SHIFT                                                                           0x0 +#define UVD_STATUS__VCPU_REPORT__SHIFT                                                                        0x1 +#define UVD_STATUS__FILL_0__SHIFT                                                                             0x8 +#define UVD_STATUS__RBC_ACCESS_GPCOM__SHIFT                                                                   0x10 +#define UVD_STATUS__DRM_BUSY__SHIFT                                                                           0x11 +#define UVD_STATUS__FILL_1__SHIFT                                                                             0x12 +#define UVD_STATUS__SYS_GPCOM_REQ__SHIFT                                                                      0x1f +#define UVD_STATUS__RBC_BUSY_MASK                                                                             0x00000001L +#define UVD_STATUS__VCPU_REPORT_MASK                                                                          0x000000FEL +#define UVD_STATUS__FILL_0_MASK                                                                               0x0000FF00L +#define UVD_STATUS__RBC_ACCESS_GPCOM_MASK                                                                     0x00010000L +#define UVD_STATUS__DRM_BUSY_MASK                                                                             0x00020000L +#define UVD_STATUS__FILL_1_MASK                                                                               0x7FFC0000L +#define UVD_STATUS__SYS_GPCOM_REQ_MASK                                                                        0x80000000L +//UVD_ENC_PIPE_BUSY +#define UVD_ENC_PIPE_BUSY__IME_BUSY__SHIFT                                                                    0x0 +#define UVD_ENC_PIPE_BUSY__SMP_BUSY__SHIFT                                                                    0x1 +#define UVD_ENC_PIPE_BUSY__SIT_BUSY__SHIFT                                                                    0x2 +#define UVD_ENC_PIPE_BUSY__SDB_BUSY__SHIFT                                                                    0x3 +#define UVD_ENC_PIPE_BUSY__ENT_BUSY__SHIFT                                                                    0x4 +#define UVD_ENC_PIPE_BUSY__ENT_HEADER_BUSY__SHIFT                                                             0x5 +#define UVD_ENC_PIPE_BUSY__LCM_BUSY__SHIFT                                                                    0x6 +#define UVD_ENC_PIPE_BUSY__MDM_RD_CUR_BUSY__SHIFT                                                             0x7 +#define UVD_ENC_PIPE_BUSY__MDM_RD_REF_BUSY__SHIFT                                                             0x8 +#define UVD_ENC_PIPE_BUSY__MDM_RD_GEN_BUSY__SHIFT                                                             0x9 +#define UVD_ENC_PIPE_BUSY__MDM_WR_RECON_BUSY__SHIFT                                                           0xa +#define UVD_ENC_PIPE_BUSY__MDM_WR_GEN_BUSY__SHIFT                                                             0xb +#define UVD_ENC_PIPE_BUSY__EFC_BUSY__SHIFT                                                                    0xc +#define UVD_ENC_PIPE_BUSY__MDM_PPU_BUSY__SHIFT                                                                0xd +#define UVD_ENC_PIPE_BUSY__MIF_AUTODMA_BUSY__SHIFT                                                            0xe +#define UVD_ENC_PIPE_BUSY__CDEFE_BUSY__SHIFT                                                                  0xf +#define UVD_ENC_PIPE_BUSY__MIF_RD_CUR_BUSY__SHIFT                                                             0x10 +#define UVD_ENC_PIPE_BUSY__MIF_RD_REF0_BUSY__SHIFT                                                            0x11 +#define UVD_ENC_PIPE_BUSY__MIF_WR_GEN0_BUSY__SHIFT                                                            0x12 +#define UVD_ENC_PIPE_BUSY__MIF_RD_GEN0_BUSY__SHIFT                                                            0x13 +#define UVD_ENC_PIPE_BUSY__MIF_WR_GEN1_BUSY__SHIFT                                                            0x14 +#define UVD_ENC_PIPE_BUSY__MIF_RD_GEN1_BUSY__SHIFT                                                            0x15 +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP0_BUSY__SHIFT                                                            0x16 +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP1_BUSY__SHIFT                                                            0x17 +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD0_BUSY__SHIFT                                                            0x18 +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD1_BUSY__SHIFT                                                            0x19 +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD2_BUSY__SHIFT                                                            0x1a +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD3_BUSY__SHIFT                                                            0x1b +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD4_BUSY__SHIFT                                                            0x1c +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP2_BUSY__SHIFT                                                            0x1d +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP3_BUSY__SHIFT                                                            0x1e +#define UVD_ENC_PIPE_BUSY__SAOE_BUSY__SHIFT                                                                   0x1f +#define UVD_ENC_PIPE_BUSY__IME_BUSY_MASK                                                                      0x00000001L +#define UVD_ENC_PIPE_BUSY__SMP_BUSY_MASK                                                                      0x00000002L +#define UVD_ENC_PIPE_BUSY__SIT_BUSY_MASK                                                                      0x00000004L +#define UVD_ENC_PIPE_BUSY__SDB_BUSY_MASK                                                                      0x00000008L +#define UVD_ENC_PIPE_BUSY__ENT_BUSY_MASK                                                                      0x00000010L +#define UVD_ENC_PIPE_BUSY__ENT_HEADER_BUSY_MASK                                                               0x00000020L +#define UVD_ENC_PIPE_BUSY__LCM_BUSY_MASK                                                                      0x00000040L +#define UVD_ENC_PIPE_BUSY__MDM_RD_CUR_BUSY_MASK                                                               0x00000080L +#define UVD_ENC_PIPE_BUSY__MDM_RD_REF_BUSY_MASK                                                               0x00000100L +#define UVD_ENC_PIPE_BUSY__MDM_RD_GEN_BUSY_MASK                                                               0x00000200L +#define UVD_ENC_PIPE_BUSY__MDM_WR_RECON_BUSY_MASK                                                             0x00000400L +#define UVD_ENC_PIPE_BUSY__MDM_WR_GEN_BUSY_MASK                                                               0x00000800L +#define UVD_ENC_PIPE_BUSY__EFC_BUSY_MASK                                                                      0x00001000L +#define UVD_ENC_PIPE_BUSY__MDM_PPU_BUSY_MASK                                                                  0x00002000L +#define UVD_ENC_PIPE_BUSY__MIF_AUTODMA_BUSY_MASK                                                              0x00004000L +#define UVD_ENC_PIPE_BUSY__CDEFE_BUSY_MASK                                                                    0x00008000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_CUR_BUSY_MASK                                                               0x00010000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_REF0_BUSY_MASK                                                              0x00020000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_GEN0_BUSY_MASK                                                              0x00040000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_GEN0_BUSY_MASK                                                              0x00080000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_GEN1_BUSY_MASK                                                              0x00100000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_GEN1_BUSY_MASK                                                              0x00200000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP0_BUSY_MASK                                                              0x00400000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP1_BUSY_MASK                                                              0x00800000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD0_BUSY_MASK                                                              0x01000000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD1_BUSY_MASK                                                              0x02000000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD2_BUSY_MASK                                                              0x04000000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD3_BUSY_MASK                                                              0x08000000L +#define UVD_ENC_PIPE_BUSY__MIF_RD_BSD4_BUSY_MASK                                                              0x10000000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP2_BUSY_MASK                                                              0x20000000L +#define UVD_ENC_PIPE_BUSY__MIF_WR_BSP3_BUSY_MASK                                                              0x40000000L +#define UVD_ENC_PIPE_BUSY__SAOE_BUSY_MASK                                                                     0x80000000L +//UVD_FW_POWER_STATUS +#define UVD_FW_POWER_STATUS__UVDF_PWR_OFF__SHIFT                                                              0x0 +#define UVD_FW_POWER_STATUS__UVDTC_PWR_OFF__SHIFT                                                             0x1 +#define UVD_FW_POWER_STATUS__UVDB_PWR_OFF__SHIFT                                                              0x2 +#define UVD_FW_POWER_STATUS__UVDTA_PWR_OFF__SHIFT                                                             0x3 +#define UVD_FW_POWER_STATUS__UVDTD_PWR_OFF__SHIFT                                                             0x4 +#define UVD_FW_POWER_STATUS__UVDTE_PWR_OFF__SHIFT                                                             0x5 +#define UVD_FW_POWER_STATUS__UVDE_PWR_OFF__SHIFT                                                              0x6 +#define UVD_FW_POWER_STATUS__UVDAB_PWR_OFF__SHIFT                                                             0x7 +#define UVD_FW_POWER_STATUS__UVDTB_PWR_OFF__SHIFT                                                             0x8 +#define UVD_FW_POWER_STATUS__UVDNA_PWR_OFF__SHIFT                                                             0x9 +#define UVD_FW_POWER_STATUS__UVDNB_PWR_OFF__SHIFT                                                             0xa +#define UVD_FW_POWER_STATUS__UVDF_PWR_OFF_MASK                                                                0x00000001L +#define UVD_FW_POWER_STATUS__UVDTC_PWR_OFF_MASK                                                               0x00000002L +#define UVD_FW_POWER_STATUS__UVDB_PWR_OFF_MASK                                                                0x00000004L +#define UVD_FW_POWER_STATUS__UVDTA_PWR_OFF_MASK                                                               0x00000008L +#define UVD_FW_POWER_STATUS__UVDTD_PWR_OFF_MASK                                                               0x00000010L +#define UVD_FW_POWER_STATUS__UVDTE_PWR_OFF_MASK                                                               0x00000020L +#define UVD_FW_POWER_STATUS__UVDE_PWR_OFF_MASK                                                                0x00000040L +#define UVD_FW_POWER_STATUS__UVDAB_PWR_OFF_MASK                                                               0x00000080L +#define UVD_FW_POWER_STATUS__UVDTB_PWR_OFF_MASK                                                               0x00000100L +#define UVD_FW_POWER_STATUS__UVDNA_PWR_OFF_MASK                                                               0x00000200L +#define UVD_FW_POWER_STATUS__UVDNB_PWR_OFF_MASK                                                               0x00000400L +//UVD_CNTL +#define UVD_CNTL__MIF_WR_LOW_THRESHOLD_BP__SHIFT                                                              0x11 +#define UVD_CNTL__SUVD_EN__SHIFT                                                                              0x13 +#define UVD_CNTL__CABAC_MB_ACC__SHIFT                                                                         0x1c +#define UVD_CNTL__LRBBM_SAFE_SYNC_DIS__SHIFT                                                                  0x1f +#define UVD_CNTL__MIF_WR_LOW_THRESHOLD_BP_MASK                                                                0x00020000L +#define UVD_CNTL__SUVD_EN_MASK                                                                                0x00080000L +#define UVD_CNTL__CABAC_MB_ACC_MASK                                                                           0x10000000L +#define UVD_CNTL__LRBBM_SAFE_SYNC_DIS_MASK                                                                    0x80000000L +//UVD_SOFT_RESET +#define UVD_SOFT_RESET__RBC_SOFT_RESET__SHIFT                                                                 0x0 +#define UVD_SOFT_RESET__LBSI_SOFT_RESET__SHIFT                                                                0x1 +#define UVD_SOFT_RESET__LMI_SOFT_RESET__SHIFT                                                                 0x2 +#define UVD_SOFT_RESET__VCPU_SOFT_RESET__SHIFT                                                                0x3 +#define UVD_SOFT_RESET__UDEC_SOFT_RESET__SHIFT                                                                0x4 +#define UVD_SOFT_RESET__CXW_SOFT_RESET__SHIFT                                                                 0x6 +#define UVD_SOFT_RESET__TAP_SOFT_RESET__SHIFT                                                                 0x7 +#define UVD_SOFT_RESET__MPC_SOFT_RESET__SHIFT                                                                 0x8 +#define UVD_SOFT_RESET__EFC_SOFT_RESET__SHIFT                                                                 0x9 +#define UVD_SOFT_RESET__IH_SOFT_RESET__SHIFT                                                                  0xa +#define UVD_SOFT_RESET__MPRD_SOFT_RESET__SHIFT                                                                0xb +#define UVD_SOFT_RESET__IDCT_SOFT_RESET__SHIFT                                                                0xc +#define UVD_SOFT_RESET__LMI_UMC_SOFT_RESET__SHIFT                                                             0xd +#define UVD_SOFT_RESET__SPH_SOFT_RESET__SHIFT                                                                 0xe +#define UVD_SOFT_RESET__MIF_SOFT_RESET__SHIFT                                                                 0xf +#define UVD_SOFT_RESET__LCM_SOFT_RESET__SHIFT                                                                 0x10 +#define UVD_SOFT_RESET__SUVD_SOFT_RESET__SHIFT                                                                0x11 +#define UVD_SOFT_RESET__LBSI_VCLK_RESET_STATUS__SHIFT                                                         0x12 +#define UVD_SOFT_RESET__VCPU_VCLK_RESET_STATUS__SHIFT                                                         0x13 +#define UVD_SOFT_RESET__UDEC_VCLK_RESET_STATUS__SHIFT                                                         0x14 +#define UVD_SOFT_RESET__UDEC_DCLK_RESET_STATUS__SHIFT                                                         0x15 +#define UVD_SOFT_RESET__MPC_DCLK_RESET_STATUS__SHIFT                                                          0x16 +#define UVD_SOFT_RESET__MPRD_VCLK_RESET_STATUS__SHIFT                                                         0x17 +#define UVD_SOFT_RESET__MPRD_DCLK_RESET_STATUS__SHIFT                                                         0x18 +#define UVD_SOFT_RESET__IDCT_VCLK_RESET_STATUS__SHIFT                                                         0x19 +#define UVD_SOFT_RESET__MIF_DCLK_RESET_STATUS__SHIFT                                                          0x1a +#define UVD_SOFT_RESET__LCM_DCLK_RESET_STATUS__SHIFT                                                          0x1b +#define UVD_SOFT_RESET__SUVD_VCLK_RESET_STATUS__SHIFT                                                         0x1c +#define UVD_SOFT_RESET__SUVD_DCLK_RESET_STATUS__SHIFT                                                         0x1d +#define UVD_SOFT_RESET__RE_DCLK_RESET_STATUS__SHIFT                                                           0x1e +#define UVD_SOFT_RESET__SRE_DCLK_RESET_STATUS__SHIFT                                                          0x1f +#define UVD_SOFT_RESET__RBC_SOFT_RESET_MASK                                                                   0x00000001L +#define UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK                                                                  0x00000002L +#define UVD_SOFT_RESET__LMI_SOFT_RESET_MASK                                                                   0x00000004L +#define UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK                                                                  0x00000008L +#define UVD_SOFT_RESET__UDEC_SOFT_RESET_MASK                                                                  0x00000010L +#define UVD_SOFT_RESET__CXW_SOFT_RESET_MASK                                                                   0x00000040L +#define UVD_SOFT_RESET__TAP_SOFT_RESET_MASK                                                                   0x00000080L +#define UVD_SOFT_RESET__MPC_SOFT_RESET_MASK                                                                   0x00000100L +#define UVD_SOFT_RESET__EFC_SOFT_RESET_MASK                                                                   0x00000200L +#define UVD_SOFT_RESET__IH_SOFT_RESET_MASK                                                                    0x00000400L +#define UVD_SOFT_RESET__MPRD_SOFT_RESET_MASK                                                                  0x00000800L +#define UVD_SOFT_RESET__IDCT_SOFT_RESET_MASK                                                                  0x00001000L +#define UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK                                                               0x00002000L +#define UVD_SOFT_RESET__SPH_SOFT_RESET_MASK                                                                   0x00004000L +#define UVD_SOFT_RESET__MIF_SOFT_RESET_MASK                                                                   0x00008000L +#define UVD_SOFT_RESET__LCM_SOFT_RESET_MASK                                                                   0x00010000L +#define UVD_SOFT_RESET__SUVD_SOFT_RESET_MASK                                                                  0x00020000L +#define UVD_SOFT_RESET__LBSI_VCLK_RESET_STATUS_MASK                                                           0x00040000L +#define UVD_SOFT_RESET__VCPU_VCLK_RESET_STATUS_MASK                                                           0x00080000L +#define UVD_SOFT_RESET__UDEC_VCLK_RESET_STATUS_MASK                                                           0x00100000L +#define UVD_SOFT_RESET__UDEC_DCLK_RESET_STATUS_MASK                                                           0x00200000L +#define UVD_SOFT_RESET__MPC_DCLK_RESET_STATUS_MASK                                                            0x00400000L +#define UVD_SOFT_RESET__MPRD_VCLK_RESET_STATUS_MASK                                                           0x00800000L +#define UVD_SOFT_RESET__MPRD_DCLK_RESET_STATUS_MASK                                                           0x01000000L +#define UVD_SOFT_RESET__IDCT_VCLK_RESET_STATUS_MASK                                                           0x02000000L +#define UVD_SOFT_RESET__MIF_DCLK_RESET_STATUS_MASK                                                            0x04000000L +#define UVD_SOFT_RESET__LCM_DCLK_RESET_STATUS_MASK                                                            0x08000000L +#define UVD_SOFT_RESET__SUVD_VCLK_RESET_STATUS_MASK                                                           0x10000000L +#define UVD_SOFT_RESET__SUVD_DCLK_RESET_STATUS_MASK                                                           0x20000000L +#define UVD_SOFT_RESET__RE_DCLK_RESET_STATUS_MASK                                                             0x40000000L +#define UVD_SOFT_RESET__SRE_DCLK_RESET_STATUS_MASK                                                            0x80000000L +//UVD_SOFT_RESET2 +#define UVD_SOFT_RESET2__ATOMIC_SOFT_RESET__SHIFT                                                             0x0 +#define UVD_SOFT_RESET2__PPU_SOFT_RESET__SHIFT                                                                0x1 +#define UVD_SOFT_RESET2__MMSCH_VCLK_RESET_STATUS__SHIFT                                                       0x10 +#define UVD_SOFT_RESET2__MMSCH_SCLK_RESET_STATUS__SHIFT                                                       0x11 +#define UVD_SOFT_RESET2__ATOMIC_SOFT_RESET_MASK                                                               0x00000001L +#define UVD_SOFT_RESET2__PPU_SOFT_RESET_MASK                                                                  0x00000002L +#define UVD_SOFT_RESET2__MMSCH_VCLK_RESET_STATUS_MASK                                                         0x00010000L +#define UVD_SOFT_RESET2__MMSCH_SCLK_RESET_STATUS_MASK                                                         0x00020000L +//UVD_MMSCH_SOFT_RESET +#define UVD_MMSCH_SOFT_RESET__MMSCH_RESET__SHIFT                                                              0x0 +#define UVD_MMSCH_SOFT_RESET__TAP_SOFT_RESET__SHIFT                                                           0x1 +#define UVD_MMSCH_SOFT_RESET__MMSCH_LOCK__SHIFT                                                               0x1f +#define UVD_MMSCH_SOFT_RESET__MMSCH_RESET_MASK                                                                0x00000001L +#define UVD_MMSCH_SOFT_RESET__TAP_SOFT_RESET_MASK                                                             0x00000002L +#define UVD_MMSCH_SOFT_RESET__MMSCH_LOCK_MASK                                                                 0x80000000L +//UVD_WIG_CTRL +#define UVD_WIG_CTRL__AVM_SOFT_RESET__SHIFT                                                                   0x0 +#define UVD_WIG_CTRL__ACAP_SOFT_RESET__SHIFT                                                                  0x1 +#define UVD_WIG_CTRL__WIG_SOFT_RESET__SHIFT                                                                   0x2 +#define UVD_WIG_CTRL__WIG_REGCLK_FORCE_ON__SHIFT                                                              0x3 +#define UVD_WIG_CTRL__AVM_REGCLK_FORCE_ON__SHIFT                                                              0x4 +#define UVD_WIG_CTRL__AVM_SOFT_RESET_MASK                                                                     0x00000001L +#define UVD_WIG_CTRL__ACAP_SOFT_RESET_MASK                                                                    0x00000002L +#define UVD_WIG_CTRL__WIG_SOFT_RESET_MASK                                                                     0x00000004L +#define UVD_WIG_CTRL__WIG_REGCLK_FORCE_ON_MASK                                                                0x00000008L +#define UVD_WIG_CTRL__AVM_REGCLK_FORCE_ON_MASK                                                                0x00000010L +//UVD_CGC_STATUS +#define UVD_CGC_STATUS__SYS_SCLK__SHIFT                                                                       0x0 +#define UVD_CGC_STATUS__SYS_DCLK__SHIFT                                                                       0x1 +#define UVD_CGC_STATUS__SYS_VCLK__SHIFT                                                                       0x2 +#define UVD_CGC_STATUS__UDEC_SCLK__SHIFT                                                                      0x3 +#define UVD_CGC_STATUS__UDEC_DCLK__SHIFT                                                                      0x4 +#define UVD_CGC_STATUS__UDEC_VCLK__SHIFT                                                                      0x5 +#define UVD_CGC_STATUS__MPEG2_SCLK__SHIFT                                                                     0x6 +#define UVD_CGC_STATUS__MPEG2_DCLK__SHIFT                                                                     0x7 +#define UVD_CGC_STATUS__MPEG2_VCLK__SHIFT                                                                     0x8 +#define UVD_CGC_STATUS__REGS_SCLK__SHIFT                                                                      0x9 +#define UVD_CGC_STATUS__REGS_VCLK__SHIFT                                                                      0xa +#define UVD_CGC_STATUS__RBC_SCLK__SHIFT                                                                       0xb +#define UVD_CGC_STATUS__LMI_MC_SCLK__SHIFT                                                                    0xc +#define UVD_CGC_STATUS__LMI_UMC_SCLK__SHIFT                                                                   0xd +#define UVD_CGC_STATUS__IDCT_SCLK__SHIFT                                                                      0xe +#define UVD_CGC_STATUS__IDCT_VCLK__SHIFT                                                                      0xf +#define UVD_CGC_STATUS__MPRD_SCLK__SHIFT                                                                      0x10 +#define UVD_CGC_STATUS__MPRD_DCLK__SHIFT                                                                      0x11 +#define UVD_CGC_STATUS__MPRD_VCLK__SHIFT                                                                      0x12 +#define UVD_CGC_STATUS__MPC_SCLK__SHIFT                                                                       0x13 +#define UVD_CGC_STATUS__MPC_DCLK__SHIFT                                                                       0x14 +#define UVD_CGC_STATUS__LBSI_SCLK__SHIFT                                                                      0x15 +#define UVD_CGC_STATUS__LBSI_VCLK__SHIFT                                                                      0x16 +#define UVD_CGC_STATUS__LRBBM_SCLK__SHIFT                                                                     0x17 +#define UVD_CGC_STATUS__WCB_SCLK__SHIFT                                                                       0x18 +#define UVD_CGC_STATUS__VCPU_SCLK__SHIFT                                                                      0x19 +#define UVD_CGC_STATUS__VCPU_VCLK__SHIFT                                                                      0x1a +#define UVD_CGC_STATUS__MMSCH_SCLK__SHIFT                                                                     0x1b +#define UVD_CGC_STATUS__MMSCH_VCLK__SHIFT                                                                     0x1c +#define UVD_CGC_STATUS__ALL_ENC_ACTIVE__SHIFT                                                                 0x1d +#define UVD_CGC_STATUS__LRBBM_DCLK__SHIFT                                                                     0x1e +#define UVD_CGC_STATUS__ALL_DEC_ACTIVE__SHIFT                                                                 0x1f +#define UVD_CGC_STATUS__SYS_SCLK_MASK                                                                         0x00000001L +#define UVD_CGC_STATUS__SYS_DCLK_MASK                                                                         0x00000002L +#define UVD_CGC_STATUS__SYS_VCLK_MASK                                                                         0x00000004L +#define UVD_CGC_STATUS__UDEC_SCLK_MASK                                                                        0x00000008L +#define UVD_CGC_STATUS__UDEC_DCLK_MASK                                                                        0x00000010L +#define UVD_CGC_STATUS__UDEC_VCLK_MASK                                                                        0x00000020L +#define UVD_CGC_STATUS__MPEG2_SCLK_MASK                                                                       0x00000040L +#define UVD_CGC_STATUS__MPEG2_DCLK_MASK                                                                       0x00000080L +#define UVD_CGC_STATUS__MPEG2_VCLK_MASK                                                                       0x00000100L +#define UVD_CGC_STATUS__REGS_SCLK_MASK                                                                        0x00000200L +#define UVD_CGC_STATUS__REGS_VCLK_MASK                                                                        0x00000400L +#define UVD_CGC_STATUS__RBC_SCLK_MASK                                                                         0x00000800L +#define UVD_CGC_STATUS__LMI_MC_SCLK_MASK                                                                      0x00001000L +#define UVD_CGC_STATUS__LMI_UMC_SCLK_MASK                                                                     0x00002000L +#define UVD_CGC_STATUS__IDCT_SCLK_MASK                                                                        0x00004000L +#define UVD_CGC_STATUS__IDCT_VCLK_MASK                                                                        0x00008000L +#define UVD_CGC_STATUS__MPRD_SCLK_MASK                                                                        0x00010000L +#define UVD_CGC_STATUS__MPRD_DCLK_MASK                                                                        0x00020000L +#define UVD_CGC_STATUS__MPRD_VCLK_MASK                                                                        0x00040000L +#define UVD_CGC_STATUS__MPC_SCLK_MASK                                                                         0x00080000L +#define UVD_CGC_STATUS__MPC_DCLK_MASK                                                                         0x00100000L +#define UVD_CGC_STATUS__LBSI_SCLK_MASK                                                                        0x00200000L +#define UVD_CGC_STATUS__LBSI_VCLK_MASK                                                                        0x00400000L +#define UVD_CGC_STATUS__LRBBM_SCLK_MASK                                                                       0x00800000L +#define UVD_CGC_STATUS__WCB_SCLK_MASK                                                                         0x01000000L +#define UVD_CGC_STATUS__VCPU_SCLK_MASK                                                                        0x02000000L +#define UVD_CGC_STATUS__VCPU_VCLK_MASK                                                                        0x04000000L +#define UVD_CGC_STATUS__MMSCH_SCLK_MASK                                                                       0x08000000L +#define UVD_CGC_STATUS__MMSCH_VCLK_MASK                                                                       0x10000000L +#define UVD_CGC_STATUS__ALL_ENC_ACTIVE_MASK                                                                   0x20000000L +#define UVD_CGC_STATUS__LRBBM_DCLK_MASK                                                                       0x40000000L +#define UVD_CGC_STATUS__ALL_DEC_ACTIVE_MASK                                                                   0x80000000L +//UVD_CGC_UDEC_STATUS +#define UVD_CGC_UDEC_STATUS__RE_SCLK__SHIFT                                                                   0x0 +#define UVD_CGC_UDEC_STATUS__RE_DCLK__SHIFT                                                                   0x1 +#define UVD_CGC_UDEC_STATUS__RE_VCLK__SHIFT                                                                   0x2 +#define UVD_CGC_UDEC_STATUS__CM_SCLK__SHIFT                                                                   0x3 +#define UVD_CGC_UDEC_STATUS__CM_DCLK__SHIFT                                                                   0x4 +#define UVD_CGC_UDEC_STATUS__CM_VCLK__SHIFT                                                                   0x5 +#define UVD_CGC_UDEC_STATUS__IT_SCLK__SHIFT                                                                   0x6 +#define UVD_CGC_UDEC_STATUS__IT_DCLK__SHIFT                                                                   0x7 +#define UVD_CGC_UDEC_STATUS__IT_VCLK__SHIFT                                                                   0x8 +#define UVD_CGC_UDEC_STATUS__DB_SCLK__SHIFT                                                                   0x9 +#define UVD_CGC_UDEC_STATUS__DB_DCLK__SHIFT                                                                   0xa +#define UVD_CGC_UDEC_STATUS__DB_VCLK__SHIFT                                                                   0xb +#define UVD_CGC_UDEC_STATUS__MP_SCLK__SHIFT                                                                   0xc +#define UVD_CGC_UDEC_STATUS__MP_DCLK__SHIFT                                                                   0xd +#define UVD_CGC_UDEC_STATUS__MP_VCLK__SHIFT                                                                   0xe +#define UVD_CGC_UDEC_STATUS__RE_SCLK_MASK                                                                     0x00000001L +#define UVD_CGC_UDEC_STATUS__RE_DCLK_MASK                                                                     0x00000002L +#define UVD_CGC_UDEC_STATUS__RE_VCLK_MASK                                                                     0x00000004L +#define UVD_CGC_UDEC_STATUS__CM_SCLK_MASK                                                                     0x00000008L +#define UVD_CGC_UDEC_STATUS__CM_DCLK_MASK                                                                     0x00000010L +#define UVD_CGC_UDEC_STATUS__CM_VCLK_MASK                                                                     0x00000020L +#define UVD_CGC_UDEC_STATUS__IT_SCLK_MASK                                                                     0x00000040L +#define UVD_CGC_UDEC_STATUS__IT_DCLK_MASK                                                                     0x00000080L +#define UVD_CGC_UDEC_STATUS__IT_VCLK_MASK                                                                     0x00000100L +#define UVD_CGC_UDEC_STATUS__DB_SCLK_MASK                                                                     0x00000200L +#define UVD_CGC_UDEC_STATUS__DB_DCLK_MASK                                                                     0x00000400L +#define UVD_CGC_UDEC_STATUS__DB_VCLK_MASK                                                                     0x00000800L +#define UVD_CGC_UDEC_STATUS__MP_SCLK_MASK                                                                     0x00001000L +#define UVD_CGC_UDEC_STATUS__MP_DCLK_MASK                                                                     0x00002000L +#define UVD_CGC_UDEC_STATUS__MP_VCLK_MASK                                                                     0x00004000L +//UVD_SUVD_CGC_STATUS +#define UVD_SUVD_CGC_STATUS__SRE_VCLK__SHIFT                                                                  0x0 +#define UVD_SUVD_CGC_STATUS__SRE_DCLK__SHIFT                                                                  0x1 +#define UVD_SUVD_CGC_STATUS__SIT_DCLK__SHIFT                                                                  0x2 +#define UVD_SUVD_CGC_STATUS__SMP_DCLK__SHIFT                                                                  0x3 +#define UVD_SUVD_CGC_STATUS__SCM_DCLK__SHIFT                                                                  0x4 +#define UVD_SUVD_CGC_STATUS__SDB_DCLK__SHIFT                                                                  0x5 +#define UVD_SUVD_CGC_STATUS__SRE_H264_VCLK__SHIFT                                                             0x6 +#define UVD_SUVD_CGC_STATUS__SRE_HEVC_VCLK__SHIFT                                                             0x7 +#define UVD_SUVD_CGC_STATUS__SIT_H264_DCLK__SHIFT                                                             0x8 +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_DCLK__SHIFT                                                             0x9 +#define UVD_SUVD_CGC_STATUS__SCM_H264_DCLK__SHIFT                                                             0xa +#define UVD_SUVD_CGC_STATUS__SCM_HEVC_DCLK__SHIFT                                                             0xb +#define UVD_SUVD_CGC_STATUS__SDB_H264_DCLK__SHIFT                                                             0xc +#define UVD_SUVD_CGC_STATUS__SDB_HEVC_DCLK__SHIFT                                                             0xd +#define UVD_SUVD_CGC_STATUS__SCLR_DCLK__SHIFT                                                                 0xe +#define UVD_SUVD_CGC_STATUS__UVD_SC__SHIFT                                                                    0xf +#define UVD_SUVD_CGC_STATUS__ENT_DCLK__SHIFT                                                                  0x10 +#define UVD_SUVD_CGC_STATUS__IME_DCLK__SHIFT                                                                  0x11 +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_DEC_DCLK__SHIFT                                                         0x12 +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_ENC_DCLK__SHIFT                                                         0x13 +#define UVD_SUVD_CGC_STATUS__SITE_DCLK__SHIFT                                                                 0x14 +#define UVD_SUVD_CGC_STATUS__SITE_HEVC_DCLK__SHIFT                                                            0x15 +#define UVD_SUVD_CGC_STATUS__SITE_HEVC_ENC_DCLK__SHIFT                                                        0x16 +#define UVD_SUVD_CGC_STATUS__SRE_VP9_VCLK__SHIFT                                                              0x17 +#define UVD_SUVD_CGC_STATUS__SCM_VP9_VCLK__SHIFT                                                              0x18 +#define UVD_SUVD_CGC_STATUS__SIT_VP9_DEC_DCLK__SHIFT                                                          0x19 +#define UVD_SUVD_CGC_STATUS__SDB_VP9_DCLK__SHIFT                                                              0x1a +#define UVD_SUVD_CGC_STATUS__IME_HEVC_DCLK__SHIFT                                                             0x1b +#define UVD_SUVD_CGC_STATUS__EFC_DCLK__SHIFT                                                                  0x1c +#define UVD_SUVD_CGC_STATUS__SAOE_DCLK__SHIFT                                                                 0x1d +#define UVD_SUVD_CGC_STATUS__SRE_AV1_VCLK__SHIFT                                                              0x1e +#define UVD_SUVD_CGC_STATUS__SCM_AV1_DCLK__SHIFT                                                              0x1f +#define UVD_SUVD_CGC_STATUS__SRE_VCLK_MASK                                                                    0x00000001L +#define UVD_SUVD_CGC_STATUS__SRE_DCLK_MASK                                                                    0x00000002L +#define UVD_SUVD_CGC_STATUS__SIT_DCLK_MASK                                                                    0x00000004L +#define UVD_SUVD_CGC_STATUS__SMP_DCLK_MASK                                                                    0x00000008L +#define UVD_SUVD_CGC_STATUS__SCM_DCLK_MASK                                                                    0x00000010L +#define UVD_SUVD_CGC_STATUS__SDB_DCLK_MASK                                                                    0x00000020L +#define UVD_SUVD_CGC_STATUS__SRE_H264_VCLK_MASK                                                               0x00000040L +#define UVD_SUVD_CGC_STATUS__SRE_HEVC_VCLK_MASK                                                               0x00000080L +#define UVD_SUVD_CGC_STATUS__SIT_H264_DCLK_MASK                                                               0x00000100L +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_DCLK_MASK                                                               0x00000200L +#define UVD_SUVD_CGC_STATUS__SCM_H264_DCLK_MASK                                                               0x00000400L +#define UVD_SUVD_CGC_STATUS__SCM_HEVC_DCLK_MASK                                                               0x00000800L +#define UVD_SUVD_CGC_STATUS__SDB_H264_DCLK_MASK                                                               0x00001000L +#define UVD_SUVD_CGC_STATUS__SDB_HEVC_DCLK_MASK                                                               0x00002000L +#define UVD_SUVD_CGC_STATUS__SCLR_DCLK_MASK                                                                   0x00004000L +#define UVD_SUVD_CGC_STATUS__UVD_SC_MASK                                                                      0x00008000L +#define UVD_SUVD_CGC_STATUS__ENT_DCLK_MASK                                                                    0x00010000L +#define UVD_SUVD_CGC_STATUS__IME_DCLK_MASK                                                                    0x00020000L +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_DEC_DCLK_MASK                                                           0x00040000L +#define UVD_SUVD_CGC_STATUS__SIT_HEVC_ENC_DCLK_MASK                                                           0x00080000L +#define UVD_SUVD_CGC_STATUS__SITE_DCLK_MASK                                                                   0x00100000L +#define UVD_SUVD_CGC_STATUS__SITE_HEVC_DCLK_MASK                                                              0x00200000L +#define UVD_SUVD_CGC_STATUS__SITE_HEVC_ENC_DCLK_MASK                                                          0x00400000L +#define UVD_SUVD_CGC_STATUS__SRE_VP9_VCLK_MASK                                                                0x00800000L +#define UVD_SUVD_CGC_STATUS__SCM_VP9_VCLK_MASK                                                                0x01000000L +#define UVD_SUVD_CGC_STATUS__SIT_VP9_DEC_DCLK_MASK                                                            0x02000000L +#define UVD_SUVD_CGC_STATUS__SDB_VP9_DCLK_MASK                                                                0x04000000L +#define UVD_SUVD_CGC_STATUS__IME_HEVC_DCLK_MASK                                                               0x08000000L +#define UVD_SUVD_CGC_STATUS__EFC_DCLK_MASK                                                                    0x10000000L +#define UVD_SUVD_CGC_STATUS__SAOE_DCLK_MASK                                                                   0x20000000L +#define UVD_SUVD_CGC_STATUS__SRE_AV1_VCLK_MASK                                                                0x40000000L +#define UVD_SUVD_CGC_STATUS__SCM_AV1_DCLK_MASK                                                                0x80000000L +//UVD_GPCOM_VCPU_CMD +#define UVD_GPCOM_VCPU_CMD__CMD_SEND__SHIFT                                                                   0x0 +#define UVD_GPCOM_VCPU_CMD__CMD__SHIFT                                                                        0x1 +#define UVD_GPCOM_VCPU_CMD__CMD_SOURCE__SHIFT                                                                 0x1f +#define UVD_GPCOM_VCPU_CMD__CMD_SEND_MASK                                                                     0x00000001L +#define UVD_GPCOM_VCPU_CMD__CMD_MASK                                                                          0x7FFFFFFEL +#define UVD_GPCOM_VCPU_CMD__CMD_SOURCE_MASK                                                                   0x80000000L + + +// addressBlock: aid_uvd0_ecpudec +//UVD_VCPU_CACHE_OFFSET0 +#define UVD_VCPU_CACHE_OFFSET0__CACHE_OFFSET0__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET0__CACHE_OFFSET0_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE0 +#define UVD_VCPU_CACHE_SIZE0__CACHE_SIZE0__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE0__CACHE_SIZE0_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET1 +#define UVD_VCPU_CACHE_OFFSET1__CACHE_OFFSET1__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET1__CACHE_OFFSET1_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE1 +#define UVD_VCPU_CACHE_SIZE1__CACHE_SIZE1__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE1__CACHE_SIZE1_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET2 +#define UVD_VCPU_CACHE_OFFSET2__CACHE_OFFSET2__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET2__CACHE_OFFSET2_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE2 +#define UVD_VCPU_CACHE_SIZE2__CACHE_SIZE2__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE2__CACHE_SIZE2_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET3 +#define UVD_VCPU_CACHE_OFFSET3__CACHE_OFFSET3__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET3__CACHE_OFFSET3_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE3 +#define UVD_VCPU_CACHE_SIZE3__CACHE_SIZE3__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE3__CACHE_SIZE3_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET4 +#define UVD_VCPU_CACHE_OFFSET4__CACHE_OFFSET4__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET4__CACHE_OFFSET4_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE4 +#define UVD_VCPU_CACHE_SIZE4__CACHE_SIZE4__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE4__CACHE_SIZE4_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET5 +#define UVD_VCPU_CACHE_OFFSET5__CACHE_OFFSET5__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET5__CACHE_OFFSET5_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE5 +#define UVD_VCPU_CACHE_SIZE5__CACHE_SIZE5__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE5__CACHE_SIZE5_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET6 +#define UVD_VCPU_CACHE_OFFSET6__CACHE_OFFSET6__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET6__CACHE_OFFSET6_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE6 +#define UVD_VCPU_CACHE_SIZE6__CACHE_SIZE6__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE6__CACHE_SIZE6_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET7 +#define UVD_VCPU_CACHE_OFFSET7__CACHE_OFFSET7__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET7__CACHE_OFFSET7_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE7 +#define UVD_VCPU_CACHE_SIZE7__CACHE_SIZE7__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE7__CACHE_SIZE7_MASK                                                                0x001FFFFFL +//UVD_VCPU_CACHE_OFFSET8 +#define UVD_VCPU_CACHE_OFFSET8__CACHE_OFFSET8__SHIFT                                                          0x0 +#define UVD_VCPU_CACHE_OFFSET8__CACHE_OFFSET8_MASK                                                            0x001FFFFFL +//UVD_VCPU_CACHE_SIZE8 +#define UVD_VCPU_CACHE_SIZE8__CACHE_SIZE8__SHIFT                                                              0x0 +#define UVD_VCPU_CACHE_SIZE8__CACHE_SIZE8_MASK                                                                0x001FFFFFL +//UVD_VCPU_NONCACHE_OFFSET0 +#define UVD_VCPU_NONCACHE_OFFSET0__NONCACHE_OFFSET0__SHIFT                                                    0x0 +#define UVD_VCPU_NONCACHE_OFFSET0__NONCACHE_OFFSET0_MASK                                                      0x01FFFFFFL +//UVD_VCPU_NONCACHE_SIZE0 +#define UVD_VCPU_NONCACHE_SIZE0__NONCACHE_SIZE0__SHIFT                                                        0x0 +#define UVD_VCPU_NONCACHE_SIZE0__NONCACHE_SIZE0_MASK                                                          0x001FFFFFL +//UVD_VCPU_NONCACHE_OFFSET1 +#define UVD_VCPU_NONCACHE_OFFSET1__NONCACHE_OFFSET1__SHIFT                                                    0x0 +#define UVD_VCPU_NONCACHE_OFFSET1__NONCACHE_OFFSET1_MASK                                                      0x01FFFFFFL +//UVD_VCPU_NONCACHE_SIZE1 +#define UVD_VCPU_NONCACHE_SIZE1__NONCACHE_SIZE1__SHIFT                                                        0x0 +#define UVD_VCPU_NONCACHE_SIZE1__NONCACHE_SIZE1_MASK                                                          0x001FFFFFL +//UVD_VCPU_CNTL +#define UVD_VCPU_CNTL__IRQ_ERR__SHIFT                                                                         0x0 +#define UVD_VCPU_CNTL__AXI_MAX_BRST_SIZE_IS_4__SHIFT                                                          0x4 +#define UVD_VCPU_CNTL__PMB_ED_ENABLE__SHIFT                                                                   0x5 +#define UVD_VCPU_CNTL__PMB_SOFT_RESET__SHIFT                                                                  0x6 +#define UVD_VCPU_CNTL__RBBM_SOFT_RESET__SHIFT                                                                 0x7 +#define UVD_VCPU_CNTL__ABORT_REQ__SHIFT                                                                       0x8 +#define UVD_VCPU_CNTL__CLK_EN__SHIFT                                                                          0x9 +#define UVD_VCPU_CNTL__TRCE_EN__SHIFT                                                                         0xa +#define UVD_VCPU_CNTL__TRCE_MUX__SHIFT                                                                        0xb +#define UVD_VCPU_CNTL__DBG_MUX__SHIFT                                                                         0xd +#define UVD_VCPU_CNTL__JTAG_EN__SHIFT                                                                         0x10 +#define UVD_VCPU_CNTL__TIMEOUT_DIS__SHIFT                                                                     0x12 +#define UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT                                                                 0x14 +#define UVD_VCPU_CNTL__BLK_RST__SHIFT                                                                         0x1c +#define UVD_VCPU_CNTL__RUNSTALL__SHIFT                                                                        0x1d +#define UVD_VCPU_CNTL__SRE_CMDIF_DRST__SHIFT                                                                  0x1e +#define UVD_VCPU_CNTL__SRE_CMDIF_VRST__SHIFT                                                                  0x1f +#define UVD_VCPU_CNTL__IRQ_ERR_MASK                                                                           0x0000000FL +#define UVD_VCPU_CNTL__AXI_MAX_BRST_SIZE_IS_4_MASK                                                            0x00000010L +#define UVD_VCPU_CNTL__PMB_ED_ENABLE_MASK                                                                     0x00000020L +#define UVD_VCPU_CNTL__PMB_SOFT_RESET_MASK                                                                    0x00000040L +#define UVD_VCPU_CNTL__RBBM_SOFT_RESET_MASK                                                                   0x00000080L +#define UVD_VCPU_CNTL__ABORT_REQ_MASK                                                                         0x00000100L +#define UVD_VCPU_CNTL__CLK_EN_MASK                                                                            0x00000200L +#define UVD_VCPU_CNTL__TRCE_EN_MASK                                                                           0x00000400L +#define UVD_VCPU_CNTL__TRCE_MUX_MASK                                                                          0x00001800L +#define UVD_VCPU_CNTL__DBG_MUX_MASK                                                                           0x0000E000L +#define UVD_VCPU_CNTL__JTAG_EN_MASK                                                                           0x00010000L +#define UVD_VCPU_CNTL__TIMEOUT_DIS_MASK                                                                       0x00040000L +#define UVD_VCPU_CNTL__PRB_TIMEOUT_VAL_MASK                                                                   0x0FF00000L +#define UVD_VCPU_CNTL__BLK_RST_MASK                                                                           0x10000000L +#define UVD_VCPU_CNTL__RUNSTALL_MASK                                                                          0x20000000L +#define UVD_VCPU_CNTL__SRE_CMDIF_DRST_MASK                                                                    0x40000000L +#define UVD_VCPU_CNTL__SRE_CMDIF_VRST_MASK                                                                    0x80000000L +//UVD_VCPU_PRID +#define UVD_VCPU_PRID__PRID__SHIFT                                                                            0x0 +#define UVD_VCPU_PRID__PRID_MASK                                                                              0x0000FFFFL +//UVD_VCPU_TRCE +#define UVD_VCPU_TRCE__PC__SHIFT                                                                              0x0 +#define UVD_VCPU_TRCE__PC_MASK                                                                                0x0FFFFFFFL +//UVD_VCPU_TRCE_RD +#define UVD_VCPU_TRCE_RD__DATA__SHIFT                                                                         0x0 +#define UVD_VCPU_TRCE_RD__DATA_MASK                                                                           0xFFFFFFFFL +//UVD_VCPU_IND_INDEX +#define UVD_VCPU_IND_INDEX__INDEX__SHIFT                                                                      0x0 +#define UVD_VCPU_IND_INDEX__INDEX_MASK                                                                        0x000001FFL +//UVD_VCPU_IND_DATA +#define UVD_VCPU_IND_DATA__DATA__SHIFT                                                                        0x0 +#define UVD_VCPU_IND_DATA__DATA_MASK                                                                          0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_mpcdec +//UVD_MP_SWAP_CNTL +#define UVD_MP_SWAP_CNTL__MP_REF0_MC_SWAP__SHIFT                                                              0x0 +#define UVD_MP_SWAP_CNTL__MP_REF1_MC_SWAP__SHIFT                                                              0x2 +#define UVD_MP_SWAP_CNTL__MP_REF2_MC_SWAP__SHIFT                                                              0x4 +#define UVD_MP_SWAP_CNTL__MP_REF3_MC_SWAP__SHIFT                                                              0x6 +#define UVD_MP_SWAP_CNTL__MP_REF4_MC_SWAP__SHIFT                                                              0x8 +#define UVD_MP_SWAP_CNTL__MP_REF5_MC_SWAP__SHIFT                                                              0xa +#define UVD_MP_SWAP_CNTL__MP_REF6_MC_SWAP__SHIFT                                                              0xc +#define UVD_MP_SWAP_CNTL__MP_REF7_MC_SWAP__SHIFT                                                              0xe +#define UVD_MP_SWAP_CNTL__MP_REF8_MC_SWAP__SHIFT                                                              0x10 +#define UVD_MP_SWAP_CNTL__MP_REF9_MC_SWAP__SHIFT                                                              0x12 +#define UVD_MP_SWAP_CNTL__MP_REF10_MC_SWAP__SHIFT                                                             0x14 +#define UVD_MP_SWAP_CNTL__MP_REF11_MC_SWAP__SHIFT                                                             0x16 +#define UVD_MP_SWAP_CNTL__MP_REF12_MC_SWAP__SHIFT                                                             0x18 +#define UVD_MP_SWAP_CNTL__MP_REF13_MC_SWAP__SHIFT                                                             0x1a +#define UVD_MP_SWAP_CNTL__MP_REF14_MC_SWAP__SHIFT                                                             0x1c +#define UVD_MP_SWAP_CNTL__MP_REF15_MC_SWAP__SHIFT                                                             0x1e +#define UVD_MP_SWAP_CNTL__MP_REF0_MC_SWAP_MASK                                                                0x00000003L +#define UVD_MP_SWAP_CNTL__MP_REF1_MC_SWAP_MASK                                                                0x0000000CL +#define UVD_MP_SWAP_CNTL__MP_REF2_MC_SWAP_MASK                                                                0x00000030L +#define UVD_MP_SWAP_CNTL__MP_REF3_MC_SWAP_MASK                                                                0x000000C0L +#define UVD_MP_SWAP_CNTL__MP_REF4_MC_SWAP_MASK                                                                0x00000300L +#define UVD_MP_SWAP_CNTL__MP_REF5_MC_SWAP_MASK                                                                0x00000C00L +#define UVD_MP_SWAP_CNTL__MP_REF6_MC_SWAP_MASK                                                                0x00003000L +#define UVD_MP_SWAP_CNTL__MP_REF7_MC_SWAP_MASK                                                                0x0000C000L +#define UVD_MP_SWAP_CNTL__MP_REF8_MC_SWAP_MASK                                                                0x00030000L +#define UVD_MP_SWAP_CNTL__MP_REF9_MC_SWAP_MASK                                                                0x000C0000L +#define UVD_MP_SWAP_CNTL__MP_REF10_MC_SWAP_MASK                                                               0x00300000L +#define UVD_MP_SWAP_CNTL__MP_REF11_MC_SWAP_MASK                                                               0x00C00000L +#define UVD_MP_SWAP_CNTL__MP_REF12_MC_SWAP_MASK                                                               0x03000000L +#define UVD_MP_SWAP_CNTL__MP_REF13_MC_SWAP_MASK                                                               0x0C000000L +#define UVD_MP_SWAP_CNTL__MP_REF14_MC_SWAP_MASK                                                               0x30000000L +#define UVD_MP_SWAP_CNTL__MP_REF15_MC_SWAP_MASK                                                               0xC0000000L +//UVD_MP_SWAP_CNTL2 +#define UVD_MP_SWAP_CNTL2__MP_REF16_MC_SWAP__SHIFT                                                            0x0 +#define UVD_MP_SWAP_CNTL2__MP_REF16_MC_SWAP_MASK                                                              0x00000003L +//UVD_MPC_LUMA_SRCH +#define UVD_MPC_LUMA_SRCH__CNTR__SHIFT                                                                        0x0 +#define UVD_MPC_LUMA_SRCH__CNTR_MASK                                                                          0xFFFFFFFFL +//UVD_MPC_LUMA_HIT +#define UVD_MPC_LUMA_HIT__CNTR__SHIFT                                                                         0x0 +#define UVD_MPC_LUMA_HIT__CNTR_MASK                                                                           0xFFFFFFFFL +//UVD_MPC_LUMA_HITPEND +#define UVD_MPC_LUMA_HITPEND__CNTR__SHIFT                                                                     0x0 +#define UVD_MPC_LUMA_HITPEND__CNTR_MASK                                                                       0xFFFFFFFFL +//UVD_MPC_CHROMA_SRCH +#define UVD_MPC_CHROMA_SRCH__CNTR__SHIFT                                                                      0x0 +#define UVD_MPC_CHROMA_SRCH__CNTR_MASK                                                                        0xFFFFFFFFL +//UVD_MPC_CHROMA_HIT +#define UVD_MPC_CHROMA_HIT__CNTR__SHIFT                                                                       0x0 +#define UVD_MPC_CHROMA_HIT__CNTR_MASK                                                                         0xFFFFFFFFL +//UVD_MPC_CHROMA_HITPEND +#define UVD_MPC_CHROMA_HITPEND__CNTR__SHIFT                                                                   0x0 +#define UVD_MPC_CHROMA_HITPEND__CNTR_MASK                                                                     0xFFFFFFFFL +//UVD_MPC_CNTL +#define UVD_MPC_CNTL__BLK_RST__SHIFT                                                                          0x0 +#define UVD_MPC_CNTL__REG_MPC1_PERF_SELECT__SHIFT                                                             0x1 +#define UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT                                                                 0x3 +#define UVD_MPC_CNTL__PERF_RST__SHIFT                                                                         0x6 +#define UVD_MPC_CNTL__REG_MPC_CNTL_BACKWARD_COMPATIBILITY__SHIFT                                              0x7 +#define UVD_MPC_CNTL__DBG_MUX__SHIFT                                                                          0x8 +#define UVD_MPC_CNTL__AVE_WEIGHT__SHIFT                                                                       0x10 +#define UVD_MPC_CNTL__URGENT_EN__SHIFT                                                                        0x12 +#define UVD_MPC_CNTL__SMPAT_REQ_SPEED_UP__SHIFT                                                               0x13 +#define UVD_MPC_CNTL__TEST_MODE_EN__SHIFT                                                                     0x14 +#define UVD_MPC_CNTL__BLK_RST_MASK                                                                            0x00000001L +#define UVD_MPC_CNTL__REG_MPC1_PERF_SELECT_MASK                                                               0x00000002L +#define UVD_MPC_CNTL__REPLACEMENT_MODE_MASK                                                                   0x00000038L +#define UVD_MPC_CNTL__PERF_RST_MASK                                                                           0x00000040L +#define UVD_MPC_CNTL__REG_MPC_CNTL_BACKWARD_COMPATIBILITY_MASK                                                0x00000080L +#define UVD_MPC_CNTL__DBG_MUX_MASK                                                                            0x00000F00L +#define UVD_MPC_CNTL__AVE_WEIGHT_MASK                                                                         0x00030000L +#define UVD_MPC_CNTL__URGENT_EN_MASK                                                                          0x00040000L +#define UVD_MPC_CNTL__SMPAT_REQ_SPEED_UP_MASK                                                                 0x00080000L +#define UVD_MPC_CNTL__TEST_MODE_EN_MASK                                                                       0x00300000L +//UVD_MPC_PITCH +#define UVD_MPC_PITCH__LUMA_PITCH__SHIFT                                                                      0x0 +#define UVD_MPC_PITCH__LUMA_PITCH_MASK                                                                        0x000007FFL +//UVD_MPC_SET_MUXA0 +#define UVD_MPC_SET_MUXA0__VARA_0__SHIFT                                                                      0x0 +#define UVD_MPC_SET_MUXA0__VARA_1__SHIFT                                                                      0x6 +#define UVD_MPC_SET_MUXA0__VARA_2__SHIFT                                                                      0xc +#define UVD_MPC_SET_MUXA0__VARA_3__SHIFT                                                                      0x12 +#define UVD_MPC_SET_MUXA0__VARA_4__SHIFT                                                                      0x18 +#define UVD_MPC_SET_MUXA0__VARA_0_MASK                                                                        0x0000003FL +#define UVD_MPC_SET_MUXA0__VARA_1_MASK                                                                        0x00000FC0L +#define UVD_MPC_SET_MUXA0__VARA_2_MASK                                                                        0x0003F000L +#define UVD_MPC_SET_MUXA0__VARA_3_MASK                                                                        0x00FC0000L +#define UVD_MPC_SET_MUXA0__VARA_4_MASK                                                                        0x3F000000L +//UVD_MPC_SET_MUXA1 +#define UVD_MPC_SET_MUXA1__VARA_5__SHIFT                                                                      0x0 +#define UVD_MPC_SET_MUXA1__VARA_6__SHIFT                                                                      0x6 +#define UVD_MPC_SET_MUXA1__VARA_7__SHIFT                                                                      0xc +#define UVD_MPC_SET_MUXA1__VARA_5_MASK                                                                        0x0000003FL +#define UVD_MPC_SET_MUXA1__VARA_6_MASK                                                                        0x00000FC0L +#define UVD_MPC_SET_MUXA1__VARA_7_MASK                                                                        0x0003F000L +//UVD_MPC_SET_MUXB0 +#define UVD_MPC_SET_MUXB0__VARB_0__SHIFT                                                                      0x0 +#define UVD_MPC_SET_MUXB0__VARB_1__SHIFT                                                                      0x6 +#define UVD_MPC_SET_MUXB0__VARB_2__SHIFT                                                                      0xc +#define UVD_MPC_SET_MUXB0__VARB_3__SHIFT                                                                      0x12 +#define UVD_MPC_SET_MUXB0__VARB_4__SHIFT                                                                      0x18 +#define UVD_MPC_SET_MUXB0__VARB_0_MASK                                                                        0x0000003FL +#define UVD_MPC_SET_MUXB0__VARB_1_MASK                                                                        0x00000FC0L +#define UVD_MPC_SET_MUXB0__VARB_2_MASK                                                                        0x0003F000L +#define UVD_MPC_SET_MUXB0__VARB_3_MASK                                                                        0x00FC0000L +#define UVD_MPC_SET_MUXB0__VARB_4_MASK                                                                        0x3F000000L +//UVD_MPC_SET_MUXB1 +#define UVD_MPC_SET_MUXB1__VARB_5__SHIFT                                                                      0x0 +#define UVD_MPC_SET_MUXB1__VARB_6__SHIFT                                                                      0x6 +#define UVD_MPC_SET_MUXB1__VARB_7__SHIFT                                                                      0xc +#define UVD_MPC_SET_MUXB1__VARB_5_MASK                                                                        0x0000003FL +#define UVD_MPC_SET_MUXB1__VARB_6_MASK                                                                        0x00000FC0L +#define UVD_MPC_SET_MUXB1__VARB_7_MASK                                                                        0x0003F000L +//UVD_MPC_SET_MUX +#define UVD_MPC_SET_MUX__SET_0__SHIFT                                                                         0x0 +#define UVD_MPC_SET_MUX__SET_1__SHIFT                                                                         0x3 +#define UVD_MPC_SET_MUX__SET_2__SHIFT                                                                         0x6 +#define UVD_MPC_SET_MUX__SET_0_MASK                                                                           0x00000007L +#define UVD_MPC_SET_MUX__SET_1_MASK                                                                           0x00000038L +#define UVD_MPC_SET_MUX__SET_2_MASK                                                                           0x000001C0L +//UVD_MPC_SET_ALU +#define UVD_MPC_SET_ALU__FUNCT__SHIFT                                                                         0x0 +#define UVD_MPC_SET_ALU__OPERAND__SHIFT                                                                       0x4 +#define UVD_MPC_SET_ALU__FUNCT_MASK                                                                           0x00000007L +#define UVD_MPC_SET_ALU__OPERAND_MASK                                                                         0x00000FF0L +//UVD_MPC_PERF0 +#define UVD_MPC_PERF0__MAX_LAT__SHIFT                                                                         0x0 +#define UVD_MPC_PERF0__MAX_LAT_MASK                                                                           0x000003FFL +//UVD_MPC_PERF1 +#define UVD_MPC_PERF1__AVE_LAT__SHIFT                                                                         0x0 +#define UVD_MPC_PERF1__AVE_LAT_MASK                                                                           0x000003FFL +//UVD_MPC_IND_INDEX +#define UVD_MPC_IND_INDEX__INDEX__SHIFT                                                                       0x0 +#define UVD_MPC_IND_INDEX__INDEX_MASK                                                                         0x000001FFL +//UVD_MPC_IND_DATA +#define UVD_MPC_IND_DATA__DATA__SHIFT                                                                         0x0 +#define UVD_MPC_IND_DATA__DATA_MASK                                                                           0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_rbcdec +//UVD_RBC_IB_SIZE +#define UVD_RBC_IB_SIZE__IB_SIZE__SHIFT                                                                       0x4 +#define UVD_RBC_IB_SIZE__IB_SIZE_MASK                                                                         0x007FFFF0L +//UVD_RBC_IB_SIZE_UPDATE +#define UVD_RBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                                         0x4 +#define UVD_RBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                           0x007FFFF0L +//UVD_RBC_RB_CNTL +#define UVD_RBC_RB_CNTL__RB_BUFSZ__SHIFT                                                                      0x0 +#define UVD_RBC_RB_CNTL__RB_BLKSZ__SHIFT                                                                      0x8 +#define UVD_RBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                                   0x10 +#define UVD_RBC_RB_CNTL__RB_WPTR_POLL_EN__SHIFT                                                               0x14 +#define UVD_RBC_RB_CNTL__RB_NO_UPDATE__SHIFT                                                                  0x18 +#define UVD_RBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                                 0x1c +#define UVD_RBC_RB_CNTL__BLK_RST__SHIFT                                                                       0x1d +#define UVD_RBC_RB_CNTL__RB_BUFSZ_MASK                                                                        0x0000001FL +#define UVD_RBC_RB_CNTL__RB_BLKSZ_MASK                                                                        0x00001F00L +#define UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK                                                                     0x00010000L +#define UVD_RBC_RB_CNTL__RB_WPTR_POLL_EN_MASK                                                                 0x00100000L +#define UVD_RBC_RB_CNTL__RB_NO_UPDATE_MASK                                                                    0x01000000L +#define UVD_RBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                                   0x10000000L +#define UVD_RBC_RB_CNTL__BLK_RST_MASK                                                                         0x20000000L +//UVD_RBC_RB_RPTR_ADDR +#define UVD_RBC_RB_RPTR_ADDR__RB_RPTR_ADDR__SHIFT                                                             0x0 +#define UVD_RBC_RB_RPTR_ADDR__RB_RPTR_ADDR_MASK                                                               0xFFFFFFFFL +//UVD_RBC_VCPU_ACCESS +#define UVD_RBC_VCPU_ACCESS__ENABLE_RBC__SHIFT                                                                0x0 +#define UVD_RBC_VCPU_ACCESS__ENABLE_RBC_MASK                                                                  0x00000001L +//UVD_FW_SEMAPHORE_CNTL +#define UVD_FW_SEMAPHORE_CNTL__START__SHIFT                                                                   0x0 +#define UVD_FW_SEMAPHORE_CNTL__BUSY__SHIFT                                                                    0x8 +#define UVD_FW_SEMAPHORE_CNTL__PASS__SHIFT                                                                    0x9 +#define UVD_FW_SEMAPHORE_CNTL__START_MASK                                                                     0x00000001L +#define UVD_FW_SEMAPHORE_CNTL__BUSY_MASK                                                                      0x00000100L +#define UVD_FW_SEMAPHORE_CNTL__PASS_MASK                                                                      0x00000200L +//UVD_RBC_READ_REQ_URGENT_CNTL +#define UVD_RBC_READ_REQ_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                       0x0 +#define UVD_RBC_READ_REQ_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                         0x00000003L +//UVD_RBC_RB_WPTR_CNTL +#define UVD_RBC_RB_WPTR_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                       0x0 +#define UVD_RBC_RB_WPTR_CNTL__RB_PRE_WRITE_TIMER_MASK                                                         0x00007FFFL +//UVD_RBC_WPTR_STATUS +#define UVD_RBC_WPTR_STATUS__RB_WPTR_IN_USE__SHIFT                                                            0x4 +#define UVD_RBC_WPTR_STATUS__RB_WPTR_IN_USE_MASK                                                              0x007FFFF0L +//UVD_RBC_WPTR_POLL_CNTL +#define UVD_RBC_WPTR_POLL_CNTL__POLL_FREQ__SHIFT                                                              0x0 +#define UVD_RBC_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT                                                        0x10 +#define UVD_RBC_WPTR_POLL_CNTL__POLL_FREQ_MASK                                                                0x0000FFFFL +#define UVD_RBC_WPTR_POLL_CNTL__IDLE_POLL_COUNT_MASK                                                          0xFFFF0000L +//UVD_RBC_WPTR_POLL_ADDR +#define UVD_RBC_WPTR_POLL_ADDR__POLL_ADDR__SHIFT                                                              0x2 +#define UVD_RBC_WPTR_POLL_ADDR__POLL_ADDR_MASK                                                                0xFFFFFFFCL +//UVD_SEMA_CMD +#define UVD_SEMA_CMD__REQ_CMD__SHIFT                                                                          0x0 +#define UVD_SEMA_CMD__WR_PHASE__SHIFT                                                                         0x4 +#define UVD_SEMA_CMD__MODE__SHIFT                                                                             0x6 +#define UVD_SEMA_CMD__VMID_EN__SHIFT                                                                          0x7 +#define UVD_SEMA_CMD__VMID__SHIFT                                                                             0x8 +#define UVD_SEMA_CMD__REQ_CMD_MASK                                                                            0x0000000FL +#define UVD_SEMA_CMD__WR_PHASE_MASK                                                                           0x00000030L +#define UVD_SEMA_CMD__MODE_MASK                                                                               0x00000040L +#define UVD_SEMA_CMD__VMID_EN_MASK                                                                            0x00000080L +#define UVD_SEMA_CMD__VMID_MASK                                                                               0x00000F00L +//UVD_SEMA_ADDR_LOW +#define UVD_SEMA_ADDR_LOW__ADDR_26_3__SHIFT                                                                   0x0 +#define UVD_SEMA_ADDR_LOW__ADDR_26_3_MASK                                                                     0x00FFFFFFL +//UVD_SEMA_ADDR_HIGH +#define UVD_SEMA_ADDR_HIGH__ADDR_47_27__SHIFT                                                                 0x0 +#define UVD_SEMA_ADDR_HIGH__ADDR_47_27_MASK                                                                   0x001FFFFFL +//UVD_ENGINE_CNTL +#define UVD_ENGINE_CNTL__ENGINE_START__SHIFT                                                                  0x0 +#define UVD_ENGINE_CNTL__ENGINE_START_MODE__SHIFT                                                             0x1 +#define UVD_ENGINE_CNTL__NJ_PF_HANDLE_DISABLE__SHIFT                                                          0x2 +#define UVD_ENGINE_CNTL__ENGINE_START_MASK                                                                    0x00000001L +#define UVD_ENGINE_CNTL__ENGINE_START_MODE_MASK                                                               0x00000002L +#define UVD_ENGINE_CNTL__NJ_PF_HANDLE_DISABLE_MASK                                                            0x00000004L +//UVD_SEMA_TIMEOUT_STATUS +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_WAIT_INCOMPLETE_TIMEOUT_STAT__SHIFT                                0x0 +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_WAIT_FAULT_TIMEOUT_STAT__SHIFT                                     0x1 +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_SIGNAL_INCOMPLETE_TIMEOUT_STAT__SHIFT                              0x2 +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_TIMEOUT_CLEAR__SHIFT                                               0x3 +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_WAIT_INCOMPLETE_TIMEOUT_STAT_MASK                                  0x00000001L +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_WAIT_FAULT_TIMEOUT_STAT_MASK                                       0x00000002L +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_SIGNAL_INCOMPLETE_TIMEOUT_STAT_MASK                                0x00000004L +#define UVD_SEMA_TIMEOUT_STATUS__SEMAPHORE_TIMEOUT_CLEAR_MASK                                                 0x00000008L +//UVD_SEMA_CNTL +#define UVD_SEMA_CNTL__SEMAPHORE_EN__SHIFT                                                                    0x0 +#define UVD_SEMA_CNTL__ADVANCED_MODE_DIS__SHIFT                                                               0x1 +#define UVD_SEMA_CNTL__SEMAPHORE_EN_MASK                                                                      0x00000001L +#define UVD_SEMA_CNTL__ADVANCED_MODE_DIS_MASK                                                                 0x00000002L +//UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__SIGNAL_INCOMPLETE_EN__SHIFT                                  0x0 +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__SIGNAL_INCOMPLETE_COUNT__SHIFT                               0x1 +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__RESEND_TIMER__SHIFT                                          0x18 +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__SIGNAL_INCOMPLETE_EN_MASK                                    0x00000001L +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__SIGNAL_INCOMPLETE_COUNT_MASK                                 0x001FFFFEL +#define UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL__RESEND_TIMER_MASK                                            0x07000000L +//UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__WAIT_FAULT_EN__SHIFT                                                0x0 +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__WAIT_FAULT_COUNT__SHIFT                                             0x1 +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__RESEND_TIMER__SHIFT                                                 0x18 +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__WAIT_FAULT_EN_MASK                                                  0x00000001L +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__WAIT_FAULT_COUNT_MASK                                               0x001FFFFEL +#define UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL__RESEND_TIMER_MASK                                                   0x07000000L +//UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__WAIT_INCOMPLETE_EN__SHIFT                                      0x0 +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__WAIT_INCOMPLETE_COUNT__SHIFT                                   0x1 +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__RESEND_TIMER__SHIFT                                            0x18 +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__WAIT_INCOMPLETE_EN_MASK                                        0x00000001L +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__WAIT_INCOMPLETE_COUNT_MASK                                     0x001FFFFEL +#define UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL__RESEND_TIMER_MASK                                              0x07000000L +//UVD_JOB_START +#define UVD_JOB_START__JOB_START__SHIFT                                                                       0x0 +#define UVD_JOB_START__JOB_START_MASK                                                                         0x00000001L +//UVD_RBC_BUF_STATUS +#define UVD_RBC_BUF_STATUS__RB_BUF_VALID__SHIFT                                                               0x0 +#define UVD_RBC_BUF_STATUS__IB_BUF_VALID__SHIFT                                                               0x8 +#define UVD_RBC_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                                             0x10 +#define UVD_RBC_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                                             0x13 +#define UVD_RBC_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                                             0x16 +#define UVD_RBC_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                                             0x19 +#define UVD_RBC_BUF_STATUS__RB_BUF_VALID_MASK                                                                 0x000000FFL +#define UVD_RBC_BUF_STATUS__IB_BUF_VALID_MASK                                                                 0x0000FF00L +#define UVD_RBC_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                               0x00070000L +#define UVD_RBC_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                               0x00380000L +#define UVD_RBC_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                               0x01C00000L +#define UVD_RBC_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                               0x0E000000L +//UVD_RBC_SWAP_CNTL +#define UVD_RBC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                                  0x0 +#define UVD_RBC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                                  0x2 +#define UVD_RBC_SWAP_CNTL__RB_RPTR_MC_SWAP__SHIFT                                                             0x4 +#define UVD_RBC_SWAP_CNTL__RB_WR_MC_SWAP__SHIFT                                                               0x1a +#define UVD_RBC_SWAP_CNTL__RB_MC_SWAP_MASK                                                                    0x00000003L +#define UVD_RBC_SWAP_CNTL__IB_MC_SWAP_MASK                                                                    0x0000000CL +#define UVD_RBC_SWAP_CNTL__RB_RPTR_MC_SWAP_MASK                                                               0x00000030L +#define UVD_RBC_SWAP_CNTL__RB_WR_MC_SWAP_MASK                                                                 0x0C000000L + + +// addressBlock: aid_uvd0_lmi_adpdec +//UVD_LMI_RE_64BIT_BAR_LOW +#define UVD_LMI_RE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                            0x0 +#define UVD_LMI_RE_64BIT_BAR_LOW__BITS_31_0_MASK                                                              0xFFFFFFFFL +//UVD_LMI_RE_64BIT_BAR_HIGH +#define UVD_LMI_RE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                          0x0 +#define UVD_LMI_RE_64BIT_BAR_HIGH__BITS_63_32_MASK                                                            0xFFFFFFFFL +//UVD_LMI_IT_64BIT_BAR_LOW +#define UVD_LMI_IT_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                            0x0 +#define UVD_LMI_IT_64BIT_BAR_LOW__BITS_31_0_MASK                                                              0xFFFFFFFFL +//UVD_LMI_IT_64BIT_BAR_HIGH +#define UVD_LMI_IT_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                          0x0 +#define UVD_LMI_IT_64BIT_BAR_HIGH__BITS_63_32_MASK                                                            0xFFFFFFFFL +//UVD_LMI_MP_64BIT_BAR_LOW +#define UVD_LMI_MP_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                            0x0 +#define UVD_LMI_MP_64BIT_BAR_LOW__BITS_31_0_MASK                                                              0xFFFFFFFFL +//UVD_LMI_MP_64BIT_BAR_HIGH +#define UVD_LMI_MP_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                          0x0 +#define UVD_LMI_MP_64BIT_BAR_HIGH__BITS_63_32_MASK                                                            0xFFFFFFFFL +//UVD_LMI_CM_64BIT_BAR_LOW +#define UVD_LMI_CM_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                            0x0 +#define UVD_LMI_CM_64BIT_BAR_LOW__BITS_31_0_MASK                                                              0xFFFFFFFFL +//UVD_LMI_CM_64BIT_BAR_HIGH +#define UVD_LMI_CM_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                          0x0 +#define UVD_LMI_CM_64BIT_BAR_HIGH__BITS_63_32_MASK                                                            0xFFFFFFFFL +//UVD_LMI_DB_64BIT_BAR_LOW +#define UVD_LMI_DB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                            0x0 +#define UVD_LMI_DB_64BIT_BAR_LOW__BITS_31_0_MASK                                                              0xFFFFFFFFL +//UVD_LMI_DB_64BIT_BAR_HIGH +#define UVD_LMI_DB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                          0x0 +#define UVD_LMI_DB_64BIT_BAR_HIGH__BITS_63_32_MASK                                                            0xFFFFFFFFL +//UVD_LMI_DBW_64BIT_BAR_LOW +#define UVD_LMI_DBW_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                           0x0 +#define UVD_LMI_DBW_64BIT_BAR_LOW__BITS_31_0_MASK                                                             0xFFFFFFFFL +//UVD_LMI_DBW_64BIT_BAR_HIGH +#define UVD_LMI_DBW_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                         0x0 +#define UVD_LMI_DBW_64BIT_BAR_HIGH__BITS_63_32_MASK                                                           0xFFFFFFFFL +//UVD_LMI_IDCT_64BIT_BAR_LOW +#define UVD_LMI_IDCT_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                          0x0 +#define UVD_LMI_IDCT_64BIT_BAR_LOW__BITS_31_0_MASK                                                            0xFFFFFFFFL +//UVD_LMI_IDCT_64BIT_BAR_HIGH +#define UVD_LMI_IDCT_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                        0x0 +#define UVD_LMI_IDCT_64BIT_BAR_HIGH__BITS_63_32_MASK                                                          0xFFFFFFFFL +//UVD_LMI_MPRD_S0_64BIT_BAR_LOW +#define UVD_LMI_MPRD_S0_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                       0x0 +#define UVD_LMI_MPRD_S0_64BIT_BAR_LOW__BITS_31_0_MASK                                                         0xFFFFFFFFL +//UVD_LMI_MPRD_S0_64BIT_BAR_HIGH +#define UVD_LMI_MPRD_S0_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                     0x0 +#define UVD_LMI_MPRD_S0_64BIT_BAR_HIGH__BITS_63_32_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MPRD_S1_64BIT_BAR_LOW +#define UVD_LMI_MPRD_S1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                       0x0 +#define UVD_LMI_MPRD_S1_64BIT_BAR_LOW__BITS_31_0_MASK                                                         0xFFFFFFFFL +//UVD_LMI_MPRD_S1_64BIT_BAR_HIGH +#define UVD_LMI_MPRD_S1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                     0x0 +#define UVD_LMI_MPRD_S1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MPRD_DBW_64BIT_BAR_LOW +#define UVD_LMI_MPRD_DBW_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MPRD_DBW_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MPRD_DBW_64BIT_BAR_HIGH +#define UVD_LMI_MPRD_DBW_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MPRD_DBW_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MPC_64BIT_BAR_LOW +#define UVD_LMI_MPC_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                           0x0 +#define UVD_LMI_MPC_64BIT_BAR_LOW__BITS_31_0_MASK                                                             0xFFFFFFFFL +//UVD_LMI_MPC_64BIT_BAR_HIGH +#define UVD_LMI_MPC_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                         0x0 +#define UVD_LMI_MPC_64BIT_BAR_HIGH__BITS_63_32_MASK                                                           0xFFFFFFFFL +//UVD_LMI_RBC_RB_64BIT_BAR_LOW +#define UVD_LMI_RBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                        0x0 +#define UVD_LMI_RBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                          0xFFFFFFFFL +//UVD_LMI_RBC_RB_64BIT_BAR_HIGH +#define UVD_LMI_RBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                      0x0 +#define UVD_LMI_RBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                                        0xFFFFFFFFL +//UVD_LMI_RBC_IB_64BIT_BAR_LOW +#define UVD_LMI_RBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                        0x0 +#define UVD_LMI_RBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                          0xFFFFFFFFL +//UVD_LMI_RBC_IB_64BIT_BAR_HIGH +#define UVD_LMI_RBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                      0x0 +#define UVD_LMI_RBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                                        0xFFFFFFFFL +//UVD_LMI_LBSI_64BIT_BAR_LOW +#define UVD_LMI_LBSI_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                          0x0 +#define UVD_LMI_LBSI_64BIT_BAR_LOW__BITS_31_0_MASK                                                            0xFFFFFFFFL +//UVD_LMI_LBSI_64BIT_BAR_HIGH +#define UVD_LMI_LBSI_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                        0x0 +#define UVD_LMI_LBSI_64BIT_BAR_HIGH__BITS_63_32_MASK                                                          0xFFFFFFFFL +//UVD_LMI_VCPU_NC0_64BIT_BAR_LOW +#define UVD_LMI_VCPU_NC0_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_VCPU_NC0_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_VCPU_NC0_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_NC0_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_VCPU_NC0_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_VCPU_NC1_64BIT_BAR_LOW +#define UVD_LMI_VCPU_NC1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_VCPU_NC1_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_VCPU_NC1_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_NC1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_VCPU_NC1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                    0x0 +#define UVD_LMI_VCPU_CACHE_64BIT_BAR_LOW__BITS_31_0_MASK                                                      0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                  0x0 +#define UVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH__BITS_63_32_MASK                                                    0xFFFFFFFFL +//UVD_LMI_CENC_64BIT_BAR_LOW +#define UVD_LMI_CENC_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                          0x0 +#define UVD_LMI_CENC_64BIT_BAR_LOW__BITS_31_0_MASK                                                            0xFFFFFFFFL +//UVD_LMI_CENC_64BIT_BAR_HIGH +#define UVD_LMI_CENC_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                        0x0 +#define UVD_LMI_CENC_64BIT_BAR_HIGH__BITS_63_32_MASK                                                          0xFFFFFFFFL +//UVD_LMI_SRE_64BIT_BAR_LOW +#define UVD_LMI_SRE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                           0x0 +#define UVD_LMI_SRE_64BIT_BAR_LOW__BITS_31_0_MASK                                                             0xFFFFFFFFL +//UVD_LMI_SRE_64BIT_BAR_HIGH +#define UVD_LMI_SRE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                         0x0 +#define UVD_LMI_SRE_64BIT_BAR_HIGH__BITS_63_32_MASK                                                           0xFFFFFFFFL +//UVD_LMI_MIF_GPGPU_64BIT_BAR_LOW +#define UVD_LMI_MIF_GPGPU_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MIF_GPGPU_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MIF_GPGPU_64BIT_BAR_HIGH +#define UVD_LMI_MIF_GPGPU_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MIF_GPGPU_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                 0x0 +#define UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_LOW__BITS_31_0_MASK                                                   0xFFFFFFFFL +//UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                               0x0 +#define UVD_LMI_MIF_CURR_LUMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                                 0xFFFFFFFFL +//UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                               0x0 +#define UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_LOW__BITS_31_0_MASK                                                 0xFFFFFFFFL +//UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                             0x0 +#define UVD_LMI_MIF_CURR_CHROMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                               0xFFFFFFFFL +//UVD_LMI_MIF_REF_64BIT_BAR_LOW +#define UVD_LMI_MIF_REF_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                       0x0 +#define UVD_LMI_MIF_REF_64BIT_BAR_LOW__BITS_31_0_MASK                                                         0xFFFFFFFFL +//UVD_LMI_MIF_REF_64BIT_BAR_HIGH +#define UVD_LMI_MIF_REF_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                     0x0 +#define UVD_LMI_MIF_REF_64BIT_BAR_HIGH__BITS_63_32_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MIF_DBW_64BIT_BAR_LOW +#define UVD_LMI_MIF_DBW_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                       0x0 +#define UVD_LMI_MIF_DBW_64BIT_BAR_LOW__BITS_31_0_MASK                                                         0xFFFFFFFFL +//UVD_LMI_MIF_DBW_64BIT_BAR_HIGH +#define UVD_LMI_MIF_DBW_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                     0x0 +#define UVD_LMI_MIF_DBW_64BIT_BAR_HIGH__BITS_63_32_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MIF_CM_COLOC_64BIT_BAR_LOW +#define UVD_LMI_MIF_CM_COLOC_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                  0x0 +#define UVD_LMI_MIF_CM_COLOC_64BIT_BAR_LOW__BITS_31_0_MASK                                                    0xFFFFFFFFL +//UVD_LMI_MIF_CM_COLOC_64BIT_BAR_HIGH +#define UVD_LMI_MIF_CM_COLOC_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                0x0 +#define UVD_LMI_MIF_CM_COLOC_64BIT_BAR_HIGH__BITS_63_32_MASK                                                  0xFFFFFFFFL +//UVD_LMI_MIF_BSP0_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSP0_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSP0_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSP0_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSP0_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSP0_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSP1_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSP1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSP1_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSP1_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSP1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSP1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSP2_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSP2_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSP2_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSP2_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSP2_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSP2_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSP3_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSP3_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSP3_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSP3_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSP3_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSP3_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSD0_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSD0_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSD0_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSD0_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSD0_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSD0_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSD1_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSD1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSD1_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSD1_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSD1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSD1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSD2_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSD2_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSD2_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSD2_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSD2_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSD2_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSD3_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSD3_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSD3_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSD3_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSD3_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSD3_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_BSD4_64BIT_BAR_LOW +#define UVD_LMI_MIF_BSD4_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_BSD4_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_BSD4_64BIT_BAR_HIGH +#define UVD_LMI_MIF_BSD4_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_BSD4_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE8_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE8_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE8_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE8_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE8_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE8_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE3_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE3_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE3_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE3_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE3_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE3_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE4_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE4_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE4_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE4_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE4_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE4_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE5_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE5_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE5_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE5_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE5_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE5_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE6_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE6_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE6_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE6_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE6_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE6_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE7_64BIT_BAR_LOW +#define UVD_LMI_VCPU_CACHE7_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                   0x0 +#define UVD_LMI_VCPU_CACHE7_64BIT_BAR_LOW__BITS_31_0_MASK                                                     0xFFFFFFFFL +//UVD_LMI_VCPU_CACHE7_64BIT_BAR_HIGH +#define UVD_LMI_VCPU_CACHE7_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                 0x0 +#define UVD_LMI_VCPU_CACHE7_64BIT_BAR_HIGH__BITS_63_32_MASK                                                   0xFFFFFFFFL +//UVD_LMI_MIF_SCLR_64BIT_BAR_LOW +#define UVD_LMI_MIF_SCLR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                      0x0 +#define UVD_LMI_MIF_SCLR_64BIT_BAR_LOW__BITS_31_0_MASK                                                        0xFFFFFFFFL +//UVD_LMI_MIF_SCLR_64BIT_BAR_HIGH +#define UVD_LMI_MIF_SCLR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                    0x0 +#define UVD_LMI_MIF_SCLR_64BIT_BAR_HIGH__BITS_63_32_MASK                                                      0xFFFFFFFFL +//UVD_LMI_MIF_SCLR2_64BIT_BAR_LOW +#define UVD_LMI_MIF_SCLR2_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MIF_SCLR2_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MIF_SCLR2_64BIT_BAR_HIGH +#define UVD_LMI_MIF_SCLR2_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MIF_SCLR2_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_SPH_64BIT_BAR_HIGH +#define UVD_LMI_SPH_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                         0x0 +#define UVD_LMI_SPH_64BIT_BAR_HIGH__BITS_63_32_MASK                                                           0xFFFFFFFFL +//UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_LMI_MIF_IMAGEPASTE_LUMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                         0x0 +#define UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_LOW__BITS_31_0_MASK                                           0xFFFFFFFFL +//UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                       0x0 +#define UVD_LMI_MIF_IMAGEPASTE_CHROMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                         0xFFFFFFFFL +//UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_LMI_MIF_PRIVACY_LUMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_LMI_MIF_PRIVACY_CHROMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_ADP_ATOMIC_CONFIG +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER0_WR_CACHE__SHIFT                                                   0x0 +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER1_WR_CACHE__SHIFT                                                   0x4 +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER2_WR_CACHE__SHIFT                                                   0x8 +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER3_WR_CACHE__SHIFT                                                   0xc +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_RD_URG__SHIFT                                                           0x10 +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER0_WR_CACHE_MASK                                                     0x0000000FL +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER1_WR_CACHE_MASK                                                     0x000000F0L +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER2_WR_CACHE_MASK                                                     0x00000F00L +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_USER3_WR_CACHE_MASK                                                     0x0000F000L +#define UVD_ADP_ATOMIC_CONFIG__ATOMIC_RD_URG_MASK                                                             0x000F0000L +//UVD_LMI_ARB_CTRL2 +#define UVD_LMI_ARB_CTRL2__CENC_RD_WAIT_EN__SHIFT                                                             0x0 +#define UVD_LMI_ARB_CTRL2__ATOMIC_WR_WAIT_EN__SHIFT                                                           0x1 +#define UVD_LMI_ARB_CTRL2__CENC_RD_MAX_BURST__SHIFT                                                           0x2 +#define UVD_LMI_ARB_CTRL2__ATOMIC_WR_MAX_BURST__SHIFT                                                         0x6 +#define UVD_LMI_ARB_CTRL2__MIF_RD_REQ_RET_MAX__SHIFT                                                          0xa +#define UVD_LMI_ARB_CTRL2__MIF_WR_REQ_RET_MAX__SHIFT                                                          0x14 +#define UVD_LMI_ARB_CTRL2__CENC_RD_WAIT_EN_MASK                                                               0x00000001L +#define UVD_LMI_ARB_CTRL2__ATOMIC_WR_WAIT_EN_MASK                                                             0x00000002L +#define UVD_LMI_ARB_CTRL2__CENC_RD_MAX_BURST_MASK                                                             0x0000003CL +#define UVD_LMI_ARB_CTRL2__ATOMIC_WR_MAX_BURST_MASK                                                           0x000003C0L +#define UVD_LMI_ARB_CTRL2__MIF_RD_REQ_RET_MAX_MASK                                                            0x000FFC00L +#define UVD_LMI_ARB_CTRL2__MIF_WR_REQ_RET_MAX_MASK                                                            0xFFF00000L +//UVD_LMI_VCPU_CACHE_VMIDS_MULTI +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE1_VMID__SHIFT                                               0x0 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE2_VMID__SHIFT                                               0x4 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE3_VMID__SHIFT                                               0x8 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE4_VMID__SHIFT                                               0xc +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE5_VMID__SHIFT                                               0x10 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE6_VMID__SHIFT                                               0x14 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE7_VMID__SHIFT                                               0x18 +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE8_VMID__SHIFT                                               0x1c +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE1_VMID_MASK                                                 0x0000000FL +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE2_VMID_MASK                                                 0x000000F0L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE3_VMID_MASK                                                 0x00000F00L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE4_VMID_MASK                                                 0x0000F000L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE5_VMID_MASK                                                 0x000F0000L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE6_VMID_MASK                                                 0x00F00000L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE7_VMID_MASK                                                 0x0F000000L +#define UVD_LMI_VCPU_CACHE_VMIDS_MULTI__VCPU_CACHE8_VMID_MASK                                                 0xF0000000L +//UVD_LMI_VCPU_NC_VMIDS_MULTI +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC2_VMID__SHIFT                                                     0x4 +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC3_VMID__SHIFT                                                     0x8 +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC4_VMID__SHIFT                                                     0xc +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC5_VMID__SHIFT                                                     0x10 +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC6_VMID__SHIFT                                                     0x14 +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC7_VMID__SHIFT                                                     0x18 +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC2_VMID_MASK                                                       0x000000F0L +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC3_VMID_MASK                                                       0x00000F00L +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC4_VMID_MASK                                                       0x0000F000L +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC5_VMID_MASK                                                       0x000F0000L +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC6_VMID_MASK                                                       0x00F00000L +#define UVD_LMI_VCPU_NC_VMIDS_MULTI__VCPU_NC7_VMID_MASK                                                       0x0F000000L +//UVD_LMI_LAT_CTRL +#define UVD_LMI_LAT_CTRL__SCALE__SHIFT                                                                        0x0 +#define UVD_LMI_LAT_CTRL__MAX_START__SHIFT                                                                    0x8 +#define UVD_LMI_LAT_CTRL__MIN_START__SHIFT                                                                    0x9 +#define UVD_LMI_LAT_CTRL__AVG_START__SHIFT                                                                    0xa +#define UVD_LMI_LAT_CTRL__PERFMON_SYNC__SHIFT                                                                 0xb +#define UVD_LMI_LAT_CTRL__SKIP__SHIFT                                                                         0x10 +#define UVD_LMI_LAT_CTRL__SCALE_MASK                                                                          0x000000FFL +#define UVD_LMI_LAT_CTRL__MAX_START_MASK                                                                      0x00000100L +#define UVD_LMI_LAT_CTRL__MIN_START_MASK                                                                      0x00000200L +#define UVD_LMI_LAT_CTRL__AVG_START_MASK                                                                      0x00000400L +#define UVD_LMI_LAT_CTRL__PERFMON_SYNC_MASK                                                                   0x00000800L +#define UVD_LMI_LAT_CTRL__SKIP_MASK                                                                           0x000F0000L +//UVD_LMI_LAT_CNTR +#define UVD_LMI_LAT_CNTR__MAX_LAT__SHIFT                                                                      0x0 +#define UVD_LMI_LAT_CNTR__MIN_LAT__SHIFT                                                                      0x8 +#define UVD_LMI_LAT_CNTR__MAX_LAT_MASK                                                                        0x000000FFL +#define UVD_LMI_LAT_CNTR__MIN_LAT_MASK                                                                        0x0000FF00L +//UVD_LMI_AVG_LAT_CNTR +#define UVD_LMI_AVG_LAT_CNTR__ENV_LOW__SHIFT                                                                  0x0 +#define UVD_LMI_AVG_LAT_CNTR__ENV_HIGH__SHIFT                                                                 0x8 +#define UVD_LMI_AVG_LAT_CNTR__ENV_HIT__SHIFT                                                                  0x10 +#define UVD_LMI_AVG_LAT_CNTR__ENV_LOW_MASK                                                                    0x000000FFL +#define UVD_LMI_AVG_LAT_CNTR__ENV_HIGH_MASK                                                                   0x0000FF00L +#define UVD_LMI_AVG_LAT_CNTR__ENV_HIT_MASK                                                                    0xFFFF0000L +//UVD_LMI_SPH +#define UVD_LMI_SPH__ADDR__SHIFT                                                                              0x0 +#define UVD_LMI_SPH__STS__SHIFT                                                                               0x1c +#define UVD_LMI_SPH__STS_VALID__SHIFT                                                                         0x1e +#define UVD_LMI_SPH__STS_OVERFLOW__SHIFT                                                                      0x1f +#define UVD_LMI_SPH__ADDR_MASK                                                                                0x0FFFFFFFL +#define UVD_LMI_SPH__STS_MASK                                                                                 0x30000000L +#define UVD_LMI_SPH__STS_VALID_MASK                                                                           0x40000000L +#define UVD_LMI_SPH__STS_OVERFLOW_MASK                                                                        0x80000000L +//UVD_LMI_VCPU_CACHE_VMID +#define UVD_LMI_VCPU_CACHE_VMID__VCPU_CACHE_VMID__SHIFT                                                       0x0 +#define UVD_LMI_VCPU_CACHE_VMID__VCPU_CACHE_VMID_MASK                                                         0x0000000FL +//UVD_LMI_CTRL2 +#define UVD_LMI_CTRL2__SPH_DIS__SHIFT                                                                         0x0 +#define UVD_LMI_CTRL2__STALL_ARB__SHIFT                                                                       0x1 +#define UVD_LMI_CTRL2__ASSERT_UMC_URGENT__SHIFT                                                               0x2 +#define UVD_LMI_CTRL2__MASK_UMC_URGENT__SHIFT                                                                 0x3 +#define UVD_LMI_CTRL2__CRC1_RESET__SHIFT                                                                      0x4 +#define UVD_LMI_CTRL2__DRCITF_BUBBLE_FIX_DIS__SHIFT                                                           0x7 +#define UVD_LMI_CTRL2__STALL_ARB_UMC__SHIFT                                                                   0x8 +#define UVD_LMI_CTRL2__MC_READ_ID_SEL__SHIFT                                                                  0x9 +#define UVD_LMI_CTRL2__MC_WRITE_ID_SEL__SHIFT                                                                 0xb +#define UVD_LMI_CTRL2__VCPU_NC0_EXT_EN__SHIFT                                                                 0xd +#define UVD_LMI_CTRL2__VCPU_NC1_EXT_EN__SHIFT                                                                 0xe +#define UVD_LMI_CTRL2__SPU_EXTRA_CID_EN__SHIFT                                                                0xf +#define UVD_LMI_CTRL2__RE_OFFLOAD_EN__SHIFT                                                                   0x10 +#define UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM__SHIFT                                                          0x11 +#define UVD_LMI_CTRL2__CLEAR_NJ_PF_BP__SHIFT                                                                  0x19 +#define UVD_LMI_CTRL2__NJ_MIF_GATING__SHIFT                                                                   0x1a +#define UVD_LMI_CTRL2__CRC1_SEL__SHIFT                                                                        0x1b +#define UVD_LMI_CTRL2__SPH_DIS_MASK                                                                           0x00000001L +#define UVD_LMI_CTRL2__STALL_ARB_MASK                                                                         0x00000002L +#define UVD_LMI_CTRL2__ASSERT_UMC_URGENT_MASK                                                                 0x00000004L +#define UVD_LMI_CTRL2__MASK_UMC_URGENT_MASK                                                                   0x00000008L +#define UVD_LMI_CTRL2__CRC1_RESET_MASK                                                                        0x00000010L +#define UVD_LMI_CTRL2__DRCITF_BUBBLE_FIX_DIS_MASK                                                             0x00000080L +#define UVD_LMI_CTRL2__STALL_ARB_UMC_MASK                                                                     0x00000100L +#define UVD_LMI_CTRL2__MC_READ_ID_SEL_MASK                                                                    0x00000600L +#define UVD_LMI_CTRL2__MC_WRITE_ID_SEL_MASK                                                                   0x00001800L +#define UVD_LMI_CTRL2__VCPU_NC0_EXT_EN_MASK                                                                   0x00002000L +#define UVD_LMI_CTRL2__VCPU_NC1_EXT_EN_MASK                                                                   0x00004000L +#define UVD_LMI_CTRL2__SPU_EXTRA_CID_EN_MASK                                                                  0x00008000L +#define UVD_LMI_CTRL2__RE_OFFLOAD_EN_MASK                                                                     0x00010000L +#define UVD_LMI_CTRL2__RE_OFLD_MIF_WR_REQ_NUM_MASK                                                            0x01FE0000L +#define UVD_LMI_CTRL2__CLEAR_NJ_PF_BP_MASK                                                                    0x02000000L +#define UVD_LMI_CTRL2__NJ_MIF_GATING_MASK                                                                     0x04000000L +#define UVD_LMI_CTRL2__CRC1_SEL_MASK                                                                          0xF8000000L +//UVD_LMI_URGENT_CTRL +#define UVD_LMI_URGENT_CTRL__ENABLE_MC_RD_URGENT_STALL__SHIFT                                                 0x0 +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_RD_STALL__SHIFT                                                        0x1 +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_RD_URGENT__SHIFT                                                       0x2 +#define UVD_LMI_URGENT_CTRL__ENABLE_MC_WR_URGENT_STALL__SHIFT                                                 0x8 +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_WR_STALL__SHIFT                                                        0x9 +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_WR_URGENT__SHIFT                                                       0xa +#define UVD_LMI_URGENT_CTRL__ENABLE_UMC_RD_URGENT_STALL__SHIFT                                                0x10 +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_RD_STALL__SHIFT                                                       0x11 +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_RD_URGENT__SHIFT                                                      0x12 +#define UVD_LMI_URGENT_CTRL__ENABLE_UMC_WR_URGENT_STALL__SHIFT                                                0x18 +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_WR_STALL__SHIFT                                                       0x19 +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_WR_URGENT__SHIFT                                                      0x1a +#define UVD_LMI_URGENT_CTRL__ENABLE_MC_RD_URGENT_STALL_MASK                                                   0x00000001L +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_RD_STALL_MASK                                                          0x00000002L +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_RD_URGENT_MASK                                                         0x0000003CL +#define UVD_LMI_URGENT_CTRL__ENABLE_MC_WR_URGENT_STALL_MASK                                                   0x00000100L +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_WR_STALL_MASK                                                          0x00000200L +#define UVD_LMI_URGENT_CTRL__ASSERT_MC_WR_URGENT_MASK                                                         0x00003C00L +#define UVD_LMI_URGENT_CTRL__ENABLE_UMC_RD_URGENT_STALL_MASK                                                  0x00010000L +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_RD_STALL_MASK                                                         0x00020000L +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_RD_URGENT_MASK                                                        0x003C0000L +#define UVD_LMI_URGENT_CTRL__ENABLE_UMC_WR_URGENT_STALL_MASK                                                  0x01000000L +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_WR_STALL_MASK                                                         0x02000000L +#define UVD_LMI_URGENT_CTRL__ASSERT_UMC_WR_URGENT_MASK                                                        0x3C000000L +//UVD_LMI_CTRL +#define UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT                                                                0x0 +#define UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN__SHIFT                                                             0x8 +#define UVD_LMI_CTRL__REQ_MODE__SHIFT                                                                         0x9 +#define UVD_LMI_CTRL__ASSERT_MC_URGENT__SHIFT                                                                 0xb +#define UVD_LMI_CTRL__MASK_MC_URGENT__SHIFT                                                                   0xc +#define UVD_LMI_CTRL__DATA_COHERENCY_EN__SHIFT                                                                0xd +#define UVD_LMI_CTRL__CRC_RESET__SHIFT                                                                        0xe +#define UVD_LMI_CTRL__CRC_SEL__SHIFT                                                                          0xf +#define UVD_LMI_CTRL__DISABLE_ON_FWV_FAIL__SHIFT                                                              0x14 +#define UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN__SHIFT                                                           0x15 +#define UVD_LMI_CTRL__CM_DATA_COHERENCY_EN__SHIFT                                                             0x16 +#define UVD_LMI_CTRL__DB_DB_DATA_COHERENCY_EN__SHIFT                                                          0x17 +#define UVD_LMI_CTRL__DB_IT_DATA_COHERENCY_EN__SHIFT                                                          0x18 +#define UVD_LMI_CTRL__IT_IT_DATA_COHERENCY_EN__SHIFT                                                          0x19 +#define UVD_LMI_CTRL__MIF_MIF_DATA_COHERENCY_EN__SHIFT                                                        0x1a +#define UVD_LMI_CTRL__MIF_LESS_OUTSTANDING_RD_REQ__SHIFT                                                      0x1b +#define UVD_LMI_CTRL__MC_BLK_RST__SHIFT                                                                       0x1c +#define UVD_LMI_CTRL__UMC_BLK_RST__SHIFT                                                                      0x1d +#define UVD_LMI_CTRL__RFU__SHIFT                                                                              0x1e +#define UVD_LMI_CTRL__WRITE_CLEAN_TIMER_MASK                                                                  0x000000FFL +#define UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK                                                               0x00000100L +#define UVD_LMI_CTRL__REQ_MODE_MASK                                                                           0x00000200L +#define UVD_LMI_CTRL__ASSERT_MC_URGENT_MASK                                                                   0x00000800L +#define UVD_LMI_CTRL__MASK_MC_URGENT_MASK                                                                     0x00001000L +#define UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK                                                                  0x00002000L +#define UVD_LMI_CTRL__CRC_RESET_MASK                                                                          0x00004000L +#define UVD_LMI_CTRL__CRC_SEL_MASK                                                                            0x000F8000L +#define UVD_LMI_CTRL__DISABLE_ON_FWV_FAIL_MASK                                                                0x00100000L +#define UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK                                                             0x00200000L +#define UVD_LMI_CTRL__CM_DATA_COHERENCY_EN_MASK                                                               0x00400000L +#define UVD_LMI_CTRL__DB_DB_DATA_COHERENCY_EN_MASK                                                            0x00800000L +#define UVD_LMI_CTRL__DB_IT_DATA_COHERENCY_EN_MASK                                                            0x01000000L +#define UVD_LMI_CTRL__IT_IT_DATA_COHERENCY_EN_MASK                                                            0x02000000L +#define UVD_LMI_CTRL__MIF_MIF_DATA_COHERENCY_EN_MASK                                                          0x04000000L +#define UVD_LMI_CTRL__MIF_LESS_OUTSTANDING_RD_REQ_MASK                                                        0x08000000L +#define UVD_LMI_CTRL__MC_BLK_RST_MASK                                                                         0x10000000L +#define UVD_LMI_CTRL__UMC_BLK_RST_MASK                                                                        0x20000000L +#define UVD_LMI_CTRL__RFU_MASK                                                                                0xC0000000L +//UVD_LMI_STATUS +#define UVD_LMI_STATUS__READ_CLEAN__SHIFT                                                                     0x0 +#define UVD_LMI_STATUS__WRITE_CLEAN__SHIFT                                                                    0x1 +#define UVD_LMI_STATUS__WRITE_CLEAN_RAW__SHIFT                                                                0x2 +#define UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN__SHIFT                                                           0x3 +#define UVD_LMI_STATUS__UMC_READ_CLEAN__SHIFT                                                                 0x4 +#define UVD_LMI_STATUS__UMC_WRITE_CLEAN__SHIFT                                                                0x5 +#define UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW__SHIFT                                                            0x6 +#define UVD_LMI_STATUS__PENDING_UVD_MC_WRITE__SHIFT                                                           0x7 +#define UVD_LMI_STATUS__READ_CLEAN_RAW__SHIFT                                                                 0x8 +#define UVD_LMI_STATUS__UMC_READ_CLEAN_RAW__SHIFT                                                             0x9 +#define UVD_LMI_STATUS__UMC_UVD_IDLE__SHIFT                                                                   0xa +#define UVD_LMI_STATUS__UMC_AVP_IDLE__SHIFT                                                                   0xb +#define UVD_LMI_STATUS__ADP_MC_READ_CLEAN__SHIFT                                                              0xc +#define UVD_LMI_STATUS__ADP_UMC_READ_CLEAN__SHIFT                                                             0xd +#define UVD_LMI_STATUS__BSP0_WRITE_CLEAN__SHIFT                                                               0x12 +#define UVD_LMI_STATUS__BSP1_WRITE_CLEAN__SHIFT                                                               0x13 +#define UVD_LMI_STATUS__BSP2_WRITE_CLEAN__SHIFT                                                               0x14 +#define UVD_LMI_STATUS__BSP3_WRITE_CLEAN__SHIFT                                                               0x15 +#define UVD_LMI_STATUS__CENC_READ_CLEAN__SHIFT                                                                0x16 +#define UVD_LMI_STATUS__READ_CLEAN_MASK                                                                       0x00000001L +#define UVD_LMI_STATUS__WRITE_CLEAN_MASK                                                                      0x00000002L +#define UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK                                                                  0x00000004L +#define UVD_LMI_STATUS__VCPU_LMI_WRITE_CLEAN_MASK                                                             0x00000008L +#define UVD_LMI_STATUS__UMC_READ_CLEAN_MASK                                                                   0x00000010L +#define UVD_LMI_STATUS__UMC_WRITE_CLEAN_MASK                                                                  0x00000020L +#define UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK                                                              0x00000040L +#define UVD_LMI_STATUS__PENDING_UVD_MC_WRITE_MASK                                                             0x00000080L +#define UVD_LMI_STATUS__READ_CLEAN_RAW_MASK                                                                   0x00000100L +#define UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK                                                               0x00000200L +#define UVD_LMI_STATUS__UMC_UVD_IDLE_MASK                                                                     0x00000400L +#define UVD_LMI_STATUS__UMC_AVP_IDLE_MASK                                                                     0x00000800L +#define UVD_LMI_STATUS__ADP_MC_READ_CLEAN_MASK                                                                0x00001000L +#define UVD_LMI_STATUS__ADP_UMC_READ_CLEAN_MASK                                                               0x00002000L +#define UVD_LMI_STATUS__BSP0_WRITE_CLEAN_MASK                                                                 0x00040000L +#define UVD_LMI_STATUS__BSP1_WRITE_CLEAN_MASK                                                                 0x00080000L +#define UVD_LMI_STATUS__BSP2_WRITE_CLEAN_MASK                                                                 0x00100000L +#define UVD_LMI_STATUS__BSP3_WRITE_CLEAN_MASK                                                                 0x00200000L +#define UVD_LMI_STATUS__CENC_READ_CLEAN_MASK                                                                  0x00400000L +//UVD_LMI_PERFMON_CTRL +#define UVD_LMI_PERFMON_CTRL__PERFMON_STATE__SHIFT                                                            0x0 +#define UVD_LMI_PERFMON_CTRL__PERFMON_SEL__SHIFT                                                              0x8 +#define UVD_LMI_PERFMON_CTRL__PERFMON_STATE_MASK                                                              0x00000003L +#define UVD_LMI_PERFMON_CTRL__PERFMON_SEL_MASK                                                                0x00001F00L +//UVD_LMI_PERFMON_COUNT_LO +#define UVD_LMI_PERFMON_COUNT_LO__PERFMON_COUNT__SHIFT                                                        0x0 +#define UVD_LMI_PERFMON_COUNT_LO__PERFMON_COUNT_MASK                                                          0xFFFFFFFFL +//UVD_LMI_PERFMON_COUNT_HI +#define UVD_LMI_PERFMON_COUNT_HI__PERFMON_COUNT__SHIFT                                                        0x0 +#define UVD_LMI_PERFMON_COUNT_HI__PERFMON_COUNT_MASK                                                          0x0000FFFFL +//UVD_LMI_ADP_SWAP_CNTL +#define UVD_LMI_ADP_SWAP_CNTL__VCPU_R_MC_SWAP__SHIFT                                                          0x6 +#define UVD_LMI_ADP_SWAP_CNTL__VCPU_W_MC_SWAP__SHIFT                                                          0x8 +#define UVD_LMI_ADP_SWAP_CNTL__CM_MC_SWAP__SHIFT                                                              0xa +#define UVD_LMI_ADP_SWAP_CNTL__IT_MC_SWAP__SHIFT                                                              0xc +#define UVD_LMI_ADP_SWAP_CNTL__DB_R_MC_SWAP__SHIFT                                                            0xe +#define UVD_LMI_ADP_SWAP_CNTL__DB_W_MC_SWAP__SHIFT                                                            0x10 +#define UVD_LMI_ADP_SWAP_CNTL__CSM_MC_SWAP__SHIFT                                                             0x12 +#define UVD_LMI_ADP_SWAP_CNTL__PREF_MC_SWAP__SHIFT                                                            0x14 +#define UVD_LMI_ADP_SWAP_CNTL__DBW_MC_SWAP__SHIFT                                                             0x18 +#define UVD_LMI_ADP_SWAP_CNTL__RE_MC_SWAP__SHIFT                                                              0x1c +#define UVD_LMI_ADP_SWAP_CNTL__MP_MC_SWAP__SHIFT                                                              0x1e +#define UVD_LMI_ADP_SWAP_CNTL__VCPU_R_MC_SWAP_MASK                                                            0x000000C0L +#define UVD_LMI_ADP_SWAP_CNTL__VCPU_W_MC_SWAP_MASK                                                            0x00000300L +#define UVD_LMI_ADP_SWAP_CNTL__CM_MC_SWAP_MASK                                                                0x00000C00L +#define UVD_LMI_ADP_SWAP_CNTL__IT_MC_SWAP_MASK                                                                0x00003000L +#define UVD_LMI_ADP_SWAP_CNTL__DB_R_MC_SWAP_MASK                                                              0x0000C000L +#define UVD_LMI_ADP_SWAP_CNTL__DB_W_MC_SWAP_MASK                                                              0x00030000L +#define UVD_LMI_ADP_SWAP_CNTL__CSM_MC_SWAP_MASK                                                               0x000C0000L +#define UVD_LMI_ADP_SWAP_CNTL__PREF_MC_SWAP_MASK                                                              0x00300000L +#define UVD_LMI_ADP_SWAP_CNTL__DBW_MC_SWAP_MASK                                                               0x03000000L +#define UVD_LMI_ADP_SWAP_CNTL__RE_MC_SWAP_MASK                                                                0x30000000L +#define UVD_LMI_ADP_SWAP_CNTL__MP_MC_SWAP_MASK                                                                0xC0000000L +//UVD_LMI_RBC_RB_VMID +#define UVD_LMI_RBC_RB_VMID__RB_VMID__SHIFT                                                                   0x0 +#define UVD_LMI_RBC_RB_VMID__RB_VMID_MASK                                                                     0x0000000FL +//UVD_LMI_RBC_IB_VMID +#define UVD_LMI_RBC_IB_VMID__IB_VMID__SHIFT                                                                   0x0 +#define UVD_LMI_RBC_IB_VMID__IB_VMID_MASK                                                                     0x0000000FL +//UVD_LMI_MC_CREDITS +#define UVD_LMI_MC_CREDITS__UVD_RD_CREDITS__SHIFT                                                             0x0 +#define UVD_LMI_MC_CREDITS__UVD_WR_CREDITS__SHIFT                                                             0x8 +#define UVD_LMI_MC_CREDITS__UMC_RD_CREDITS__SHIFT                                                             0x10 +#define UVD_LMI_MC_CREDITS__UMC_WR_CREDITS__SHIFT                                                             0x18 +#define UVD_LMI_MC_CREDITS__UVD_RD_CREDITS_MASK                                                               0x0000003FL +#define UVD_LMI_MC_CREDITS__UVD_WR_CREDITS_MASK                                                               0x00003F00L +#define UVD_LMI_MC_CREDITS__UMC_RD_CREDITS_MASK                                                               0x003F0000L +#define UVD_LMI_MC_CREDITS__UMC_WR_CREDITS_MASK                                                               0x3F000000L +//UVD_LMI_ADP_IND_INDEX +#define UVD_LMI_ADP_IND_INDEX__INDEX__SHIFT                                                                   0x0 +#define UVD_LMI_ADP_IND_INDEX__INDEX_MASK                                                                     0x00001FFFL +//UVD_LMI_ADP_IND_DATA +#define UVD_LMI_ADP_IND_DATA__DATA__SHIFT                                                                     0x0 +#define UVD_LMI_ADP_IND_DATA__DATA_MASK                                                                       0xFFFFFFFFL +//UVD_LMI_ADP_PF_EN +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE0_PF_EN__SHIFT                                                           0x0 +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE1_PF_EN__SHIFT                                                           0x1 +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE2_PF_EN__SHIFT                                                           0x2 +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE0_PF_EN_MASK                                                             0x00000001L +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE1_PF_EN_MASK                                                             0x00000002L +#define UVD_LMI_ADP_PF_EN__VCPU_CACHE2_PF_EN_MASK                                                             0x00000004L +//UVD_LMI_PREF_CTRL +#define UVD_LMI_PREF_CTRL__PREF_RST__SHIFT                                                                    0x0 +#define UVD_LMI_PREF_CTRL__PREF_BUSY_STATUS__SHIFT                                                            0x1 +#define UVD_LMI_PREF_CTRL__PREF_WSTRB__SHIFT                                                                  0x2 +#define UVD_LMI_PREF_CTRL__PREF_WRITE_SIZE__SHIFT                                                             0x3 +#define UVD_LMI_PREF_CTRL__PREF_STEP_SIZE__SHIFT                                                              0x4 +#define UVD_LMI_PREF_CTRL__PREF_SIZE__SHIFT                                                                   0x13 +#define UVD_LMI_PREF_CTRL__PREF_RST_MASK                                                                      0x00000001L +#define UVD_LMI_PREF_CTRL__PREF_BUSY_STATUS_MASK                                                              0x00000002L +#define UVD_LMI_PREF_CTRL__PREF_WSTRB_MASK                                                                    0x00000004L +#define UVD_LMI_PREF_CTRL__PREF_WRITE_SIZE_MASK                                                               0x00000008L +#define UVD_LMI_PREF_CTRL__PREF_STEP_SIZE_MASK                                                                0x00000070L +#define UVD_LMI_PREF_CTRL__PREF_SIZE_MASK                                                                     0xFFF80000L +//UVD_LMI_MIF_REF_LUMA_64BIT_BAR_LOW +#define UVD_LMI_MIF_REF_LUMA_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                  0x0 +#define UVD_LMI_MIF_REF_LUMA_64BIT_BAR_LOW__BITS_31_0_MASK                                                    0xFFFFFFFFL +//UVD_LMI_MIF_REF_LUMA_64BIT_BAR_HIGH +#define UVD_LMI_MIF_REF_LUMA_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                0x0 +#define UVD_LMI_MIF_REF_LUMA_64BIT_BAR_HIGH__BITS_63_32_MASK                                                  0xFFFFFFFFL +//VCN_RAS_CNTL +#define VCN_RAS_CNTL__VCPU_VCODEC_IH_EN__SHIFT                                                                0x0 +#define VCN_RAS_CNTL__VCPU_VCODEC_PMI_EN__SHIFT                                                               0x4 +#define VCN_RAS_CNTL__VCPU_VCODEC_REARM__SHIFT                                                                0x8 +#define VCN_RAS_CNTL__VCPU_VCODEC_STALL_EN__SHIFT                                                             0xc +#define VCN_RAS_CNTL__VCPU_VCODEC_READY__SHIFT                                                                0x10 +#define VCN_RAS_CNTL__VCPU_VCODEC_IH_EN_MASK                                                                  0x00000001L +#define VCN_RAS_CNTL__VCPU_VCODEC_PMI_EN_MASK                                                                 0x00000010L +#define VCN_RAS_CNTL__VCPU_VCODEC_REARM_MASK                                                                  0x00000100L +#define VCN_RAS_CNTL__VCPU_VCODEC_STALL_EN_MASK                                                               0x00001000L +#define VCN_RAS_CNTL__VCPU_VCODEC_READY_MASK                                                                  0x00010000L + + +// addressBlock: aid_uvd0_uvd_jpeg0_jpegnpdec +//UVD_JPEG_CNTL +#define UVD_JPEG_CNTL__REQUEST_EN__SHIFT                                                                      0x1 +#define UVD_JPEG_CNTL__ERR_RST_EN__SHIFT                                                                      0x2 +#define UVD_JPEG_CNTL__DBG_MUX_SEL__SHIFT                                                                     0x8 +#define UVD_JPEG_CNTL__FORMAT_CONV_EN__SHIFT                                                                  0x10 +#define UVD_JPEG_CNTL__VUP_MODE__SHIFT                                                                        0x11 +#define UVD_JPEG_CNTL__FC_TIMEOUT_EN__SHIFT                                                                   0x12 +#define UVD_JPEG_CNTL__ROI_CROP_EN__SHIFT                                                                     0x18 +#define UVD_JPEG_CNTL__ROI_CROP_EARLY_DECODE_STOP_DIS__SHIFT                                                  0x19 +#define UVD_JPEG_CNTL__REQUEST_EN_MASK                                                                        0x00000002L +#define UVD_JPEG_CNTL__ERR_RST_EN_MASK                                                                        0x00000004L +#define UVD_JPEG_CNTL__DBG_MUX_SEL_MASK                                                                       0x00007F00L +#define UVD_JPEG_CNTL__FORMAT_CONV_EN_MASK                                                                    0x00010000L +#define UVD_JPEG_CNTL__VUP_MODE_MASK                                                                          0x00020000L +#define UVD_JPEG_CNTL__FC_TIMEOUT_EN_MASK                                                                     0x00040000L +#define UVD_JPEG_CNTL__ROI_CROP_EN_MASK                                                                       0x01000000L +#define UVD_JPEG_CNTL__ROI_CROP_EARLY_DECODE_STOP_DIS_MASK                                                    0x02000000L +//UVD_JPEG_RB_BASE +#define UVD_JPEG_RB_BASE__RB_BYTE_OFF__SHIFT                                                                  0x0 +#define UVD_JPEG_RB_BASE__RB_BASE__SHIFT                                                                      0x6 +#define UVD_JPEG_RB_BASE__RB_BYTE_OFF_MASK                                                                    0x0000003FL +#define UVD_JPEG_RB_BASE__RB_BASE_MASK                                                                        0xFFFFFFC0L +//UVD_JPEG_RB_WPTR +#define UVD_JPEG_RB_WPTR__RB_WPTR__SHIFT                                                                      0x4 +#define UVD_JPEG_RB_WPTR__RB_WPTR_MASK                                                                        0x3FFFFFF0L +//UVD_JPEG_RB_RPTR +#define UVD_JPEG_RB_RPTR__RB_RPTR__SHIFT                                                                      0x4 +#define UVD_JPEG_RB_RPTR__RB_RPTR_MASK                                                                        0x3FFFFFF0L +//UVD_JPEG_RB_SIZE +#define UVD_JPEG_RB_SIZE__RB_SIZE__SHIFT                                                                      0x4 +#define UVD_JPEG_RB_SIZE__RB_SIZE_MASK                                                                        0x3FFFFFF0L +//UVD_JPEG_DEC_CNT +#define UVD_JPEG_DEC_CNT__DECODE_COUNT__SHIFT                                                                 0x0 +#define UVD_JPEG_DEC_CNT__DECODE_COUNT_MASK                                                                   0xFFFFFFFFL +//UVD_JPEG_SPS_INFO +#define UVD_JPEG_SPS_INFO__PIC_WIDTH__SHIFT                                                                   0x0 +#define UVD_JPEG_SPS_INFO__PIC_HEIGHT__SHIFT                                                                  0x10 +#define UVD_JPEG_SPS_INFO__PIC_WIDTH_MASK                                                                     0x0000FFFFL +#define UVD_JPEG_SPS_INFO__PIC_HEIGHT_MASK                                                                    0xFFFF0000L +//UVD_JPEG_SPS1_INFO +#define UVD_JPEG_SPS1_INFO__CHROMA_FORMAT_IDC__SHIFT                                                          0x0 +#define UVD_JPEG_SPS1_INFO__YUV422_SUBFORMAT__SHIFT                                                           0x3 +#define UVD_JPEG_SPS1_INFO__OUT_FMT_422__SHIFT                                                                0x4 +#define UVD_JPEG_SPS1_INFO__CHROMA_FORMAT_IDC_MASK                                                            0x00000007L +#define UVD_JPEG_SPS1_INFO__YUV422_SUBFORMAT_MASK                                                             0x00000008L +#define UVD_JPEG_SPS1_INFO__OUT_FMT_422_MASK                                                                  0x00000010L +//UVD_JPEG_RE_TIMER +#define UVD_JPEG_RE_TIMER__TIMER_OUT__SHIFT                                                                   0x0 +#define UVD_JPEG_RE_TIMER__TIMER_OUT_EN__SHIFT                                                                0x10 +#define UVD_JPEG_RE_TIMER__TIMER_OUT_MASK                                                                     0x000000FFL +#define UVD_JPEG_RE_TIMER__TIMER_OUT_EN_MASK                                                                  0x00010000L +//UVD_JPEG_DEC_SCRATCH0 +#define UVD_JPEG_DEC_SCRATCH0__SCRATCH0__SHIFT                                                                0x0 +#define UVD_JPEG_DEC_SCRATCH0__SCRATCH0_MASK                                                                  0xFFFFFFFFL +//UVD_JPEG_INT_EN +#define UVD_JPEG_INT_EN__OUTBUF_WPTR_INC_EN__SHIFT                                                            0x0 +#define UVD_JPEG_INT_EN__JOB_AVAIL_EN__SHIFT                                                                  0x1 +#define UVD_JPEG_INT_EN__FENCE_VAL_EN__SHIFT                                                                  0x2 +#define UVD_JPEG_INT_EN__FIFO_OVERFLOW_ERR_EN__SHIFT                                                          0x6 +#define UVD_JPEG_INT_EN__BLK_CNT_OUT_OF_SYNC_ERR_EN__SHIFT                                                    0x7 +#define UVD_JPEG_INT_EN__EOI_ERR_EN__SHIFT                                                                    0x8 +#define UVD_JPEG_INT_EN__HFM_ERR_EN__SHIFT                                                                    0x9 +#define UVD_JPEG_INT_EN__RST_ERR_EN__SHIFT                                                                    0xa +#define UVD_JPEG_INT_EN__ECS_MK_ERR_EN__SHIFT                                                                 0xb +#define UVD_JPEG_INT_EN__TIMEOUT_ERR_EN__SHIFT                                                                0xc +#define UVD_JPEG_INT_EN__MARKER_ERR_EN__SHIFT                                                                 0xd +#define UVD_JPEG_INT_EN__FMT_ERR_EN__SHIFT                                                                    0xe +#define UVD_JPEG_INT_EN__PROFILE_ERR_EN__SHIFT                                                                0xf +#define UVD_JPEG_INT_EN__FC_TIMEOUT_ERR_EN__SHIFT                                                             0x10 +#define UVD_JPEG_INT_EN__FC_FMT_ERR_EN__SHIFT                                                                 0x11 +#define UVD_JPEG_INT_EN__FC_SRC_ERR_EN__SHIFT                                                                 0x12 +#define UVD_JPEG_INT_EN__CROP_SIZE_ERR_EN__SHIFT                                                              0x13 +#define UVD_JPEG_INT_EN__OUTBUF_WPTR_INC_EN_MASK                                                              0x00000001L +#define UVD_JPEG_INT_EN__JOB_AVAIL_EN_MASK                                                                    0x00000002L +#define UVD_JPEG_INT_EN__FENCE_VAL_EN_MASK                                                                    0x00000004L +#define UVD_JPEG_INT_EN__FIFO_OVERFLOW_ERR_EN_MASK                                                            0x00000040L +#define UVD_JPEG_INT_EN__BLK_CNT_OUT_OF_SYNC_ERR_EN_MASK                                                      0x00000080L +#define UVD_JPEG_INT_EN__EOI_ERR_EN_MASK                                                                      0x00000100L +#define UVD_JPEG_INT_EN__HFM_ERR_EN_MASK                                                                      0x00000200L +#define UVD_JPEG_INT_EN__RST_ERR_EN_MASK                                                                      0x00000400L +#define UVD_JPEG_INT_EN__ECS_MK_ERR_EN_MASK                                                                   0x00000800L +#define UVD_JPEG_INT_EN__TIMEOUT_ERR_EN_MASK                                                                  0x00001000L +#define UVD_JPEG_INT_EN__MARKER_ERR_EN_MASK                                                                   0x00002000L +#define UVD_JPEG_INT_EN__FMT_ERR_EN_MASK                                                                      0x00004000L +#define UVD_JPEG_INT_EN__PROFILE_ERR_EN_MASK                                                                  0x00008000L +#define UVD_JPEG_INT_EN__FC_TIMEOUT_ERR_EN_MASK                                                               0x00010000L +#define UVD_JPEG_INT_EN__FC_FMT_ERR_EN_MASK                                                                   0x00020000L +#define UVD_JPEG_INT_EN__FC_SRC_ERR_EN_MASK                                                                   0x00040000L +#define UVD_JPEG_INT_EN__CROP_SIZE_ERR_EN_MASK                                                                0x00080000L +//UVD_JPEG_INT_STAT +#define UVD_JPEG_INT_STAT__OUTBUF_WPTR_INC_INT__SHIFT                                                         0x0 +#define UVD_JPEG_INT_STAT__JOB_AVAIL_INT__SHIFT                                                               0x1 +#define UVD_JPEG_INT_STAT__FENCE_VAL_INT__SHIFT                                                               0x2 +#define UVD_JPEG_INT_STAT__FIFO_OVERFLOW_ERR_INT__SHIFT                                                       0x6 +#define UVD_JPEG_INT_STAT__BLK_CNT_OUT_OF_SYNC_ERR_INT__SHIFT                                                 0x7 +#define UVD_JPEG_INT_STAT__EOI_ERR_INT__SHIFT                                                                 0x8 +#define UVD_JPEG_INT_STAT__HFM_ERR_INT__SHIFT                                                                 0x9 +#define UVD_JPEG_INT_STAT__RST_ERR_INT__SHIFT                                                                 0xa +#define UVD_JPEG_INT_STAT__ECS_MK_ERR_INT__SHIFT                                                              0xb +#define UVD_JPEG_INT_STAT__TIMEOUT_ERR_INT__SHIFT                                                             0xc +#define UVD_JPEG_INT_STAT__MARKER_ERR_INT__SHIFT                                                              0xd +#define UVD_JPEG_INT_STAT__FMT_ERR_INT__SHIFT                                                                 0xe +#define UVD_JPEG_INT_STAT__PROFILE_ERR_INT__SHIFT                                                             0xf +#define UVD_JPEG_INT_STAT__FC_TIMEOUT_ERR_INT__SHIFT                                                          0x10 +#define UVD_JPEG_INT_STAT__FC_FMT_ERR_INT__SHIFT                                                              0x11 +#define UVD_JPEG_INT_STAT__FC_SRC_ERR_INT__SHIFT                                                              0x12 +#define UVD_JPEG_INT_STAT__CROP_SIZE_ERR_INT__SHIFT                                                           0x13 +#define UVD_JPEG_INT_STAT__OUTBUF_WPTR_INC_INT_MASK                                                           0x00000001L +#define UVD_JPEG_INT_STAT__JOB_AVAIL_INT_MASK                                                                 0x00000002L +#define UVD_JPEG_INT_STAT__FENCE_VAL_INT_MASK                                                                 0x00000004L +#define UVD_JPEG_INT_STAT__FIFO_OVERFLOW_ERR_INT_MASK                                                         0x00000040L +#define UVD_JPEG_INT_STAT__BLK_CNT_OUT_OF_SYNC_ERR_INT_MASK                                                   0x00000080L +#define UVD_JPEG_INT_STAT__EOI_ERR_INT_MASK                                                                   0x00000100L +#define UVD_JPEG_INT_STAT__HFM_ERR_INT_MASK                                                                   0x00000200L +#define UVD_JPEG_INT_STAT__RST_ERR_INT_MASK                                                                   0x00000400L +#define UVD_JPEG_INT_STAT__ECS_MK_ERR_INT_MASK                                                                0x00000800L +#define UVD_JPEG_INT_STAT__TIMEOUT_ERR_INT_MASK                                                               0x00001000L +#define UVD_JPEG_INT_STAT__MARKER_ERR_INT_MASK                                                                0x00002000L +#define UVD_JPEG_INT_STAT__FMT_ERR_INT_MASK                                                                   0x00004000L +#define UVD_JPEG_INT_STAT__PROFILE_ERR_INT_MASK                                                               0x00008000L +#define UVD_JPEG_INT_STAT__FC_TIMEOUT_ERR_INT_MASK                                                            0x00010000L +#define UVD_JPEG_INT_STAT__FC_FMT_ERR_INT_MASK                                                                0x00020000L +#define UVD_JPEG_INT_STAT__FC_SRC_ERR_INT_MASK                                                                0x00040000L +#define UVD_JPEG_INT_STAT__CROP_SIZE_ERR_INT_MASK                                                             0x00080000L +//UVD_JPEG_TIER_CNTL0 +#define UVD_JPEG_TIER_CNTL0__TIER_SEL__SHIFT                                                                  0x0 +#define UVD_JPEG_TIER_CNTL0__Y_COMP_ID__SHIFT                                                                 0x2 +#define UVD_JPEG_TIER_CNTL0__U_COMP_ID__SHIFT                                                                 0x4 +#define UVD_JPEG_TIER_CNTL0__V_COMP_ID__SHIFT                                                                 0x6 +#define UVD_JPEG_TIER_CNTL0__Y_H_SAMP_FAC__SHIFT                                                              0x8 +#define UVD_JPEG_TIER_CNTL0__Y_V_SAMP_FAC__SHIFT                                                              0xb +#define UVD_JPEG_TIER_CNTL0__U_H_SAMP_FAC__SHIFT                                                              0xe +#define UVD_JPEG_TIER_CNTL0__U_V_SAMP_FAC__SHIFT                                                              0x11 +#define UVD_JPEG_TIER_CNTL0__V_H_SAMP_FAC__SHIFT                                                              0x14 +#define UVD_JPEG_TIER_CNTL0__V_V_SAMP_FAC__SHIFT                                                              0x17 +#define UVD_JPEG_TIER_CNTL0__Y_TQ__SHIFT                                                                      0x1a +#define UVD_JPEG_TIER_CNTL0__U_TQ__SHIFT                                                                      0x1c +#define UVD_JPEG_TIER_CNTL0__V_TQ__SHIFT                                                                      0x1e +#define UVD_JPEG_TIER_CNTL0__TIER_SEL_MASK                                                                    0x00000003L +#define UVD_JPEG_TIER_CNTL0__Y_COMP_ID_MASK                                                                   0x0000000CL +#define UVD_JPEG_TIER_CNTL0__U_COMP_ID_MASK                                                                   0x00000030L +#define UVD_JPEG_TIER_CNTL0__V_COMP_ID_MASK                                                                   0x000000C0L +#define UVD_JPEG_TIER_CNTL0__Y_H_SAMP_FAC_MASK                                                                0x00000700L +#define UVD_JPEG_TIER_CNTL0__Y_V_SAMP_FAC_MASK                                                                0x00003800L +#define UVD_JPEG_TIER_CNTL0__U_H_SAMP_FAC_MASK                                                                0x0001C000L +#define UVD_JPEG_TIER_CNTL0__U_V_SAMP_FAC_MASK                                                                0x000E0000L +#define UVD_JPEG_TIER_CNTL0__V_H_SAMP_FAC_MASK                                                                0x00700000L +#define UVD_JPEG_TIER_CNTL0__V_V_SAMP_FAC_MASK                                                                0x03800000L +#define UVD_JPEG_TIER_CNTL0__Y_TQ_MASK                                                                        0x0C000000L +#define UVD_JPEG_TIER_CNTL0__U_TQ_MASK                                                                        0x30000000L +#define UVD_JPEG_TIER_CNTL0__V_TQ_MASK                                                                        0xC0000000L +//UVD_JPEG_TIER_CNTL1 +#define UVD_JPEG_TIER_CNTL1__SRC_WIDTH__SHIFT                                                                 0x0 +#define UVD_JPEG_TIER_CNTL1__SRC_HEIGHT__SHIFT                                                                0x10 +#define UVD_JPEG_TIER_CNTL1__SRC_WIDTH_MASK                                                                   0x0000FFFFL +#define UVD_JPEG_TIER_CNTL1__SRC_HEIGHT_MASK                                                                  0xFFFF0000L +//UVD_JPEG_TIER_CNTL2 +#define UVD_JPEG_TIER_CNTL2__TBL_ECS_SEL__SHIFT                                                               0x0 +#define UVD_JPEG_TIER_CNTL2__TBL_TYPE__SHIFT                                                                  0x1 +#define UVD_JPEG_TIER_CNTL2__TQ__SHIFT                                                                        0x2 +#define UVD_JPEG_TIER_CNTL2__TH__SHIFT                                                                        0x4 +#define UVD_JPEG_TIER_CNTL2__TC__SHIFT                                                                        0x6 +#define UVD_JPEG_TIER_CNTL2__TD__SHIFT                                                                        0x7 +#define UVD_JPEG_TIER_CNTL2__TA__SHIFT                                                                        0xa +#define UVD_JPEG_TIER_CNTL2__TIER2_HTBL_CNTLEN__SHIFT                                                         0xe +#define UVD_JPEG_TIER_CNTL2__DRI_VAL__SHIFT                                                                   0x10 +#define UVD_JPEG_TIER_CNTL2__TBL_ECS_SEL_MASK                                                                 0x00000001L +#define UVD_JPEG_TIER_CNTL2__TBL_TYPE_MASK                                                                    0x00000002L +#define UVD_JPEG_TIER_CNTL2__TQ_MASK                                                                          0x0000000CL +#define UVD_JPEG_TIER_CNTL2__TH_MASK                                                                          0x00000030L +#define UVD_JPEG_TIER_CNTL2__TC_MASK                                                                          0x00000040L +#define UVD_JPEG_TIER_CNTL2__TD_MASK                                                                          0x00000380L +#define UVD_JPEG_TIER_CNTL2__TA_MASK                                                                          0x00001C00L +#define UVD_JPEG_TIER_CNTL2__TIER2_HTBL_CNTLEN_MASK                                                           0x00004000L +#define UVD_JPEG_TIER_CNTL2__DRI_VAL_MASK                                                                     0xFFFF0000L +//UVD_JPEG_TIER_STATUS +#define UVD_JPEG_TIER_STATUS__BSI_FETCH_DONE__SHIFT                                                           0x0 +#define UVD_JPEG_TIER_STATUS__DECODE_DONE__SHIFT                                                              0x1 +#define UVD_JPEG_TIER_STATUS__BSI_FETCH_DONE_MASK                                                             0x00000001L +#define UVD_JPEG_TIER_STATUS__DECODE_DONE_MASK                                                                0x00000002L + + +// addressBlock: aid_uvd0_uvd_jpeg_sclk0_jpegnpsclkdec +//UVD_JPEG_OUTBUF_CNTL +#define UVD_JPEG_OUTBUF_CNTL__OUTBUF_CNT__SHIFT                                                               0x0 +#define UVD_JPEG_OUTBUF_CNTL__HGT_ALIGN__SHIFT                                                                0x2 +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_DECODE_DONE_FIX__SHIFT                                                    0x6 +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_WR_COMB_MAX_CNT__SHIFT                                                    0x7 +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_WR_COMB_TIMER__SHIFT                                                      0x9 +#define UVD_JPEG_OUTBUF_CNTL__DIS_OBUF_AVAIL_CHECK__SHIFT                                                     0x10 +#define UVD_JPEG_OUTBUF_CNTL__OUTBUF_CNT_MASK                                                                 0x00000003L +#define UVD_JPEG_OUTBUF_CNTL__HGT_ALIGN_MASK                                                                  0x00000004L +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_DECODE_DONE_FIX_MASK                                                      0x00000040L +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_WR_COMB_MAX_CNT_MASK                                                      0x00000180L +#define UVD_JPEG_OUTBUF_CNTL__JPEG0_WR_COMB_TIMER_MASK                                                        0x00001E00L +#define UVD_JPEG_OUTBUF_CNTL__DIS_OBUF_AVAIL_CHECK_MASK                                                       0x00010000L +//UVD_JPEG_OUTBUF_WPTR +#define UVD_JPEG_OUTBUF_WPTR__OUTBUF_WPTR__SHIFT                                                              0x0 +#define UVD_JPEG_OUTBUF_WPTR__OUTBUF_WPTR_MASK                                                                0xFFFFFFFFL +//UVD_JPEG_OUTBUF_RPTR +#define UVD_JPEG_OUTBUF_RPTR__OUTBUF_RPTR__SHIFT                                                              0x0 +#define UVD_JPEG_OUTBUF_RPTR__OUTBUF_RPTR_MASK                                                                0xFFFFFFFFL +//UVD_JPEG_PITCH +#define UVD_JPEG_PITCH__PITCH__SHIFT                                                                          0x0 +#define UVD_JPEG_PITCH__PITCH_MASK                                                                            0xFFFFFFFFL +//UVD_JPEG_UV_PITCH +#define UVD_JPEG_UV_PITCH__UV_PITCH__SHIFT                                                                    0x0 +#define UVD_JPEG_UV_PITCH__UV_PITCH_MASK                                                                      0xFFFFFFFFL +//JPEG_DEC_Y_GFX8_TILING_SURFACE +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__BANK_WIDTH__SHIFT                                                     0x0 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__BANK_HEIGHT__SHIFT                                                    0x2 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__MACRO_TILE_ASPECT__SHIFT                                              0x4 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__NUM_BANKS__SHIFT                                                      0x6 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__PIPE_CONFIG__SHIFT                                                    0x8 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__TILE_SPLIT__SHIFT                                                     0xd +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__ARRAY_MODE__SHIFT                                                     0x10 +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__BANK_WIDTH_MASK                                                       0x00000003L +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__BANK_HEIGHT_MASK                                                      0x0000000CL +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__MACRO_TILE_ASPECT_MASK                                                0x00000030L +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__NUM_BANKS_MASK                                                        0x000000C0L +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__PIPE_CONFIG_MASK                                                      0x00001F00L +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__TILE_SPLIT_MASK                                                       0x0000E000L +#define JPEG_DEC_Y_GFX8_TILING_SURFACE__ARRAY_MODE_MASK                                                       0x000F0000L +//JPEG_DEC_UV_GFX8_TILING_SURFACE +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__BANK_WIDTH__SHIFT                                                    0x0 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__BANK_HEIGHT__SHIFT                                                   0x2 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__MACRO_TILE_ASPECT__SHIFT                                             0x4 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__NUM_BANKS__SHIFT                                                     0x6 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__PIPE_CONFIG__SHIFT                                                   0x8 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__TILE_SPLIT__SHIFT                                                    0xd +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__ARRAY_MODE__SHIFT                                                    0x10 +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__BANK_WIDTH_MASK                                                      0x00000003L +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__BANK_HEIGHT_MASK                                                     0x0000000CL +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__MACRO_TILE_ASPECT_MASK                                               0x00000030L +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__NUM_BANKS_MASK                                                       0x000000C0L +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__PIPE_CONFIG_MASK                                                     0x00001F00L +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__TILE_SPLIT_MASK                                                      0x0000E000L +#define JPEG_DEC_UV_GFX8_TILING_SURFACE__ARRAY_MODE_MASK                                                      0x000F0000L +//JPEG_DEC_GFX8_ADDR_CONFIG +#define JPEG_DEC_GFX8_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE__SHIFT                                                0x4 +#define JPEG_DEC_GFX8_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE_MASK                                                  0x00000070L +//JPEG_DEC_Y_GFX10_TILING_SURFACE +#define JPEG_DEC_Y_GFX10_TILING_SURFACE__SWIZZLE_MODE__SHIFT                                                  0x0 +#define JPEG_DEC_Y_GFX10_TILING_SURFACE__SWIZZLE_MODE_MASK                                                    0x0000001FL +//JPEG_DEC_UV_GFX10_TILING_SURFACE +#define JPEG_DEC_UV_GFX10_TILING_SURFACE__SWIZZLE_MODE__SHIFT                                                 0x0 +#define JPEG_DEC_UV_GFX10_TILING_SURFACE__SWIZZLE_MODE_MASK                                                   0x0000001FL +//JPEG_DEC_GFX10_ADDR_CONFIG +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_PIPES__SHIFT                                                          0x0 +#define JPEG_DEC_GFX10_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE__SHIFT                                               0x3 +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_PKRS__SHIFT                                                           0x8 +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_BANKS__SHIFT                                                          0xc +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_SHADER_ENGINES__SHIFT                                                 0x13 +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_PIPES_MASK                                                            0x00000007L +#define JPEG_DEC_GFX10_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE_MASK                                                 0x00000038L +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_PKRS_MASK                                                             0x00000700L +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_BANKS_MASK                                                            0x00007000L +#define JPEG_DEC_GFX10_ADDR_CONFIG__NUM_SHADER_ENGINES_MASK                                                   0x00180000L +//JPEG_DEC_ADDR_MODE +#define JPEG_DEC_ADDR_MODE__ADDR_MODE_Y__SHIFT                                                                0x0 +#define JPEG_DEC_ADDR_MODE__ADDR_MODE_UV__SHIFT                                                               0x2 +#define JPEG_DEC_ADDR_MODE__ADDR_LIB_SEL__SHIFT                                                               0xc +#define JPEG_DEC_ADDR_MODE__ADDR_MODE_Y_MASK                                                                  0x00000003L +#define JPEG_DEC_ADDR_MODE__ADDR_MODE_UV_MASK                                                                 0x0000000CL +#define JPEG_DEC_ADDR_MODE__ADDR_LIB_SEL_MASK                                                                 0x00007000L +//UVD_JPEG_OUTPUT_XY +#define UVD_JPEG_OUTPUT_XY__OUTPUT_X__SHIFT                                                                   0x0 +#define UVD_JPEG_OUTPUT_XY__OUTPUT_Y__SHIFT                                                                   0x10 +#define UVD_JPEG_OUTPUT_XY__OUTPUT_X_MASK                                                                     0x00003FFFL +#define UVD_JPEG_OUTPUT_XY__OUTPUT_Y_MASK                                                                     0x3FFF0000L +//UVD_JPEG_GPCOM_CMD +#define UVD_JPEG_GPCOM_CMD__CMD__SHIFT                                                                        0x1 +#define UVD_JPEG_GPCOM_CMD__CMD_MASK                                                                          0x0000000EL +//UVD_JPEG_GPCOM_DATA0 +#define UVD_JPEG_GPCOM_DATA0__DATA0__SHIFT                                                                    0x0 +#define UVD_JPEG_GPCOM_DATA0__DATA0_MASK                                                                      0xFFFFFFFFL +//UVD_JPEG_GPCOM_DATA1 +#define UVD_JPEG_GPCOM_DATA1__DATA1__SHIFT                                                                    0x0 +#define UVD_JPEG_GPCOM_DATA1__DATA1_MASK                                                                      0xFFFFFFFFL +//UVD_JPEG_SCRATCH1 +#define UVD_JPEG_SCRATCH1__SCRATCH1__SHIFT                                                                    0x0 +#define UVD_JPEG_SCRATCH1__SCRATCH1_MASK                                                                      0xFFFFFFFFL +//UVD_JPEG_DEC_SOFT_RST +#define UVD_JPEG_DEC_SOFT_RST__SOFT_RESET__SHIFT                                                              0x0 +#define UVD_JPEG_DEC_SOFT_RST__RESET_STATUS__SHIFT                                                            0x10 +#define UVD_JPEG_DEC_SOFT_RST__SOFT_RESET_MASK                                                                0x00000001L +#define UVD_JPEG_DEC_SOFT_RST__RESET_STATUS_MASK                                                              0x00010000L + +// addressBlock: aid_uvd0_vcn_edcc_dec +//VCN_UE_ERR_STATUS_LO_VIDD +#define VCN_UE_ERR_STATUS_LO_VIDD__Err_Status_Valid_Flag__SHIFT                                               0x0 +#define VCN_UE_ERR_STATUS_LO_VIDD__Address_Valid_Flag__SHIFT                                                  0x1 +#define VCN_UE_ERR_STATUS_LO_VIDD__Address__SHIFT                                                             0x2 +#define VCN_UE_ERR_STATUS_LO_VIDD__Memory_id__SHIFT                                                           0x18 +#define VCN_UE_ERR_STATUS_LO_VIDD__Err_Status_Valid_Flag_MASK                                                 0x00000001L +#define VCN_UE_ERR_STATUS_LO_VIDD__Address_Valid_Flag_MASK                                                    0x00000002L +#define VCN_UE_ERR_STATUS_LO_VIDD__Address_MASK                                                               0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_VIDD__Memory_id_MASK                                                             0xFF000000L +//VCN_UE_ERR_STATUS_HI_VIDD +#define VCN_UE_ERR_STATUS_HI_VIDD__ECC__SHIFT                                                                 0x0 +#define VCN_UE_ERR_STATUS_HI_VIDD__Parity__SHIFT                                                              0x1 +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_Info_Valid_Flag__SHIFT                                                 0x2 +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_Info__SHIFT                                                            0x3 +#define VCN_UE_ERR_STATUS_HI_VIDD__UE_Cnt__SHIFT                                                              0x17 +#define VCN_UE_ERR_STATUS_HI_VIDD__FED_Cnt__SHIFT                                                             0x1a +#define VCN_UE_ERR_STATUS_HI_VIDD__RESERVED__SHIFT                                                            0x1d +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_clr__SHIFT                                                             0x1f +#define VCN_UE_ERR_STATUS_HI_VIDD__ECC_MASK                                                                   0x00000001L +#define VCN_UE_ERR_STATUS_HI_VIDD__Parity_MASK                                                                0x00000002L +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_Info_Valid_Flag_MASK                                                   0x00000004L +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_Info_MASK                                                              0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_VIDD__UE_Cnt_MASK                                                                0x03800000L +#define VCN_UE_ERR_STATUS_HI_VIDD__FED_Cnt_MASK                                                               0x1C000000L +#define VCN_UE_ERR_STATUS_HI_VIDD__RESERVED_MASK                                                              0x60000000L +#define VCN_UE_ERR_STATUS_HI_VIDD__Err_clr_MASK                                                               0x80000000L +//VCN_UE_ERR_STATUS_LO_VIDV +#define VCN_UE_ERR_STATUS_LO_VIDV__Err_Status_Valid_Flag__SHIFT                                               0x0 +#define VCN_UE_ERR_STATUS_LO_VIDV__Address_Valid_Flag__SHIFT                                                  0x1 +#define VCN_UE_ERR_STATUS_LO_VIDV__Address__SHIFT                                                             0x2 +#define VCN_UE_ERR_STATUS_LO_VIDV__Memory_id__SHIFT                                                           0x18 +#define VCN_UE_ERR_STATUS_LO_VIDV__Err_Status_Valid_Flag_MASK                                                 0x00000001L +#define VCN_UE_ERR_STATUS_LO_VIDV__Address_Valid_Flag_MASK                                                    0x00000002L +#define VCN_UE_ERR_STATUS_LO_VIDV__Address_MASK                                                               0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_VIDV__Memory_id_MASK                                                             0xFF000000L +//VCN_UE_ERR_STATUS_HI_VIDV +#define VCN_UE_ERR_STATUS_HI_VIDV__ECC__SHIFT                                                                 0x0 +#define VCN_UE_ERR_STATUS_HI_VIDV__Parity__SHIFT                                                              0x1 +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_Info_Valid_Flag__SHIFT                                                 0x2 +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_Info__SHIFT                                                            0x3 +#define VCN_UE_ERR_STATUS_HI_VIDV__UE_Cnt__SHIFT                                                              0x17 +#define VCN_UE_ERR_STATUS_HI_VIDV__FED_Cnt__SHIFT                                                             0x1a +#define VCN_UE_ERR_STATUS_HI_VIDV__RESERVED__SHIFT                                                            0x1d +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_clr__SHIFT                                                             0x1f +#define VCN_UE_ERR_STATUS_HI_VIDV__ECC_MASK                                                                   0x00000001L +#define VCN_UE_ERR_STATUS_HI_VIDV__Parity_MASK                                                                0x00000002L +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_Info_Valid_Flag_MASK                                                   0x00000004L +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_Info_MASK                                                              0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_VIDV__UE_Cnt_MASK                                                                0x03800000L +#define VCN_UE_ERR_STATUS_HI_VIDV__FED_Cnt_MASK                                                               0x1C000000L +#define VCN_UE_ERR_STATUS_HI_VIDV__RESERVED_MASK                                                              0x60000000L +#define VCN_UE_ERR_STATUS_HI_VIDV__Err_clr_MASK                                                               0x80000000L +//VCN_CE_ERR_STATUS_LO_MMSCHD +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Address__SHIFT                                                           0x2 +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Memory_id__SHIFT                                                         0x18 +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Address_MASK                                                             0x00FFFFFCL +#define VCN_CE_ERR_STATUS_LO_MMSCHD__Memory_id_MASK                                                           0xFF000000L +//VCN_CE_ERR_STATUS_HI_MMSCHD +#define VCN_CE_ERR_STATUS_HI_MMSCHD__ECC__SHIFT                                                               0x0 +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Other__SHIFT                                                             0x1 +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_Info__SHIFT                                                          0x3 +#define VCN_CE_ERR_STATUS_HI_MMSCHD__CE_Cnt__SHIFT                                                            0x17 +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Poison__SHIFT                                                            0x1c +#define VCN_CE_ERR_STATUS_HI_MMSCHD__RESERVED__SHIFT                                                          0x1d +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_clr__SHIFT                                                           0x1f +#define VCN_CE_ERR_STATUS_HI_MMSCHD__ECC_MASK                                                                 0x00000001L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Other_MASK                                                               0x00000002L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__CE_Cnt_MASK                                                              0x03800000L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Poison_MASK                                                              0x10000000L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__RESERVED_MASK                                                            0x60000000L +#define VCN_CE_ERR_STATUS_HI_MMSCHD__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG0S +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG0S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG0S +#define VCN_UE_ERR_STATUS_HI_JPEG0S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG0S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG0S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG0S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG0S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG0S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG0D +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG0D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG0D +#define VCN_UE_ERR_STATUS_HI_JPEG0D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG0D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG0D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG0D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG0D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG0D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG1S +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG1S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG1S +#define VCN_UE_ERR_STATUS_HI_JPEG1S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG1S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG1S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG1S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG1S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG1S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG1D +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG1D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG1D +#define VCN_UE_ERR_STATUS_HI_JPEG1D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG1D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG1D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG1D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG1D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG1D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG2S +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG2S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG2S +#define VCN_UE_ERR_STATUS_HI_JPEG2S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG2S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG2S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG2S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG2S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG2S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG2D +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG2D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG2D +#define VCN_UE_ERR_STATUS_HI_JPEG2D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG2D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG2D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG2D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG2D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG2D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG3S +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG3S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG3S +#define VCN_UE_ERR_STATUS_HI_JPEG3S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG3S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG3S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG3S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG3S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG3S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG3D +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG3D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG3D +#define VCN_UE_ERR_STATUS_HI_JPEG3D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG3D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG3D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG3D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG3D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG3D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG4S +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG4S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG4S +#define VCN_UE_ERR_STATUS_HI_JPEG4S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG4S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG4S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG4S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG4S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG4S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG4D +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG4D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG4D +#define VCN_UE_ERR_STATUS_HI_JPEG4D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG4D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG4D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG4D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG4D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG4D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG5S +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG5S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG5S +#define VCN_UE_ERR_STATUS_HI_JPEG5S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG5S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG5S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG5S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG5S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG5S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG5D +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG5D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG5D +#define VCN_UE_ERR_STATUS_HI_JPEG5D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG5D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG5D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG5D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG5D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG5D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG6S +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG6S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG6S +#define VCN_UE_ERR_STATUS_HI_JPEG6S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG6S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG6S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG6S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG6S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG6S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG6D +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG6D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG6D +#define VCN_UE_ERR_STATUS_HI_JPEG6D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG6D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG6D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG6D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG6D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG6D__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG7S +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG7S__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG7S +#define VCN_UE_ERR_STATUS_HI_JPEG7S__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG7S__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG7S__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG7S__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG7S__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG7S__Err_clr_MASK                                                             0x80000000L +//VCN_UE_ERR_STATUS_LO_JPEG7D +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Err_Status_Valid_Flag__SHIFT                                             0x0 +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Address_Valid_Flag__SHIFT                                                0x1 +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Address__SHIFT                                                           0x2 +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Memory_id__SHIFT                                                         0x18 +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Err_Status_Valid_Flag_MASK                                               0x00000001L +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Address_Valid_Flag_MASK                                                  0x00000002L +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Address_MASK                                                             0x00FFFFFCL +#define VCN_UE_ERR_STATUS_LO_JPEG7D__Memory_id_MASK                                                           0xFF000000L +//VCN_UE_ERR_STATUS_HI_JPEG7D +#define VCN_UE_ERR_STATUS_HI_JPEG7D__ECC__SHIFT                                                               0x0 +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Parity__SHIFT                                                            0x1 +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_Info_Valid_Flag__SHIFT                                               0x2 +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_Info__SHIFT                                                          0x3 +#define VCN_UE_ERR_STATUS_HI_JPEG7D__UE_Cnt__SHIFT                                                            0x17 +#define VCN_UE_ERR_STATUS_HI_JPEG7D__FED_Cnt__SHIFT                                                           0x1a +#define VCN_UE_ERR_STATUS_HI_JPEG7D__RESERVED__SHIFT                                                          0x1d +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_clr__SHIFT                                                           0x1f +#define VCN_UE_ERR_STATUS_HI_JPEG7D__ECC_MASK                                                                 0x00000001L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Parity_MASK                                                              0x00000002L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_Info_Valid_Flag_MASK                                                 0x00000004L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_Info_MASK                                                            0x007FFFF8L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__UE_Cnt_MASK                                                              0x03800000L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__FED_Cnt_MASK                                                             0x1C000000L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__RESERVED_MASK                                                            0x60000000L +#define VCN_UE_ERR_STATUS_HI_JPEG7D__Err_clr_MASK                                                             0x80000000L + +// addressBlock: aid_uvd0_uvd_jrbc0_uvd_jrbc_dec +//UVD_JRBC0_UVD_JRBC_RB_WPTR +#define UVD_JRBC0_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC0_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC0_UVD_JRBC_RB_CNTL +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC0_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC0_UVD_JRBC_IB_SIZE +#define UVD_JRBC0_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC0_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC0_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC0_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC0_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC0_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC0_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC0_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC0_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC0_UVD_JRBC_SOFT_RESET +#define UVD_JRBC0_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC0_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC0_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC0_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC0_UVD_JRBC_STATUS +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC0_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC0_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC0_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC0_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC0_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC0_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC0_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC0_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC0_UVD_JRBC_RB_RPTR +#define UVD_JRBC0_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC0_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC0_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC0_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC0_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC0_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC0_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC0_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC0_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC0_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC0_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC0_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC0_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC0_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC0_UVD_JRBC_RB_SIZE +#define UVD_JRBC0_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC0_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC0_UVD_JRBC_SCRATCH0 +#define UVD_JRBC0_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC0_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jmi0_uvd_jmi_dec +//UVD_JMI0_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI0_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI0_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI0_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI0_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI0_UVD_LMI_JRBC_CTRL +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI0_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI0_UVD_LMI_JPEG_CTRL +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI0_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI0_JPEG_LMI_DROP +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI0_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI0_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI0_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI0_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI0_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI0_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI0_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI0_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI0_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI0_UVD_LMI_JPEG_VMID +#define UVD_JMI0_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI0_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI0_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI0_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI0_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI0_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI0_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI0_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI0_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI0_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI0_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI0_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI0_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI0_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI0_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI0_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI0_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI0_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi_common_dec +//UVD_JADP_MCIF_URGENT_CTRL +#define UVD_JADP_MCIF_URGENT_CTRL__WR_WATERMARK__SHIFT                                                        0x0 +#define UVD_JADP_MCIF_URGENT_CTRL__RD_WATERMARK__SHIFT                                                        0x6 +#define UVD_JADP_MCIF_URGENT_CTRL__WR_RD_URGENT_TIMER__SHIFT                                                  0xb +#define UVD_JADP_MCIF_URGENT_CTRL__WR_URGENT_PROG_STEP__SHIFT                                                 0x11 +#define UVD_JADP_MCIF_URGENT_CTRL__RD_URGENT_PROG_STEP__SHIFT                                                 0x15 +#define UVD_JADP_MCIF_URGENT_CTRL__WR_QOS_EN__SHIFT                                                           0x19 +#define UVD_JADP_MCIF_URGENT_CTRL__RD_QOS_EN__SHIFT                                                           0x1a +#define UVD_JADP_MCIF_URGENT_CTRL__WR_WATERMARK_MASK                                                          0x0000003FL +#define UVD_JADP_MCIF_URGENT_CTRL__RD_WATERMARK_MASK                                                          0x000007C0L +#define UVD_JADP_MCIF_URGENT_CTRL__WR_RD_URGENT_TIMER_MASK                                                    0x0001F800L +#define UVD_JADP_MCIF_URGENT_CTRL__WR_URGENT_PROG_STEP_MASK                                                   0x001E0000L +#define UVD_JADP_MCIF_URGENT_CTRL__RD_URGENT_PROG_STEP_MASK                                                   0x01E00000L +#define UVD_JADP_MCIF_URGENT_CTRL__WR_QOS_EN_MASK                                                             0x02000000L +#define UVD_JADP_MCIF_URGENT_CTRL__RD_QOS_EN_MASK                                                             0x04000000L +//UVD_JMI_URGENT_CTRL +#define UVD_JMI_URGENT_CTRL__ENABLE_MC_RD_URGENT_STALL__SHIFT                                                 0x0 +#define UVD_JMI_URGENT_CTRL__ASSERT_MC_RD_URGENT__SHIFT                                                       0x4 +#define UVD_JMI_URGENT_CTRL__ENABLE_MC_WR_URGENT_STALL__SHIFT                                                 0x10 +#define UVD_JMI_URGENT_CTRL__ASSERT_MC_WR_URGENT__SHIFT                                                       0x14 +#define UVD_JMI_URGENT_CTRL__ENABLE_MC_RD_URGENT_STALL_MASK                                                   0x00000001L +#define UVD_JMI_URGENT_CTRL__ASSERT_MC_RD_URGENT_MASK                                                         0x000000F0L +#define UVD_JMI_URGENT_CTRL__ENABLE_MC_WR_URGENT_STALL_MASK                                                   0x00010000L +#define UVD_JMI_URGENT_CTRL__ASSERT_MC_WR_URGENT_MASK                                                         0x00F00000L +//UVD_JMI_CTRL +#define UVD_JMI_CTRL__STALL_MC_ARB__SHIFT                                                                     0x0 +#define UVD_JMI_CTRL__MASK_MC_URGENT__SHIFT                                                                   0x1 +#define UVD_JMI_CTRL__ASSERT_MC_URGENT__SHIFT                                                                 0x2 +#define UVD_JMI_CTRL__MC_RD_ARB_WAIT_TIMER__SHIFT                                                             0x8 +#define UVD_JMI_CTRL__MC_WR_ARB_WAIT_TIMER__SHIFT                                                             0x10 +#define UVD_JMI_CTRL__STALL_MC_ARB_MASK                                                                       0x00000001L +#define UVD_JMI_CTRL__MASK_MC_URGENT_MASK                                                                     0x00000002L +#define UVD_JMI_CTRL__ASSERT_MC_URGENT_MASK                                                                   0x00000004L +#define UVD_JMI_CTRL__MC_RD_ARB_WAIT_TIMER_MASK                                                               0x0000FF00L +#define UVD_JMI_CTRL__MC_WR_ARB_WAIT_TIMER_MASK                                                               0x00FF0000L +//JPEG_MEMCHECK_CLAMPING_CNTL +#define JPEG_MEMCHECK_CLAMPING_CNTL__CLAMP_TO_SAFE_ADDR_EN__SHIFT                                             0x0 +#define JPEG_MEMCHECK_CLAMPING_CNTL__CLAMP_TO_SAFE_ADDR_EN_MASK                                               0x00000001L +//JPEG_MEMCHECK_SAFE_ADDR +#define JPEG_MEMCHECK_SAFE_ADDR__MEMCHECK_SAFE_ADDR__SHIFT                                                    0x0 +#define JPEG_MEMCHECK_SAFE_ADDR__MEMCHECK_SAFE_ADDR_MASK                                                      0xFFFFFFFFL +//JPEG_MEMCHECK_SAFE_ADDR_64BIT +#define JPEG_MEMCHECK_SAFE_ADDR_64BIT__MEMCHECK_SAFE_ADDR_64BIT__SHIFT                                        0x0 +#define JPEG_MEMCHECK_SAFE_ADDR_64BIT__MEMCHECK_SAFE_ADDR_64BIT_MASK                                          0xFFFFFFFFL +//UVD_JMI_LAT_CTRL +#define UVD_JMI_LAT_CTRL__SCALE__SHIFT                                                                        0x0 +#define UVD_JMI_LAT_CTRL__MAX_START__SHIFT                                                                    0x8 +#define UVD_JMI_LAT_CTRL__MIN_START__SHIFT                                                                    0x9 +#define UVD_JMI_LAT_CTRL__AVG_START__SHIFT                                                                    0xa +#define UVD_JMI_LAT_CTRL__PERFMON_SYNC__SHIFT                                                                 0xb +#define UVD_JMI_LAT_CTRL__SKIP__SHIFT                                                                         0x10 +#define UVD_JMI_LAT_CTRL__SCALE_MASK                                                                          0x000000FFL +#define UVD_JMI_LAT_CTRL__MAX_START_MASK                                                                      0x00000100L +#define UVD_JMI_LAT_CTRL__MIN_START_MASK                                                                      0x00000200L +#define UVD_JMI_LAT_CTRL__AVG_START_MASK                                                                      0x00000400L +#define UVD_JMI_LAT_CTRL__PERFMON_SYNC_MASK                                                                   0x00000800L +#define UVD_JMI_LAT_CTRL__SKIP_MASK                                                                           0x000F0000L +//UVD_JMI_LAT_CNTR +#define UVD_JMI_LAT_CNTR__MAX_LAT__SHIFT                                                                      0x0 +#define UVD_JMI_LAT_CNTR__MIN_LAT__SHIFT                                                                      0x8 +#define UVD_JMI_LAT_CNTR__MAX_LAT_MASK                                                                        0x000000FFL +#define UVD_JMI_LAT_CNTR__MIN_LAT_MASK                                                                        0x0000FF00L +//UVD_JMI_AVG_LAT_CNTR +#define UVD_JMI_AVG_LAT_CNTR__ENV_LOW__SHIFT                                                                  0x0 +#define UVD_JMI_AVG_LAT_CNTR__ENV_HIGH__SHIFT                                                                 0x8 +#define UVD_JMI_AVG_LAT_CNTR__ENV_HIT__SHIFT                                                                  0x10 +#define UVD_JMI_AVG_LAT_CNTR__ENV_LOW_MASK                                                                    0x000000FFL +#define UVD_JMI_AVG_LAT_CNTR__ENV_HIGH_MASK                                                                   0x0000FF00L +#define UVD_JMI_AVG_LAT_CNTR__ENV_HIT_MASK                                                                    0xFFFF0000L +//UVD_JMI_PERFMON_CTRL +#define UVD_JMI_PERFMON_CTRL__PERFMON_STATE__SHIFT                                                            0x0 +#define UVD_JMI_PERFMON_CTRL__PERFMON_SEL__SHIFT                                                              0x8 +#define UVD_JMI_PERFMON_CTRL__PERFMON_STATE_MASK                                                              0x00000003L +#define UVD_JMI_PERFMON_CTRL__PERFMON_SEL_MASK                                                                0x00001F00L +//UVD_JMI_PERFMON_COUNT_LO +#define UVD_JMI_PERFMON_COUNT_LO__PERFMON_COUNT__SHIFT                                                        0x0 +#define UVD_JMI_PERFMON_COUNT_LO__PERFMON_COUNT_MASK                                                          0xFFFFFFFFL +//UVD_JMI_PERFMON_COUNT_HI +#define UVD_JMI_PERFMON_COUNT_HI__PERFMON_COUNT__SHIFT                                                        0x0 +#define UVD_JMI_PERFMON_COUNT_HI__PERFMON_COUNT_MASK                                                          0x0000FFFFL +//UVD_JMI_CLEAN_STATUS +#define UVD_JMI_CLEAN_STATUS__LMI_READ_CLEAN__SHIFT                                                           0x0 +#define UVD_JMI_CLEAN_STATUS__LMI_READ_CLEAN_RAW__SHIFT                                                       0x1 +#define UVD_JMI_CLEAN_STATUS__LMI_WRITE_CLEAN__SHIFT                                                          0x2 +#define UVD_JMI_CLEAN_STATUS__LMI_WRITE_CLEAN_RAW__SHIFT                                                      0x3 +#define UVD_JMI_CLEAN_STATUS__MC_WRITE_PENDING__SHIFT                                                         0x4 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE0_READ_CLEAN__SHIFT                                                   0x8 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE1_READ_CLEAN__SHIFT                                                   0x9 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE2_READ_CLEAN__SHIFT                                                   0xa +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE3_READ_CLEAN__SHIFT                                                   0xb +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE4_READ_CLEAN__SHIFT                                                   0xc +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE5_READ_CLEAN__SHIFT                                                   0xd +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE6_READ_CLEAN__SHIFT                                                   0xe +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE7_READ_CLEAN__SHIFT                                                   0xf +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE0_WRITE_CLEAN__SHIFT                                                  0x10 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE1_WRITE_CLEAN__SHIFT                                                  0x11 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE2_WRITE_CLEAN__SHIFT                                                  0x12 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE3_WRITE_CLEAN__SHIFT                                                  0x13 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE4_WRITE_CLEAN__SHIFT                                                  0x14 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE5_WRITE_CLEAN__SHIFT                                                  0x15 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE6_WRITE_CLEAN__SHIFT                                                  0x16 +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE7_WRITE_CLEAN__SHIFT                                                  0x17 +#define UVD_JMI_CLEAN_STATUS__LMI_READ_CLEAN_MASK                                                             0x00000001L +#define UVD_JMI_CLEAN_STATUS__LMI_READ_CLEAN_RAW_MASK                                                         0x00000002L +#define UVD_JMI_CLEAN_STATUS__LMI_WRITE_CLEAN_MASK                                                            0x00000004L +#define UVD_JMI_CLEAN_STATUS__LMI_WRITE_CLEAN_RAW_MASK                                                        0x00000008L +#define UVD_JMI_CLEAN_STATUS__MC_WRITE_PENDING_MASK                                                           0x00000010L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE0_READ_CLEAN_MASK                                                     0x00000100L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE1_READ_CLEAN_MASK                                                     0x00000200L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE2_READ_CLEAN_MASK                                                     0x00000400L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE3_READ_CLEAN_MASK                                                     0x00000800L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE4_READ_CLEAN_MASK                                                     0x00001000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE5_READ_CLEAN_MASK                                                     0x00002000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE6_READ_CLEAN_MASK                                                     0x00004000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE7_READ_CLEAN_MASK                                                     0x00008000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE0_WRITE_CLEAN_MASK                                                    0x00010000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE1_WRITE_CLEAN_MASK                                                    0x00020000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE2_WRITE_CLEAN_MASK                                                    0x00040000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE3_WRITE_CLEAN_MASK                                                    0x00080000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE4_WRITE_CLEAN_MASK                                                    0x00100000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE5_WRITE_CLEAN_MASK                                                    0x00200000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE6_WRITE_CLEAN_MASK                                                    0x00400000L +#define UVD_JMI_CLEAN_STATUS__DJPEG_CORE7_WRITE_CLEAN_MASK                                                    0x00800000L +//UVD_JMI_CNTL +#define UVD_JMI_CNTL__SOFT_RESET__SHIFT                                                                       0x0 +#define UVD_JMI_CNTL__MC_RD_REQ_RET_MAX__SHIFT                                                                0x8 +#define UVD_JMI_CNTL__SOFT_RESET_MASK                                                                         0x00000001L +#define UVD_JMI_CNTL__MC_RD_REQ_RET_MAX_MASK                                                                  0x0003FF00L + + +// addressBlock: aid_uvd0_uvd_jpeg_common_dec +//JPEG_SOFT_RESET_STATUS +#define JPEG_SOFT_RESET_STATUS__JPEG0_DEC_RESET_STATUS__SHIFT                                                 0x0 +#define JPEG_SOFT_RESET_STATUS__JPEG1_DEC_RESET_STATUS__SHIFT                                                 0x1 +#define JPEG_SOFT_RESET_STATUS__JPEG2_DEC_RESET_STATUS__SHIFT                                                 0x2 +#define JPEG_SOFT_RESET_STATUS__JPEG3_DEC_RESET_STATUS__SHIFT                                                 0x3 +#define JPEG_SOFT_RESET_STATUS__JPEG4_DEC_RESET_STATUS__SHIFT                                                 0x4 +#define JPEG_SOFT_RESET_STATUS__JPEG5_DEC_RESET_STATUS__SHIFT                                                 0x5 +#define JPEG_SOFT_RESET_STATUS__JPEG6_DEC_RESET_STATUS__SHIFT                                                 0x6 +#define JPEG_SOFT_RESET_STATUS__JPEG7_DEC_RESET_STATUS__SHIFT                                                 0x7 +#define JPEG_SOFT_RESET_STATUS__DJRBC0_RESET_STATUS__SHIFT                                                    0x8 +#define JPEG_SOFT_RESET_STATUS__DJRBC1_RESET_STATUS__SHIFT                                                    0x9 +#define JPEG_SOFT_RESET_STATUS__DJRBC2_RESET_STATUS__SHIFT                                                    0xa +#define JPEG_SOFT_RESET_STATUS__DJRBC3_RESET_STATUS__SHIFT                                                    0xb +#define JPEG_SOFT_RESET_STATUS__DJRBC4_RESET_STATUS__SHIFT                                                    0xc +#define JPEG_SOFT_RESET_STATUS__DJRBC5_RESET_STATUS__SHIFT                                                    0xd +#define JPEG_SOFT_RESET_STATUS__DJRBC6_RESET_STATUS__SHIFT                                                    0xe +#define JPEG_SOFT_RESET_STATUS__DJRBC7_RESET_STATUS__SHIFT                                                    0xf +#define JPEG_SOFT_RESET_STATUS__JPEG_ENC_RESET_STATUS__SHIFT                                                  0x11 +#define JPEG_SOFT_RESET_STATUS__EJRBC_RESET_STATUS__SHIFT                                                     0x12 +#define JPEG_SOFT_RESET_STATUS__JMCIF_RESET_STATUS__SHIFT                                                     0x18 +#define JPEG_SOFT_RESET_STATUS__JPEG0_DEC_RESET_STATUS_MASK                                                   0x00000001L +#define JPEG_SOFT_RESET_STATUS__JPEG1_DEC_RESET_STATUS_MASK                                                   0x00000002L +#define JPEG_SOFT_RESET_STATUS__JPEG2_DEC_RESET_STATUS_MASK                                                   0x00000004L +#define JPEG_SOFT_RESET_STATUS__JPEG3_DEC_RESET_STATUS_MASK                                                   0x00000008L +#define JPEG_SOFT_RESET_STATUS__JPEG4_DEC_RESET_STATUS_MASK                                                   0x00000010L +#define JPEG_SOFT_RESET_STATUS__JPEG5_DEC_RESET_STATUS_MASK                                                   0x00000020L +#define JPEG_SOFT_RESET_STATUS__JPEG6_DEC_RESET_STATUS_MASK                                                   0x00000040L +#define JPEG_SOFT_RESET_STATUS__JPEG7_DEC_RESET_STATUS_MASK                                                   0x00000080L +#define JPEG_SOFT_RESET_STATUS__DJRBC0_RESET_STATUS_MASK                                                      0x00000100L +#define JPEG_SOFT_RESET_STATUS__DJRBC1_RESET_STATUS_MASK                                                      0x00000200L +#define JPEG_SOFT_RESET_STATUS__DJRBC2_RESET_STATUS_MASK                                                      0x00000400L +#define JPEG_SOFT_RESET_STATUS__DJRBC3_RESET_STATUS_MASK                                                      0x00000800L +#define JPEG_SOFT_RESET_STATUS__DJRBC4_RESET_STATUS_MASK                                                      0x00001000L +#define JPEG_SOFT_RESET_STATUS__DJRBC5_RESET_STATUS_MASK                                                      0x00002000L +#define JPEG_SOFT_RESET_STATUS__DJRBC6_RESET_STATUS_MASK                                                      0x00004000L +#define JPEG_SOFT_RESET_STATUS__DJRBC7_RESET_STATUS_MASK                                                      0x00008000L +#define JPEG_SOFT_RESET_STATUS__JPEG_ENC_RESET_STATUS_MASK                                                    0x00020000L +#define JPEG_SOFT_RESET_STATUS__EJRBC_RESET_STATUS_MASK                                                       0x00040000L +#define JPEG_SOFT_RESET_STATUS__JMCIF_RESET_STATUS_MASK                                                       0x01000000L +//JPEG_SYS_INT_EN +#define JPEG_SYS_INT_EN__DJPEG0_CORE__SHIFT                                                                   0x0 +#define JPEG_SYS_INT_EN__DJPEG1_CORE__SHIFT                                                                   0x1 +#define JPEG_SYS_INT_EN__DJPEG2_CORE__SHIFT                                                                   0x2 +#define JPEG_SYS_INT_EN__DJPEG3_CORE__SHIFT                                                                   0x3 +#define JPEG_SYS_INT_EN__DJPEG4_CORE__SHIFT                                                                   0x4 +#define JPEG_SYS_INT_EN__DJPEG5_CORE__SHIFT                                                                   0x5 +#define JPEG_SYS_INT_EN__DJPEG6_CORE__SHIFT                                                                   0x6 +#define JPEG_SYS_INT_EN__DJPEG7_CORE__SHIFT                                                                   0x7 +#define JPEG_SYS_INT_EN__DJRBC0__SHIFT                                                                        0x8 +#define JPEG_SYS_INT_EN__DJRBC1__SHIFT                                                                        0x9 +#define JPEG_SYS_INT_EN__DJRBC2__SHIFT                                                                        0xa +#define JPEG_SYS_INT_EN__DJRBC3__SHIFT                                                                        0xb +#define JPEG_SYS_INT_EN__DJRBC4__SHIFT                                                                        0xc +#define JPEG_SYS_INT_EN__DJRBC5__SHIFT                                                                        0xd +#define JPEG_SYS_INT_EN__DJRBC6__SHIFT                                                                        0xe +#define JPEG_SYS_INT_EN__DJRBC7__SHIFT                                                                        0xf +#define JPEG_SYS_INT_EN__DJPEG0_PF_RPT__SHIFT                                                                 0x10 +#define JPEG_SYS_INT_EN__DJPEG1_PF_RPT__SHIFT                                                                 0x11 +#define JPEG_SYS_INT_EN__DJPEG2_PF_RPT__SHIFT                                                                 0x12 +#define JPEG_SYS_INT_EN__DJPEG3_PF_RPT__SHIFT                                                                 0x13 +#define JPEG_SYS_INT_EN__DJPEG4_PF_RPT__SHIFT                                                                 0x14 +#define JPEG_SYS_INT_EN__DJPEG5_PF_RPT__SHIFT                                                                 0x15 +#define JPEG_SYS_INT_EN__DJPEG6_PF_RPT__SHIFT                                                                 0x16 +#define JPEG_SYS_INT_EN__DJPEG7_PF_RPT__SHIFT                                                                 0x17 +#define JPEG_SYS_INT_EN__DJPEG0_RAS_CNTL__SHIFT                                                               0x18 +#define JPEG_SYS_INT_EN__DJPEG1_RAS_CNTL__SHIFT                                                               0x19 +#define JPEG_SYS_INT_EN__DJPEG0_CORE_MASK                                                                     0x00000001L +#define JPEG_SYS_INT_EN__DJPEG1_CORE_MASK                                                                     0x00000002L +#define JPEG_SYS_INT_EN__DJPEG2_CORE_MASK                                                                     0x00000004L +#define JPEG_SYS_INT_EN__DJPEG3_CORE_MASK                                                                     0x00000008L +#define JPEG_SYS_INT_EN__DJPEG4_CORE_MASK                                                                     0x00000010L +#define JPEG_SYS_INT_EN__DJPEG5_CORE_MASK                                                                     0x00000020L +#define JPEG_SYS_INT_EN__DJPEG6_CORE_MASK                                                                     0x00000040L +#define JPEG_SYS_INT_EN__DJPEG7_CORE_MASK                                                                     0x00000080L +#define JPEG_SYS_INT_EN__DJRBC0_MASK                                                                          0x00000100L +#define JPEG_SYS_INT_EN__DJRBC1_MASK                                                                          0x00000200L +#define JPEG_SYS_INT_EN__DJRBC2_MASK                                                                          0x00000400L +#define JPEG_SYS_INT_EN__DJRBC3_MASK                                                                          0x00000800L +#define JPEG_SYS_INT_EN__DJRBC4_MASK                                                                          0x00001000L +#define JPEG_SYS_INT_EN__DJRBC5_MASK                                                                          0x00002000L +#define JPEG_SYS_INT_EN__DJRBC6_MASK                                                                          0x00004000L +#define JPEG_SYS_INT_EN__DJRBC7_MASK                                                                          0x00008000L +#define JPEG_SYS_INT_EN__DJPEG0_PF_RPT_MASK                                                                   0x00010000L +#define JPEG_SYS_INT_EN__DJPEG1_PF_RPT_MASK                                                                   0x00020000L +#define JPEG_SYS_INT_EN__DJPEG2_PF_RPT_MASK                                                                   0x00040000L +#define JPEG_SYS_INT_EN__DJPEG3_PF_RPT_MASK                                                                   0x00080000L +#define JPEG_SYS_INT_EN__DJPEG4_PF_RPT_MASK                                                                   0x00100000L +#define JPEG_SYS_INT_EN__DJPEG5_PF_RPT_MASK                                                                   0x00200000L +#define JPEG_SYS_INT_EN__DJPEG6_PF_RPT_MASK                                                                   0x00400000L +#define JPEG_SYS_INT_EN__DJPEG7_PF_RPT_MASK                                                                   0x00800000L +#define JPEG_SYS_INT_EN__DJPEG0_RAS_CNTL_MASK                                                                 0x01000000L +#define JPEG_SYS_INT_EN__DJPEG1_RAS_CNTL_MASK                                                                 0x02000000L +//JPEG_SYS_INT_EN1 +#define JPEG_SYS_INT_EN1__EJPEG_PF_RPT__SHIFT                                                                 0x0 +#define JPEG_SYS_INT_EN1__EJPEG_CORE__SHIFT                                                                   0x1 +#define JPEG_SYS_INT_EN1__EJRBC__SHIFT                                                                        0x2 +#define JPEG_SYS_INT_EN1__EJPEG_RAS_CNTL__SHIFT                                                               0x3 +#define JPEG_SYS_INT_EN1__EJPEG_PF_RPT_MASK                                                                   0x00000001L +#define JPEG_SYS_INT_EN1__EJPEG_CORE_MASK                                                                     0x00000002L +#define JPEG_SYS_INT_EN1__EJRBC_MASK                                                                          0x00000004L +#define JPEG_SYS_INT_EN1__EJPEG_RAS_CNTL_MASK                                                                 0x00000008L +//JPEG_SYS_INT_STATUS +#define JPEG_SYS_INT_STATUS__DJPEG0_CORE__SHIFT                                                               0x0 +#define JPEG_SYS_INT_STATUS__DJPEG1_CORE__SHIFT                                                               0x1 +#define JPEG_SYS_INT_STATUS__DJPEG2_CORE__SHIFT                                                               0x2 +#define JPEG_SYS_INT_STATUS__DJPEG3_CORE__SHIFT                                                               0x3 +#define JPEG_SYS_INT_STATUS__DJPEG4_CORE__SHIFT                                                               0x4 +#define JPEG_SYS_INT_STATUS__DJPEG5_CORE__SHIFT                                                               0x5 +#define JPEG_SYS_INT_STATUS__DJPEG6_CORE__SHIFT                                                               0x6 +#define JPEG_SYS_INT_STATUS__DJPEG7_CORE__SHIFT                                                               0x7 +#define JPEG_SYS_INT_STATUS__DJRBC0__SHIFT                                                                    0x8 +#define JPEG_SYS_INT_STATUS__DJRBC1__SHIFT                                                                    0x9 +#define JPEG_SYS_INT_STATUS__DJRBC2__SHIFT                                                                    0xa +#define JPEG_SYS_INT_STATUS__DJRBC3__SHIFT                                                                    0xb +#define JPEG_SYS_INT_STATUS__DJRBC4__SHIFT                                                                    0xc +#define JPEG_SYS_INT_STATUS__DJRBC5__SHIFT                                                                    0xd +#define JPEG_SYS_INT_STATUS__DJRBC6__SHIFT                                                                    0xe +#define JPEG_SYS_INT_STATUS__DJRBC7__SHIFT                                                                    0xf +#define JPEG_SYS_INT_STATUS__DJPEG0_PF_RPT__SHIFT                                                             0x10 +#define JPEG_SYS_INT_STATUS__DJPEG1_PF_RPT__SHIFT                                                             0x11 +#define JPEG_SYS_INT_STATUS__DJPEG2_PF_RPT__SHIFT                                                             0x12 +#define JPEG_SYS_INT_STATUS__DJPEG3_PF_RPT__SHIFT                                                             0x13 +#define JPEG_SYS_INT_STATUS__DJPEG4_PF_RPT__SHIFT                                                             0x14 +#define JPEG_SYS_INT_STATUS__DJPEG5_PF_RPT__SHIFT                                                             0x15 +#define JPEG_SYS_INT_STATUS__DJPEG6_PF_RPT__SHIFT                                                             0x16 +#define JPEG_SYS_INT_STATUS__DJPEG7_PF_RPT__SHIFT                                                             0x17 +#define JPEG_SYS_INT_STATUS__DJPEG0_RAS_CNTL__SHIFT                                                           0x18 +#define JPEG_SYS_INT_STATUS__DJPEG1_RAS_CNTL__SHIFT                                                           0x19 +#define JPEG_SYS_INT_STATUS__DJPEG0_CORE_MASK                                                                 0x00000001L +#define JPEG_SYS_INT_STATUS__DJPEG1_CORE_MASK                                                                 0x00000002L +#define JPEG_SYS_INT_STATUS__DJPEG2_CORE_MASK                                                                 0x00000004L +#define JPEG_SYS_INT_STATUS__DJPEG3_CORE_MASK                                                                 0x00000008L +#define JPEG_SYS_INT_STATUS__DJPEG4_CORE_MASK                                                                 0x00000010L +#define JPEG_SYS_INT_STATUS__DJPEG5_CORE_MASK                                                                 0x00000020L +#define JPEG_SYS_INT_STATUS__DJPEG6_CORE_MASK                                                                 0x00000040L +#define JPEG_SYS_INT_STATUS__DJPEG7_CORE_MASK                                                                 0x00000080L +#define JPEG_SYS_INT_STATUS__DJRBC0_MASK                                                                      0x00000100L +#define JPEG_SYS_INT_STATUS__DJRBC1_MASK                                                                      0x00000200L +#define JPEG_SYS_INT_STATUS__DJRBC2_MASK                                                                      0x00000400L +#define JPEG_SYS_INT_STATUS__DJRBC3_MASK                                                                      0x00000800L +#define JPEG_SYS_INT_STATUS__DJRBC4_MASK                                                                      0x00001000L +#define JPEG_SYS_INT_STATUS__DJRBC5_MASK                                                                      0x00002000L +#define JPEG_SYS_INT_STATUS__DJRBC6_MASK                                                                      0x00004000L +#define JPEG_SYS_INT_STATUS__DJRBC7_MASK                                                                      0x00008000L +#define JPEG_SYS_INT_STATUS__DJPEG0_PF_RPT_MASK                                                               0x00010000L +#define JPEG_SYS_INT_STATUS__DJPEG1_PF_RPT_MASK                                                               0x00020000L +#define JPEG_SYS_INT_STATUS__DJPEG2_PF_RPT_MASK                                                               0x00040000L +#define JPEG_SYS_INT_STATUS__DJPEG3_PF_RPT_MASK                                                               0x00080000L +#define JPEG_SYS_INT_STATUS__DJPEG4_PF_RPT_MASK                                                               0x00100000L +#define JPEG_SYS_INT_STATUS__DJPEG5_PF_RPT_MASK                                                               0x00200000L +#define JPEG_SYS_INT_STATUS__DJPEG6_PF_RPT_MASK                                                               0x00400000L +#define JPEG_SYS_INT_STATUS__DJPEG7_PF_RPT_MASK                                                               0x00800000L +#define JPEG_SYS_INT_STATUS__DJPEG0_RAS_CNTL_MASK                                                             0x01000000L +#define JPEG_SYS_INT_STATUS__DJPEG1_RAS_CNTL_MASK                                                             0x02000000L +//JPEG_SYS_INT_STATUS1 +#define JPEG_SYS_INT_STATUS1__EJPEG_PF_RPT__SHIFT                                                             0x0 +#define JPEG_SYS_INT_STATUS1__EJPEG_CORE__SHIFT                                                               0x1 +#define JPEG_SYS_INT_STATUS1__EJRBC__SHIFT                                                                    0x2 +#define JPEG_SYS_INT_STATUS1__EJPEG_RAS_CNTL__SHIFT                                                           0x3 +#define JPEG_SYS_INT_STATUS1__EJPEG_PF_RPT_MASK                                                               0x00000001L +#define JPEG_SYS_INT_STATUS1__EJPEG_CORE_MASK                                                                 0x00000002L +#define JPEG_SYS_INT_STATUS1__EJRBC_MASK                                                                      0x00000004L +#define JPEG_SYS_INT_STATUS1__EJPEG_RAS_CNTL_MASK                                                             0x00000008L +//JPEG_SYS_INT_ACK +#define JPEG_SYS_INT_ACK__DJPEG0_CORE__SHIFT                                                                  0x0 +#define JPEG_SYS_INT_ACK__DJPEG1_CORE__SHIFT                                                                  0x1 +#define JPEG_SYS_INT_ACK__DJPEG2_CORE__SHIFT                                                                  0x2 +#define JPEG_SYS_INT_ACK__DJPEG3_CORE__SHIFT                                                                  0x3 +#define JPEG_SYS_INT_ACK__DJPEG4_CORE__SHIFT                                                                  0x4 +#define JPEG_SYS_INT_ACK__DJPEG5_CORE__SHIFT                                                                  0x5 +#define JPEG_SYS_INT_ACK__DJPEG6_CORE__SHIFT                                                                  0x6 +#define JPEG_SYS_INT_ACK__DJPEG7_CORE__SHIFT                                                                  0x7 +#define JPEG_SYS_INT_ACK__DJRBC0__SHIFT                                                                       0x8 +#define JPEG_SYS_INT_ACK__DJRBC1__SHIFT                                                                       0x9 +#define JPEG_SYS_INT_ACK__DJRBC2__SHIFT                                                                       0xa +#define JPEG_SYS_INT_ACK__DJRBC3__SHIFT                                                                       0xb +#define JPEG_SYS_INT_ACK__DJRBC4__SHIFT                                                                       0xc +#define JPEG_SYS_INT_ACK__DJRBC5__SHIFT                                                                       0xd +#define JPEG_SYS_INT_ACK__DJRBC6__SHIFT                                                                       0xe +#define JPEG_SYS_INT_ACK__DJRBC7__SHIFT                                                                       0xf +#define JPEG_SYS_INT_ACK__DJPEG0_PF_RPT__SHIFT                                                                0x10 +#define JPEG_SYS_INT_ACK__DJPEG1_PF_RPT__SHIFT                                                                0x11 +#define JPEG_SYS_INT_ACK__DJPEG2_PF_RPT__SHIFT                                                                0x12 +#define JPEG_SYS_INT_ACK__DJPEG3_PF_RPT__SHIFT                                                                0x13 +#define JPEG_SYS_INT_ACK__DJPEG4_PF_RPT__SHIFT                                                                0x14 +#define JPEG_SYS_INT_ACK__DJPEG5_PF_RPT__SHIFT                                                                0x15 +#define JPEG_SYS_INT_ACK__DJPEG6_PF_RPT__SHIFT                                                                0x16 +#define JPEG_SYS_INT_ACK__DJPEG7_PF_RPT__SHIFT                                                                0x17 +#define JPEG_SYS_INT_ACK__DJPEG0_RAS_CNTL__SHIFT                                                              0x18 +#define JPEG_SYS_INT_ACK__DJPEG1_RAS_CNTL__SHIFT                                                              0x19 +#define JPEG_SYS_INT_ACK__DJPEG0_CORE_MASK                                                                    0x00000001L +#define JPEG_SYS_INT_ACK__DJPEG1_CORE_MASK                                                                    0x00000002L +#define JPEG_SYS_INT_ACK__DJPEG2_CORE_MASK                                                                    0x00000004L +#define JPEG_SYS_INT_ACK__DJPEG3_CORE_MASK                                                                    0x00000008L +#define JPEG_SYS_INT_ACK__DJPEG4_CORE_MASK                                                                    0x00000010L +#define JPEG_SYS_INT_ACK__DJPEG5_CORE_MASK                                                                    0x00000020L +#define JPEG_SYS_INT_ACK__DJPEG6_CORE_MASK                                                                    0x00000040L +#define JPEG_SYS_INT_ACK__DJPEG7_CORE_MASK                                                                    0x00000080L +#define JPEG_SYS_INT_ACK__DJRBC0_MASK                                                                         0x00000100L +#define JPEG_SYS_INT_ACK__DJRBC1_MASK                                                                         0x00000200L +#define JPEG_SYS_INT_ACK__DJRBC2_MASK                                                                         0x00000400L +#define JPEG_SYS_INT_ACK__DJRBC3_MASK                                                                         0x00000800L +#define JPEG_SYS_INT_ACK__DJRBC4_MASK                                                                         0x00001000L +#define JPEG_SYS_INT_ACK__DJRBC5_MASK                                                                         0x00002000L +#define JPEG_SYS_INT_ACK__DJRBC6_MASK                                                                         0x00004000L +#define JPEG_SYS_INT_ACK__DJRBC7_MASK                                                                         0x00008000L +#define JPEG_SYS_INT_ACK__DJPEG0_PF_RPT_MASK                                                                  0x00010000L +#define JPEG_SYS_INT_ACK__DJPEG1_PF_RPT_MASK                                                                  0x00020000L +#define JPEG_SYS_INT_ACK__DJPEG2_PF_RPT_MASK                                                                  0x00040000L +#define JPEG_SYS_INT_ACK__DJPEG3_PF_RPT_MASK                                                                  0x00080000L +#define JPEG_SYS_INT_ACK__DJPEG4_PF_RPT_MASK                                                                  0x00100000L +#define JPEG_SYS_INT_ACK__DJPEG5_PF_RPT_MASK                                                                  0x00200000L +#define JPEG_SYS_INT_ACK__DJPEG6_PF_RPT_MASK                                                                  0x00400000L +#define JPEG_SYS_INT_ACK__DJPEG7_PF_RPT_MASK                                                                  0x00800000L +#define JPEG_SYS_INT_ACK__DJPEG0_RAS_CNTL_MASK                                                                0x01000000L +#define JPEG_SYS_INT_ACK__DJPEG1_RAS_CNTL_MASK                                                                0x02000000L +//JPEG_SYS_INT_ACK1 +#define JPEG_SYS_INT_ACK1__EJPEG_PF_RPT__SHIFT                                                                0x0 +#define JPEG_SYS_INT_ACK1__EJPEG_CORE__SHIFT                                                                  0x1 +#define JPEG_SYS_INT_ACK1__EJRBC__SHIFT                                                                       0x2 +#define JPEG_SYS_INT_ACK1__EJPEG_RAS_CNTL__SHIFT                                                              0x3 +#define JPEG_SYS_INT_ACK1__EJPEG_PF_RPT_MASK                                                                  0x00000001L +#define JPEG_SYS_INT_ACK1__EJPEG_CORE_MASK                                                                    0x00000002L +#define JPEG_SYS_INT_ACK1__EJRBC_MASK                                                                         0x00000004L +#define JPEG_SYS_INT_ACK1__EJPEG_RAS_CNTL_MASK                                                                0x00000008L +//JPEG_MEMCHECK_SYS_INT_EN +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC0_RD_ERR_EN__SHIFT                                                     0x0 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC1_RD_ERR_EN__SHIFT                                                     0x1 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC2_RD_ERR_EN__SHIFT                                                     0x2 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC3_RD_ERR_EN__SHIFT                                                     0x3 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC4_RD_ERR_EN__SHIFT                                                     0x4 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC5_RD_ERR_EN__SHIFT                                                     0x5 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC6_RD_ERR_EN__SHIFT                                                     0x6 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC7_RD_ERR_EN__SHIFT                                                     0x7 +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH0_RD_ERR_EN__SHIFT                                                   0x8 +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH1_RD_ERR_EN__SHIFT                                                   0x9 +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH2_RD_ERR_EN__SHIFT                                                   0xa +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH3_RD_ERR_EN__SHIFT                                                   0xb +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH4_RD_ERR_EN__SHIFT                                                   0xc +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH5_RD_ERR_EN__SHIFT                                                   0xd +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH6_RD_ERR_EN__SHIFT                                                   0xe +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH7_RD_ERR_EN__SHIFT                                                   0xf +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC0_WR_ERR_EN__SHIFT                                                     0x10 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC1_WR_ERR_EN__SHIFT                                                     0x11 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC2_WR_ERR_EN__SHIFT                                                     0x12 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC3_WR_ERR_EN__SHIFT                                                     0x13 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC4_WR_ERR_EN__SHIFT                                                     0x14 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC5_WR_ERR_EN__SHIFT                                                     0x15 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC6_WR_ERR_EN__SHIFT                                                     0x16 +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC7_WR_ERR_EN__SHIFT                                                     0x17 +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF0_WR_ERR_EN__SHIFT                                                      0x18 +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF1_WR_ERR_EN__SHIFT                                                      0x19 +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF2_WR_ERR_EN__SHIFT                                                      0x1a +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF3_WR_ERR_EN__SHIFT                                                      0x1b +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF4_WR_ERR_EN__SHIFT                                                      0x1c +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF5_WR_ERR_EN__SHIFT                                                      0x1d +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF6_WR_ERR_EN__SHIFT                                                      0x1e +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF7_WR_ERR_EN__SHIFT                                                      0x1f +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC0_RD_ERR_EN_MASK                                                       0x00000001L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC1_RD_ERR_EN_MASK                                                       0x00000002L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC2_RD_ERR_EN_MASK                                                       0x00000004L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC3_RD_ERR_EN_MASK                                                       0x00000008L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC4_RD_ERR_EN_MASK                                                       0x00000010L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC5_RD_ERR_EN_MASK                                                       0x00000020L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC6_RD_ERR_EN_MASK                                                       0x00000040L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC7_RD_ERR_EN_MASK                                                       0x00000080L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH0_RD_ERR_EN_MASK                                                     0x00000100L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH1_RD_ERR_EN_MASK                                                     0x00000200L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH2_RD_ERR_EN_MASK                                                     0x00000400L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH3_RD_ERR_EN_MASK                                                     0x00000800L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH4_RD_ERR_EN_MASK                                                     0x00001000L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH5_RD_ERR_EN_MASK                                                     0x00002000L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH6_RD_ERR_EN_MASK                                                     0x00004000L +#define JPEG_MEMCHECK_SYS_INT_EN__BSFETCH7_RD_ERR_EN_MASK                                                     0x00008000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC0_WR_ERR_EN_MASK                                                       0x00010000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC1_WR_ERR_EN_MASK                                                       0x00020000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC2_WR_ERR_EN_MASK                                                       0x00040000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC3_WR_ERR_EN_MASK                                                       0x00080000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC4_WR_ERR_EN_MASK                                                       0x00100000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC5_WR_ERR_EN_MASK                                                       0x00200000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC6_WR_ERR_EN_MASK                                                       0x00400000L +#define JPEG_MEMCHECK_SYS_INT_EN__DJRBC7_WR_ERR_EN_MASK                                                       0x00800000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF0_WR_ERR_EN_MASK                                                        0x01000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF1_WR_ERR_EN_MASK                                                        0x02000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF2_WR_ERR_EN_MASK                                                        0x04000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF3_WR_ERR_EN_MASK                                                        0x08000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF4_WR_ERR_EN_MASK                                                        0x10000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF5_WR_ERR_EN_MASK                                                        0x20000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF6_WR_ERR_EN_MASK                                                        0x40000000L +#define JPEG_MEMCHECK_SYS_INT_EN__OBUF7_WR_ERR_EN_MASK                                                        0x80000000L +//JPEG_MEMCHECK_SYS_INT_EN1 +#define JPEG_MEMCHECK_SYS_INT_EN1__EJRBC_RD_ERR_EN__SHIFT                                                     0x0 +#define JPEG_MEMCHECK_SYS_INT_EN1__PELFETCH_RD_ERR_EN__SHIFT                                                  0x1 +#define JPEG_MEMCHECK_SYS_INT_EN1__SCALAR_RD_ERR_EN__SHIFT                                                    0x2 +#define JPEG_MEMCHECK_SYS_INT_EN1__EJRBC_WR_ERR_EN__SHIFT                                                     0x3 +#define JPEG_MEMCHECK_SYS_INT_EN1__BS_WR_ERR_EN__SHIFT                                                        0x4 +#define JPEG_MEMCHECK_SYS_INT_EN1__SCALAR_WR_ERR_EN__SHIFT                                                    0x5 +#define JPEG_MEMCHECK_SYS_INT_EN1__EJRBC_RD_ERR_EN_MASK                                                       0x00000001L +#define JPEG_MEMCHECK_SYS_INT_EN1__PELFETCH_RD_ERR_EN_MASK                                                    0x00000002L +#define JPEG_MEMCHECK_SYS_INT_EN1__SCALAR_RD_ERR_EN_MASK                                                      0x00000004L +#define JPEG_MEMCHECK_SYS_INT_EN1__EJRBC_WR_ERR_EN_MASK                                                       0x00000008L +#define JPEG_MEMCHECK_SYS_INT_EN1__BS_WR_ERR_EN_MASK                                                          0x00000010L +#define JPEG_MEMCHECK_SYS_INT_EN1__SCALAR_WR_ERR_EN_MASK                                                      0x00000020L +//JPEG_MEMCHECK_SYS_INT_STAT +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH0_RD_HI_ERR__SHIFT                                                 0x0 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH1_RD_HI_ERR__SHIFT                                                 0x1 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH2_RD_HI_ERR__SHIFT                                                 0x2 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH3_RD_HI_ERR__SHIFT                                                 0x3 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH4_RD_HI_ERR__SHIFT                                                 0x4 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH5_RD_HI_ERR__SHIFT                                                 0x5 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH6_RD_HI_ERR__SHIFT                                                 0x6 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH7_RD_HI_ERR__SHIFT                                                 0x7 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH0_RD_LO_ERR__SHIFT                                                 0x8 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH1_RD_LO_ERR__SHIFT                                                 0x9 +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH2_RD_LO_ERR__SHIFT                                                 0xa +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH3_RD_LO_ERR__SHIFT                                                 0xb +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH4_RD_LO_ERR__SHIFT                                                 0xc +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH5_RD_LO_ERR__SHIFT                                                 0xd +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH6_RD_LO_ERR__SHIFT                                                 0xe +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH7_RD_LO_ERR__SHIFT                                                 0xf +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF0_WR_HI_ERR__SHIFT                                                    0x10 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF1_WR_HI_ERR__SHIFT                                                    0x11 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF2_WR_HI_ERR__SHIFT                                                    0x12 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF3_WR_HI_ERR__SHIFT                                                    0x13 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF4_WR_HI_ERR__SHIFT                                                    0x14 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF5_WR_HI_ERR__SHIFT                                                    0x15 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF6_WR_HI_ERR__SHIFT                                                    0x16 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF7_WR_HI_ERR__SHIFT                                                    0x17 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF0_WR_LO_ERR__SHIFT                                                    0x18 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF1_WR_LO_ERR__SHIFT                                                    0x19 +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF2_WR_LO_ERR__SHIFT                                                    0x1a +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF3_WR_LO_ERR__SHIFT                                                    0x1b +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF4_WR_LO_ERR__SHIFT                                                    0x1c +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF5_WR_LO_ERR__SHIFT                                                    0x1d +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF6_WR_LO_ERR__SHIFT                                                    0x1e +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF7_WR_LO_ERR__SHIFT                                                    0x1f +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH0_RD_HI_ERR_MASK                                                   0x00000001L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH1_RD_HI_ERR_MASK                                                   0x00000002L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH2_RD_HI_ERR_MASK                                                   0x00000004L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH3_RD_HI_ERR_MASK                                                   0x00000008L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH4_RD_HI_ERR_MASK                                                   0x00000010L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH5_RD_HI_ERR_MASK                                                   0x00000020L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH6_RD_HI_ERR_MASK                                                   0x00000040L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH7_RD_HI_ERR_MASK                                                   0x00000080L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH0_RD_LO_ERR_MASK                                                   0x00000100L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH1_RD_LO_ERR_MASK                                                   0x00000200L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH2_RD_LO_ERR_MASK                                                   0x00000400L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH3_RD_LO_ERR_MASK                                                   0x00000800L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH4_RD_LO_ERR_MASK                                                   0x00001000L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH5_RD_LO_ERR_MASK                                                   0x00002000L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH6_RD_LO_ERR_MASK                                                   0x00004000L +#define JPEG_MEMCHECK_SYS_INT_STAT__BSFETCH7_RD_LO_ERR_MASK                                                   0x00008000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF0_WR_HI_ERR_MASK                                                      0x00010000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF1_WR_HI_ERR_MASK                                                      0x00020000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF2_WR_HI_ERR_MASK                                                      0x00040000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF3_WR_HI_ERR_MASK                                                      0x00080000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF4_WR_HI_ERR_MASK                                                      0x00100000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF5_WR_HI_ERR_MASK                                                      0x00200000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF6_WR_HI_ERR_MASK                                                      0x00400000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF7_WR_HI_ERR_MASK                                                      0x00800000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF0_WR_LO_ERR_MASK                                                      0x01000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF1_WR_LO_ERR_MASK                                                      0x02000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF2_WR_LO_ERR_MASK                                                      0x04000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF3_WR_LO_ERR_MASK                                                      0x08000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF4_WR_LO_ERR_MASK                                                      0x10000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF5_WR_LO_ERR_MASK                                                      0x20000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF6_WR_LO_ERR_MASK                                                      0x40000000L +#define JPEG_MEMCHECK_SYS_INT_STAT__OBUF7_WR_LO_ERR_MASK                                                      0x80000000L +//JPEG_MEMCHECK_SYS_INT_STAT1 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_RD_HI_ERR__SHIFT                                                  0x0 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_RD_HI_ERR__SHIFT                                                  0x1 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_RD_HI_ERR__SHIFT                                                  0x2 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_RD_HI_ERR__SHIFT                                                  0x3 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_RD_HI_ERR__SHIFT                                                  0x4 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_RD_HI_ERR__SHIFT                                                  0x5 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_RD_HI_ERR__SHIFT                                                  0x6 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_RD_HI_ERR__SHIFT                                                  0x7 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_RD_LO_ERR__SHIFT                                                  0x8 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_RD_LO_ERR__SHIFT                                                  0x9 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_RD_LO_ERR__SHIFT                                                  0xa +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_RD_LO_ERR__SHIFT                                                  0xb +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_RD_LO_ERR__SHIFT                                                  0xc +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_RD_LO_ERR__SHIFT                                                  0xd +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_RD_LO_ERR__SHIFT                                                  0xe +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_RD_LO_ERR__SHIFT                                                  0xf +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_WR_HI_ERR__SHIFT                                                  0x10 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_WR_HI_ERR__SHIFT                                                  0x11 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_WR_HI_ERR__SHIFT                                                  0x12 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_WR_HI_ERR__SHIFT                                                  0x13 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_WR_HI_ERR__SHIFT                                                  0x14 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_WR_HI_ERR__SHIFT                                                  0x15 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_WR_HI_ERR__SHIFT                                                  0x16 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_WR_HI_ERR__SHIFT                                                  0x17 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_WR_LO_ERR__SHIFT                                                  0x18 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_WR_LO_ERR__SHIFT                                                  0x19 +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_WR_LO_ERR__SHIFT                                                  0x1a +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_WR_LO_ERR__SHIFT                                                  0x1b +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_WR_LO_ERR__SHIFT                                                  0x1c +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_WR_LO_ERR__SHIFT                                                  0x1d +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_WR_LO_ERR__SHIFT                                                  0x1e +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_WR_LO_ERR__SHIFT                                                  0x1f +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_RD_HI_ERR_MASK                                                    0x00000001L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_RD_HI_ERR_MASK                                                    0x00000002L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_RD_HI_ERR_MASK                                                    0x00000004L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_RD_HI_ERR_MASK                                                    0x00000008L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_RD_HI_ERR_MASK                                                    0x00000010L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_RD_HI_ERR_MASK                                                    0x00000020L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_RD_HI_ERR_MASK                                                    0x00000040L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_RD_HI_ERR_MASK                                                    0x00000080L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_RD_LO_ERR_MASK                                                    0x00000100L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_RD_LO_ERR_MASK                                                    0x00000200L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_RD_LO_ERR_MASK                                                    0x00000400L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_RD_LO_ERR_MASK                                                    0x00000800L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_RD_LO_ERR_MASK                                                    0x00001000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_RD_LO_ERR_MASK                                                    0x00002000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_RD_LO_ERR_MASK                                                    0x00004000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_RD_LO_ERR_MASK                                                    0x00008000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_WR_HI_ERR_MASK                                                    0x00010000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_WR_HI_ERR_MASK                                                    0x00020000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_WR_HI_ERR_MASK                                                    0x00040000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_WR_HI_ERR_MASK                                                    0x00080000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_WR_HI_ERR_MASK                                                    0x00100000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_WR_HI_ERR_MASK                                                    0x00200000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_WR_HI_ERR_MASK                                                    0x00400000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_WR_HI_ERR_MASK                                                    0x00800000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC0_WR_LO_ERR_MASK                                                    0x01000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC1_WR_LO_ERR_MASK                                                    0x02000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC2_WR_LO_ERR_MASK                                                    0x04000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC3_WR_LO_ERR_MASK                                                    0x08000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC4_WR_LO_ERR_MASK                                                    0x10000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC5_WR_LO_ERR_MASK                                                    0x20000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC6_WR_LO_ERR_MASK                                                    0x40000000L +#define JPEG_MEMCHECK_SYS_INT_STAT1__DJRBC7_WR_LO_ERR_MASK                                                    0x80000000L +//JPEG_MEMCHECK_SYS_INT_STAT2 +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_RD_HI_ERR__SHIFT                                                   0x0 +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_RD_LO_ERR__SHIFT                                                   0x1 +#define JPEG_MEMCHECK_SYS_INT_STAT2__PELFETCH_RD_HI_ERR__SHIFT                                                0x2 +#define JPEG_MEMCHECK_SYS_INT_STAT2__PELFETCH_RD_LO_ERR__SHIFT                                                0x3 +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_RD_HI_ERR__SHIFT                                                  0x4 +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_RD_LO_ERR__SHIFT                                                  0x5 +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_WR_HI_ERR__SHIFT                                                   0x6 +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_WR_LO_ERR__SHIFT                                                   0x7 +#define JPEG_MEMCHECK_SYS_INT_STAT2__BS_WR_HI_ERR__SHIFT                                                      0x8 +#define JPEG_MEMCHECK_SYS_INT_STAT2__BS_WR_LO_ERR__SHIFT                                                      0x9 +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_WR_HI_ERR__SHIFT                                                  0xa +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_WR_LO_ERR__SHIFT                                                  0xb +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_RD_HI_ERR_MASK                                                     0x00000001L +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_RD_LO_ERR_MASK                                                     0x00000002L +#define JPEG_MEMCHECK_SYS_INT_STAT2__PELFETCH_RD_HI_ERR_MASK                                                  0x00000004L +#define JPEG_MEMCHECK_SYS_INT_STAT2__PELFETCH_RD_LO_ERR_MASK                                                  0x00000008L +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_RD_HI_ERR_MASK                                                    0x00000010L +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_RD_LO_ERR_MASK                                                    0x00000020L +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_WR_HI_ERR_MASK                                                     0x00000040L +#define JPEG_MEMCHECK_SYS_INT_STAT2__EJRBC_WR_LO_ERR_MASK                                                     0x00000080L +#define JPEG_MEMCHECK_SYS_INT_STAT2__BS_WR_HI_ERR_MASK                                                        0x00000100L +#define JPEG_MEMCHECK_SYS_INT_STAT2__BS_WR_LO_ERR_MASK                                                        0x00000200L +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_WR_HI_ERR_MASK                                                    0x00000400L +#define JPEG_MEMCHECK_SYS_INT_STAT2__SCALAR_WR_LO_ERR_MASK                                                    0x00000800L +//JPEG_MEMCHECK_SYS_INT_ACK +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH0_RD_HI_ERR__SHIFT                                                  0x0 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH1_RD_HI_ERR__SHIFT                                                  0x1 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH2_RD_HI_ERR__SHIFT                                                  0x2 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH3_RD_HI_ERR__SHIFT                                                  0x3 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH4_RD_HI_ERR__SHIFT                                                  0x4 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH5_RD_HI_ERR__SHIFT                                                  0x5 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH6_RD_HI_ERR__SHIFT                                                  0x6 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH7_RD_HI_ERR__SHIFT                                                  0x7 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH0_RD_LO_ERR__SHIFT                                                  0x8 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH1_RD_LO_ERR__SHIFT                                                  0x9 +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH2_RD_LO_ERR__SHIFT                                                  0xa +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH3_RD_LO_ERR__SHIFT                                                  0xb +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH4_RD_LO_ERR__SHIFT                                                  0xc +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH5_RD_LO_ERR__SHIFT                                                  0xd +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH6_RD_LO_ERR__SHIFT                                                  0xe +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH7_RD_LO_ERR__SHIFT                                                  0xf +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF0_WR_HI_ERR__SHIFT                                                     0x10 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF1_WR_HI_ERR__SHIFT                                                     0x11 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF2_WR_HI_ERR__SHIFT                                                     0x12 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF3_WR_HI_ERR__SHIFT                                                     0x13 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF4_WR_HI_ERR__SHIFT                                                     0x14 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF5_WR_HI_ERR__SHIFT                                                     0x15 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF6_WR_HI_ERR__SHIFT                                                     0x16 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF7_WR_HI_ERR__SHIFT                                                     0x17 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF0_WR_LO_ERR__SHIFT                                                     0x18 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF1_WR_LO_ERR__SHIFT                                                     0x19 +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF2_WR_LO_ERR__SHIFT                                                     0x1a +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF3_WR_LO_ERR__SHIFT                                                     0x1b +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF4_WR_LO_ERR__SHIFT                                                     0x1c +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF5_WR_LO_ERR__SHIFT                                                     0x1d +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF6_WR_LO_ERR__SHIFT                                                     0x1e +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF7_WR_LO_ERR__SHIFT                                                     0x1f +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH0_RD_HI_ERR_MASK                                                    0x00000001L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH1_RD_HI_ERR_MASK                                                    0x00000002L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH2_RD_HI_ERR_MASK                                                    0x00000004L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH3_RD_HI_ERR_MASK                                                    0x00000008L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH4_RD_HI_ERR_MASK                                                    0x00000010L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH5_RD_HI_ERR_MASK                                                    0x00000020L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH6_RD_HI_ERR_MASK                                                    0x00000040L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH7_RD_HI_ERR_MASK                                                    0x00000080L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH0_RD_LO_ERR_MASK                                                    0x00000100L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH1_RD_LO_ERR_MASK                                                    0x00000200L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH2_RD_LO_ERR_MASK                                                    0x00000400L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH3_RD_LO_ERR_MASK                                                    0x00000800L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH4_RD_LO_ERR_MASK                                                    0x00001000L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH5_RD_LO_ERR_MASK                                                    0x00002000L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH6_RD_LO_ERR_MASK                                                    0x00004000L +#define JPEG_MEMCHECK_SYS_INT_ACK__BSFETCH7_RD_LO_ERR_MASK                                                    0x00008000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF0_WR_HI_ERR_MASK                                                       0x00010000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF1_WR_HI_ERR_MASK                                                       0x00020000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF2_WR_HI_ERR_MASK                                                       0x00040000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF3_WR_HI_ERR_MASK                                                       0x00080000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF4_WR_HI_ERR_MASK                                                       0x00100000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF5_WR_HI_ERR_MASK                                                       0x00200000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF6_WR_HI_ERR_MASK                                                       0x00400000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF7_WR_HI_ERR_MASK                                                       0x00800000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF0_WR_LO_ERR_MASK                                                       0x01000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF1_WR_LO_ERR_MASK                                                       0x02000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF2_WR_LO_ERR_MASK                                                       0x04000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF3_WR_LO_ERR_MASK                                                       0x08000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF4_WR_LO_ERR_MASK                                                       0x10000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF5_WR_LO_ERR_MASK                                                       0x20000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF6_WR_LO_ERR_MASK                                                       0x40000000L +#define JPEG_MEMCHECK_SYS_INT_ACK__OBUF7_WR_LO_ERR_MASK                                                       0x80000000L +//JPEG_MEMCHECK_SYS_INT_ACK1 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_RD_HI_ERR__SHIFT                                                   0x0 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_RD_HI_ERR__SHIFT                                                   0x1 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_RD_HI_ERR__SHIFT                                                   0x2 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_RD_HI_ERR__SHIFT                                                   0x3 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_RD_HI_ERR__SHIFT                                                   0x4 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_RD_HI_ERR__SHIFT                                                   0x5 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_RD_HI_ERR__SHIFT                                                   0x6 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_RD_HI_ERR__SHIFT                                                   0x7 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_RD_LO_ERR__SHIFT                                                   0x8 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_RD_LO_ERR__SHIFT                                                   0x9 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_RD_LO_ERR__SHIFT                                                   0xa +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_RD_LO_ERR__SHIFT                                                   0xb +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_RD_LO_ERR__SHIFT                                                   0xc +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_RD_LO_ERR__SHIFT                                                   0xd +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_RD_LO_ERR__SHIFT                                                   0xe +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_RD_LO_ERR__SHIFT                                                   0xf +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_WR_HI_ERR__SHIFT                                                   0x10 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_WR_HI_ERR__SHIFT                                                   0x11 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_WR_HI_ERR__SHIFT                                                   0x12 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_WR_HI_ERR__SHIFT                                                   0x13 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_WR_HI_ERR__SHIFT                                                   0x14 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_WR_HI_ERR__SHIFT                                                   0x15 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_WR_HI_ERR__SHIFT                                                   0x16 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_WR_HI_ERR__SHIFT                                                   0x17 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_WR_LO_ERR__SHIFT                                                   0x18 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_WR_LO_ERR__SHIFT                                                   0x19 +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_WR_LO_ERR__SHIFT                                                   0x1a +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_WR_LO_ERR__SHIFT                                                   0x1b +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_WR_LO_ERR__SHIFT                                                   0x1c +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_WR_LO_ERR__SHIFT                                                   0x1d +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_WR_LO_ERR__SHIFT                                                   0x1e +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_WR_LO_ERR__SHIFT                                                   0x1f +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_RD_HI_ERR_MASK                                                     0x00000001L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_RD_HI_ERR_MASK                                                     0x00000002L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_RD_HI_ERR_MASK                                                     0x00000004L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_RD_HI_ERR_MASK                                                     0x00000008L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_RD_HI_ERR_MASK                                                     0x00000010L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_RD_HI_ERR_MASK                                                     0x00000020L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_RD_HI_ERR_MASK                                                     0x00000040L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_RD_HI_ERR_MASK                                                     0x00000080L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_RD_LO_ERR_MASK                                                     0x00000100L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_RD_LO_ERR_MASK                                                     0x00000200L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_RD_LO_ERR_MASK                                                     0x00000400L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_RD_LO_ERR_MASK                                                     0x00000800L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_RD_LO_ERR_MASK                                                     0x00001000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_RD_LO_ERR_MASK                                                     0x00002000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_RD_LO_ERR_MASK                                                     0x00004000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_RD_LO_ERR_MASK                                                     0x00008000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_WR_HI_ERR_MASK                                                     0x00010000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_WR_HI_ERR_MASK                                                     0x00020000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_WR_HI_ERR_MASK                                                     0x00040000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_WR_HI_ERR_MASK                                                     0x00080000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_WR_HI_ERR_MASK                                                     0x00100000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_WR_HI_ERR_MASK                                                     0x00200000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_WR_HI_ERR_MASK                                                     0x00400000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_WR_HI_ERR_MASK                                                     0x00800000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC0_WR_LO_ERR_MASK                                                     0x01000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC1_WR_LO_ERR_MASK                                                     0x02000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC2_WR_LO_ERR_MASK                                                     0x04000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC3_WR_LO_ERR_MASK                                                     0x08000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC4_WR_LO_ERR_MASK                                                     0x10000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC5_WR_LO_ERR_MASK                                                     0x20000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC6_WR_LO_ERR_MASK                                                     0x40000000L +#define JPEG_MEMCHECK_SYS_INT_ACK1__DJRBC7_WR_LO_ERR_MASK                                                     0x80000000L +//JPEG_MEMCHECK_SYS_INT_ACK2 +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_RD_HI_ERR__SHIFT                                                    0x0 +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_RD_LO_ERR__SHIFT                                                    0x1 +#define JPEG_MEMCHECK_SYS_INT_ACK2__PELFETCH_RD_HI_ERR__SHIFT                                                 0x2 +#define JPEG_MEMCHECK_SYS_INT_ACK2__PELFETCH_RD_LO_ERR__SHIFT                                                 0x3 +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_RD_HI_ERR__SHIFT                                                   0x4 +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_RD_LO_ERR__SHIFT                                                   0x5 +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_WR_HI_ERR__SHIFT                                                    0x6 +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_WR_LO_ERR__SHIFT                                                    0x7 +#define JPEG_MEMCHECK_SYS_INT_ACK2__BS_WR_HI_ERR__SHIFT                                                       0x8 +#define JPEG_MEMCHECK_SYS_INT_ACK2__BS_WR_LO_ERR__SHIFT                                                       0x9 +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_WR_HI_ERR__SHIFT                                                   0xa +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_WR_LO_ERR__SHIFT                                                   0xb +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_RD_HI_ERR_MASK                                                      0x00000001L +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_RD_LO_ERR_MASK                                                      0x00000002L +#define JPEG_MEMCHECK_SYS_INT_ACK2__PELFETCH_RD_HI_ERR_MASK                                                   0x00000004L +#define JPEG_MEMCHECK_SYS_INT_ACK2__PELFETCH_RD_LO_ERR_MASK                                                   0x00000008L +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_RD_HI_ERR_MASK                                                     0x00000010L +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_RD_LO_ERR_MASK                                                     0x00000020L +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_WR_HI_ERR_MASK                                                      0x00000040L +#define JPEG_MEMCHECK_SYS_INT_ACK2__EJRBC_WR_LO_ERR_MASK                                                      0x00000080L +#define JPEG_MEMCHECK_SYS_INT_ACK2__BS_WR_HI_ERR_MASK                                                         0x00000100L +#define JPEG_MEMCHECK_SYS_INT_ACK2__BS_WR_LO_ERR_MASK                                                         0x00000200L +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_WR_HI_ERR_MASK                                                     0x00000400L +#define JPEG_MEMCHECK_SYS_INT_ACK2__SCALAR_WR_LO_ERR_MASK                                                     0x00000800L +//JPEG_MASTINT_EN +#define JPEG_MASTINT_EN__OVERRUN_RST__SHIFT                                                                   0x0 +#define JPEG_MASTINT_EN__INT_OVERRUN__SHIFT                                                                   0x4 +#define JPEG_MASTINT_EN__OVERRUN_RST_MASK                                                                     0x00000001L +#define JPEG_MASTINT_EN__INT_OVERRUN_MASK                                                                     0x007FFFF0L +//JPEG_IH_CTRL +#define JPEG_IH_CTRL__IH_SOFT_RESET__SHIFT                                                                    0x0 +#define JPEG_IH_CTRL__IH_STALL_EN__SHIFT                                                                      0x1 +#define JPEG_IH_CTRL__IH_STATUS_CLEAN__SHIFT                                                                  0x2 +#define JPEG_IH_CTRL__IH_VMID__SHIFT                                                                          0x3 +#define JPEG_IH_CTRL__IH_USER_DATA__SHIFT                                                                     0x7 +#define JPEG_IH_CTRL__IH_RINGID__SHIFT                                                                        0x13 +#define JPEG_IH_CTRL__IH_SOFT_RESET_MASK                                                                      0x00000001L +#define JPEG_IH_CTRL__IH_STALL_EN_MASK                                                                        0x00000002L +#define JPEG_IH_CTRL__IH_STATUS_CLEAN_MASK                                                                    0x00000004L +#define JPEG_IH_CTRL__IH_VMID_MASK                                                                            0x00000078L +#define JPEG_IH_CTRL__IH_USER_DATA_MASK                                                                       0x0007FF80L +#define JPEG_IH_CTRL__IH_RINGID_MASK                                                                          0x07F80000L +//JRBBM_ARB_CTRL +#define JRBBM_ARB_CTRL__DJRBC0_DROP__SHIFT                                                                    0x0 +#define JRBBM_ARB_CTRL__DJRBC1_DROP__SHIFT                                                                    0x1 +#define JRBBM_ARB_CTRL__DJRBC2_DROP__SHIFT                                                                    0x2 +#define JRBBM_ARB_CTRL__DJRBC3_DROP__SHIFT                                                                    0x3 +#define JRBBM_ARB_CTRL__DJRBC4_DROP__SHIFT                                                                    0x4 +#define JRBBM_ARB_CTRL__DJRBC5_DROP__SHIFT                                                                    0x5 +#define JRBBM_ARB_CTRL__DJRBC6_DROP__SHIFT                                                                    0x6 +#define JRBBM_ARB_CTRL__DJRBC7_DROP__SHIFT                                                                    0x7 +#define JRBBM_ARB_CTRL__EJRBC_DROP__SHIFT                                                                     0x8 +#define JRBBM_ARB_CTRL__SRBM_DROP__SHIFT                                                                      0x9 +#define JRBBM_ARB_CTRL__DJRBC0_DROP_MASK                                                                      0x00000001L +#define JRBBM_ARB_CTRL__DJRBC1_DROP_MASK                                                                      0x00000002L +#define JRBBM_ARB_CTRL__DJRBC2_DROP_MASK                                                                      0x00000004L +#define JRBBM_ARB_CTRL__DJRBC3_DROP_MASK                                                                      0x00000008L +#define JRBBM_ARB_CTRL__DJRBC4_DROP_MASK                                                                      0x00000010L +#define JRBBM_ARB_CTRL__DJRBC5_DROP_MASK                                                                      0x00000020L +#define JRBBM_ARB_CTRL__DJRBC6_DROP_MASK                                                                      0x00000040L +#define JRBBM_ARB_CTRL__DJRBC7_DROP_MASK                                                                      0x00000080L +#define JRBBM_ARB_CTRL__EJRBC_DROP_MASK                                                                       0x00000100L +#define JRBBM_ARB_CTRL__SRBM_DROP_MASK                                                                        0x00000200L + + +// addressBlock: aid_uvd0_uvd_jpeg_common_sclk_dec +//JPEG_CGC_GATE +#define JPEG_CGC_GATE__JPEG0_DEC__SHIFT                                                                       0x0 +#define JPEG_CGC_GATE__JPEG1_DEC__SHIFT                                                                       0x1 +#define JPEG_CGC_GATE__JPEG2_DEC__SHIFT                                                                       0x2 +#define JPEG_CGC_GATE__JPEG3_DEC__SHIFT                                                                       0x3 +#define JPEG_CGC_GATE__JPEG4_DEC__SHIFT                                                                       0x4 +#define JPEG_CGC_GATE__JPEG5_DEC__SHIFT                                                                       0x5 +#define JPEG_CGC_GATE__JPEG6_DEC__SHIFT                                                                       0x6 +#define JPEG_CGC_GATE__JPEG7_DEC__SHIFT                                                                       0x7 +#define JPEG_CGC_GATE__JPEG_ENC__SHIFT                                                                        0x8 +#define JPEG_CGC_GATE__JMCIF__SHIFT                                                                           0x9 +#define JPEG_CGC_GATE__JRBBM__SHIFT                                                                           0xa +#define JPEG_CGC_GATE__JPEG0_DEC_MASK                                                                         0x00000001L +#define JPEG_CGC_GATE__JPEG1_DEC_MASK                                                                         0x00000002L +#define JPEG_CGC_GATE__JPEG2_DEC_MASK                                                                         0x00000004L +#define JPEG_CGC_GATE__JPEG3_DEC_MASK                                                                         0x00000008L +#define JPEG_CGC_GATE__JPEG4_DEC_MASK                                                                         0x00000010L +#define JPEG_CGC_GATE__JPEG5_DEC_MASK                                                                         0x00000020L +#define JPEG_CGC_GATE__JPEG6_DEC_MASK                                                                         0x00000040L +#define JPEG_CGC_GATE__JPEG7_DEC_MASK                                                                         0x00000080L +#define JPEG_CGC_GATE__JPEG_ENC_MASK                                                                          0x00000100L +#define JPEG_CGC_GATE__JMCIF_MASK                                                                             0x00000200L +#define JPEG_CGC_GATE__JRBBM_MASK                                                                             0x00000400L +//JPEG_CGC_CTRL +#define JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT                                                                  0x0 +#define JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT                                                              0x1 +#define JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT                                                                   0x5 +#define JPEG_CGC_CTRL__JPEG0_DEC_MODE__SHIFT                                                                  0x10 +#define JPEG_CGC_CTRL__JPEG1_DEC_MODE__SHIFT                                                                  0x11 +#define JPEG_CGC_CTRL__JPEG2_DEC_MODE__SHIFT                                                                  0x12 +#define JPEG_CGC_CTRL__JPEG3_DEC_MODE__SHIFT                                                                  0x13 +#define JPEG_CGC_CTRL__JPEG4_DEC_MODE__SHIFT                                                                  0x14 +#define JPEG_CGC_CTRL__JPEG5_DEC_MODE__SHIFT                                                                  0x15 +#define JPEG_CGC_CTRL__JPEG6_DEC_MODE__SHIFT                                                                  0x16 +#define JPEG_CGC_CTRL__JPEG7_DEC_MODE__SHIFT                                                                  0x17 +#define JPEG_CGC_CTRL__JPEG_ENC_MODE__SHIFT                                                                   0x18 +#define JPEG_CGC_CTRL__JMCIF_MODE__SHIFT                                                                      0x19 +#define JPEG_CGC_CTRL__JRBBM_MODE__SHIFT                                                                      0x1a +#define JPEG_CGC_CTRL__DYN_CLOCK_MODE_MASK                                                                    0x00000001L +#define JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK                                                                0x0000001EL +#define JPEG_CGC_CTRL__CLK_OFF_DELAY_MASK                                                                     0x00001FE0L +#define JPEG_CGC_CTRL__JPEG0_DEC_MODE_MASK                                                                    0x00010000L +#define JPEG_CGC_CTRL__JPEG1_DEC_MODE_MASK                                                                    0x00020000L +#define JPEG_CGC_CTRL__JPEG2_DEC_MODE_MASK                                                                    0x00040000L +#define JPEG_CGC_CTRL__JPEG3_DEC_MODE_MASK                                                                    0x00080000L +#define JPEG_CGC_CTRL__JPEG4_DEC_MODE_MASK                                                                    0x00100000L +#define JPEG_CGC_CTRL__JPEG5_DEC_MODE_MASK                                                                    0x00200000L +#define JPEG_CGC_CTRL__JPEG6_DEC_MODE_MASK                                                                    0x00400000L +#define JPEG_CGC_CTRL__JPEG7_DEC_MODE_MASK                                                                    0x00800000L +#define JPEG_CGC_CTRL__JPEG_ENC_MODE_MASK                                                                     0x01000000L +#define JPEG_CGC_CTRL__JMCIF_MODE_MASK                                                                        0x02000000L +#define JPEG_CGC_CTRL__JRBBM_MODE_MASK                                                                        0x04000000L +//JPEG_CGC_STATUS +#define JPEG_CGC_STATUS__JPEG0_DEC_VCLK_ACTIVE__SHIFT                                                         0x0 +#define JPEG_CGC_STATUS__JPEG0_DEC_SCLK_ACTIVE__SHIFT                                                         0x1 +#define JPEG_CGC_STATUS__JPEG1_DEC_VCLK_ACTIVE__SHIFT                                                         0x2 +#define JPEG_CGC_STATUS__JPEG1_DEC_SCLK_ACTIVE__SHIFT                                                         0x3 +#define JPEG_CGC_STATUS__JPEG2_DEC_VCLK_ACTIVE__SHIFT                                                         0x4 +#define JPEG_CGC_STATUS__JPEG2_DEC_SCLK_ACTIVE__SHIFT                                                         0x5 +#define JPEG_CGC_STATUS__JPEG3_DEC_VCLK_ACTIVE__SHIFT                                                         0x6 +#define JPEG_CGC_STATUS__JPEG3_DEC_SCLK_ACTIVE__SHIFT                                                         0x7 +#define JPEG_CGC_STATUS__JPEG4_DEC_VCLK_ACTIVE__SHIFT                                                         0x8 +#define JPEG_CGC_STATUS__JPEG4_DEC_SCLK_ACTIVE__SHIFT                                                         0x9 +#define JPEG_CGC_STATUS__JPEG5_DEC_VCLK_ACTIVE__SHIFT                                                         0xa +#define JPEG_CGC_STATUS__JPEG5_DEC_SCLK_ACTIVE__SHIFT                                                         0xb +#define JPEG_CGC_STATUS__JPEG6_DEC_VCLK_ACTIVE__SHIFT                                                         0xc +#define JPEG_CGC_STATUS__JPEG6_DEC_SCLK_ACTIVE__SHIFT                                                         0xd +#define JPEG_CGC_STATUS__JPEG7_DEC_VCLK_ACTIVE__SHIFT                                                         0xe +#define JPEG_CGC_STATUS__JPEG7_DEC_SCLK_ACTIVE__SHIFT                                                         0xf +#define JPEG_CGC_STATUS__JPEG_ENC_VCLK_ACTIVE__SHIFT                                                          0x10 +#define JPEG_CGC_STATUS__JPEG_ENC_SCLK_ACTIVE__SHIFT                                                          0x11 +#define JPEG_CGC_STATUS__JMCIF_SCLK_ACTIVE__SHIFT                                                             0x12 +#define JPEG_CGC_STATUS__JRBBM_VCLK_ACTIVE__SHIFT                                                             0x13 +#define JPEG_CGC_STATUS__JRBBM_SCLK_ACTIVE__SHIFT                                                             0x14 +#define JPEG_CGC_STATUS__JPEG0_DEC_VCLK_ACTIVE_MASK                                                           0x00000001L +#define JPEG_CGC_STATUS__JPEG0_DEC_SCLK_ACTIVE_MASK                                                           0x00000002L +#define JPEG_CGC_STATUS__JPEG1_DEC_VCLK_ACTIVE_MASK                                                           0x00000004L +#define JPEG_CGC_STATUS__JPEG1_DEC_SCLK_ACTIVE_MASK                                                           0x00000008L +#define JPEG_CGC_STATUS__JPEG2_DEC_VCLK_ACTIVE_MASK                                                           0x00000010L +#define JPEG_CGC_STATUS__JPEG2_DEC_SCLK_ACTIVE_MASK                                                           0x00000020L +#define JPEG_CGC_STATUS__JPEG3_DEC_VCLK_ACTIVE_MASK                                                           0x00000040L +#define JPEG_CGC_STATUS__JPEG3_DEC_SCLK_ACTIVE_MASK                                                           0x00000080L +#define JPEG_CGC_STATUS__JPEG4_DEC_VCLK_ACTIVE_MASK                                                           0x00000100L +#define JPEG_CGC_STATUS__JPEG4_DEC_SCLK_ACTIVE_MASK                                                           0x00000200L +#define JPEG_CGC_STATUS__JPEG5_DEC_VCLK_ACTIVE_MASK                                                           0x00000400L +#define JPEG_CGC_STATUS__JPEG5_DEC_SCLK_ACTIVE_MASK                                                           0x00000800L +#define JPEG_CGC_STATUS__JPEG6_DEC_VCLK_ACTIVE_MASK                                                           0x00001000L +#define JPEG_CGC_STATUS__JPEG6_DEC_SCLK_ACTIVE_MASK                                                           0x00002000L +#define JPEG_CGC_STATUS__JPEG7_DEC_VCLK_ACTIVE_MASK                                                           0x00004000L +#define JPEG_CGC_STATUS__JPEG7_DEC_SCLK_ACTIVE_MASK                                                           0x00008000L +#define JPEG_CGC_STATUS__JPEG_ENC_VCLK_ACTIVE_MASK                                                            0x00010000L +#define JPEG_CGC_STATUS__JPEG_ENC_SCLK_ACTIVE_MASK                                                            0x00020000L +#define JPEG_CGC_STATUS__JMCIF_SCLK_ACTIVE_MASK                                                               0x00040000L +#define JPEG_CGC_STATUS__JRBBM_VCLK_ACTIVE_MASK                                                               0x00080000L +#define JPEG_CGC_STATUS__JRBBM_SCLK_ACTIVE_MASK                                                               0x00100000L +//JPEG_COMN_CGC_MEM_CTRL +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_LS_EN__SHIFT                                                            0x0 +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_DS_EN__SHIFT                                                            0x1 +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_SD_EN__SHIFT                                                            0x2 +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_LS_SW_EN__SHIFT                                                         0x3 +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_LS_EN_MASK                                                              0x00000001L +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_DS_EN_MASK                                                              0x00000002L +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_SD_EN_MASK                                                              0x00000004L +#define JPEG_COMN_CGC_MEM_CTRL__JMCIF_LS_SW_EN_MASK                                                           0x00000008L +//JPEG_DEC_CGC_MEM_CTRL +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_LS_EN__SHIFT                                                         0x0 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_DS_EN__SHIFT                                                         0x1 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_SD_EN__SHIFT                                                         0x2 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_LS_SW_EN__SHIFT                                                      0x3 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_LS_EN__SHIFT                                                         0x4 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_DS_EN__SHIFT                                                         0x5 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_SD_EN__SHIFT                                                         0x6 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_LS_SW_EN__SHIFT                                                      0x7 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_LS_EN__SHIFT                                                         0x8 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_DS_EN__SHIFT                                                         0x9 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_SD_EN__SHIFT                                                         0xa +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_LS_SW_EN__SHIFT                                                      0xb +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_LS_EN__SHIFT                                                         0xc +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_DS_EN__SHIFT                                                         0xd +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_SD_EN__SHIFT                                                         0xe +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_LS_SW_EN__SHIFT                                                      0xf +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_LS_EN__SHIFT                                                         0x10 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_DS_EN__SHIFT                                                         0x11 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_SD_EN__SHIFT                                                         0x12 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_LS_SW_EN__SHIFT                                                      0x13 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_LS_EN__SHIFT                                                         0x14 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_DS_EN__SHIFT                                                         0x15 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_SD_EN__SHIFT                                                         0x16 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_LS_SW_EN__SHIFT                                                      0x17 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_LS_EN__SHIFT                                                         0x18 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_DS_EN__SHIFT                                                         0x19 +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_SD_EN__SHIFT                                                         0x1a +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_LS_SW_EN__SHIFT                                                      0x1b +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_LS_EN__SHIFT                                                         0x1c +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_DS_EN__SHIFT                                                         0x1d +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_SD_EN__SHIFT                                                         0x1e +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_LS_SW_EN__SHIFT                                                      0x1f +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_LS_EN_MASK                                                           0x00000001L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_DS_EN_MASK                                                           0x00000002L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_SD_EN_MASK                                                           0x00000004L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG0_DEC_LS_SW_EN_MASK                                                        0x00000008L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_LS_EN_MASK                                                           0x00000010L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_DS_EN_MASK                                                           0x00000020L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_SD_EN_MASK                                                           0x00000040L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG1_DEC_LS_SW_EN_MASK                                                        0x00000080L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_LS_EN_MASK                                                           0x00000100L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_DS_EN_MASK                                                           0x00000200L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_SD_EN_MASK                                                           0x00000400L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG2_DEC_LS_SW_EN_MASK                                                        0x00000800L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_LS_EN_MASK                                                           0x00001000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_DS_EN_MASK                                                           0x00002000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_SD_EN_MASK                                                           0x00004000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG3_DEC_LS_SW_EN_MASK                                                        0x00008000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_LS_EN_MASK                                                           0x00010000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_DS_EN_MASK                                                           0x00020000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_SD_EN_MASK                                                           0x00040000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG4_DEC_LS_SW_EN_MASK                                                        0x00080000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_LS_EN_MASK                                                           0x00100000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_DS_EN_MASK                                                           0x00200000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_SD_EN_MASK                                                           0x00400000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG5_DEC_LS_SW_EN_MASK                                                        0x00800000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_LS_EN_MASK                                                           0x01000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_DS_EN_MASK                                                           0x02000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_SD_EN_MASK                                                           0x04000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG6_DEC_LS_SW_EN_MASK                                                        0x08000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_LS_EN_MASK                                                           0x10000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_DS_EN_MASK                                                           0x20000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_SD_EN_MASK                                                           0x40000000L +#define JPEG_DEC_CGC_MEM_CTRL__JPEG7_DEC_LS_SW_EN_MASK                                                        0x80000000L +//JPEG_ENC_CGC_MEM_CTRL +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_LS_EN__SHIFT                                                          0x0 +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_DS_EN__SHIFT                                                          0x1 +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_SD_EN__SHIFT                                                          0x2 +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_LS_SW_EN__SHIFT                                                       0x3 +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_LS_EN_MASK                                                            0x00000001L +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_DS_EN_MASK                                                            0x00000002L +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_SD_EN_MASK                                                            0x00000004L +#define JPEG_ENC_CGC_MEM_CTRL__JPEG_ENC_LS_SW_EN_MASK                                                         0x00000008L +//JPEG_PERF_BANK_CONF +#define JPEG_PERF_BANK_CONF__RESET__SHIFT                                                                     0x0 +#define JPEG_PERF_BANK_CONF__PEEK__SHIFT                                                                      0x8 +#define JPEG_PERF_BANK_CONF__CONCATENATE__SHIFT                                                               0x10 +#define JPEG_PERF_BANK_CONF__CORE_SEL__SHIFT                                                                  0x15 +#define JPEG_PERF_BANK_CONF__RESET_MASK                                                                       0x0000000FL +#define JPEG_PERF_BANK_CONF__PEEK_MASK                                                                        0x00000F00L +#define JPEG_PERF_BANK_CONF__CONCATENATE_MASK                                                                 0x00030000L +#define JPEG_PERF_BANK_CONF__CORE_SEL_MASK                                                                    0x00E00000L +//JPEG_PERF_BANK_EVENT_SEL +#define JPEG_PERF_BANK_EVENT_SEL__SEL0__SHIFT                                                                 0x0 +#define JPEG_PERF_BANK_EVENT_SEL__SEL1__SHIFT                                                                 0x8 +#define JPEG_PERF_BANK_EVENT_SEL__SEL2__SHIFT                                                                 0x10 +#define JPEG_PERF_BANK_EVENT_SEL__SEL3__SHIFT                                                                 0x18 +#define JPEG_PERF_BANK_EVENT_SEL__SEL0_MASK                                                                   0x000000FFL +#define JPEG_PERF_BANK_EVENT_SEL__SEL1_MASK                                                                   0x0000FF00L +#define JPEG_PERF_BANK_EVENT_SEL__SEL2_MASK                                                                   0x00FF0000L +#define JPEG_PERF_BANK_EVENT_SEL__SEL3_MASK                                                                   0xFF000000L +//JPEG_PERF_BANK_COUNT0 +#define JPEG_PERF_BANK_COUNT0__COUNT__SHIFT                                                                   0x0 +#define JPEG_PERF_BANK_COUNT0__COUNT_MASK                                                                     0xFFFFFFFFL +//JPEG_PERF_BANK_COUNT1 +#define JPEG_PERF_BANK_COUNT1__COUNT__SHIFT                                                                   0x0 +#define JPEG_PERF_BANK_COUNT1__COUNT_MASK                                                                     0xFFFFFFFFL +//JPEG_PERF_BANK_COUNT2 +#define JPEG_PERF_BANK_COUNT2__COUNT__SHIFT                                                                   0x0 +#define JPEG_PERF_BANK_COUNT2__COUNT_MASK                                                                     0xFFFFFFFFL +//JPEG_PERF_BANK_COUNT3 +#define JPEG_PERF_BANK_COUNT3__COUNT__SHIFT                                                                   0x0 +#define JPEG_PERF_BANK_COUNT3__COUNT_MASK                                                                     0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_pg_dec +//UVD_PGFSM_CONFIG +#define UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG__SHIFT                                                              0x0 +#define UVD_PGFSM_CONFIG__UVDS_PWR_CONFIG__SHIFT                                                              0x2 +#define UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG__SHIFT                                                              0x4 +#define UVD_PGFSM_CONFIG__UVDTC_PWR_CONFIG__SHIFT                                                             0x6 +#define UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG__SHIFT                                                              0x8 +#define UVD_PGFSM_CONFIG__UVDTA_PWR_CONFIG__SHIFT                                                             0xa +#define UVD_PGFSM_CONFIG__UVDLM_PWR_CONFIG__SHIFT                                                             0xc +#define UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG__SHIFT                                                             0xe +#define UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG__SHIFT                                                             0x10 +#define UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG__SHIFT                                                              0x12 +#define UVD_PGFSM_CONFIG__UVDAB_PWR_CONFIG__SHIFT                                                             0x14 +#define UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG__SHIFT                                                              0x16 +#define UVD_PGFSM_CONFIG__UVDTB_PWR_CONFIG__SHIFT                                                             0x18 +#define UVD_PGFSM_CONFIG__UVDNA_PWR_CONFIG__SHIFT                                                             0x1a +#define UVD_PGFSM_CONFIG__UVDNB_PWR_CONFIG__SHIFT                                                             0x1c +#define UVD_PGFSM_CONFIG__UVDM_PWR_CONFIG_MASK                                                                0x00000003L +#define UVD_PGFSM_CONFIG__UVDS_PWR_CONFIG_MASK                                                                0x0000000CL +#define UVD_PGFSM_CONFIG__UVDF_PWR_CONFIG_MASK                                                                0x00000030L +#define UVD_PGFSM_CONFIG__UVDTC_PWR_CONFIG_MASK                                                               0x000000C0L +#define UVD_PGFSM_CONFIG__UVDB_PWR_CONFIG_MASK                                                                0x00000300L +#define UVD_PGFSM_CONFIG__UVDTA_PWR_CONFIG_MASK                                                               0x00000C00L +#define UVD_PGFSM_CONFIG__UVDLM_PWR_CONFIG_MASK                                                               0x00003000L +#define UVD_PGFSM_CONFIG__UVDTD_PWR_CONFIG_MASK                                                               0x0000C000L +#define UVD_PGFSM_CONFIG__UVDTE_PWR_CONFIG_MASK                                                               0x00030000L +#define UVD_PGFSM_CONFIG__UVDE_PWR_CONFIG_MASK                                                                0x000C0000L +#define UVD_PGFSM_CONFIG__UVDAB_PWR_CONFIG_MASK                                                               0x00300000L +#define UVD_PGFSM_CONFIG__UVDJ_PWR_CONFIG_MASK                                                                0x00C00000L +#define UVD_PGFSM_CONFIG__UVDTB_PWR_CONFIG_MASK                                                               0x03000000L +#define UVD_PGFSM_CONFIG__UVDNA_PWR_CONFIG_MASK                                                               0x0C000000L +#define UVD_PGFSM_CONFIG__UVDNB_PWR_CONFIG_MASK                                                               0x30000000L +//UVD_PGFSM_STATUS +#define UVD_PGFSM_STATUS__UVDM_PWR_STATUS__SHIFT                                                              0x0 +#define UVD_PGFSM_STATUS__UVDS_PWR_STATUS__SHIFT                                                              0x2 +#define UVD_PGFSM_STATUS__UVDF_PWR_STATUS__SHIFT                                                              0x4 +#define UVD_PGFSM_STATUS__UVDTC_PWR_STATUS__SHIFT                                                             0x6 +#define UVD_PGFSM_STATUS__UVDB_PWR_STATUS__SHIFT                                                              0x8 +#define UVD_PGFSM_STATUS__UVDTA_PWR_STATUS__SHIFT                                                             0xa +#define UVD_PGFSM_STATUS__UVDLM_PWR_STATUS__SHIFT                                                             0xc +#define UVD_PGFSM_STATUS__UVDTD_PWR_STATUS__SHIFT                                                             0xe +#define UVD_PGFSM_STATUS__UVDTE_PWR_STATUS__SHIFT                                                             0x10 +#define UVD_PGFSM_STATUS__UVDE_PWR_STATUS__SHIFT                                                              0x12 +#define UVD_PGFSM_STATUS__UVDAB_PWR_STATUS__SHIFT                                                             0x14 +#define UVD_PGFSM_STATUS__UVDJ_PWR_STATUS__SHIFT                                                              0x16 +#define UVD_PGFSM_STATUS__UVDTB_PWR_STATUS__SHIFT                                                             0x18 +#define UVD_PGFSM_STATUS__UVDNA_PWR_STATUS__SHIFT                                                             0x1a +#define UVD_PGFSM_STATUS__UVDNB_PWR_STATUS__SHIFT                                                             0x1c +#define UVD_PGFSM_STATUS__UVDM_PWR_STATUS_MASK                                                                0x00000003L +#define UVD_PGFSM_STATUS__UVDS_PWR_STATUS_MASK                                                                0x0000000CL +#define UVD_PGFSM_STATUS__UVDF_PWR_STATUS_MASK                                                                0x00000030L +#define UVD_PGFSM_STATUS__UVDTC_PWR_STATUS_MASK                                                               0x000000C0L +#define UVD_PGFSM_STATUS__UVDB_PWR_STATUS_MASK                                                                0x00000300L +#define UVD_PGFSM_STATUS__UVDTA_PWR_STATUS_MASK                                                               0x00000C00L +#define UVD_PGFSM_STATUS__UVDLM_PWR_STATUS_MASK                                                               0x00003000L +#define UVD_PGFSM_STATUS__UVDTD_PWR_STATUS_MASK                                                               0x0000C000L +#define UVD_PGFSM_STATUS__UVDTE_PWR_STATUS_MASK                                                               0x00030000L +#define UVD_PGFSM_STATUS__UVDE_PWR_STATUS_MASK                                                                0x000C0000L +#define UVD_PGFSM_STATUS__UVDAB_PWR_STATUS_MASK                                                               0x00300000L +#define UVD_PGFSM_STATUS__UVDJ_PWR_STATUS_MASK                                                                0x00C00000L +#define UVD_PGFSM_STATUS__UVDTB_PWR_STATUS_MASK                                                               0x03000000L +#define UVD_PGFSM_STATUS__UVDNA_PWR_STATUS_MASK                                                               0x0C000000L +#define UVD_PGFSM_STATUS__UVDNB_PWR_STATUS_MASK                                                               0x30000000L +//UVD_POWER_STATUS +#define UVD_POWER_STATUS__UVD_POWER_STATUS__SHIFT                                                             0x0 +#define UVD_POWER_STATUS__UVD_PG_MODE__SHIFT                                                                  0x2 +#define UVD_POWER_STATUS__UVD_CG_MODE__SHIFT                                                                  0x4 +#define UVD_POWER_STATUS__UVD_PG_EN__SHIFT                                                                    0x8 +#define UVD_POWER_STATUS__RBC_SNOOP_DIS__SHIFT                                                                0x9 +#define UVD_POWER_STATUS__SW_RB_SNOOP_DIS__SHIFT                                                              0xb +#define UVD_POWER_STATUS__STALL_DPG_POWER_UP__SHIFT                                                           0x1f +#define UVD_POWER_STATUS__UVD_POWER_STATUS_MASK                                                               0x00000003L +#define UVD_POWER_STATUS__UVD_PG_MODE_MASK                                                                    0x00000004L +#define UVD_POWER_STATUS__UVD_CG_MODE_MASK                                                                    0x00000030L +#define UVD_POWER_STATUS__UVD_PG_EN_MASK                                                                      0x00000100L +#define UVD_POWER_STATUS__RBC_SNOOP_DIS_MASK                                                                  0x00000200L +#define UVD_POWER_STATUS__SW_RB_SNOOP_DIS_MASK                                                                0x00000800L +#define UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK                                                             0x80000000L +//UVD_JPEG_POWER_STATUS +#define UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS__SHIFT                                                       0x0 +#define UVD_JPEG_POWER_STATUS__JPEG_PG_MODE__SHIFT                                                            0x4 +#define UVD_JPEG_POWER_STATUS__JRBC_DEC_SNOOP_DIS__SHIFT                                                      0x8 +#define UVD_JPEG_POWER_STATUS__JRBC_ENC_SNOOP_DIS__SHIFT                                                      0x9 +#define UVD_JPEG_POWER_STATUS__STALL_JDPG_POWER_UP__SHIFT                                                     0x1f +#define UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK                                                         0x00000001L +#define UVD_JPEG_POWER_STATUS__JPEG_PG_MODE_MASK                                                              0x00000010L +#define UVD_JPEG_POWER_STATUS__JRBC_DEC_SNOOP_DIS_MASK                                                        0x00000100L +#define UVD_JPEG_POWER_STATUS__JRBC_ENC_SNOOP_DIS_MASK                                                        0x00000200L +#define UVD_JPEG_POWER_STATUS__STALL_JDPG_POWER_UP_MASK                                                       0x80000000L +//UVD_MC_DJPEG_RD_SPACE +#define UVD_MC_DJPEG_RD_SPACE__DJPEG_RD_SPACE__SHIFT                                                          0x0 +#define UVD_MC_DJPEG_RD_SPACE__DJPEG_RD_SPACE_MASK                                                            0x0003FFFFL +//UVD_MC_DJPEG_WR_SPACE +#define UVD_MC_DJPEG_WR_SPACE__DJPEG_WR_SPACE__SHIFT                                                          0x0 +#define UVD_MC_DJPEG_WR_SPACE__DJPEG_WR_SPACE_MASK                                                            0x0003FFFFL +//UVD_MC_EJPEG_RD_SPACE +#define UVD_MC_EJPEG_RD_SPACE__EJPEG_RD_SPACE__SHIFT                                                          0x0 +#define UVD_MC_EJPEG_RD_SPACE__EJPEG_RD_SPACE_MASK                                                            0x0003FFFFL +//UVD_MC_EJPEG_WR_SPACE +#define UVD_MC_EJPEG_WR_SPACE__EJPEG_WR_SPACE__SHIFT                                                          0x0 +#define UVD_MC_EJPEG_WR_SPACE__EJPEG_WR_SPACE_MASK                                                            0x0003FFFFL +//UVD_PG_IND_INDEX +#define UVD_PG_IND_INDEX__INDEX__SHIFT                                                                        0x0 +#define UVD_PG_IND_INDEX__INDEX_MASK                                                                          0x0000003FL +//UVD_PG_IND_DATA +#define UVD_PG_IND_DATA__DATA__SHIFT                                                                          0x0 +#define UVD_PG_IND_DATA__DATA_MASK                                                                            0xFFFFFFFFL +//CC_UVD_HARVESTING +#define CC_UVD_HARVESTING__MMSCH_DISABLE__SHIFT                                                               0x0 +#define CC_UVD_HARVESTING__UVD_DISABLE__SHIFT                                                                 0x1 +#define CC_UVD_HARVESTING__MMSCH_DISABLE_MASK                                                                 0x00000001L +#define CC_UVD_HARVESTING__UVD_DISABLE_MASK                                                                   0x00000002L +//UVD_DPG_LMA_CTL +#define UVD_DPG_LMA_CTL__READ_WRITE__SHIFT                                                                    0x0 +#define UVD_DPG_LMA_CTL__MASK_EN__SHIFT                                                                       0x1 +#define UVD_DPG_LMA_CTL__ADDR_AUTO_INCREMENT__SHIFT                                                           0x2 +#define UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT                                                                      0x4 +#define UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT                                                               0x10 +#define UVD_DPG_LMA_CTL__READ_WRITE_MASK                                                                      0x00000001L +#define UVD_DPG_LMA_CTL__MASK_EN_MASK                                                                         0x00000002L +#define UVD_DPG_LMA_CTL__ADDR_AUTO_INCREMENT_MASK                                                             0x00000004L +#define UVD_DPG_LMA_CTL__SRAM_SEL_MASK                                                                        0x00000010L +#define UVD_DPG_LMA_CTL__READ_WRITE_ADDR_MASK                                                                 0xFFFF0000L +//UVD_DPG_LMA_DATA +#define UVD_DPG_LMA_DATA__LMA_DATA__SHIFT                                                                     0x0 +#define UVD_DPG_LMA_DATA__LMA_DATA_MASK                                                                       0xFFFFFFFFL +//UVD_DPG_LMA_MASK +#define UVD_DPG_LMA_MASK__LMA_MASK__SHIFT                                                                     0x0 +#define UVD_DPG_LMA_MASK__LMA_MASK_MASK                                                                       0xFFFFFFFFL +//UVD_DPG_PAUSE +#define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ__SHIFT                                                              0x0 +#define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK__SHIFT                                                              0x1 +#define UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ__SHIFT                                                                0x2 +#define UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK__SHIFT                                                                0x3 +#define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ_MASK                                                                0x00000001L +#define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK                                                                0x00000002L +#define UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK                                                                  0x00000004L +#define UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK                                                                  0x00000008L +//UVD_SCRATCH1 +#define UVD_SCRATCH1__SCRATCH1_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH1__SCRATCH1_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH2 +#define UVD_SCRATCH2__SCRATCH2_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH2__SCRATCH2_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH3 +#define UVD_SCRATCH3__SCRATCH3_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH3__SCRATCH3_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH4 +#define UVD_SCRATCH4__SCRATCH4_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH4__SCRATCH4_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH5 +#define UVD_SCRATCH5__SCRATCH5_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH5__SCRATCH5_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH6 +#define UVD_SCRATCH6__SCRATCH6_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH6__SCRATCH6_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH7 +#define UVD_SCRATCH7__SCRATCH7_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH7__SCRATCH7_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH8 +#define UVD_SCRATCH8__SCRATCH8_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH8__SCRATCH8_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH9 +#define UVD_SCRATCH9__SCRATCH9_DATA__SHIFT                                                                    0x0 +#define UVD_SCRATCH9__SCRATCH9_DATA_MASK                                                                      0xFFFFFFFFL +//UVD_SCRATCH10 +#define UVD_SCRATCH10__SCRATCH10_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH10__SCRATCH10_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_SCRATCH11 +#define UVD_SCRATCH11__SCRATCH11_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH11__SCRATCH11_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_SCRATCH12 +#define UVD_SCRATCH12__SCRATCH12_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH12__SCRATCH12_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_SCRATCH13 +#define UVD_SCRATCH13__SCRATCH13_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH13__SCRATCH13_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_SCRATCH14 +#define UVD_SCRATCH14__SCRATCH14_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH14__SCRATCH14_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_FREE_COUNTER_REG +#define UVD_FREE_COUNTER_REG__FREE_COUNTER__SHIFT                                                             0x0 +#define UVD_FREE_COUNTER_REG__FREE_COUNTER_MASK                                                               0xFFFFFFFFL +//UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_LOW +#define UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                0x0 +#define UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_LOW__BITS_31_0_MASK                                                  0xFFFFFFFFL +//UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_HIGH +#define UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                              0x0 +#define UVD_DPG_LMI_VCPU_CACHE_64BIT_BAR_HIGH__BITS_63_32_MASK                                                0xFFFFFFFFL +//UVD_DPG_VCPU_CACHE_OFFSET0 +#define UVD_DPG_VCPU_CACHE_OFFSET0__CACHE_OFFSET0__SHIFT                                                      0x0 +#define UVD_DPG_VCPU_CACHE_OFFSET0__CACHE_OFFSET0_MASK                                                        0x01FFFFFFL +//UVD_DPG_LMI_VCPU_CACHE_VMID +#define UVD_DPG_LMI_VCPU_CACHE_VMID__VCPU_CACHE_VMID__SHIFT                                                   0x0 +#define UVD_DPG_LMI_VCPU_CACHE_VMID__VCPU_CACHE_VMID_MASK                                                     0x0000000FL +//UVD_REG_FILTER_EN +#define UVD_REG_FILTER_EN__UVD_REG_FILTER_EN__SHIFT                                                           0x0 +#define UVD_REG_FILTER_EN__MMSCH_HI_PRIV__SHIFT                                                               0x1 +#define UVD_REG_FILTER_EN__VIDEO_PRIV_EN__SHIFT                                                               0x2 +#define UVD_REG_FILTER_EN__JPEG_PRIV_EN__SHIFT                                                                0x3 +#define UVD_REG_FILTER_EN__UVD_REG_FILTER_EN_MASK                                                             0x00000001L +#define UVD_REG_FILTER_EN__MMSCH_HI_PRIV_MASK                                                                 0x00000002L +#define UVD_REG_FILTER_EN__VIDEO_PRIV_EN_MASK                                                                 0x00000004L +#define UVD_REG_FILTER_EN__JPEG_PRIV_EN_MASK                                                                  0x00000008L +//UVD_SECURITY_REG_VIO_REPORT +#define UVD_SECURITY_REG_VIO_REPORT__HOST_REG_VIO__SHIFT                                                      0x0 +#define UVD_SECURITY_REG_VIO_REPORT__VCPU_REG_VIO__SHIFT                                                      0x1 +#define UVD_SECURITY_REG_VIO_REPORT__VIDEO_REG_VIO__SHIFT                                                     0x2 +#define UVD_SECURITY_REG_VIO_REPORT__DPG_REG_VIO__SHIFT                                                       0x3 +#define UVD_SECURITY_REG_VIO_REPORT__JPEG_REG_VIO__SHIFT                                                      0x4 +#define UVD_SECURITY_REG_VIO_REPORT__JDPG_REG_VIO__SHIFT                                                      0x5 +#define UVD_SECURITY_REG_VIO_REPORT__HOST_REG_VIO_MASK                                                        0x00000001L +#define UVD_SECURITY_REG_VIO_REPORT__VCPU_REG_VIO_MASK                                                        0x00000002L +#define UVD_SECURITY_REG_VIO_REPORT__VIDEO_REG_VIO_MASK                                                       0x00000004L +#define UVD_SECURITY_REG_VIO_REPORT__DPG_REG_VIO_MASK                                                         0x00000008L +#define UVD_SECURITY_REG_VIO_REPORT__JPEG_REG_VIO_MASK                                                        0x00000010L +#define UVD_SECURITY_REG_VIO_REPORT__JDPG_REG_VIO_MASK                                                        0x00000020L +//UVD_FW_VERSION +#define UVD_FW_VERSION__FW_VERSION__SHIFT                                                                     0x0 +#define UVD_FW_VERSION__FW_VERSION_MASK                                                                       0xFFFFFFFFL +//UVD_PF_STATUS +#define UVD_PF_STATUS__JPEG_PF_OCCURED__SHIFT                                                                 0x0 +#define UVD_PF_STATUS__NJ_PF_OCCURED__SHIFT                                                                   0x1 +#define UVD_PF_STATUS__ENCODER0_PF_OCCURED__SHIFT                                                             0x2 +#define UVD_PF_STATUS__ENCODER1_PF_OCCURED__SHIFT                                                             0x3 +#define UVD_PF_STATUS__ENCODER2_PF_OCCURED__SHIFT                                                             0x4 +#define UVD_PF_STATUS__ENCODER3_PF_OCCURED__SHIFT                                                             0x5 +#define UVD_PF_STATUS__ENCODER4_PF_OCCURED__SHIFT                                                             0x6 +#define UVD_PF_STATUS__EJPEG_PF_OCCURED__SHIFT                                                                0x7 +#define UVD_PF_STATUS__JPEG_PF_CLEAR__SHIFT                                                                   0x8 +#define UVD_PF_STATUS__NJ_PF_CLEAR__SHIFT                                                                     0x9 +#define UVD_PF_STATUS__ENCODER0_PF_CLEAR__SHIFT                                                               0xa +#define UVD_PF_STATUS__ENCODER1_PF_CLEAR__SHIFT                                                               0xb +#define UVD_PF_STATUS__ENCODER2_PF_CLEAR__SHIFT                                                               0xc +#define UVD_PF_STATUS__ENCODER3_PF_CLEAR__SHIFT                                                               0xd +#define UVD_PF_STATUS__ENCODER4_PF_CLEAR__SHIFT                                                               0xe +#define UVD_PF_STATUS__EJPEG_PF_CLEAR__SHIFT                                                                  0xf +#define UVD_PF_STATUS__NJ_ATM_PF_OCCURED__SHIFT                                                               0x10 +#define UVD_PF_STATUS__DJ_ATM_PF_OCCURED__SHIFT                                                               0x11 +#define UVD_PF_STATUS__EJ_ATM_PF_OCCURED__SHIFT                                                               0x12 +#define UVD_PF_STATUS__JPEG2_PF_OCCURED__SHIFT                                                                0x13 +#define UVD_PF_STATUS__DJ2_ATM_PF_OCCURED__SHIFT                                                              0x14 +#define UVD_PF_STATUS__JPEG2_PF_CLEAR__SHIFT                                                                  0x15 +#define UVD_PF_STATUS__ENCODER5_PF_OCCURED__SHIFT                                                             0x16 +#define UVD_PF_STATUS__ENCODER5_PF_CLEAR__SHIFT                                                               0x17 +#define UVD_PF_STATUS__JPEG_PF_OCCURED_MASK                                                                   0x00000001L +#define UVD_PF_STATUS__NJ_PF_OCCURED_MASK                                                                     0x00000002L +#define UVD_PF_STATUS__ENCODER0_PF_OCCURED_MASK                                                               0x00000004L +#define UVD_PF_STATUS__ENCODER1_PF_OCCURED_MASK                                                               0x00000008L +#define UVD_PF_STATUS__ENCODER2_PF_OCCURED_MASK                                                               0x00000010L +#define UVD_PF_STATUS__ENCODER3_PF_OCCURED_MASK                                                               0x00000020L +#define UVD_PF_STATUS__ENCODER4_PF_OCCURED_MASK                                                               0x00000040L +#define UVD_PF_STATUS__EJPEG_PF_OCCURED_MASK                                                                  0x00000080L +#define UVD_PF_STATUS__JPEG_PF_CLEAR_MASK                                                                     0x00000100L +#define UVD_PF_STATUS__NJ_PF_CLEAR_MASK                                                                       0x00000200L +#define UVD_PF_STATUS__ENCODER0_PF_CLEAR_MASK                                                                 0x00000400L +#define UVD_PF_STATUS__ENCODER1_PF_CLEAR_MASK                                                                 0x00000800L +#define UVD_PF_STATUS__ENCODER2_PF_CLEAR_MASK                                                                 0x00001000L +#define UVD_PF_STATUS__ENCODER3_PF_CLEAR_MASK                                                                 0x00002000L +#define UVD_PF_STATUS__ENCODER4_PF_CLEAR_MASK                                                                 0x00004000L +#define UVD_PF_STATUS__EJPEG_PF_CLEAR_MASK                                                                    0x00008000L +#define UVD_PF_STATUS__NJ_ATM_PF_OCCURED_MASK                                                                 0x00010000L +#define UVD_PF_STATUS__DJ_ATM_PF_OCCURED_MASK                                                                 0x00020000L +#define UVD_PF_STATUS__EJ_ATM_PF_OCCURED_MASK                                                                 0x00040000L +#define UVD_PF_STATUS__JPEG2_PF_OCCURED_MASK                                                                  0x00080000L +#define UVD_PF_STATUS__DJ2_ATM_PF_OCCURED_MASK                                                                0x00100000L +#define UVD_PF_STATUS__JPEG2_PF_CLEAR_MASK                                                                    0x00200000L +#define UVD_PF_STATUS__ENCODER5_PF_OCCURED_MASK                                                               0x00400000L +#define UVD_PF_STATUS__ENCODER5_PF_CLEAR_MASK                                                                 0x00800000L +//UVD_DPG_CLK_EN_VCPU_REPORT +#define UVD_DPG_CLK_EN_VCPU_REPORT__CLK_EN__SHIFT                                                             0x0 +#define UVD_DPG_CLK_EN_VCPU_REPORT__VCPU_REPORT__SHIFT                                                        0x1 +#define UVD_DPG_CLK_EN_VCPU_REPORT__CLK_EN_MASK                                                               0x00000001L +#define UVD_DPG_CLK_EN_VCPU_REPORT__VCPU_REPORT_MASK                                                          0x000000FEL +//CC_UVD_VCPU_ERR_DETECT_BOT_LO +#define CC_UVD_VCPU_ERR_DETECT_BOT_LO__UVD_VCPU_ERR_DETECT_BOT_LO__SHIFT                                      0xc +#define CC_UVD_VCPU_ERR_DETECT_BOT_LO__UVD_VCPU_ERR_DETECT_BOT_LO_MASK                                        0xFFFFF000L +//CC_UVD_VCPU_ERR_DETECT_BOT_HI +#define CC_UVD_VCPU_ERR_DETECT_BOT_HI__UVD_VCPU_ERR_DETECT_BOT_HI__SHIFT                                      0x0 +#define CC_UVD_VCPU_ERR_DETECT_BOT_HI__UVD_VCPU_ERR_DETECT_BOT_HI_MASK                                        0x0000FFFFL +//CC_UVD_VCPU_ERR_DETECT_TOP_LO +#define CC_UVD_VCPU_ERR_DETECT_TOP_LO__UVD_VCPU_ERR_DETECT_TOP_LO__SHIFT                                      0xc +#define CC_UVD_VCPU_ERR_DETECT_TOP_LO__UVD_VCPU_ERR_DETECT_TOP_LO_MASK                                        0xFFFFF000L +//CC_UVD_VCPU_ERR_DETECT_TOP_HI +#define CC_UVD_VCPU_ERR_DETECT_TOP_HI__UVD_VCPU_ERR_DETECT_TOP_HI__SHIFT                                      0x0 +#define CC_UVD_VCPU_ERR_DETECT_TOP_HI__UVD_VCPU_ERR_DETECT_TOP_HI_MASK                                        0x0000FFFFL +//CC_UVD_VCPU_ERR +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_STATUS__SHIFT                                                           0x0 +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_CLEAR__SHIFT                                                            0x1 +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_DETECT_EN__SHIFT                                                        0x2 +#define CC_UVD_VCPU_ERR__UVD_TMZ_DBG_DIS__SHIFT                                                               0x3 +#define CC_UVD_VCPU_ERR__RESET_ON_FAULT__SHIFT                                                                0x4 +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_STATUS_MASK                                                             0x00000001L +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_CLEAR_MASK                                                              0x00000002L +#define CC_UVD_VCPU_ERR__UVD_VCPU_ERR_DETECT_EN_MASK                                                          0x00000004L +#define CC_UVD_VCPU_ERR__UVD_TMZ_DBG_DIS_MASK                                                                 0x00000008L +#define CC_UVD_VCPU_ERR__RESET_ON_FAULT_MASK                                                                  0x00000010L +//CC_UVD_VCPU_ERR_INST_ADDR_LO +#define CC_UVD_VCPU_ERR_INST_ADDR_LO__UVD_VCPU_ERR_INST_ADDR_LO__SHIFT                                        0x0 +#define CC_UVD_VCPU_ERR_INST_ADDR_LO__UVD_VCPU_ERR_INST_ADDR_LO_MASK                                          0xFFFFFFFFL +//CC_UVD_VCPU_ERR_INST_ADDR_HI +#define CC_UVD_VCPU_ERR_INST_ADDR_HI__UVD_VCPU_ERR_INST_ADDR_HI__SHIFT                                        0x0 +#define CC_UVD_VCPU_ERR_INST_ADDR_HI__UVD_VCPU_ERR_INST_ADDR_HI_MASK                                          0x0000FFFFL +//UVD_LMI_MMSCH_NC_SPACE +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC0_SPACE__SHIFT                                                        0x0 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC1_SPACE__SHIFT                                                        0x3 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC2_SPACE__SHIFT                                                        0x6 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC3_SPACE__SHIFT                                                        0x9 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC4_SPACE__SHIFT                                                        0xc +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC5_SPACE__SHIFT                                                        0xf +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC6_SPACE__SHIFT                                                        0x12 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC7_SPACE__SHIFT                                                        0x15 +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC0_SPACE_MASK                                                          0x00000007L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC1_SPACE_MASK                                                          0x00000038L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC2_SPACE_MASK                                                          0x000001C0L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC3_SPACE_MASK                                                          0x00000E00L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC4_SPACE_MASK                                                          0x00007000L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC5_SPACE_MASK                                                          0x00038000L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC6_SPACE_MASK                                                          0x001C0000L +#define UVD_LMI_MMSCH_NC_SPACE__MMSCH_NC7_SPACE_MASK                                                          0x00E00000L +//UVD_LMI_ATOMIC_SPACE +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER0_SPACE__SHIFT                                                       0x0 +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER1_SPACE__SHIFT                                                       0x3 +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER2_SPACE__SHIFT                                                       0x6 +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER3_SPACE__SHIFT                                                       0x9 +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER0_SPACE_MASK                                                         0x00000007L +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER1_SPACE_MASK                                                         0x00000038L +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER2_SPACE_MASK                                                         0x000001C0L +#define UVD_LMI_ATOMIC_SPACE__ATOMIC_USER3_SPACE_MASK                                                         0x00000E00L +//UVD_GFX8_ADDR_CONFIG +#define UVD_GFX8_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE__SHIFT                                                     0x4 +#define UVD_GFX8_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE_MASK                                                       0x00000070L +//UVD_GFX10_ADDR_CONFIG +#define UVD_GFX10_ADDR_CONFIG__NUM_PIPES__SHIFT                                                               0x0 +#define UVD_GFX10_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE__SHIFT                                                    0x3 +#define UVD_GFX10_ADDR_CONFIG__MAX_COMPRESSED_FRAGS__SHIFT                                                    0x6 +#define UVD_GFX10_ADDR_CONFIG__NUM_PKRS__SHIFT                                                                0x8 +#define UVD_GFX10_ADDR_CONFIG__NUM_BANKS__SHIFT                                                               0xc +#define UVD_GFX10_ADDR_CONFIG__NUM_SHADER_ENGINES__SHIFT                                                      0x13 +#define UVD_GFX10_ADDR_CONFIG__NUM_PIPES_MASK                                                                 0x00000007L +#define UVD_GFX10_ADDR_CONFIG__PIPE_INTERLEAVE_SIZE_MASK                                                      0x00000038L +#define UVD_GFX10_ADDR_CONFIG__MAX_COMPRESSED_FRAGS_MASK                                                      0x000000C0L +#define UVD_GFX10_ADDR_CONFIG__NUM_PKRS_MASK                                                                  0x00000700L +#define UVD_GFX10_ADDR_CONFIG__NUM_BANKS_MASK                                                                 0x00007000L +#define UVD_GFX10_ADDR_CONFIG__NUM_SHADER_ENGINES_MASK                                                        0x00180000L +//UVD_GPCNT2_CNTL +#define UVD_GPCNT2_CNTL__CLR__SHIFT                                                                           0x0 +#define UVD_GPCNT2_CNTL__START__SHIFT                                                                         0x1 +#define UVD_GPCNT2_CNTL__COUNTUP__SHIFT                                                                       0x2 +#define UVD_GPCNT2_CNTL__CLR_MASK                                                                             0x00000001L +#define UVD_GPCNT2_CNTL__START_MASK                                                                           0x00000002L +#define UVD_GPCNT2_CNTL__COUNTUP_MASK                                                                         0x00000004L +//UVD_GPCNT2_TARGET_LOWER +#define UVD_GPCNT2_TARGET_LOWER__TARGET__SHIFT                                                                0x0 +#define UVD_GPCNT2_TARGET_LOWER__TARGET_MASK                                                                  0xFFFFFFFFL +//UVD_GPCNT2_STATUS_LOWER +#define UVD_GPCNT2_STATUS_LOWER__COUNT__SHIFT                                                                 0x0 +#define UVD_GPCNT2_STATUS_LOWER__COUNT_MASK                                                                   0xFFFFFFFFL +//UVD_GPCNT2_TARGET_UPPER +#define UVD_GPCNT2_TARGET_UPPER__TARGET__SHIFT                                                                0x0 +#define UVD_GPCNT2_TARGET_UPPER__TARGET_MASK                                                                  0x0000FFFFL +//UVD_GPCNT2_STATUS_UPPER +#define UVD_GPCNT2_STATUS_UPPER__COUNT__SHIFT                                                                 0x0 +#define UVD_GPCNT2_STATUS_UPPER__COUNT_MASK                                                                   0x0000FFFFL +//UVD_GPCNT3_CNTL +#define UVD_GPCNT3_CNTL__CLR__SHIFT                                                                           0x0 +#define UVD_GPCNT3_CNTL__START__SHIFT                                                                         0x1 +#define UVD_GPCNT3_CNTL__COUNTUP__SHIFT                                                                       0x2 +#define UVD_GPCNT3_CNTL__FREQ__SHIFT                                                                          0x3 +#define UVD_GPCNT3_CNTL__DIV__SHIFT                                                                           0xa +#define UVD_GPCNT3_CNTL__CLR_MASK                                                                             0x00000001L +#define UVD_GPCNT3_CNTL__START_MASK                                                                           0x00000002L +#define UVD_GPCNT3_CNTL__COUNTUP_MASK                                                                         0x00000004L +#define UVD_GPCNT3_CNTL__FREQ_MASK                                                                            0x000003F8L +#define UVD_GPCNT3_CNTL__DIV_MASK                                                                             0x0001FC00L +//UVD_GPCNT3_TARGET_LOWER +#define UVD_GPCNT3_TARGET_LOWER__TARGET__SHIFT                                                                0x0 +#define UVD_GPCNT3_TARGET_LOWER__TARGET_MASK                                                                  0xFFFFFFFFL +//UVD_GPCNT3_STATUS_LOWER +#define UVD_GPCNT3_STATUS_LOWER__COUNT__SHIFT                                                                 0x0 +#define UVD_GPCNT3_STATUS_LOWER__COUNT_MASK                                                                   0xFFFFFFFFL +//UVD_GPCNT3_TARGET_UPPER +#define UVD_GPCNT3_TARGET_UPPER__TARGET__SHIFT                                                                0x0 +#define UVD_GPCNT3_TARGET_UPPER__TARGET_MASK                                                                  0x0000FFFFL +//UVD_GPCNT3_STATUS_UPPER +#define UVD_GPCNT3_STATUS_UPPER__COUNT__SHIFT                                                                 0x0 +#define UVD_GPCNT3_STATUS_UPPER__COUNT_MASK                                                                   0x0000FFFFL +//UVD_VCLK_DS_CNTL +#define UVD_VCLK_DS_CNTL__VCLK_DS_EN__SHIFT                                                                   0x0 +#define UVD_VCLK_DS_CNTL__VCLK_DS_STATUS__SHIFT                                                               0x4 +#define UVD_VCLK_DS_CNTL__VCLK_DS_HYSTERESIS_CNT__SHIFT                                                       0x10 +#define UVD_VCLK_DS_CNTL__VCLK_DS_EN_MASK                                                                     0x00000001L +#define UVD_VCLK_DS_CNTL__VCLK_DS_STATUS_MASK                                                                 0x00000010L +#define UVD_VCLK_DS_CNTL__VCLK_DS_HYSTERESIS_CNT_MASK                                                         0xFFFF0000L +//UVD_DCLK_DS_CNTL +#define UVD_DCLK_DS_CNTL__DCLK_DS_EN__SHIFT                                                                   0x0 +#define UVD_DCLK_DS_CNTL__DCLK_DS_STATUS__SHIFT                                                               0x4 +#define UVD_DCLK_DS_CNTL__DCLK_DS_HYSTERESIS_CNT__SHIFT                                                       0x10 +#define UVD_DCLK_DS_CNTL__DCLK_DS_EN_MASK                                                                     0x00000001L +#define UVD_DCLK_DS_CNTL__DCLK_DS_STATUS_MASK                                                                 0x00000010L +#define UVD_DCLK_DS_CNTL__DCLK_DS_HYSTERESIS_CNT_MASK                                                         0xFFFF0000L +//UVD_TSC_LOWER +#define UVD_TSC_LOWER__COUNT__SHIFT                                                                           0x0 +#define UVD_TSC_LOWER__COUNT_MASK                                                                             0xFFFFFFFFL +//UVD_TSC_UPPER +#define UVD_TSC_UPPER__COUNT__SHIFT                                                                           0x0 +#define UVD_TSC_UPPER__COUNT_MASK                                                                             0x00FFFFFFL +//VCN_FEATURES +#define VCN_FEATURES__HAS_VIDEO_DEC__SHIFT                                                                    0x0 +#define VCN_FEATURES__HAS_VIDEO_ENC__SHIFT                                                                    0x1 +#define VCN_FEATURES__HAS_MJPEG_DEC__SHIFT                                                                    0x2 +#define VCN_FEATURES__HAS_MJPEG_ENC__SHIFT                                                                    0x3 +#define VCN_FEATURES__HAS_VIDEO_VIRT__SHIFT                                                                   0x4 +#define VCN_FEATURES__HAS_H264_LEGACY_DEC__SHIFT                                                              0x5 +#define VCN_FEATURES__HAS_UDEC_DEC__SHIFT                                                                     0x6 +#define VCN_FEATURES__HAS_MJPEG2_IDCT_DEC__SHIFT                                                              0x7 +#define VCN_FEATURES__HAS_SCLR_DEC__SHIFT                                                                     0x8 +#define VCN_FEATURES__HAS_VP9_DEC__SHIFT                                                                      0x9 +#define VCN_FEATURES__HAS_AV1_DEC__SHIFT                                                                      0xa +#define VCN_FEATURES__HAS_EFC_ENC__SHIFT                                                                      0xb +#define VCN_FEATURES__HAS_EFC_HDR2SDR_ENC__SHIFT                                                              0xc +#define VCN_FEATURES__HAS_DUAL_MJPEG_DEC__SHIFT                                                               0xd +#define VCN_FEATURES__HAS_AV1_ENC__SHIFT                                                                      0xe +#define VCN_FEATURES__INSTANCE_ID__SHIFT                                                                      0x1c +#define VCN_FEATURES__HAS_VIDEO_DEC_MASK                                                                      0x00000001L +#define VCN_FEATURES__HAS_VIDEO_ENC_MASK                                                                      0x00000002L +#define VCN_FEATURES__HAS_MJPEG_DEC_MASK                                                                      0x00000004L +#define VCN_FEATURES__HAS_MJPEG_ENC_MASK                                                                      0x00000008L +#define VCN_FEATURES__HAS_VIDEO_VIRT_MASK                                                                     0x00000010L +#define VCN_FEATURES__HAS_H264_LEGACY_DEC_MASK                                                                0x00000020L +#define VCN_FEATURES__HAS_UDEC_DEC_MASK                                                                       0x00000040L +#define VCN_FEATURES__HAS_MJPEG2_IDCT_DEC_MASK                                                                0x00000080L +#define VCN_FEATURES__HAS_SCLR_DEC_MASK                                                                       0x00000100L +#define VCN_FEATURES__HAS_VP9_DEC_MASK                                                                        0x00000200L +#define VCN_FEATURES__HAS_AV1_DEC_MASK                                                                        0x00000400L +#define VCN_FEATURES__HAS_EFC_ENC_MASK                                                                        0x00000800L +#define VCN_FEATURES__HAS_EFC_HDR2SDR_ENC_MASK                                                                0x00001000L +#define VCN_FEATURES__HAS_DUAL_MJPEG_DEC_MASK                                                                 0x00002000L +#define VCN_FEATURES__HAS_AV1_ENC_MASK                                                                        0x00004000L +#define VCN_FEATURES__INSTANCE_ID_MASK                                                                        0xF0000000L +//UVD_GPUIOV_STATUS +#define UVD_GPUIOV_STATUS__UVD_GPUIOV_STATUS_VF_ENABLE__SHIFT                                                 0x0 +#define UVD_GPUIOV_STATUS__UVD_GPUIOV_STATUS_VF_ENABLE_MASK                                                   0x00000001L +//UVD_RAS_VCPU_VCODEC_STATUS +#define UVD_RAS_VCPU_VCODEC_STATUS__POISONED_VF__SHIFT                                                        0x0 +#define UVD_RAS_VCPU_VCODEC_STATUS__POISONED_PF__SHIFT                                                        0x1f +#define UVD_RAS_VCPU_VCODEC_STATUS__POISONED_VF_MASK                                                          0x7FFFFFFFL +#define UVD_RAS_VCPU_VCODEC_STATUS__POISONED_PF_MASK                                                          0x80000000L +//UVD_RAS_MMSCH_FATAL_ERROR +#define UVD_RAS_MMSCH_FATAL_ERROR__POISONED_VF__SHIFT                                                         0x0 +#define UVD_RAS_MMSCH_FATAL_ERROR__POISONED_PF__SHIFT                                                         0x1f +#define UVD_RAS_MMSCH_FATAL_ERROR__POISONED_VF_MASK                                                           0x7FFFFFFFL +#define UVD_RAS_MMSCH_FATAL_ERROR__POISONED_PF_MASK                                                           0x80000000L +//UVD_RAS_JPEG0_STATUS +#define UVD_RAS_JPEG0_STATUS__POISONED_VF__SHIFT                                                              0x0 +#define UVD_RAS_JPEG0_STATUS__POISONED_PF__SHIFT                                                              0x1f +#define UVD_RAS_JPEG0_STATUS__POISONED_VF_MASK                                                                0x7FFFFFFFL +#define UVD_RAS_JPEG0_STATUS__POISONED_PF_MASK                                                                0x80000000L +//UVD_RAS_JPEG1_STATUS +#define UVD_RAS_JPEG1_STATUS__POISONED_VF__SHIFT                                                              0x0 +#define UVD_RAS_JPEG1_STATUS__POISONED_PF__SHIFT                                                              0x1f +#define UVD_RAS_JPEG1_STATUS__POISONED_VF_MASK                                                                0x7FFFFFFFL +#define UVD_RAS_JPEG1_STATUS__POISONED_PF_MASK                                                                0x80000000L +//UVD_RAS_CNTL_PMI_ARB +#define UVD_RAS_CNTL_PMI_ARB__STAT_VCPU_VCODEC__SHIFT                                                         0x0 +#define UVD_RAS_CNTL_PMI_ARB__ACK_VCPU_VCODEC__SHIFT                                                          0x1 +#define UVD_RAS_CNTL_PMI_ARB__STAT_MMSCH__SHIFT                                                               0x2 +#define UVD_RAS_CNTL_PMI_ARB__ACK_MMSCH__SHIFT                                                                0x3 +#define UVD_RAS_CNTL_PMI_ARB__STAT_JPEG0__SHIFT                                                               0x4 +#define UVD_RAS_CNTL_PMI_ARB__ACK_JPEG0__SHIFT                                                                0x5 +#define UVD_RAS_CNTL_PMI_ARB__STAT_JPEG1__SHIFT                                                               0x6 +#define UVD_RAS_CNTL_PMI_ARB__ACK_JPEG1__SHIFT                                                                0x7 +#define UVD_RAS_CNTL_PMI_ARB__STAT_VCPU_VCODEC_MASK                                                           0x00000001L +#define UVD_RAS_CNTL_PMI_ARB__ACK_VCPU_VCODEC_MASK                                                            0x00000002L +#define UVD_RAS_CNTL_PMI_ARB__STAT_MMSCH_MASK                                                                 0x00000004L +#define UVD_RAS_CNTL_PMI_ARB__ACK_MMSCH_MASK                                                                  0x00000008L +#define UVD_RAS_CNTL_PMI_ARB__STAT_JPEG0_MASK                                                                 0x00000010L +#define UVD_RAS_CNTL_PMI_ARB__ACK_JPEG0_MASK                                                                  0x00000020L +#define UVD_RAS_CNTL_PMI_ARB__STAT_JPEG1_MASK                                                                 0x00000040L +#define UVD_RAS_CNTL_PMI_ARB__ACK_JPEG1_MASK                                                                  0x00000080L +//UVD_SCRATCH15 +#define UVD_SCRATCH15__SCRATCH15_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH15__SCRATCH15_DATA_MASK                                                                    0xFFFFFFFFL +//VCN_JPEG_DB_CTRL1 +#define VCN_JPEG_DB_CTRL1__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL1__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL1__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL1__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL1__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL1__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL2 +#define VCN_JPEG_DB_CTRL2__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL2__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL2__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL2__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL2__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL2__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL3 +#define VCN_JPEG_DB_CTRL3__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL3__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL3__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL3__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL3__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL3__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL4 +#define VCN_JPEG_DB_CTRL4__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL4__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL4__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL4__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL4__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL4__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL5 +#define VCN_JPEG_DB_CTRL5__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL5__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL5__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL5__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL5__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL5__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL6 +#define VCN_JPEG_DB_CTRL6__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL6__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL6__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL6__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL6__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL6__HIT_MASK                                                                           0x80000000L +//VCN_JPEG_DB_CTRL7 +#define VCN_JPEG_DB_CTRL7__OFFSET__SHIFT                                                                      0x2 +#define VCN_JPEG_DB_CTRL7__EN__SHIFT                                                                          0x1e +#define VCN_JPEG_DB_CTRL7__HIT__SHIFT                                                                         0x1f +#define VCN_JPEG_DB_CTRL7__OFFSET_MASK                                                                        0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL7__EN_MASK                                                                            0x40000000L +#define VCN_JPEG_DB_CTRL7__HIT_MASK                                                                           0x80000000L +//UVD_SCRATCH32 +#define UVD_SCRATCH32__SCRATCH32_DATA__SHIFT                                                                  0x0 +#define UVD_SCRATCH32__SCRATCH32_DATA_MASK                                                                    0xFFFFFFFFL +//UVD_VERSION +#define UVD_VERSION__VARIANT_TYPE__SHIFT                                                                      0x0 +#define UVD_VERSION__MINOR_VERSION__SHIFT                                                                     0x8 +#define UVD_VERSION__MAJOR_VERSION__SHIFT                                                                     0x10 +#define UVD_VERSION__INSTANCE_ID__SHIFT                                                                       0x1c +#define UVD_VERSION__VARIANT_TYPE_MASK                                                                        0x000000FFL +#define UVD_VERSION__MINOR_VERSION_MASK                                                                       0x0000FF00L +#define UVD_VERSION__MAJOR_VERSION_MASK                                                                       0x0FFF0000L +#define UVD_VERSION__INSTANCE_ID_MASK                                                                         0xF0000000L +//VCN_RB_DB_CTRL +#define VCN_RB_DB_CTRL__OFFSET__SHIFT                                                                         0x2 +#define VCN_RB_DB_CTRL__EN__SHIFT                                                                             0x1e +#define VCN_RB_DB_CTRL__HIT__SHIFT                                                                            0x1f +#define VCN_RB_DB_CTRL__OFFSET_MASK                                                                           0x0FFFFFFCL +#define VCN_RB_DB_CTRL__EN_MASK                                                                               0x40000000L +#define VCN_RB_DB_CTRL__HIT_MASK                                                                              0x80000000L +//VCN_JPEG_DB_CTRL +#define VCN_JPEG_DB_CTRL__OFFSET__SHIFT                                                                       0x2 +#define VCN_JPEG_DB_CTRL__EN__SHIFT                                                                           0x1e +#define VCN_JPEG_DB_CTRL__HIT__SHIFT                                                                          0x1f +#define VCN_JPEG_DB_CTRL__OFFSET_MASK                                                                         0x0FFFFFFCL +#define VCN_JPEG_DB_CTRL__EN_MASK                                                                             0x40000000L +#define VCN_JPEG_DB_CTRL__HIT_MASK                                                                            0x80000000L +//VCN_RB1_DB_CTRL +#define VCN_RB1_DB_CTRL__OFFSET__SHIFT                                                                        0x2 +#define VCN_RB1_DB_CTRL__EN__SHIFT                                                                            0x1e +#define VCN_RB1_DB_CTRL__HIT__SHIFT                                                                           0x1f +#define VCN_RB1_DB_CTRL__OFFSET_MASK                                                                          0x0FFFFFFCL +#define VCN_RB1_DB_CTRL__EN_MASK                                                                              0x40000000L +#define VCN_RB1_DB_CTRL__HIT_MASK                                                                             0x80000000L +//VCN_RB2_DB_CTRL +#define VCN_RB2_DB_CTRL__OFFSET__SHIFT                                                                        0x2 +#define VCN_RB2_DB_CTRL__EN__SHIFT                                                                            0x1e +#define VCN_RB2_DB_CTRL__HIT__SHIFT                                                                           0x1f +#define VCN_RB2_DB_CTRL__OFFSET_MASK                                                                          0x0FFFFFFCL +#define VCN_RB2_DB_CTRL__EN_MASK                                                                              0x40000000L +#define VCN_RB2_DB_CTRL__HIT_MASK                                                                             0x80000000L +//VCN_RB3_DB_CTRL +#define VCN_RB3_DB_CTRL__OFFSET__SHIFT                                                                        0x2 +#define VCN_RB3_DB_CTRL__EN__SHIFT                                                                            0x1e +#define VCN_RB3_DB_CTRL__HIT__SHIFT                                                                           0x1f +#define VCN_RB3_DB_CTRL__OFFSET_MASK                                                                          0x0FFFFFFCL +#define VCN_RB3_DB_CTRL__EN_MASK                                                                              0x40000000L +#define VCN_RB3_DB_CTRL__HIT_MASK                                                                             0x80000000L +//VCN_RB4_DB_CTRL +#define VCN_RB4_DB_CTRL__OFFSET__SHIFT                                                                        0x2 +#define VCN_RB4_DB_CTRL__EN__SHIFT                                                                            0x1e +#define VCN_RB4_DB_CTRL__HIT__SHIFT                                                                           0x1f +#define VCN_RB4_DB_CTRL__OFFSET_MASK                                                                          0x0FFFFFFCL +#define VCN_RB4_DB_CTRL__EN_MASK                                                                              0x40000000L +#define VCN_RB4_DB_CTRL__HIT_MASK                                                                             0x80000000L +//VCN_RB_ENABLE +#define VCN_RB_ENABLE__RB_EN__SHIFT                                                                           0x0 +#define VCN_RB_ENABLE__JPEG_RB_EN__SHIFT                                                                      0x1 +#define VCN_RB_ENABLE__RB1_EN__SHIFT                                                                          0x2 +#define VCN_RB_ENABLE__RB2_EN__SHIFT                                                                          0x3 +#define VCN_RB_ENABLE__RB3_EN__SHIFT                                                                          0x4 +#define VCN_RB_ENABLE__RB4_EN__SHIFT                                                                          0x5 +#define VCN_RB_ENABLE__UMSCH_RB_EN__SHIFT                                                                     0x6 +#define VCN_RB_ENABLE__EJPEG_RB_EN__SHIFT                                                                     0x7 +#define VCN_RB_ENABLE__AUDIO_RB_EN__SHIFT                                                                     0x8 +#define VCN_RB_ENABLE__RB_EN_MASK                                                                             0x00000001L +#define VCN_RB_ENABLE__JPEG_RB_EN_MASK                                                                        0x00000002L +#define VCN_RB_ENABLE__RB1_EN_MASK                                                                            0x00000004L +#define VCN_RB_ENABLE__RB2_EN_MASK                                                                            0x00000008L +#define VCN_RB_ENABLE__RB3_EN_MASK                                                                            0x00000010L +#define VCN_RB_ENABLE__RB4_EN_MASK                                                                            0x00000020L +#define VCN_RB_ENABLE__UMSCH_RB_EN_MASK                                                                       0x00000040L +#define VCN_RB_ENABLE__EJPEG_RB_EN_MASK                                                                       0x00000080L +#define VCN_RB_ENABLE__AUDIO_RB_EN_MASK                                                                       0x00000100L +//VCN_RB_WPTR_CTRL +#define VCN_RB_WPTR_CTRL__RB_CS_EN__SHIFT                                                                     0x0 +#define VCN_RB_WPTR_CTRL__JPEG_CS_EN__SHIFT                                                                   0x1 +#define VCN_RB_WPTR_CTRL__RB1_CS_EN__SHIFT                                                                    0x2 +#define VCN_RB_WPTR_CTRL__RB2_CS_EN__SHIFT                                                                    0x3 +#define VCN_RB_WPTR_CTRL__RB3_CS_EN__SHIFT                                                                    0x4 +#define VCN_RB_WPTR_CTRL__RB4_CS_EN__SHIFT                                                                    0x5 +#define VCN_RB_WPTR_CTRL__UMSCH_RB_CS_EN__SHIFT                                                               0x6 +#define VCN_RB_WPTR_CTRL__EJPEG_RB_CS_EN__SHIFT                                                               0x7 +#define VCN_RB_WPTR_CTRL__AUDIO_RB_CS_EN__SHIFT                                                               0x8 +#define VCN_RB_WPTR_CTRL__RB_CS_EN_MASK                                                                       0x00000001L +#define VCN_RB_WPTR_CTRL__JPEG_CS_EN_MASK                                                                     0x00000002L +#define VCN_RB_WPTR_CTRL__RB1_CS_EN_MASK                                                                      0x00000004L +#define VCN_RB_WPTR_CTRL__RB2_CS_EN_MASK                                                                      0x00000008L +#define VCN_RB_WPTR_CTRL__RB3_CS_EN_MASK                                                                      0x00000010L +#define VCN_RB_WPTR_CTRL__RB4_CS_EN_MASK                                                                      0x00000020L +#define VCN_RB_WPTR_CTRL__UMSCH_RB_CS_EN_MASK                                                                 0x00000040L +#define VCN_RB_WPTR_CTRL__EJPEG_RB_CS_EN_MASK                                                                 0x00000080L +#define VCN_RB_WPTR_CTRL__AUDIO_RB_CS_EN_MASK                                                                 0x00000100L +//UVD_RB_RPTR +#define UVD_RB_RPTR__RB_RPTR__SHIFT                                                                           0x4 +#define UVD_RB_RPTR__RB_RPTR_MASK                                                                             0x007FFFF0L +//UVD_RB_WPTR +#define UVD_RB_WPTR__RB_WPTR__SHIFT                                                                           0x4 +#define UVD_RB_WPTR__RB_WPTR_MASK                                                                             0x007FFFF0L +//UVD_RB_RPTR2 +#define UVD_RB_RPTR2__RB_RPTR__SHIFT                                                                          0x4 +#define UVD_RB_RPTR2__RB_RPTR_MASK                                                                            0x007FFFF0L +//UVD_RB_WPTR2 +#define UVD_RB_WPTR2__RB_WPTR__SHIFT                                                                          0x4 +#define UVD_RB_WPTR2__RB_WPTR_MASK                                                                            0x007FFFF0L +//UVD_RB_RPTR3 +#define UVD_RB_RPTR3__RB_RPTR__SHIFT                                                                          0x4 +#define UVD_RB_RPTR3__RB_RPTR_MASK                                                                            0x007FFFF0L +//UVD_RB_WPTR3 +#define UVD_RB_WPTR3__RB_WPTR__SHIFT                                                                          0x4 +#define UVD_RB_WPTR3__RB_WPTR_MASK                                                                            0x007FFFF0L +//UVD_RB_RPTR4 +#define UVD_RB_RPTR4__RB_RPTR__SHIFT                                                                          0x4 +#define UVD_RB_RPTR4__RB_RPTR_MASK                                                                            0x007FFFF0L +//UVD_RB_WPTR4 +#define UVD_RB_WPTR4__RB_WPTR__SHIFT                                                                          0x4 +#define UVD_RB_WPTR4__RB_WPTR_MASK                                                                            0x007FFFF0L +//UVD_OUT_RB_RPTR +#define UVD_OUT_RB_RPTR__RB_RPTR__SHIFT                                                                       0x4 +#define UVD_OUT_RB_RPTR__RB_RPTR_MASK                                                                         0x007FFFF0L +//UVD_OUT_RB_WPTR +#define UVD_OUT_RB_WPTR__RB_WPTR__SHIFT                                                                       0x4 +#define UVD_OUT_RB_WPTR__RB_WPTR_MASK                                                                         0x007FFFF0L +//UVD_AUDIO_RB_RPTR +#define UVD_AUDIO_RB_RPTR__RB_RPTR__SHIFT                                                                     0x4 +#define UVD_AUDIO_RB_RPTR__RB_RPTR_MASK                                                                       0x007FFFF0L +//UVD_AUDIO_RB_WPTR +#define UVD_AUDIO_RB_WPTR__RB_WPTR__SHIFT                                                                     0x4 +#define UVD_AUDIO_RB_WPTR__RB_WPTR_MASK                                                                       0x007FFFF0L +//UVD_RBC_RB_RPTR +#define UVD_RBC_RB_RPTR__RB_RPTR__SHIFT                                                                       0x4 +#define UVD_RBC_RB_RPTR__RB_RPTR_MASK                                                                         0x007FFFF0L +//UVD_RBC_RB_WPTR +#define UVD_RBC_RB_WPTR__RB_WPTR__SHIFT                                                                       0x4 +#define UVD_RBC_RB_WPTR__RB_WPTR_MASK                                                                         0x007FFFF0L +//UVD_DPG_LMA_CTL2 +#define UVD_DPG_LMA_CTL2__DIRECT_ACCESS_SRAM_SEL__SHIFT                                                       0x0 +#define UVD_DPG_LMA_CTL2__FIFO_DIRECT_ACCESS_EN__SHIFT                                                        0x1 +#define UVD_DPG_LMA_CTL2__VID_WRITE_PTR__SHIFT                                                                0x2 +#define UVD_DPG_LMA_CTL2__JPEG_WRITE_PTR__SHIFT                                                               0x9 +#define UVD_DPG_LMA_CTL2__DIRECT_ACCESS_SRAM_SEL_MASK                                                         0x00000001L +#define UVD_DPG_LMA_CTL2__FIFO_DIRECT_ACCESS_EN_MASK                                                          0x00000002L +#define UVD_DPG_LMA_CTL2__VID_WRITE_PTR_MASK                                                                  0x000001FCL +#define UVD_DPG_LMA_CTL2__JPEG_WRITE_PTR_MASK                                                                 0x0000FE00L + + +// addressBlock: aid_uvd0_mmsch_dec +//MMSCH_UCODE_ADDR +#define MMSCH_UCODE_ADDR__UCODE_ADDR__SHIFT                                                                   0x2 +#define MMSCH_UCODE_ADDR__UCODE_LOCK__SHIFT                                                                   0x1f +#define MMSCH_UCODE_ADDR__UCODE_ADDR_MASK                                                                     0x00003FFCL +#define MMSCH_UCODE_ADDR__UCODE_LOCK_MASK                                                                     0x80000000L +//MMSCH_UCODE_DATA +#define MMSCH_UCODE_DATA__UCODE_DATA__SHIFT                                                                   0x0 +#define MMSCH_UCODE_DATA__UCODE_DATA_MASK                                                                     0xFFFFFFFFL +//MMSCH_SRAM_ADDR +#define MMSCH_SRAM_ADDR__SRAM_ADDR__SHIFT                                                                     0x2 +#define MMSCH_SRAM_ADDR__SRAM_LOCK__SHIFT                                                                     0x1f +#define MMSCH_SRAM_ADDR__SRAM_ADDR_MASK                                                                       0x00001FFCL +#define MMSCH_SRAM_ADDR__SRAM_LOCK_MASK                                                                       0x80000000L +//MMSCH_SRAM_DATA +#define MMSCH_SRAM_DATA__SRAM_DATA__SHIFT                                                                     0x0 +#define MMSCH_SRAM_DATA__SRAM_DATA_MASK                                                                       0xFFFFFFFFL +//MMSCH_VF_SRAM_OFFSET +#define MMSCH_VF_SRAM_OFFSET__VF_SRAM_OFFSET__SHIFT                                                           0x2 +#define MMSCH_VF_SRAM_OFFSET__VF_SRAM_NUM_DW_PER_VF__SHIFT                                                    0x10 +#define MMSCH_VF_SRAM_OFFSET__VF_SRAM_OFFSET_MASK                                                             0x00001FFCL +#define MMSCH_VF_SRAM_OFFSET__VF_SRAM_NUM_DW_PER_VF_MASK                                                      0x00FF0000L +//MMSCH_DB_SRAM_OFFSET +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_OFFSET__SHIFT                                                           0x2 +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_NUM_ENG__SHIFT                                                          0x10 +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_NUM_RING_PER_ENG__SHIFT                                                 0x18 +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_OFFSET_MASK                                                             0x00001FFCL +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_NUM_ENG_MASK                                                            0x00FF0000L +#define MMSCH_DB_SRAM_OFFSET__DB_SRAM_NUM_RING_PER_ENG_MASK                                                   0xFF000000L +//MMSCH_CTX_SRAM_OFFSET +#define MMSCH_CTX_SRAM_OFFSET__CTX_SRAM_OFFSET__SHIFT                                                         0x2 +#define MMSCH_CTX_SRAM_OFFSET__CTX_SRAM_SIZE__SHIFT                                                           0x10 +#define MMSCH_CTX_SRAM_OFFSET__CTX_SRAM_OFFSET_MASK                                                           0x00001FFCL +#define MMSCH_CTX_SRAM_OFFSET__CTX_SRAM_SIZE_MASK                                                             0xFFFF0000L +//MMSCH_CTL +#define MMSCH_CTL__P_RUNSTALL__SHIFT                                                                          0x0 +#define MMSCH_CTL__P_RESET__SHIFT                                                                             0x1 +#define MMSCH_CTL__VFID_FIFO_EN__SHIFT                                                                        0x4 +#define MMSCH_CTL__P_LOCK__SHIFT                                                                              0x1f +#define MMSCH_CTL__P_RUNSTALL_MASK                                                                            0x00000001L +#define MMSCH_CTL__P_RESET_MASK                                                                               0x00000002L +#define MMSCH_CTL__VFID_FIFO_EN_MASK                                                                          0x00000010L +#define MMSCH_CTL__P_LOCK_MASK                                                                                0x80000000L +//MMSCH_INTR +#define MMSCH_INTR__INTR__SHIFT                                                                               0x0 +#define MMSCH_INTR__INTR_MASK                                                                                 0x00001FFFL +//MMSCH_INTR_ACK +#define MMSCH_INTR_ACK__INTR__SHIFT                                                                           0x0 +#define MMSCH_INTR_ACK__INTR_MASK                                                                             0x00001FFFL +//MMSCH_INTR_STATUS +#define MMSCH_INTR_STATUS__INTR__SHIFT                                                                        0x0 +#define MMSCH_INTR_STATUS__INTR_MASK                                                                          0x00001FFFL +//MMSCH_VF_VMID +#define MMSCH_VF_VMID__VF_CTX_VMID__SHIFT                                                                     0x0 +#define MMSCH_VF_VMID__VF_GPCOM_VMID__SHIFT                                                                   0x5 +#define MMSCH_VF_VMID__VF_CTX_VMID_MASK                                                                       0x0000001FL +#define MMSCH_VF_VMID__VF_GPCOM_VMID_MASK                                                                     0x000003E0L +//MMSCH_VF_CTX_ADDR_LO +#define MMSCH_VF_CTX_ADDR_LO__VF_CTX_ADDR_LO__SHIFT                                                           0x6 +#define MMSCH_VF_CTX_ADDR_LO__VF_CTX_ADDR_LO_MASK                                                             0xFFFFFFC0L +//MMSCH_VF_CTX_ADDR_HI +#define MMSCH_VF_CTX_ADDR_HI__VF_CTX_ADDR_HI__SHIFT                                                           0x0 +#define MMSCH_VF_CTX_ADDR_HI__VF_CTX_ADDR_HI_MASK                                                             0xFFFFFFFFL +//MMSCH_VF_CTX_SIZE +#define MMSCH_VF_CTX_SIZE__VF_CTX_SIZE__SHIFT                                                                 0x0 +#define MMSCH_VF_CTX_SIZE__VF_CTX_SIZE_MASK                                                                   0xFFFFFFFFL +//MMSCH_VF_GPCOM_ADDR_LO +#define MMSCH_VF_GPCOM_ADDR_LO__VF_GPCOM_ADDR_LO__SHIFT                                                       0x6 +#define MMSCH_VF_GPCOM_ADDR_LO__VF_GPCOM_ADDR_LO_MASK                                                         0xFFFFFFC0L +//MMSCH_VF_GPCOM_ADDR_HI +#define MMSCH_VF_GPCOM_ADDR_HI__VF_GPCOM_ADDR_HI__SHIFT                                                       0x0 +#define MMSCH_VF_GPCOM_ADDR_HI__VF_GPCOM_ADDR_HI_MASK                                                         0xFFFFFFFFL +//MMSCH_VF_GPCOM_SIZE +#define MMSCH_VF_GPCOM_SIZE__VF_GPCOM_SIZE__SHIFT                                                             0x0 +#define MMSCH_VF_GPCOM_SIZE__VF_GPCOM_SIZE_MASK                                                               0xFFFFFFFFL +//MMSCH_VF_MAILBOX_HOST +#define MMSCH_VF_MAILBOX_HOST__DATA__SHIFT                                                                    0x0 +#define MMSCH_VF_MAILBOX_HOST__DATA_MASK                                                                      0xFFFFFFFFL +//MMSCH_VF_MAILBOX_RESP +#define MMSCH_VF_MAILBOX_RESP__RESP__SHIFT                                                                    0x0 +#define MMSCH_VF_MAILBOX_RESP__RESP_MASK                                                                      0xFFFFFFFFL +//MMSCH_VF_MAILBOX_0 +#define MMSCH_VF_MAILBOX_0__DATA__SHIFT                                                                       0x0 +#define MMSCH_VF_MAILBOX_0__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_VF_MAILBOX_0_RESP +#define MMSCH_VF_MAILBOX_0_RESP__RESP__SHIFT                                                                  0x0 +#define MMSCH_VF_MAILBOX_0_RESP__RESP_MASK                                                                    0xFFFFFFFFL +//MMSCH_VF_MAILBOX_1 +#define MMSCH_VF_MAILBOX_1__DATA__SHIFT                                                                       0x0 +#define MMSCH_VF_MAILBOX_1__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_VF_MAILBOX_1_RESP +#define MMSCH_VF_MAILBOX_1_RESP__RESP__SHIFT                                                                  0x0 +#define MMSCH_VF_MAILBOX_1_RESP__RESP_MASK                                                                    0xFFFFFFFFL +//MMSCH_CNTL +#define MMSCH_CNTL__CLK_EN__SHIFT                                                                             0x0 +#define MMSCH_CNTL__ED_ENABLE__SHIFT                                                                          0x1 +#define MMSCH_CNTL__AXI_MAX_BRST_SIZE_IS_4__SHIFT                                                             0x2 +#define MMSCH_CNTL__AXI_40BIT_PIF_ADDR_FIX_EN__SHIFT                                                          0x3 +#define MMSCH_CNTL__PDEBUG_ENABLE__SHIFT                                                                      0x4 +#define MMSCH_CNTL__MMSCH_IRQ_ERR__SHIFT                                                                      0x5 +#define MMSCH_CNTL__MMSCH_NACK_INTR_EN__SHIFT                                                                 0x9 +#define MMSCH_CNTL__MMSCH_DB_BUSY_INTR_EN__SHIFT                                                              0xa +#define MMSCH_CNTL__PRB_TIMEOUT_VAL__SHIFT                                                                    0x14 +#define MMSCH_CNTL__TIMEOUT_DIS__SHIFT                                                                        0x1c +#define MMSCH_CNTL__MMSCH_IDLE__SHIFT                                                                         0x1d +#define MMSCH_CNTL__CLK_EN_MASK                                                                               0x00000001L +#define MMSCH_CNTL__ED_ENABLE_MASK                                                                            0x00000002L +#define MMSCH_CNTL__AXI_MAX_BRST_SIZE_IS_4_MASK                                                               0x00000004L +#define MMSCH_CNTL__AXI_40BIT_PIF_ADDR_FIX_EN_MASK                                                            0x00000008L +#define MMSCH_CNTL__PDEBUG_ENABLE_MASK                                                                        0x00000010L +#define MMSCH_CNTL__MMSCH_IRQ_ERR_MASK                                                                        0x000001E0L +#define MMSCH_CNTL__MMSCH_NACK_INTR_EN_MASK                                                                   0x00000200L +#define MMSCH_CNTL__MMSCH_DB_BUSY_INTR_EN_MASK                                                                0x00000400L +#define MMSCH_CNTL__PRB_TIMEOUT_VAL_MASK                                                                      0x0FF00000L +#define MMSCH_CNTL__TIMEOUT_DIS_MASK                                                                          0x10000000L +#define MMSCH_CNTL__MMSCH_IDLE_MASK                                                                           0x20000000L +//MMSCH_NONCACHE_OFFSET0 +#define MMSCH_NONCACHE_OFFSET0__OFFSET__SHIFT                                                                 0x0 +#define MMSCH_NONCACHE_OFFSET0__OFFSET_MASK                                                                   0x0FFFFFFFL +//MMSCH_NONCACHE_SIZE0 +#define MMSCH_NONCACHE_SIZE0__SIZE__SHIFT                                                                     0x0 +#define MMSCH_NONCACHE_SIZE0__SIZE_MASK                                                                       0x00FFFFFFL +//MMSCH_NONCACHE_OFFSET1 +#define MMSCH_NONCACHE_OFFSET1__OFFSET__SHIFT                                                                 0x0 +#define MMSCH_NONCACHE_OFFSET1__OFFSET_MASK                                                                   0x0FFFFFFFL +//MMSCH_NONCACHE_SIZE1 +#define MMSCH_NONCACHE_SIZE1__SIZE__SHIFT                                                                     0x0 +#define MMSCH_NONCACHE_SIZE1__SIZE_MASK                                                                       0x00FFFFFFL +//MMSCH_PROC_STATE1 +#define MMSCH_PROC_STATE1__PC__SHIFT                                                                          0x0 +#define MMSCH_PROC_STATE1__PC_MASK                                                                            0xFFFFFFFFL +//MMSCH_LAST_MC_ADDR +#define MMSCH_LAST_MC_ADDR__MC_ADDR__SHIFT                                                                    0x0 +#define MMSCH_LAST_MC_ADDR__RW__SHIFT                                                                         0x1f +#define MMSCH_LAST_MC_ADDR__MC_ADDR_MASK                                                                      0x0FFFFFFFL +#define MMSCH_LAST_MC_ADDR__RW_MASK                                                                           0x80000000L +//MMSCH_LAST_MEM_ACCESS_HI +#define MMSCH_LAST_MEM_ACCESS_HI__PROC_CMD__SHIFT                                                             0x0 +#define MMSCH_LAST_MEM_ACCESS_HI__FIFO_RPTR__SHIFT                                                            0x8 +#define MMSCH_LAST_MEM_ACCESS_HI__FIFO_WPTR__SHIFT                                                            0xc +#define MMSCH_LAST_MEM_ACCESS_HI__PROC_CMD_MASK                                                               0x00000007L +#define MMSCH_LAST_MEM_ACCESS_HI__FIFO_RPTR_MASK                                                              0x00000700L +#define MMSCH_LAST_MEM_ACCESS_HI__FIFO_WPTR_MASK                                                              0x00007000L +//MMSCH_LAST_MEM_ACCESS_LO +#define MMSCH_LAST_MEM_ACCESS_LO__PROC_ADDR__SHIFT                                                            0x0 +#define MMSCH_LAST_MEM_ACCESS_LO__PROC_ADDR_MASK                                                              0xFFFFFFFFL +//MMSCH_IOV_ACTIVE_FCN_ID +#define MMSCH_IOV_ACTIVE_FCN_ID__ACTIVE_VF_ID__SHIFT                                                          0x0 +#define MMSCH_IOV_ACTIVE_FCN_ID__ACTIVE_PF_VF__SHIFT                                                          0x1f +#define MMSCH_IOV_ACTIVE_FCN_ID__ACTIVE_VF_ID_MASK                                                            0x0000001FL +#define MMSCH_IOV_ACTIVE_FCN_ID__ACTIVE_PF_VF_MASK                                                            0x80000000L +//MMSCH_SCRATCH_0 +#define MMSCH_SCRATCH_0__SCRATCH_0__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_0__SCRATCH_0_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_1 +#define MMSCH_SCRATCH_1__SCRATCH_1__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_1__SCRATCH_1_MASK                                                                       0xFFFFFFFFL +//MMSCH_GPUIOV_SCH_BLOCK_0 +#define MMSCH_GPUIOV_SCH_BLOCK_0__ID__SHIFT                                                                   0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_0__VERSION__SHIFT                                                              0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_0__SIZE__SHIFT                                                                 0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_0__ID_MASK                                                                     0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_0__VERSION_MASK                                                                0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_0__SIZE_MASK                                                                   0x0000FF00L +//MMSCH_GPUIOV_CMD_CONTROL_0 +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_TYPE__SHIFT                                                           0x0 +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_EXECUTE__SHIFT                                                        0x4 +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_EXECUTE_INTR_EN__SHIFT                                                0x5 +#define MMSCH_GPUIOV_CMD_CONTROL_0__VM_BUSY_INTR_EN__SHIFT                                                    0x6 +#define MMSCH_GPUIOV_CMD_CONTROL_0__FUNCTINO_ID__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_CMD_CONTROL_0__NEXT_FUNCTINO_ID__SHIFT                                                   0x10 +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_TYPE_MASK                                                             0x0000000FL +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_EXECUTE_MASK                                                          0x00000010L +#define MMSCH_GPUIOV_CMD_CONTROL_0__CMD_EXECUTE_INTR_EN_MASK                                                  0x00000020L +#define MMSCH_GPUIOV_CMD_CONTROL_0__VM_BUSY_INTR_EN_MASK                                                      0x00000040L +#define MMSCH_GPUIOV_CMD_CONTROL_0__FUNCTINO_ID_MASK                                                          0x0000FF00L +#define MMSCH_GPUIOV_CMD_CONTROL_0__NEXT_FUNCTINO_ID_MASK                                                     0x00FF0000L +//MMSCH_GPUIOV_CMD_STATUS_0 +#define MMSCH_GPUIOV_CMD_STATUS_0__CMD_STATUS__SHIFT                                                          0x0 +#define MMSCH_GPUIOV_CMD_STATUS_0__CMD_STATUS_MASK                                                            0x0000000FL +//MMSCH_GPUIOV_VM_BUSY_STATUS_0 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_0__BUSY__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_0__BUSY_MASK                                                              0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCNS_0 +#define MMSCH_GPUIOV_ACTIVE_FCNS_0__ACTIVE_FCNS__SHIFT                                                        0x0 +#define MMSCH_GPUIOV_ACTIVE_FCNS_0__ACTIVE_FCNS_MASK                                                          0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_0__ID__SHIFT                                                               0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_0__ID_STATUS__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_0__ID_MASK                                                                 0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_0__ID_STATUS_MASK                                                          0x00000F00L +//MMSCH_GPUIOV_DW6_0 +#define MMSCH_GPUIOV_DW6_0__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW6_0__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW7_0 +#define MMSCH_GPUIOV_DW7_0__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW7_0__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW8_0 +#define MMSCH_GPUIOV_DW8_0__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW8_0__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_SCH_BLOCK_1 +#define MMSCH_GPUIOV_SCH_BLOCK_1__ID__SHIFT                                                                   0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_1__VERSION__SHIFT                                                              0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_1__SIZE__SHIFT                                                                 0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_1__ID_MASK                                                                     0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_1__VERSION_MASK                                                                0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_1__SIZE_MASK                                                                   0x0000FF00L +//MMSCH_GPUIOV_CMD_CONTROL_1 +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_TYPE__SHIFT                                                           0x0 +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_EXECUTE__SHIFT                                                        0x4 +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_EXECUTE_INTR_EN__SHIFT                                                0x5 +#define MMSCH_GPUIOV_CMD_CONTROL_1__VM_BUSY_INTR_EN__SHIFT                                                    0x6 +#define MMSCH_GPUIOV_CMD_CONTROL_1__FUNCTINO_ID__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_CMD_CONTROL_1__NEXT_FUNCTINO_ID__SHIFT                                                   0x10 +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_TYPE_MASK                                                             0x0000000FL +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_EXECUTE_MASK                                                          0x00000010L +#define MMSCH_GPUIOV_CMD_CONTROL_1__CMD_EXECUTE_INTR_EN_MASK                                                  0x00000020L +#define MMSCH_GPUIOV_CMD_CONTROL_1__VM_BUSY_INTR_EN_MASK                                                      0x00000040L +#define MMSCH_GPUIOV_CMD_CONTROL_1__FUNCTINO_ID_MASK                                                          0x0000FF00L +#define MMSCH_GPUIOV_CMD_CONTROL_1__NEXT_FUNCTINO_ID_MASK                                                     0x00FF0000L +//MMSCH_GPUIOV_CMD_STATUS_1 +#define MMSCH_GPUIOV_CMD_STATUS_1__CMD_STATUS__SHIFT                                                          0x0 +#define MMSCH_GPUIOV_CMD_STATUS_1__CMD_STATUS_MASK                                                            0x0000000FL +//MMSCH_GPUIOV_VM_BUSY_STATUS_1 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_1__BUSY__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_1__BUSY_MASK                                                              0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCNS_1 +#define MMSCH_GPUIOV_ACTIVE_FCNS_1__ACTIVE_FCNS__SHIFT                                                        0x0 +#define MMSCH_GPUIOV_ACTIVE_FCNS_1__ACTIVE_FCNS_MASK                                                          0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_1 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_1__ID__SHIFT                                                               0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_1__ID_STATUS__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_1__ID_MASK                                                                 0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_1__ID_STATUS_MASK                                                          0x00000F00L +//MMSCH_GPUIOV_DW6_1 +#define MMSCH_GPUIOV_DW6_1__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW6_1__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW7_1 +#define MMSCH_GPUIOV_DW7_1__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW7_1__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW8_1 +#define MMSCH_GPUIOV_DW8_1__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW8_1__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_CNTXT +#define MMSCH_GPUIOV_CNTXT__CNTXT_SIZE__SHIFT                                                                 0x0 +#define MMSCH_GPUIOV_CNTXT__CNTXT_LOCATION__SHIFT                                                             0x7 +#define MMSCH_GPUIOV_CNTXT__CNTXT_OFFSET__SHIFT                                                               0xa +#define MMSCH_GPUIOV_CNTXT__CNTXT_SIZE_MASK                                                                   0x0000007FL +#define MMSCH_GPUIOV_CNTXT__CNTXT_LOCATION_MASK                                                               0x00000080L +#define MMSCH_GPUIOV_CNTXT__CNTXT_OFFSET_MASK                                                                 0xFFFFFC00L +//MMSCH_SCRATCH_2 +#define MMSCH_SCRATCH_2__SCRATCH_2__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_2__SCRATCH_2_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_3 +#define MMSCH_SCRATCH_3__SCRATCH_3__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_3__SCRATCH_3_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_4 +#define MMSCH_SCRATCH_4__SCRATCH_4__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_4__SCRATCH_4_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_5 +#define MMSCH_SCRATCH_5__SCRATCH_5__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_5__SCRATCH_5_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_6 +#define MMSCH_SCRATCH_6__SCRATCH_6__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_6__SCRATCH_6_MASK                                                                       0xFFFFFFFFL +//MMSCH_SCRATCH_7 +#define MMSCH_SCRATCH_7__SCRATCH_7__SHIFT                                                                     0x0 +#define MMSCH_SCRATCH_7__SCRATCH_7_MASK                                                                       0xFFFFFFFFL +//MMSCH_VFID_FIFO_HEAD_0 +#define MMSCH_VFID_FIFO_HEAD_0__HEAD__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_HEAD_0__HEAD_MASK                                                                     0x0000003FL +//MMSCH_VFID_FIFO_TAIL_0 +#define MMSCH_VFID_FIFO_TAIL_0__TAIL__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_TAIL_0__TAIL_MASK                                                                     0x0000003FL +//MMSCH_VFID_FIFO_HEAD_1 +#define MMSCH_VFID_FIFO_HEAD_1__HEAD__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_HEAD_1__HEAD_MASK                                                                     0x0000003FL +//MMSCH_VFID_FIFO_TAIL_1 +#define MMSCH_VFID_FIFO_TAIL_1__TAIL__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_TAIL_1__TAIL_MASK                                                                     0x0000003FL +//MMSCH_NACK_STATUS +#define MMSCH_NACK_STATUS__WR_NACK_STATUS__SHIFT                                                              0x0 +#define MMSCH_NACK_STATUS__RD_NACK_STATUS__SHIFT                                                              0x2 +#define MMSCH_NACK_STATUS__WR_NACK_STATUS_MASK                                                                0x00000003L +#define MMSCH_NACK_STATUS__RD_NACK_STATUS_MASK                                                                0x0000000CL +//MMSCH_VF_MAILBOX0_DATA +#define MMSCH_VF_MAILBOX0_DATA__DATA__SHIFT                                                                   0x0 +#define MMSCH_VF_MAILBOX0_DATA__DATA_MASK                                                                     0xFFFFFFFFL +//MMSCH_VF_MAILBOX1_DATA +#define MMSCH_VF_MAILBOX1_DATA__DATA__SHIFT                                                                   0x0 +#define MMSCH_VF_MAILBOX1_DATA__DATA_MASK                                                                     0xFFFFFFFFL +//MMSCH_GPUIOV_SCH_BLOCK_IP_0 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__ID__SHIFT                                                                0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__VERSION__SHIFT                                                           0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__SIZE__SHIFT                                                              0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__ID_MASK                                                                  0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__VERSION_MASK                                                             0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_IP_0__SIZE_MASK                                                                0x0000FF00L +//MMSCH_GPUIOV_CMD_STATUS_IP_0 +#define MMSCH_GPUIOV_CMD_STATUS_IP_0__CMD_STATUS__SHIFT                                                       0x0 +#define MMSCH_GPUIOV_CMD_STATUS_IP_0__CMD_STATUS_MASK                                                         0x0000000FL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0__ID__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0__ID_STATUS__SHIFT                                                     0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0__ID_MASK                                                              0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_0__ID_STATUS_MASK                                                       0x00000F00L +//MMSCH_GPUIOV_SCH_BLOCK_IP_1 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__ID__SHIFT                                                                0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__VERSION__SHIFT                                                           0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__SIZE__SHIFT                                                              0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__ID_MASK                                                                  0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__VERSION_MASK                                                             0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_IP_1__SIZE_MASK                                                                0x0000FF00L +//MMSCH_GPUIOV_CMD_STATUS_IP_1 +#define MMSCH_GPUIOV_CMD_STATUS_IP_1__CMD_STATUS__SHIFT                                                       0x0 +#define MMSCH_GPUIOV_CMD_STATUS_IP_1__CMD_STATUS_MASK                                                         0x0000000FL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1__ID__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1__ID_STATUS__SHIFT                                                     0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1__ID_MASK                                                              0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_1__ID_STATUS_MASK                                                       0x00000F00L +//MMSCH_GPUIOV_CNTXT_IP +#define MMSCH_GPUIOV_CNTXT_IP__CNTXT_SIZE__SHIFT                                                              0x0 +#define MMSCH_GPUIOV_CNTXT_IP__CNTXT_LOCATION__SHIFT                                                          0x7 +#define MMSCH_GPUIOV_CNTXT_IP__CNTXT_SIZE_MASK                                                                0x0000007FL +#define MMSCH_GPUIOV_CNTXT_IP__CNTXT_LOCATION_MASK                                                            0x00000080L +//MMSCH_GPUIOV_SCH_BLOCK_2 +#define MMSCH_GPUIOV_SCH_BLOCK_2__ID__SHIFT                                                                   0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_2__VERSION__SHIFT                                                              0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_2__SIZE__SHIFT                                                                 0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_2__ID_MASK                                                                     0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_2__VERSION_MASK                                                                0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_2__SIZE_MASK                                                                   0x0000FF00L +//MMSCH_GPUIOV_CMD_CONTROL_2 +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_TYPE__SHIFT                                                           0x0 +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_EXECUTE__SHIFT                                                        0x4 +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_EXECUTE_INTR_EN__SHIFT                                                0x5 +#define MMSCH_GPUIOV_CMD_CONTROL_2__VM_BUSY_INTR_EN__SHIFT                                                    0x6 +#define MMSCH_GPUIOV_CMD_CONTROL_2__FUNCTINO_ID__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_CMD_CONTROL_2__NEXT_FUNCTINO_ID__SHIFT                                                   0x10 +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_TYPE_MASK                                                             0x0000000FL +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_EXECUTE_MASK                                                          0x00000010L +#define MMSCH_GPUIOV_CMD_CONTROL_2__CMD_EXECUTE_INTR_EN_MASK                                                  0x00000020L +#define MMSCH_GPUIOV_CMD_CONTROL_2__VM_BUSY_INTR_EN_MASK                                                      0x00000040L +#define MMSCH_GPUIOV_CMD_CONTROL_2__FUNCTINO_ID_MASK                                                          0x0000FF00L +#define MMSCH_GPUIOV_CMD_CONTROL_2__NEXT_FUNCTINO_ID_MASK                                                     0x00FF0000L +//MMSCH_GPUIOV_CMD_STATUS_2 +#define MMSCH_GPUIOV_CMD_STATUS_2__CMD_STATUS__SHIFT                                                          0x0 +#define MMSCH_GPUIOV_CMD_STATUS_2__CMD_STATUS_MASK                                                            0x0000000FL +//MMSCH_GPUIOV_VM_BUSY_STATUS_2 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_2__BUSY__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_VM_BUSY_STATUS_2__BUSY_MASK                                                              0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCNS_2 +#define MMSCH_GPUIOV_ACTIVE_FCNS_2__ACTIVE_FCNS__SHIFT                                                        0x0 +#define MMSCH_GPUIOV_ACTIVE_FCNS_2__ACTIVE_FCNS_MASK                                                          0xFFFFFFFFL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_2 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_2__ID__SHIFT                                                               0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_2__ID_STATUS__SHIFT                                                        0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_2__ID_MASK                                                                 0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_2__ID_STATUS_MASK                                                          0x00000F00L +//MMSCH_GPUIOV_DW6_2 +#define MMSCH_GPUIOV_DW6_2__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW6_2__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW7_2 +#define MMSCH_GPUIOV_DW7_2__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW7_2__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_DW8_2 +#define MMSCH_GPUIOV_DW8_2__DATA__SHIFT                                                                       0x0 +#define MMSCH_GPUIOV_DW8_2__DATA_MASK                                                                         0xFFFFFFFFL +//MMSCH_GPUIOV_SCH_BLOCK_IP_2 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__ID__SHIFT                                                                0x0 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__VERSION__SHIFT                                                           0x4 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__SIZE__SHIFT                                                              0x8 +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__ID_MASK                                                                  0x0000000FL +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__VERSION_MASK                                                             0x000000F0L +#define MMSCH_GPUIOV_SCH_BLOCK_IP_2__SIZE_MASK                                                                0x0000FF00L +//MMSCH_GPUIOV_CMD_STATUS_IP_2 +#define MMSCH_GPUIOV_CMD_STATUS_IP_2__CMD_STATUS__SHIFT                                                       0x0 +#define MMSCH_GPUIOV_CMD_STATUS_IP_2__CMD_STATUS_MASK                                                         0x0000000FL +//MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2__ID__SHIFT                                                            0x0 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2__ID_STATUS__SHIFT                                                     0x8 +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2__ID_MASK                                                              0x000000FFL +#define MMSCH_GPUIOV_ACTIVE_FCN_ID_IP_2__ID_STATUS_MASK                                                       0x00000F00L +//MMSCH_VFID_FIFO_HEAD_2 +#define MMSCH_VFID_FIFO_HEAD_2__HEAD__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_HEAD_2__HEAD_MASK                                                                     0x0000003FL +//MMSCH_VFID_FIFO_TAIL_2 +#define MMSCH_VFID_FIFO_TAIL_2__TAIL__SHIFT                                                                   0x0 +#define MMSCH_VFID_FIFO_TAIL_2__TAIL_MASK                                                                     0x0000003FL +//MMSCH_VM_BUSY_STATUS_0 +#define MMSCH_VM_BUSY_STATUS_0__BUSY__SHIFT                                                                   0x0 +#define MMSCH_VM_BUSY_STATUS_0__BUSY_MASK                                                                     0xFFFFFFFFL +//MMSCH_VM_BUSY_STATUS_1 +#define MMSCH_VM_BUSY_STATUS_1__BUSY__SHIFT                                                                   0x0 +#define MMSCH_VM_BUSY_STATUS_1__BUSY_MASK                                                                     0xFFFFFFFFL +//MMSCH_VM_BUSY_STATUS_2 +#define MMSCH_VM_BUSY_STATUS_2__BUSY__SHIFT                                                                   0x0 +#define MMSCH_VM_BUSY_STATUS_2__BUSY_MASK                                                                     0xFFFFFFFFL + + +// addressBlock: aid_uvd0_slmi_adpdec +//UVD_LMI_MMSCH_NC0_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC0_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC0_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC0_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC0_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC0_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC1_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC1_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC1_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC1_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC1_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC1_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC2_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC2_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC2_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC2_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC2_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC2_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC3_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC3_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC3_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC3_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC3_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC3_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC4_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC4_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC4_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC4_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC4_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC4_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC5_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC5_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC5_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC5_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC5_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC5_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC6_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC6_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC6_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC6_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC6_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC6_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC7_64BIT_BAR_LOW +#define UVD_LMI_MMSCH_NC7_64BIT_BAR_LOW__BITS_31_0__SHIFT                                                     0x0 +#define UVD_LMI_MMSCH_NC7_64BIT_BAR_LOW__BITS_31_0_MASK                                                       0xFFFFFFFFL +//UVD_LMI_MMSCH_NC7_64BIT_BAR_HIGH +#define UVD_LMI_MMSCH_NC7_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                                   0x0 +#define UVD_LMI_MMSCH_NC7_64BIT_BAR_HIGH__BITS_63_32_MASK                                                     0xFFFFFFFFL +//UVD_LMI_MMSCH_NC_VMID +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC0_VMID__SHIFT                                                          0x0 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC1_VMID__SHIFT                                                          0x4 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC2_VMID__SHIFT                                                          0x8 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC3_VMID__SHIFT                                                          0xc +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC4_VMID__SHIFT                                                          0x10 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC5_VMID__SHIFT                                                          0x14 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC6_VMID__SHIFT                                                          0x18 +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC7_VMID__SHIFT                                                          0x1c +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC0_VMID_MASK                                                            0x0000000FL +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC1_VMID_MASK                                                            0x000000F0L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC2_VMID_MASK                                                            0x00000F00L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC3_VMID_MASK                                                            0x0000F000L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC4_VMID_MASK                                                            0x000F0000L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC5_VMID_MASK                                                            0x00F00000L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC6_VMID_MASK                                                            0x0F000000L +#define UVD_LMI_MMSCH_NC_VMID__MMSCH_NC7_VMID_MASK                                                            0xF0000000L +//UVD_LMI_MMSCH_CTRL +#define UVD_LMI_MMSCH_CTRL__MMSCH_DATA_COHERENCY_EN__SHIFT                                                    0x0 +#define UVD_LMI_MMSCH_CTRL__MMSCH_VM__SHIFT                                                                   0x1 +#define UVD_LMI_MMSCH_CTRL__PRIV_CLIENT_MMSCH__SHIFT                                                          0x2 +#define UVD_LMI_MMSCH_CTRL__MMSCH_R_MC_SWAP__SHIFT                                                            0x3 +#define UVD_LMI_MMSCH_CTRL__MMSCH_W_MC_SWAP__SHIFT                                                            0x5 +#define UVD_LMI_MMSCH_CTRL__MMSCH_RD__SHIFT                                                                   0x7 +#define UVD_LMI_MMSCH_CTRL__MMSCH_WR__SHIFT                                                                   0x9 +#define UVD_LMI_MMSCH_CTRL__MMSCH_RD_DROP__SHIFT                                                              0xb +#define UVD_LMI_MMSCH_CTRL__MMSCH_WR_DROP__SHIFT                                                              0xc +#define UVD_LMI_MMSCH_CTRL__MMSCH_DATA_COHERENCY_EN_MASK                                                      0x00000001L +#define UVD_LMI_MMSCH_CTRL__MMSCH_VM_MASK                                                                     0x00000002L +#define UVD_LMI_MMSCH_CTRL__PRIV_CLIENT_MMSCH_MASK                                                            0x00000004L +#define UVD_LMI_MMSCH_CTRL__MMSCH_R_MC_SWAP_MASK                                                              0x00000018L +#define UVD_LMI_MMSCH_CTRL__MMSCH_W_MC_SWAP_MASK                                                              0x00000060L +#define UVD_LMI_MMSCH_CTRL__MMSCH_RD_MASK                                                                     0x00000180L +#define UVD_LMI_MMSCH_CTRL__MMSCH_WR_MASK                                                                     0x00000600L +#define UVD_LMI_MMSCH_CTRL__MMSCH_RD_DROP_MASK                                                                0x00000800L +#define UVD_LMI_MMSCH_CTRL__MMSCH_WR_DROP_MASK                                                                0x00001000L +//UVD_MMSCH_LMI_STATUS +#define UVD_MMSCH_LMI_STATUS__LMI_AXI_MMSCH_UNSUPPORTED_LEN_INT__SHIFT                                        0x0 +#define UVD_MMSCH_LMI_STATUS__LMI_AXI_MMSCH_UNSUPPORTED_ADR_ALIGN_INT__SHIFT                                  0x1 +#define UVD_MMSCH_LMI_STATUS__MMSCH_LMI_WRITE_CLEAN__SHIFT                                                    0x2 +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_LEN__SHIFT                                                        0x4 +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_ADDR_LSBS__SHIFT                                                  0x8 +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_AWRITE__SHIFT                                                     0xc +#define UVD_MMSCH_LMI_STATUS__MMSCH_RD_CLEAN__SHIFT                                                           0xd +#define UVD_MMSCH_LMI_STATUS__MMSCH_WR_CLEAN__SHIFT                                                           0xe +#define UVD_MMSCH_LMI_STATUS__LMI_AXI_MMSCH_UNSUPPORTED_LEN_INT_MASK                                          0x00000001L +#define UVD_MMSCH_LMI_STATUS__LMI_AXI_MMSCH_UNSUPPORTED_ADR_ALIGN_INT_MASK                                    0x00000002L +#define UVD_MMSCH_LMI_STATUS__MMSCH_LMI_WRITE_CLEAN_MASK                                                      0x00000004L +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_LEN_MASK                                                          0x000000F0L +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_ADDR_LSBS_MASK                                                    0x00000700L +#define UVD_MMSCH_LMI_STATUS__AXI_MMSCH_ERR_AWRITE_MASK                                                       0x00001000L +#define UVD_MMSCH_LMI_STATUS__MMSCH_RD_CLEAN_MASK                                                             0x00002000L +#define UVD_MMSCH_LMI_STATUS__MMSCH_WR_CLEAN_MASK                                                             0x00004000L +//VCN_RAS_CNTL_MMSCH +#define VCN_RAS_CNTL_MMSCH__MMSCH_FATAL_ERROR_EN__SHIFT                                                       0x1 +#define VCN_RAS_CNTL_MMSCH__MMSCH_PMI_EN__SHIFT                                                               0x5 +#define VCN_RAS_CNTL_MMSCH__MMSCH_REARM__SHIFT                                                                0x9 +#define VCN_RAS_CNTL_MMSCH__MMSCH_READY__SHIFT                                                                0x11 +#define VCN_RAS_CNTL_MMSCH__MMSCH_FATAL_ERROR_EN_MASK                                                         0x00000002L +#define VCN_RAS_CNTL_MMSCH__MMSCH_PMI_EN_MASK                                                                 0x00000020L +#define VCN_RAS_CNTL_MMSCH__MMSCH_REARM_MASK                                                                  0x00000200L +#define VCN_RAS_CNTL_MMSCH__MMSCH_READY_MASK                                                                  0x00020000L + + +// addressBlock: aid_uvd0_uvd_jrbc1_uvd_jrbc_dec +//UVD_JRBC1_UVD_JRBC_RB_WPTR +#define UVD_JRBC1_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC1_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC1_UVD_JRBC_RB_CNTL +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC1_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC1_UVD_JRBC_IB_SIZE +#define UVD_JRBC1_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC1_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC1_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC1_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC1_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC1_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC1_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC1_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC1_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC1_UVD_JRBC_SOFT_RESET +#define UVD_JRBC1_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC1_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC1_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC1_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC1_UVD_JRBC_STATUS +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC1_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC1_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC1_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC1_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC1_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC1_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC1_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC1_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC1_UVD_JRBC_RB_RPTR +#define UVD_JRBC1_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC1_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC1_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC1_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC1_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC1_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC1_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC1_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC1_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC1_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC1_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC1_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC1_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC1_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC1_UVD_JRBC_RB_SIZE +#define UVD_JRBC1_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC1_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC1_UVD_JRBC_SCRATCH0 +#define UVD_JRBC1_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC1_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc2_uvd_jrbc_dec +//UVD_JRBC2_UVD_JRBC_RB_WPTR +#define UVD_JRBC2_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC2_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC2_UVD_JRBC_RB_CNTL +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC2_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC2_UVD_JRBC_IB_SIZE +#define UVD_JRBC2_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC2_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC2_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC2_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC2_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC2_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC2_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC2_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC2_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC2_UVD_JRBC_SOFT_RESET +#define UVD_JRBC2_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC2_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC2_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC2_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC2_UVD_JRBC_STATUS +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC2_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC2_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC2_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC2_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC2_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC2_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC2_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC2_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC2_UVD_JRBC_RB_RPTR +#define UVD_JRBC2_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC2_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC2_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC2_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC2_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC2_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC2_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC2_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC2_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC2_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC2_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC2_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC2_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC2_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC2_UVD_JRBC_RB_SIZE +#define UVD_JRBC2_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC2_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC2_UVD_JRBC_SCRATCH0 +#define UVD_JRBC2_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC2_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc3_uvd_jrbc_dec +//UVD_JRBC3_UVD_JRBC_RB_WPTR +#define UVD_JRBC3_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC3_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC3_UVD_JRBC_RB_CNTL +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC3_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC3_UVD_JRBC_IB_SIZE +#define UVD_JRBC3_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC3_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC3_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC3_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC3_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC3_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC3_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC3_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC3_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC3_UVD_JRBC_SOFT_RESET +#define UVD_JRBC3_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC3_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC3_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC3_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC3_UVD_JRBC_STATUS +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC3_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC3_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC3_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC3_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC3_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC3_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC3_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC3_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC3_UVD_JRBC_RB_RPTR +#define UVD_JRBC3_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC3_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC3_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC3_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC3_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC3_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC3_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC3_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC3_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC3_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC3_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC3_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC3_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC3_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC3_UVD_JRBC_RB_SIZE +#define UVD_JRBC3_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC3_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC3_UVD_JRBC_SCRATCH0 +#define UVD_JRBC3_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC3_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc4_uvd_jrbc_dec +//UVD_JRBC4_UVD_JRBC_RB_WPTR +#define UVD_JRBC4_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC4_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC4_UVD_JRBC_RB_CNTL +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC4_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC4_UVD_JRBC_IB_SIZE +#define UVD_JRBC4_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC4_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC4_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC4_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC4_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC4_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC4_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC4_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC4_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC4_UVD_JRBC_SOFT_RESET +#define UVD_JRBC4_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC4_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC4_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC4_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC4_UVD_JRBC_STATUS +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC4_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC4_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC4_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC4_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC4_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC4_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC4_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC4_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC4_UVD_JRBC_RB_RPTR +#define UVD_JRBC4_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC4_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC4_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC4_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC4_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC4_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC4_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC4_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC4_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC4_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC4_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC4_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC4_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC4_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC4_UVD_JRBC_RB_SIZE +#define UVD_JRBC4_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC4_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC4_UVD_JRBC_SCRATCH0 +#define UVD_JRBC4_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC4_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc5_uvd_jrbc_dec +//UVD_JRBC5_UVD_JRBC_RB_WPTR +#define UVD_JRBC5_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC5_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC5_UVD_JRBC_RB_CNTL +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC5_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC5_UVD_JRBC_IB_SIZE +#define UVD_JRBC5_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC5_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC5_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC5_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC5_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC5_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC5_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC5_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC5_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC5_UVD_JRBC_SOFT_RESET +#define UVD_JRBC5_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC5_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC5_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC5_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC5_UVD_JRBC_STATUS +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC5_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC5_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC5_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC5_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC5_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC5_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC5_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC5_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC5_UVD_JRBC_RB_RPTR +#define UVD_JRBC5_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC5_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC5_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC5_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC5_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC5_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC5_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC5_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC5_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC5_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC5_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC5_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC5_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC5_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC5_UVD_JRBC_RB_SIZE +#define UVD_JRBC5_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC5_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC5_UVD_JRBC_SCRATCH0 +#define UVD_JRBC5_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC5_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc6_uvd_jrbc_dec +//UVD_JRBC6_UVD_JRBC_RB_WPTR +#define UVD_JRBC6_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC6_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC6_UVD_JRBC_RB_CNTL +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC6_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC6_UVD_JRBC_IB_SIZE +#define UVD_JRBC6_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC6_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC6_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC6_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC6_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC6_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC6_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC6_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC6_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC6_UVD_JRBC_SOFT_RESET +#define UVD_JRBC6_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC6_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC6_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC6_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC6_UVD_JRBC_STATUS +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC6_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC6_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC6_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC6_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC6_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC6_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC6_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC6_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC6_UVD_JRBC_RB_RPTR +#define UVD_JRBC6_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC6_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC6_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC6_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC6_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC6_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC6_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC6_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC6_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC6_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC6_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC6_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC6_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC6_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC6_UVD_JRBC_RB_SIZE +#define UVD_JRBC6_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC6_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC6_UVD_JRBC_SCRATCH0 +#define UVD_JRBC6_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC6_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jrbc7_uvd_jrbc_dec +//UVD_JRBC7_UVD_JRBC_RB_WPTR +#define UVD_JRBC7_UVD_JRBC_RB_WPTR__RB_WPTR__SHIFT                                                            0x4 +#define UVD_JRBC7_UVD_JRBC_RB_WPTR__RB_WPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC7_UVD_JRBC_RB_CNTL +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_NO_FETCH__SHIFT                                                        0x0 +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN__SHIFT                                                      0x1 +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER__SHIFT                                                 0x4 +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_NO_FETCH_MASK                                                          0x00000001L +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_RPTR_WR_EN_MASK                                                        0x00000002L +#define UVD_JRBC7_UVD_JRBC_RB_CNTL__RB_PRE_WRITE_TIMER_MASK                                                   0x0007FFF0L +//UVD_JRBC7_UVD_JRBC_IB_SIZE +#define UVD_JRBC7_UVD_JRBC_IB_SIZE__IB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC7_UVD_JRBC_IB_SIZE__IB_SIZE_MASK                                                              0x007FFFF0L +//UVD_JRBC7_UVD_JRBC_URGENT_CNTL +#define UVD_JRBC7_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK__SHIFT                                     0x0 +#define UVD_JRBC7_UVD_JRBC_URGENT_CNTL__CMD_READ_REQ_PRIORITY_MARK_MASK                                       0x00000003L +//UVD_JRBC7_UVD_JRBC_RB_REF_DATA +#define UVD_JRBC7_UVD_JRBC_RB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC7_UVD_JRBC_RB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC7_UVD_JRBC_RB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC7_UVD_JRBC_SOFT_RESET +#define UVD_JRBC7_UVD_JRBC_SOFT_RESET__RESET__SHIFT                                                           0x0 +#define UVD_JRBC7_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS__SHIFT                                               0x11 +#define UVD_JRBC7_UVD_JRBC_SOFT_RESET__RESET_MASK                                                             0x00000001L +#define UVD_JRBC7_UVD_JRBC_SOFT_RESET__SCLK_RESET_STATUS_MASK                                                 0x00020000L +//UVD_JRBC7_UVD_JRBC_STATUS +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_JOB_DONE__SHIFT                                                         0x0 +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_JOB_DONE__SHIFT                                                         0x1 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_ILLEGAL_CMD__SHIFT                                                      0x2 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT__SHIFT                                              0x3 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT__SHIFT                                                   0x4 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT__SHIFT                                                   0x5 +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_ILLEGAL_CMD__SHIFT                                                      0x6 +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT__SHIFT                                              0x7 +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT__SHIFT                                                   0x8 +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT__SHIFT                                                   0x9 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_TRAP_STATUS__SHIFT                                                      0xa +#define UVD_JRBC7_UVD_JRBC_STATUS__PREEMPT_STATUS__SHIFT                                                      0xb +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_TRAP_STATUS__SHIFT                                                      0xc +#define UVD_JRBC7_UVD_JRBC_STATUS__INT_EN__SHIFT                                                              0x10 +#define UVD_JRBC7_UVD_JRBC_STATUS__INT_ACK__SHIFT                                                             0x11 +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_JOB_DONE_MASK                                                           0x00000001L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_JOB_DONE_MASK                                                           0x00000002L +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_ILLEGAL_CMD_MASK                                                        0x00000004L +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_COND_REG_RD_TIMEOUT_MASK                                                0x00000008L +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_MEM_WR_TIMEOUT_MASK                                                     0x00000010L +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_MEM_RD_TIMEOUT_MASK                                                     0x00000020L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_ILLEGAL_CMD_MASK                                                        0x00000040L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_COND_REG_RD_TIMEOUT_MASK                                                0x00000080L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_MEM_WR_TIMEOUT_MASK                                                     0x00000100L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_MEM_RD_TIMEOUT_MASK                                                     0x00000200L +#define UVD_JRBC7_UVD_JRBC_STATUS__RB_TRAP_STATUS_MASK                                                        0x00000400L +#define UVD_JRBC7_UVD_JRBC_STATUS__PREEMPT_STATUS_MASK                                                        0x00000800L +#define UVD_JRBC7_UVD_JRBC_STATUS__IB_TRAP_STATUS_MASK                                                        0x00001000L +#define UVD_JRBC7_UVD_JRBC_STATUS__INT_EN_MASK                                                                0x00010000L +#define UVD_JRBC7_UVD_JRBC_STATUS__INT_ACK_MASK                                                               0x00020000L +//UVD_JRBC7_UVD_JRBC_RB_RPTR +#define UVD_JRBC7_UVD_JRBC_RB_RPTR__RB_RPTR__SHIFT                                                            0x4 +#define UVD_JRBC7_UVD_JRBC_RB_RPTR__RB_RPTR_MASK                                                              0x007FFFF0L +//UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC7_UVD_JRBC_RB_BUF_STATUS__RB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID__SHIFT                                                 0x0 +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR__SHIFT                                               0x10 +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR__SHIFT                                               0x18 +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_VALID_MASK                                                   0x0000FFFFL +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_RD_ADDR_MASK                                                 0x000F0000L +#define UVD_JRBC7_UVD_JRBC_IB_BUF_STATUS__IB_BUF_WR_ADDR_MASK                                                 0x03000000L +//UVD_JRBC7_UVD_JRBC_IB_SIZE_UPDATE +#define UVD_JRBC7_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE__SHIFT                                              0x4 +#define UVD_JRBC7_UVD_JRBC_IB_SIZE_UPDATE__REMAIN_IB_SIZE_MASK                                                0x007FFFF0L +//UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT__SHIFT                                           0x0 +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT__SHIFT                                        0x10 +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN__SHIFT                                        0x18 +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN__SHIFT                                            0x19 +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__RETRY_TIMER_CNT_MASK                                             0x0000FFFFL +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__RETRY_INTERVAL_CNT_MASK                                          0x00FF0000L +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__CONTINUOUS_POLL_EN_MASK                                          0x01000000L +#define UVD_JRBC7_UVD_JRBC_IB_COND_RD_TIMER__MEM_TIMEOUT_EN_MASK                                              0x02000000L +//UVD_JRBC7_UVD_JRBC_IB_REF_DATA +#define UVD_JRBC7_UVD_JRBC_IB_REF_DATA__REF_DATA__SHIFT                                                       0x0 +#define UVD_JRBC7_UVD_JRBC_IB_REF_DATA__REF_DATA_MASK                                                         0xFFFFFFFFL +//UVD_JRBC7_UVD_JPEG_PREEMPT_CMD +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN__SHIFT                                                     0x0 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE__SHIFT                                             0x1 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD__SHIFT                                              0x2 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__PREEMPT_EN_MASK                                                       0x00000001L +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__WAIT_JPEG_JOB_DONE_MASK                                               0x00000002L +#define UVD_JRBC7_UVD_JPEG_PREEMPT_CMD__PREEMPT_FENCE_CMD_MASK                                                0x00000004L +//UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA0 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0__SHIFT                                    0x0 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA0__PREEMPT_FENCE_DATA0_MASK                                      0xFFFFFFFFL +//UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA1 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1__SHIFT                                    0x0 +#define UVD_JRBC7_UVD_JPEG_PREEMPT_FENCE_DATA1__PREEMPT_FENCE_DATA1_MASK                                      0xFFFFFFFFL +//UVD_JRBC7_UVD_JRBC_RB_SIZE +#define UVD_JRBC7_UVD_JRBC_RB_SIZE__RB_SIZE__SHIFT                                                            0x4 +#define UVD_JRBC7_UVD_JRBC_RB_SIZE__RB_SIZE_MASK                                                              0x00FFFFF0L +//UVD_JRBC7_UVD_JRBC_SCRATCH0 +#define UVD_JRBC7_UVD_JRBC_SCRATCH0__SCRATCH0__SHIFT                                                          0x0 +#define UVD_JRBC7_UVD_JRBC_SCRATCH0__SCRATCH0_MASK                                                            0xFFFFFFFFL + + +// addressBlock: aid_uvd0_uvd_jmi1_uvd_jmi_dec +//UVD_JMI1_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI1_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI1_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI1_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI1_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI1_UVD_LMI_JRBC_CTRL +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI1_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI1_UVD_LMI_JPEG_CTRL +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI1_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI1_JPEG_LMI_DROP +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI1_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI1_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI1_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI1_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI1_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI1_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI1_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI1_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI1_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI1_UVD_LMI_JPEG_VMID +#define UVD_JMI1_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI1_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI1_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI1_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI1_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI1_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI1_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI1_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI1_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI1_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI1_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI1_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI1_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI1_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI1_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI1_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI1_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI1_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi2_uvd_jmi_dec +//UVD_JMI2_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI2_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI2_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI2_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI2_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI2_UVD_LMI_JRBC_CTRL +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI2_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI2_UVD_LMI_JPEG_CTRL +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI2_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI2_JPEG_LMI_DROP +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI2_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI2_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI2_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI2_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI2_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI2_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI2_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI2_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI2_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI2_UVD_LMI_JPEG_VMID +#define UVD_JMI2_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI2_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI2_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI2_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI2_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI2_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI2_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI2_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI2_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI2_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI2_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI2_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI2_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI2_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI2_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI2_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI2_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI2_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi3_uvd_jmi_dec +//UVD_JMI3_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI3_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI3_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI3_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI3_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI3_UVD_LMI_JRBC_CTRL +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI3_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI3_UVD_LMI_JPEG_CTRL +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI3_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI3_JPEG_LMI_DROP +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI3_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI3_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI3_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI3_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI3_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI3_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI3_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI3_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI3_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI3_UVD_LMI_JPEG_VMID +#define UVD_JMI3_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI3_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI3_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI3_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI3_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI3_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI3_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI3_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI3_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI3_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI3_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI3_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI3_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI3_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI3_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI3_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI3_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI3_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi4_uvd_jmi_dec +//UVD_JMI4_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI4_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI4_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI4_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI4_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI4_UVD_LMI_JRBC_CTRL +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI4_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI4_UVD_LMI_JPEG_CTRL +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI4_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI4_JPEG_LMI_DROP +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI4_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI4_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI4_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI4_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI4_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI4_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI4_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI4_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI4_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI4_UVD_LMI_JPEG_VMID +#define UVD_JMI4_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI4_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI4_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI4_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI4_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI4_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI4_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI4_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI4_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI4_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI4_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI4_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI4_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI4_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI4_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI4_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI4_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI4_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi5_uvd_jmi_dec +//UVD_JMI5_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI5_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI5_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI5_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI5_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI5_UVD_LMI_JRBC_CTRL +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI5_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI5_UVD_LMI_JPEG_CTRL +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI5_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI5_JPEG_LMI_DROP +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI5_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI5_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI5_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI5_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI5_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI5_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI5_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI5_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI5_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI5_UVD_LMI_JPEG_VMID +#define UVD_JMI5_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI5_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI5_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI5_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI5_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI5_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI5_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI5_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI5_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI5_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI5_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI5_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI5_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI5_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI5_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI5_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI5_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI5_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi6_uvd_jmi_dec +//UVD_JMI6_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI6_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI6_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI6_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI6_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI6_UVD_LMI_JRBC_CTRL +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI6_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI6_UVD_LMI_JPEG_CTRL +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI6_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI6_JPEG_LMI_DROP +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI6_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI6_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI6_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI6_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI6_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI6_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI6_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI6_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI6_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI6_UVD_LMI_JPEG_VMID +#define UVD_JMI6_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI6_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI6_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI6_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI6_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI6_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI6_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI6_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI6_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI6_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI6_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI6_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI6_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI6_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI6_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI6_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI6_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI6_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: aid_uvd0_uvd_jmi7_uvd_jmi_dec +//UVD_JMI7_UVD_JPEG_DEC_PF_CTRL +#define UVD_JMI7_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS__SHIFT                                             0x0 +#define UVD_JMI7_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING__SHIFT                                                0x1 +#define UVD_JMI7_UVD_JPEG_DEC_PF_CTRL__DEC_PF_HANDLING_DIS_MASK                                               0x00000001L +#define UVD_JMI7_UVD_JPEG_DEC_PF_CTRL__DEC_PF_SW_GATING_MASK                                                  0x00000002L +//UVD_JMI7_UVD_LMI_JRBC_CTRL +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI7_UVD_LMI_JRBC_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI7_UVD_LMI_JPEG_CTRL +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN__SHIFT                                                     0x0 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN__SHIFT                                                     0x1 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__RD_MAX_BURST__SHIFT                                                       0x4 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__WR_MAX_BURST__SHIFT                                                       0x8 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__RD_SWAP__SHIFT                                                            0x14 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__WR_SWAP__SHIFT                                                            0x16 +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__ARB_RD_WAIT_EN_MASK                                                       0x00000001L +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__ARB_WR_WAIT_EN_MASK                                                       0x00000002L +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__RD_MAX_BURST_MASK                                                         0x000000F0L +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__WR_MAX_BURST_MASK                                                         0x00000F00L +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__RD_SWAP_MASK                                                              0x00300000L +#define UVD_JMI7_UVD_LMI_JPEG_CTRL__WR_SWAP_MASK                                                              0x00C00000L +//UVD_JMI7_JPEG_LMI_DROP +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_WR_DROP__SHIFT                                                           0x0 +#define UVD_JMI7_JPEG_LMI_DROP__JRBC_WR_DROP__SHIFT                                                           0x1 +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_RD_DROP__SHIFT                                                           0x2 +#define UVD_JMI7_JPEG_LMI_DROP__JRBC_RD_DROP__SHIFT                                                           0x3 +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP__SHIFT                                                    0x4 +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_WR_DROP_MASK                                                             0x00000001L +#define UVD_JMI7_JPEG_LMI_DROP__JRBC_WR_DROP_MASK                                                             0x00000002L +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_RD_DROP_MASK                                                             0x00000004L +#define UVD_JMI7_JPEG_LMI_DROP__JRBC_RD_DROP_MASK                                                             0x00000008L +#define UVD_JMI7_JPEG_LMI_DROP__JPEG_ATOMIC_WR_DROP_MASK                                                      0x00000010L +//UVD_JMI7_UVD_LMI_JRBC_IB_VMID +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__IB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__IB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI7_UVD_LMI_JRBC_IB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI7_UVD_LMI_JRBC_RB_VMID +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID__SHIFT                                                      0x0 +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID__SHIFT                                                      0x4 +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID__SHIFT                                                     0x8 +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__RB_WR_VMID_MASK                                                        0x0000000FL +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__RB_RD_VMID_MASK                                                        0x000000F0L +#define UVD_JMI7_UVD_LMI_JRBC_RB_VMID__MEM_RD_VMID_MASK                                                       0x00000F00L +//UVD_JMI7_UVD_LMI_JPEG_VMID +#define UVD_JMI7_UVD_LMI_JPEG_VMID__JPEG_RD_VMID__SHIFT                                                       0x0 +#define UVD_JMI7_UVD_LMI_JPEG_VMID__JPEG_WR_VMID__SHIFT                                                       0x4 +#define UVD_JMI7_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID__SHIFT                                               0x8 +#define UVD_JMI7_UVD_LMI_JPEG_VMID__JPEG_RD_VMID_MASK                                                         0x0000000FL +#define UVD_JMI7_UVD_LMI_JPEG_VMID__JPEG_WR_VMID_MASK                                                         0x000000F0L +#define UVD_JMI7_UVD_LMI_JPEG_VMID__ATOMIC_USER0_WR_VMID_MASK                                                 0x00000F00L +//UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_FENCE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI7_UVD_LMI_JRBC_RB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI7_UVD_LMI_JRBC_RB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_PREEMPT_VMID +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_VMID__VMID__SHIFT                                                       0x0 +#define UVD_JMI7_UVD_LMI_JPEG_PREEMPT_VMID__VMID_MASK                                                         0x0000000FL +//UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP__SHIFT                                                     0x0 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP__SHIFT                                                     0x2 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP__SHIFT                                              0x4 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP__SHIFT                                              0x6 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP__SHIFT                                              0x8 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP__SHIFT                                              0xa +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP__SHIFT                                             0xc +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP__SHIFT                                                0xe +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP__SHIFT                                                0x10 +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MC_SWAP_MASK                                                       0x00000003L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MC_SWAP_MASK                                                       0x0000000CL +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_WR_MC_SWAP_MASK                                                0x00000030L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_WR_MC_SWAP_MASK                                                0x000000C0L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__RB_MEM_RD_MC_SWAP_MASK                                                0x00000300L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__IB_MEM_RD_MC_SWAP_MASK                                                0x00000C00L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__PREEMPT_WR_MC_SWAP_MASK                                               0x00003000L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__JPEG_RD_MC_SWAP_MASK                                                  0x0000C000L +#define UVD_JMI7_UVD_JMI_DEC_SWAP_CNTL__JPEG_WR_MC_SWAP_MASK                                                  0x00030000L +//UVD_JMI7_UVD_JMI_ATOMIC_CNTL +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en__SHIFT                                               0x0 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_max_burst__SHIFT                                                 0x1 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop__SHIFT                                                   0x5 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en__SHIFT                                            0x6 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG__SHIFT                                                    0x7 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE__SHIFT                                                   0xb +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_arb_wait_en_MASK                                                 0x00000001L +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_max_burst_MASK                                                   0x0000001EL +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_wr_drop_MASK                                                     0x00000020L +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__atomic_wr_clamping_en_MASK                                              0x00000040L +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__ATOMIC_WR_URG_MASK                                                      0x00000780L +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL__ATOMIC_SW_GATE_MASK                                                     0x00000800L +//UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW +#define UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                   0x0 +#define UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                     0xFFFFFFFFL +//UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                 0x0 +#define UVD_JMI7_UVD_JMI_ATOMIC_USER0_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                   0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0__SHIFT                                            0x0 +#define UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_LOW__BITS_31_0_MASK                                              0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                          0x0 +#define UVD_JMI7_UVD_LMI_JPEG_READ_64BIT_BAR_HIGH__BITS_63_32_MASK                                            0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0__SHIFT                                           0x0 +#define UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_LOW__BITS_31_0_MASK                                             0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                         0x0 +#define UVD_JMI7_UVD_LMI_JPEG_WRITE_64BIT_BAR_HIGH__BITS_63_32_MASK                                           0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0__SHIFT                                              0x0 +#define UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_LOW__BITS_31_0_MASK                                                0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                            0x0 +#define UVD_JMI7_UVD_LMI_JRBC_IB_64BIT_BAR_HIGH__BITS_63_32_MASK                                              0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW +#define UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0__SHIFT                                       0x0 +#define UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_LOW__BITS_31_0_MASK                                         0xFFFFFFFFL +//UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH +#define UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32__SHIFT                                     0x0 +#define UVD_JMI7_UVD_LMI_JRBC_IB_MEM_WR_64BIT_BAR_HIGH__BITS_63_32_MASK                                       0xFFFFFFFFL +//UVD_JMI7_UVD_JMI_ATOMIC_CNTL2 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap__SHIFT                                                 0x10 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                  0x18 +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL2__atomic_uvd_swap_MASK                                                   0x00FF0000L +#define UVD_JMI7_UVD_JMI_ATOMIC_CNTL2__ATOMIC_MC_SWAP_MASK                                                    0xFF000000L + + +// addressBlock: uvdctxind +//UVD_CGC_MEM_CTRL +#define UVD_CGC_MEM_CTRL__LMI_MC_LS_EN__SHIFT                                                                 0x0 +#define UVD_CGC_MEM_CTRL__MPC_LS_EN__SHIFT                                                                    0x1 +#define UVD_CGC_MEM_CTRL__MPRD_LS_EN__SHIFT                                                                   0x2 +#define UVD_CGC_MEM_CTRL__WCB_LS_EN__SHIFT                                                                    0x3 +#define UVD_CGC_MEM_CTRL__UDEC_RE_LS_EN__SHIFT                                                                0x4 +#define UVD_CGC_MEM_CTRL__UDEC_CM_LS_EN__SHIFT                                                                0x5 +#define UVD_CGC_MEM_CTRL__UDEC_IT_LS_EN__SHIFT                                                                0x6 +#define UVD_CGC_MEM_CTRL__UDEC_DB_LS_EN__SHIFT                                                                0x7 +#define UVD_CGC_MEM_CTRL__UDEC_MP_LS_EN__SHIFT                                                                0x8 +#define UVD_CGC_MEM_CTRL__SYS_LS_EN__SHIFT                                                                    0x9 +#define UVD_CGC_MEM_CTRL__VCPU_LS_EN__SHIFT                                                                   0xa +#define UVD_CGC_MEM_CTRL__MIF_LS_EN__SHIFT                                                                    0xc +#define UVD_CGC_MEM_CTRL__LCM_LS_EN__SHIFT                                                                    0xd +#define UVD_CGC_MEM_CTRL__MMSCH_LS_EN__SHIFT                                                                  0xe +#define UVD_CGC_MEM_CTRL__MPC1_LS_EN__SHIFT                                                                   0xf +#define UVD_CGC_MEM_CTRL__LS_SET_DELAY__SHIFT                                                                 0x10 +#define UVD_CGC_MEM_CTRL__LS_CLEAR_DELAY__SHIFT                                                               0x14 +#define UVD_CGC_MEM_CTRL__LMI_MC_LS_EN_MASK                                                                   0x00000001L +#define UVD_CGC_MEM_CTRL__MPC_LS_EN_MASK                                                                      0x00000002L +#define UVD_CGC_MEM_CTRL__MPRD_LS_EN_MASK                                                                     0x00000004L +#define UVD_CGC_MEM_CTRL__WCB_LS_EN_MASK                                                                      0x00000008L +#define UVD_CGC_MEM_CTRL__UDEC_RE_LS_EN_MASK                                                                  0x00000010L +#define UVD_CGC_MEM_CTRL__UDEC_CM_LS_EN_MASK                                                                  0x00000020L +#define UVD_CGC_MEM_CTRL__UDEC_IT_LS_EN_MASK                                                                  0x00000040L +#define UVD_CGC_MEM_CTRL__UDEC_DB_LS_EN_MASK                                                                  0x00000080L +#define UVD_CGC_MEM_CTRL__UDEC_MP_LS_EN_MASK                                                                  0x00000100L +#define UVD_CGC_MEM_CTRL__SYS_LS_EN_MASK                                                                      0x00000200L +#define UVD_CGC_MEM_CTRL__VCPU_LS_EN_MASK                                                                     0x00000400L +#define UVD_CGC_MEM_CTRL__MIF_LS_EN_MASK                                                                      0x00001000L +#define UVD_CGC_MEM_CTRL__LCM_LS_EN_MASK                                                                      0x00002000L +#define UVD_CGC_MEM_CTRL__MMSCH_LS_EN_MASK                                                                    0x00004000L +#define UVD_CGC_MEM_CTRL__MPC1_LS_EN_MASK                                                                     0x00008000L +#define UVD_CGC_MEM_CTRL__LS_SET_DELAY_MASK                                                                   0x000F0000L +#define UVD_CGC_MEM_CTRL__LS_CLEAR_DELAY_MASK                                                                 0x00F00000L +//UVD_CGC_CTRL2 +#define UVD_CGC_CTRL2__DYN_OCLK_RAMP_EN__SHIFT                                                                0x0 +#define UVD_CGC_CTRL2__DYN_RCLK_RAMP_EN__SHIFT                                                                0x1 +#define UVD_CGC_CTRL2__GATER_DIV_ID__SHIFT                                                                    0x2 +#define UVD_CGC_CTRL2__DYN_OCLK_RAMP_EN_MASK                                                                  0x00000001L +#define UVD_CGC_CTRL2__DYN_RCLK_RAMP_EN_MASK                                                                  0x00000002L +#define UVD_CGC_CTRL2__GATER_DIV_ID_MASK                                                                      0x0000001CL +//UVD_CGC_MEM_DS_CTRL +#define UVD_CGC_MEM_DS_CTRL__LMI_MC_DS_EN__SHIFT                                                              0x0 +#define UVD_CGC_MEM_DS_CTRL__MPC_DS_EN__SHIFT                                                                 0x1 +#define UVD_CGC_MEM_DS_CTRL__MPRD_DS_EN__SHIFT                                                                0x2 +#define UVD_CGC_MEM_DS_CTRL__WCB_DS_EN__SHIFT                                                                 0x3 +#define UVD_CGC_MEM_DS_CTRL__UDEC_RE_DS_EN__SHIFT                                                             0x4 +#define UVD_CGC_MEM_DS_CTRL__UDEC_CM_DS_EN__SHIFT                                                             0x5 +#define UVD_CGC_MEM_DS_CTRL__UDEC_IT_DS_EN__SHIFT                                                             0x6 +#define UVD_CGC_MEM_DS_CTRL__UDEC_DB_DS_EN__SHIFT                                                             0x7 +#define UVD_CGC_MEM_DS_CTRL__UDEC_MP_DS_EN__SHIFT                                                             0x8 +#define UVD_CGC_MEM_DS_CTRL__SYS_DS_EN__SHIFT                                                                 0x9 +#define UVD_CGC_MEM_DS_CTRL__VCPU_DS_EN__SHIFT                                                                0xa +#define UVD_CGC_MEM_DS_CTRL__MIF_DS_EN__SHIFT                                                                 0xc +#define UVD_CGC_MEM_DS_CTRL__LCM_DS_EN__SHIFT                                                                 0xd +#define UVD_CGC_MEM_DS_CTRL__MMSCH_DS_EN__SHIFT                                                               0xe +#define UVD_CGC_MEM_DS_CTRL__MPC1_DS_EN__SHIFT                                                                0xf +#define UVD_CGC_MEM_DS_CTRL__LMI_MC_DS_EN_MASK                                                                0x00000001L +#define UVD_CGC_MEM_DS_CTRL__MPC_DS_EN_MASK                                                                   0x00000002L +#define UVD_CGC_MEM_DS_CTRL__MPRD_DS_EN_MASK                                                                  0x00000004L +#define UVD_CGC_MEM_DS_CTRL__WCB_DS_EN_MASK                                                                   0x00000008L +#define UVD_CGC_MEM_DS_CTRL__UDEC_RE_DS_EN_MASK                                                               0x00000010L +#define UVD_CGC_MEM_DS_CTRL__UDEC_CM_DS_EN_MASK                                                               0x00000020L +#define UVD_CGC_MEM_DS_CTRL__UDEC_IT_DS_EN_MASK                                                               0x00000040L +#define UVD_CGC_MEM_DS_CTRL__UDEC_DB_DS_EN_MASK                                                               0x00000080L +#define UVD_CGC_MEM_DS_CTRL__UDEC_MP_DS_EN_MASK                                                               0x00000100L +#define UVD_CGC_MEM_DS_CTRL__SYS_DS_EN_MASK                                                                   0x00000200L +#define UVD_CGC_MEM_DS_CTRL__VCPU_DS_EN_MASK                                                                  0x00000400L +#define UVD_CGC_MEM_DS_CTRL__MIF_DS_EN_MASK                                                                   0x00001000L +#define UVD_CGC_MEM_DS_CTRL__LCM_DS_EN_MASK                                                                   0x00002000L +#define UVD_CGC_MEM_DS_CTRL__MMSCH_DS_EN_MASK                                                                 0x00004000L +#define UVD_CGC_MEM_DS_CTRL__MPC1_DS_EN_MASK                                                                  0x00008000L +//UVD_CGC_MEM_SD_CTRL +#define UVD_CGC_MEM_SD_CTRL__LMI_MC_SD_EN__SHIFT                                                              0x0 +#define UVD_CGC_MEM_SD_CTRL__MPC_SD_EN__SHIFT                                                                 0x1 +#define UVD_CGC_MEM_SD_CTRL__MPRD_SD_EN__SHIFT                                                                0x2 +#define UVD_CGC_MEM_SD_CTRL__WCB_SD_EN__SHIFT                                                                 0x3 +#define UVD_CGC_MEM_SD_CTRL__UDEC_RE_SD_EN__SHIFT                                                             0x4 +#define UVD_CGC_MEM_SD_CTRL__UDEC_CM_SD_EN__SHIFT                                                             0x5 +#define UVD_CGC_MEM_SD_CTRL__UDEC_IT_SD_EN__SHIFT                                                             0x6 +#define UVD_CGC_MEM_SD_CTRL__UDEC_DB_SD_EN__SHIFT                                                             0x7 +#define UVD_CGC_MEM_SD_CTRL__UDEC_MP_SD_EN__SHIFT                                                             0x8 +#define UVD_CGC_MEM_SD_CTRL__SYS_SD_EN__SHIFT                                                                 0x9 +#define UVD_CGC_MEM_SD_CTRL__VCPU_SD_EN__SHIFT                                                                0xa +#define UVD_CGC_MEM_SD_CTRL__MIF_SD_EN__SHIFT                                                                 0xc +#define UVD_CGC_MEM_SD_CTRL__LCM_SD_EN__SHIFT                                                                 0xd +#define UVD_CGC_MEM_SD_CTRL__MMSCH_SD_EN__SHIFT                                                               0xe +#define UVD_CGC_MEM_SD_CTRL__MPC1_SD_EN__SHIFT                                                                0xf +#define UVD_CGC_MEM_SD_CTRL__LMI_MC_SD_EN_MASK                                                                0x00000001L +#define UVD_CGC_MEM_SD_CTRL__MPC_SD_EN_MASK                                                                   0x00000002L +#define UVD_CGC_MEM_SD_CTRL__MPRD_SD_EN_MASK                                                                  0x00000004L +#define UVD_CGC_MEM_SD_CTRL__WCB_SD_EN_MASK                                                                   0x00000008L +#define UVD_CGC_MEM_SD_CTRL__UDEC_RE_SD_EN_MASK                                                               0x00000010L +#define UVD_CGC_MEM_SD_CTRL__UDEC_CM_SD_EN_MASK                                                               0x00000020L +#define UVD_CGC_MEM_SD_CTRL__UDEC_IT_SD_EN_MASK                                                               0x00000040L +#define UVD_CGC_MEM_SD_CTRL__UDEC_DB_SD_EN_MASK                                                               0x00000080L +#define UVD_CGC_MEM_SD_CTRL__UDEC_MP_SD_EN_MASK                                                               0x00000100L +#define UVD_CGC_MEM_SD_CTRL__SYS_SD_EN_MASK                                                                   0x00000200L +#define UVD_CGC_MEM_SD_CTRL__VCPU_SD_EN_MASK                                                                  0x00000400L +#define UVD_CGC_MEM_SD_CTRL__MIF_SD_EN_MASK                                                                   0x00001000L +#define UVD_CGC_MEM_SD_CTRL__LCM_SD_EN_MASK                                                                   0x00002000L +#define UVD_CGC_MEM_SD_CTRL__MMSCH_SD_EN_MASK                                                                 0x00004000L +#define UVD_CGC_MEM_SD_CTRL__MPC1_SD_EN_MASK                                                                  0x00008000L +//UVD_SW_SCRATCH_00 +#define UVD_SW_SCRATCH_00__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_00__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_01 +#define UVD_SW_SCRATCH_01__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_01__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_02 +#define UVD_SW_SCRATCH_02__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_02__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_03 +#define UVD_SW_SCRATCH_03__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_03__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_04 +#define UVD_SW_SCRATCH_04__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_04__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_05 +#define UVD_SW_SCRATCH_05__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_05__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_06 +#define UVD_SW_SCRATCH_06__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_06__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_07 +#define UVD_SW_SCRATCH_07__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_07__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_08 +#define UVD_SW_SCRATCH_08__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_08__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_09 +#define UVD_SW_SCRATCH_09__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_09__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_10 +#define UVD_SW_SCRATCH_10__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_10__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_11 +#define UVD_SW_SCRATCH_11__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_11__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_12 +#define UVD_SW_SCRATCH_12__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_12__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_13 +#define UVD_SW_SCRATCH_13__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_13__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_14 +#define UVD_SW_SCRATCH_14__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_14__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_SW_SCRATCH_15 +#define UVD_SW_SCRATCH_15__DATA__SHIFT                                                                        0x0 +#define UVD_SW_SCRATCH_15__DATA_MASK                                                                          0xFFFFFFFFL +//UVD_IH_SEM_CTRL +#define UVD_IH_SEM_CTRL__IH_STALL_EN__SHIFT                                                                   0x0 +#define UVD_IH_SEM_CTRL__SEM_STALL_EN__SHIFT                                                                  0x1 +#define UVD_IH_SEM_CTRL__IH_STATUS_CLEAN__SHIFT                                                               0x2 +#define UVD_IH_SEM_CTRL__SEM_STATUS_CLEAN__SHIFT                                                              0x3 +#define UVD_IH_SEM_CTRL__IH_VMID__SHIFT                                                                       0x4 +#define UVD_IH_SEM_CTRL__IH_USER_DATA__SHIFT                                                                  0x8 +#define UVD_IH_SEM_CTRL__IH_RINGID__SHIFT                                                                     0x14 +#define UVD_IH_SEM_CTRL__IH_STALL_EN_MASK                                                                     0x00000001L +#define UVD_IH_SEM_CTRL__SEM_STALL_EN_MASK                                                                    0x00000002L +#define UVD_IH_SEM_CTRL__IH_STATUS_CLEAN_MASK                                                                 0x00000004L +#define UVD_IH_SEM_CTRL__SEM_STATUS_CLEAN_MASK                                                                0x00000008L +#define UVD_IH_SEM_CTRL__IH_VMID_MASK                                                                         0x000000F0L +#define UVD_IH_SEM_CTRL__IH_USER_DATA_MASK                                                                    0x000FFF00L +#define UVD_IH_SEM_CTRL__IH_RINGID_MASK                                                                       0x0FF00000L + + +// addressBlock: lmi_adp_indirect +//UVD_LMI_CRC0 +#define UVD_LMI_CRC0__CRC32__SHIFT                                                                            0x0 +#define UVD_LMI_CRC0__CRC32_MASK                                                                              0xFFFFFFFFL +//UVD_LMI_CRC1 +#define UVD_LMI_CRC1__CRC32__SHIFT                                                                            0x0 +#define UVD_LMI_CRC1__CRC32_MASK                                                                              0xFFFFFFFFL +//UVD_LMI_CRC2 +#define UVD_LMI_CRC2__CRC32__SHIFT                                                                            0x0 +#define UVD_LMI_CRC2__CRC32_MASK                                                                              0xFFFFFFFFL +//UVD_LMI_CRC3 +#define UVD_LMI_CRC3__CRC32__SHIFT                                                                            0x0 +#define UVD_LMI_CRC3__CRC32_MASK                                                                              0xFFFFFFFFL +//UVD_LMI_CRC10 +#define UVD_LMI_CRC10__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC10__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_CRC11 +#define UVD_LMI_CRC11__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC11__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_CRC12 +#define UVD_LMI_CRC12__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC12__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_CRC13 +#define UVD_LMI_CRC13__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC13__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_CRC14 +#define UVD_LMI_CRC14__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC14__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_CRC15 +#define UVD_LMI_CRC15__CRC32__SHIFT                                                                           0x0 +#define UVD_LMI_CRC15__CRC32_MASK                                                                             0xFFFFFFFFL +//UVD_LMI_SWAP_CNTL2 +#define UVD_LMI_SWAP_CNTL2__SCPU_R_MC_SWAP__SHIFT                                                             0x0 +#define UVD_LMI_SWAP_CNTL2__SCPU_W_MC_SWAP__SHIFT                                                             0x2 +#define UVD_LMI_SWAP_CNTL2__ATOMIC_MC_SWAP__SHIFT                                                             0x4 +#define UVD_LMI_SWAP_CNTL2__CENC_MC_SWAP__SHIFT                                                               0xc +#define UVD_LMI_SWAP_CNTL2__FBC_KEY_MC_SWAP__SHIFT                                                            0xe +#define UVD_LMI_SWAP_CNTL2__SCPU_R_MC_SWAP_MASK                                                               0x00000003L +#define UVD_LMI_SWAP_CNTL2__SCPU_W_MC_SWAP_MASK                                                               0x0000000CL +#define UVD_LMI_SWAP_CNTL2__ATOMIC_MC_SWAP_MASK                                                               0x00000FF0L +#define UVD_LMI_SWAP_CNTL2__CENC_MC_SWAP_MASK                                                                 0x00003000L +#define UVD_LMI_SWAP_CNTL2__FBC_KEY_MC_SWAP_MASK                                                              0x0000C000L +//UVD_MEMCHECK_SYS_INT_EN +#define UVD_MEMCHECK_SYS_INT_EN__RE_ERR_EN__SHIFT                                                             0x0 +#define UVD_MEMCHECK_SYS_INT_EN__IT_ERR_EN__SHIFT                                                             0x1 +#define UVD_MEMCHECK_SYS_INT_EN__MP_ERR_EN__SHIFT                                                             0x2 +#define UVD_MEMCHECK_SYS_INT_EN__DB_ERR_EN__SHIFT                                                             0x3 +#define UVD_MEMCHECK_SYS_INT_EN__DBW_ERR_EN__SHIFT                                                            0x4 +#define UVD_MEMCHECK_SYS_INT_EN__CM_ERR_EN__SHIFT                                                             0x5 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_REF_ERR_EN__SHIFT                                                        0x6 +#define UVD_MEMCHECK_SYS_INT_EN__VCPU_ERR_EN__SHIFT                                                           0x7 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_DBW_ERR_EN__SHIFT                                                        0x8 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_CM_COLOC_ERR_EN__SHIFT                                                   0x9 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP0_ERR_EN__SHIFT                                                       0xa +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP1_ERR_EN__SHIFT                                                       0xb +#define UVD_MEMCHECK_SYS_INT_EN__SRE_ERR_EN__SHIFT                                                            0xc +#define UVD_MEMCHECK_SYS_INT_EN__IT_RD_ERR_EN__SHIFT                                                          0xf +#define UVD_MEMCHECK_SYS_INT_EN__CM_RD_ERR_EN__SHIFT                                                          0x10 +#define UVD_MEMCHECK_SYS_INT_EN__DB_RD_ERR_EN__SHIFT                                                          0x11 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_RD_ERR_EN__SHIFT                                                         0x12 +#define UVD_MEMCHECK_SYS_INT_EN__IDCT_RD_ERR_EN__SHIFT                                                        0x13 +#define UVD_MEMCHECK_SYS_INT_EN__MPC_RD_ERR_EN__SHIFT                                                         0x14 +#define UVD_MEMCHECK_SYS_INT_EN__LBSI_RD_ERR_EN__SHIFT                                                        0x15 +#define UVD_MEMCHECK_SYS_INT_EN__RBC_RD_ERR_EN__SHIFT                                                         0x18 +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP2_ERR_EN__SHIFT                                                       0x1b +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP3_ERR_EN__SHIFT                                                       0x1c +#define UVD_MEMCHECK_SYS_INT_EN__MIF_SCLR_ERR_EN__SHIFT                                                       0x1d +#define UVD_MEMCHECK_SYS_INT_EN__MIF_SCLR2_ERR_EN__SHIFT                                                      0x1e +#define UVD_MEMCHECK_SYS_INT_EN__PREF_ERR_EN__SHIFT                                                           0x1f +#define UVD_MEMCHECK_SYS_INT_EN__RE_ERR_EN_MASK                                                               0x00000001L +#define UVD_MEMCHECK_SYS_INT_EN__IT_ERR_EN_MASK                                                               0x00000002L +#define UVD_MEMCHECK_SYS_INT_EN__MP_ERR_EN_MASK                                                               0x00000004L +#define UVD_MEMCHECK_SYS_INT_EN__DB_ERR_EN_MASK                                                               0x00000008L +#define UVD_MEMCHECK_SYS_INT_EN__DBW_ERR_EN_MASK                                                              0x00000010L +#define UVD_MEMCHECK_SYS_INT_EN__CM_ERR_EN_MASK                                                               0x00000020L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_REF_ERR_EN_MASK                                                          0x00000040L +#define UVD_MEMCHECK_SYS_INT_EN__VCPU_ERR_EN_MASK                                                             0x00000080L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_DBW_ERR_EN_MASK                                                          0x00000100L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_CM_COLOC_ERR_EN_MASK                                                     0x00000200L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP0_ERR_EN_MASK                                                         0x00000400L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP1_ERR_EN_MASK                                                         0x00000800L +#define UVD_MEMCHECK_SYS_INT_EN__SRE_ERR_EN_MASK                                                              0x00001000L +#define UVD_MEMCHECK_SYS_INT_EN__IT_RD_ERR_EN_MASK                                                            0x00008000L +#define UVD_MEMCHECK_SYS_INT_EN__CM_RD_ERR_EN_MASK                                                            0x00010000L +#define UVD_MEMCHECK_SYS_INT_EN__DB_RD_ERR_EN_MASK                                                            0x00020000L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_RD_ERR_EN_MASK                                                           0x00040000L +#define UVD_MEMCHECK_SYS_INT_EN__IDCT_RD_ERR_EN_MASK                                                          0x00080000L +#define UVD_MEMCHECK_SYS_INT_EN__MPC_RD_ERR_EN_MASK                                                           0x00100000L +#define UVD_MEMCHECK_SYS_INT_EN__LBSI_RD_ERR_EN_MASK                                                          0x00200000L +#define UVD_MEMCHECK_SYS_INT_EN__RBC_RD_ERR_EN_MASK                                                           0x01000000L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP2_ERR_EN_MASK                                                         0x08000000L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_BSP3_ERR_EN_MASK                                                         0x10000000L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_SCLR_ERR_EN_MASK                                                         0x20000000L +#define UVD_MEMCHECK_SYS_INT_EN__MIF_SCLR2_ERR_EN_MASK                                                        0x40000000L +#define UVD_MEMCHECK_SYS_INT_EN__PREF_ERR_EN_MASK                                                             0x80000000L +//UVD_MEMCHECK_SYS_INT_STAT +#define UVD_MEMCHECK_SYS_INT_STAT__RE_LO_ERR__SHIFT                                                           0x0 +#define UVD_MEMCHECK_SYS_INT_STAT__RE_HI_ERR__SHIFT                                                           0x1 +#define UVD_MEMCHECK_SYS_INT_STAT__IT_LO_ERR__SHIFT                                                           0x2 +#define UVD_MEMCHECK_SYS_INT_STAT__IT_HI_ERR__SHIFT                                                           0x3 +#define UVD_MEMCHECK_SYS_INT_STAT__MP_LO_ERR__SHIFT                                                           0x4 +#define UVD_MEMCHECK_SYS_INT_STAT__MP_HI_ERR__SHIFT                                                           0x5 +#define UVD_MEMCHECK_SYS_INT_STAT__DB_LO_ERR__SHIFT                                                           0x6 +#define UVD_MEMCHECK_SYS_INT_STAT__DB_HI_ERR__SHIFT                                                           0x7 +#define UVD_MEMCHECK_SYS_INT_STAT__DBW_LO_ERR__SHIFT                                                          0x8 +#define UVD_MEMCHECK_SYS_INT_STAT__DBW_HI_ERR__SHIFT                                                          0x9 +#define UVD_MEMCHECK_SYS_INT_STAT__CM_LO_ERR__SHIFT                                                           0xa +#define UVD_MEMCHECK_SYS_INT_STAT__CM_HI_ERR__SHIFT                                                           0xb +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_REF_LO_ERR__SHIFT                                                      0xc +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_REF_HI_ERR__SHIFT                                                      0xd +#define UVD_MEMCHECK_SYS_INT_STAT__VCPU_LO_ERR__SHIFT                                                         0xe +#define UVD_MEMCHECK_SYS_INT_STAT__VCPU_HI_ERR__SHIFT                                                         0xf +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_DBW_LO_ERR__SHIFT                                                      0x10 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_DBW_HI_ERR__SHIFT                                                      0x11 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_CM_COLOC_LO_ERR__SHIFT                                                 0x12 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_CM_COLOC_HI_ERR__SHIFT                                                 0x13 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP0_LO_ERR__SHIFT                                                     0x14 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP0_HI_ERR__SHIFT                                                     0x15 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP1_LO_ERR__SHIFT                                                     0x16 +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP1_HI_ERR__SHIFT                                                     0x17 +#define UVD_MEMCHECK_SYS_INT_STAT__SRE_LO_ERR__SHIFT                                                          0x18 +#define UVD_MEMCHECK_SYS_INT_STAT__SRE_HI_ERR__SHIFT                                                          0x19 +#define UVD_MEMCHECK_SYS_INT_STAT__IT_RD_LO_ERR__SHIFT                                                        0x1e +#define UVD_MEMCHECK_SYS_INT_STAT__IT_RD_HI_ERR__SHIFT                                                        0x1f +#define UVD_MEMCHECK_SYS_INT_STAT__RE_LO_ERR_MASK                                                             0x00000001L +#define UVD_MEMCHECK_SYS_INT_STAT__RE_HI_ERR_MASK                                                             0x00000002L +#define UVD_MEMCHECK_SYS_INT_STAT__IT_LO_ERR_MASK                                                             0x00000004L +#define UVD_MEMCHECK_SYS_INT_STAT__IT_HI_ERR_MASK                                                             0x00000008L +#define UVD_MEMCHECK_SYS_INT_STAT__MP_LO_ERR_MASK                                                             0x00000010L +#define UVD_MEMCHECK_SYS_INT_STAT__MP_HI_ERR_MASK                                                             0x00000020L +#define UVD_MEMCHECK_SYS_INT_STAT__DB_LO_ERR_MASK                                                             0x00000040L +#define UVD_MEMCHECK_SYS_INT_STAT__DB_HI_ERR_MASK                                                             0x00000080L +#define UVD_MEMCHECK_SYS_INT_STAT__DBW_LO_ERR_MASK                                                            0x00000100L +#define UVD_MEMCHECK_SYS_INT_STAT__DBW_HI_ERR_MASK                                                            0x00000200L +#define UVD_MEMCHECK_SYS_INT_STAT__CM_LO_ERR_MASK                                                             0x00000400L +#define UVD_MEMCHECK_SYS_INT_STAT__CM_HI_ERR_MASK                                                             0x00000800L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_REF_LO_ERR_MASK                                                        0x00001000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_REF_HI_ERR_MASK                                                        0x00002000L +#define UVD_MEMCHECK_SYS_INT_STAT__VCPU_LO_ERR_MASK                                                           0x00004000L +#define UVD_MEMCHECK_SYS_INT_STAT__VCPU_HI_ERR_MASK                                                           0x00008000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_DBW_LO_ERR_MASK                                                        0x00010000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_DBW_HI_ERR_MASK                                                        0x00020000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_CM_COLOC_LO_ERR_MASK                                                   0x00040000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_CM_COLOC_HI_ERR_MASK                                                   0x00080000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP0_LO_ERR_MASK                                                       0x00100000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP0_HI_ERR_MASK                                                       0x00200000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP1_LO_ERR_MASK                                                       0x00400000L +#define UVD_MEMCHECK_SYS_INT_STAT__MIF_BSP1_HI_ERR_MASK                                                       0x00800000L +#define UVD_MEMCHECK_SYS_INT_STAT__SRE_LO_ERR_MASK                                                            0x01000000L +#define UVD_MEMCHECK_SYS_INT_STAT__SRE_HI_ERR_MASK                                                            0x02000000L +#define UVD_MEMCHECK_SYS_INT_STAT__IT_RD_LO_ERR_MASK                                                          0x40000000L +#define UVD_MEMCHECK_SYS_INT_STAT__IT_RD_HI_ERR_MASK                                                          0x80000000L +//UVD_MEMCHECK_SYS_INT_ACK +#define UVD_MEMCHECK_SYS_INT_ACK__RE_LO_ACK__SHIFT                                                            0x0 +#define UVD_MEMCHECK_SYS_INT_ACK__RE_HI_ACK__SHIFT                                                            0x1 +#define UVD_MEMCHECK_SYS_INT_ACK__IT_LO_ACK__SHIFT                                                            0x2 +#define UVD_MEMCHECK_SYS_INT_ACK__IT_HI_ACK__SHIFT                                                            0x3 +#define UVD_MEMCHECK_SYS_INT_ACK__MP_LO_ACK__SHIFT                                                            0x4 +#define UVD_MEMCHECK_SYS_INT_ACK__MP_HI_ACK__SHIFT                                                            0x5 +#define UVD_MEMCHECK_SYS_INT_ACK__DB_LO_ACK__SHIFT                                                            0x6 +#define UVD_MEMCHECK_SYS_INT_ACK__DB_HI_ACK__SHIFT                                                            0x7 +#define UVD_MEMCHECK_SYS_INT_ACK__DBW_LO_ACK__SHIFT                                                           0x8 +#define UVD_MEMCHECK_SYS_INT_ACK__DBW_HI_ACK__SHIFT                                                           0x9 +#define UVD_MEMCHECK_SYS_INT_ACK__CM_LO_ACK__SHIFT                                                            0xa +#define UVD_MEMCHECK_SYS_INT_ACK__CM_HI_ACK__SHIFT                                                            0xb +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_REF_LO_ACK__SHIFT                                                       0xc +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_REF_HI_ACK__SHIFT                                                       0xd +#define UVD_MEMCHECK_SYS_INT_ACK__VCPU_LO_ACK__SHIFT                                                          0xe +#define UVD_MEMCHECK_SYS_INT_ACK__VCPU_HI_ACK__SHIFT                                                          0xf +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_DBW_LO_ACK__SHIFT                                                       0x10 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_DBW_HI_ACK__SHIFT                                                       0x11 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_CM_COLOC_LO_ACK__SHIFT                                                  0x12 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_CM_COLOC_HI_ACK__SHIFT                                                  0x13 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP0_LO_ACK__SHIFT                                                      0x14 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP0_HI_ACK__SHIFT                                                      0x15 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP1_LO_ACK__SHIFT                                                      0x16 +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP1_HI_ACK__SHIFT                                                      0x17 +#define UVD_MEMCHECK_SYS_INT_ACK__SRE_LO_ACK__SHIFT                                                           0x18 +#define UVD_MEMCHECK_SYS_INT_ACK__SRE_HI_ACK__SHIFT                                                           0x19 +#define UVD_MEMCHECK_SYS_INT_ACK__IT_RD_LO_ACK__SHIFT                                                         0x1e +#define UVD_MEMCHECK_SYS_INT_ACK__IT_RD_HI_ACK__SHIFT                                                         0x1f +#define UVD_MEMCHECK_SYS_INT_ACK__RE_LO_ACK_MASK                                                              0x00000001L +#define UVD_MEMCHECK_SYS_INT_ACK__RE_HI_ACK_MASK                                                              0x00000002L +#define UVD_MEMCHECK_SYS_INT_ACK__IT_LO_ACK_MASK                                                              0x00000004L +#define UVD_MEMCHECK_SYS_INT_ACK__IT_HI_ACK_MASK                                                              0x00000008L +#define UVD_MEMCHECK_SYS_INT_ACK__MP_LO_ACK_MASK                                                              0x00000010L +#define UVD_MEMCHECK_SYS_INT_ACK__MP_HI_ACK_MASK                                                              0x00000020L +#define UVD_MEMCHECK_SYS_INT_ACK__DB_LO_ACK_MASK                                                              0x00000040L +#define UVD_MEMCHECK_SYS_INT_ACK__DB_HI_ACK_MASK                                                              0x00000080L +#define UVD_MEMCHECK_SYS_INT_ACK__DBW_LO_ACK_MASK                                                             0x00000100L +#define UVD_MEMCHECK_SYS_INT_ACK__DBW_HI_ACK_MASK                                                             0x00000200L +#define UVD_MEMCHECK_SYS_INT_ACK__CM_LO_ACK_MASK                                                              0x00000400L +#define UVD_MEMCHECK_SYS_INT_ACK__CM_HI_ACK_MASK                                                              0x00000800L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_REF_LO_ACK_MASK                                                         0x00001000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_REF_HI_ACK_MASK                                                         0x00002000L +#define UVD_MEMCHECK_SYS_INT_ACK__VCPU_LO_ACK_MASK                                                            0x00004000L +#define UVD_MEMCHECK_SYS_INT_ACK__VCPU_HI_ACK_MASK                                                            0x00008000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_DBW_LO_ACK_MASK                                                         0x00010000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_DBW_HI_ACK_MASK                                                         0x00020000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_CM_COLOC_LO_ACK_MASK                                                    0x00040000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_CM_COLOC_HI_ACK_MASK                                                    0x00080000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP0_LO_ACK_MASK                                                        0x00100000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP0_HI_ACK_MASK                                                        0x00200000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP1_LO_ACK_MASK                                                        0x00400000L +#define UVD_MEMCHECK_SYS_INT_ACK__MIF_BSP1_HI_ACK_MASK                                                        0x00800000L +#define UVD_MEMCHECK_SYS_INT_ACK__SRE_LO_ACK_MASK                                                             0x01000000L +#define UVD_MEMCHECK_SYS_INT_ACK__SRE_HI_ACK_MASK                                                             0x02000000L +#define UVD_MEMCHECK_SYS_INT_ACK__IT_RD_LO_ACK_MASK                                                           0x40000000L +#define UVD_MEMCHECK_SYS_INT_ACK__IT_RD_HI_ACK_MASK                                                           0x80000000L +//UVD_MEMCHECK_VCPU_INT_EN +#define UVD_MEMCHECK_VCPU_INT_EN__RE_ERR_EN__SHIFT                                                            0x0 +#define UVD_MEMCHECK_VCPU_INT_EN__IT_ERR_EN__SHIFT                                                            0x1 +#define UVD_MEMCHECK_VCPU_INT_EN__MP_ERR_EN__SHIFT                                                            0x2 +#define UVD_MEMCHECK_VCPU_INT_EN__DB_ERR_EN__SHIFT                                                            0x3 +#define UVD_MEMCHECK_VCPU_INT_EN__DBW_ERR_EN__SHIFT                                                           0x4 +#define UVD_MEMCHECK_VCPU_INT_EN__CM_ERR_EN__SHIFT                                                            0x5 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_REF_ERR_EN__SHIFT                                                       0x6 +#define UVD_MEMCHECK_VCPU_INT_EN__VCPU_ERR_EN__SHIFT                                                          0x7 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_DBW_ERR_EN__SHIFT                                                       0x8 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_CM_COLOC_ERR_EN__SHIFT                                                  0x9 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP0_ERR_EN__SHIFT                                                      0xa +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP1_ERR_EN__SHIFT                                                      0xb +#define UVD_MEMCHECK_VCPU_INT_EN__SRE_ERR_EN__SHIFT                                                           0xc +#define UVD_MEMCHECK_VCPU_INT_EN__IT_RD_ERR_EN__SHIFT                                                         0xf +#define UVD_MEMCHECK_VCPU_INT_EN__CM_RD_ERR_EN__SHIFT                                                         0x10 +#define UVD_MEMCHECK_VCPU_INT_EN__DB_RD_ERR_EN__SHIFT                                                         0x11 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_RD_ERR_EN__SHIFT                                                        0x12 +#define UVD_MEMCHECK_VCPU_INT_EN__IDCT_RD_ERR_EN__SHIFT                                                       0x13 +#define UVD_MEMCHECK_VCPU_INT_EN__MPC_RD_ERR_EN__SHIFT                                                        0x14 +#define UVD_MEMCHECK_VCPU_INT_EN__LBSI_RD_ERR_EN__SHIFT                                                       0x15 +#define UVD_MEMCHECK_VCPU_INT_EN__RBC_RD_ERR_EN__SHIFT                                                        0x18 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP2_ERR_EN__SHIFT                                                      0x19 +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP3_ERR_EN__SHIFT                                                      0x1a +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_SCLR_ERR_EN__SHIFT                                                      0x1b +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_SCLR2_ERR_EN__SHIFT                                                     0x1c +#define UVD_MEMCHECK_VCPU_INT_EN__PREF_ERR_EN__SHIFT                                                          0x1d +#define UVD_MEMCHECK_VCPU_INT_EN__RE_ERR_EN_MASK                                                              0x00000001L +#define UVD_MEMCHECK_VCPU_INT_EN__IT_ERR_EN_MASK                                                              0x00000002L +#define UVD_MEMCHECK_VCPU_INT_EN__MP_ERR_EN_MASK                                                              0x00000004L +#define UVD_MEMCHECK_VCPU_INT_EN__DB_ERR_EN_MASK                                                              0x00000008L +#define UVD_MEMCHECK_VCPU_INT_EN__DBW_ERR_EN_MASK                                                             0x00000010L +#define UVD_MEMCHECK_VCPU_INT_EN__CM_ERR_EN_MASK                                                              0x00000020L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_REF_ERR_EN_MASK                                                         0x00000040L +#define UVD_MEMCHECK_VCPU_INT_EN__VCPU_ERR_EN_MASK                                                            0x00000080L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_DBW_ERR_EN_MASK                                                         0x00000100L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_CM_COLOC_ERR_EN_MASK                                                    0x00000200L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP0_ERR_EN_MASK                                                        0x00000400L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP1_ERR_EN_MASK                                                        0x00000800L +#define UVD_MEMCHECK_VCPU_INT_EN__SRE_ERR_EN_MASK                                                             0x00001000L +#define UVD_MEMCHECK_VCPU_INT_EN__IT_RD_ERR_EN_MASK                                                           0x00008000L +#define UVD_MEMCHECK_VCPU_INT_EN__CM_RD_ERR_EN_MASK                                                           0x00010000L +#define UVD_MEMCHECK_VCPU_INT_EN__DB_RD_ERR_EN_MASK                                                           0x00020000L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_RD_ERR_EN_MASK                                                          0x00040000L +#define UVD_MEMCHECK_VCPU_INT_EN__IDCT_RD_ERR_EN_MASK                                                         0x00080000L +#define UVD_MEMCHECK_VCPU_INT_EN__MPC_RD_ERR_EN_MASK                                                          0x00100000L +#define UVD_MEMCHECK_VCPU_INT_EN__LBSI_RD_ERR_EN_MASK                                                         0x00200000L +#define UVD_MEMCHECK_VCPU_INT_EN__RBC_RD_ERR_EN_MASK                                                          0x01000000L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP2_ERR_EN_MASK                                                        0x02000000L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_BSP3_ERR_EN_MASK                                                        0x04000000L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_SCLR_ERR_EN_MASK                                                        0x08000000L +#define UVD_MEMCHECK_VCPU_INT_EN__MIF_SCLR2_ERR_EN_MASK                                                       0x10000000L +#define UVD_MEMCHECK_VCPU_INT_EN__PREF_ERR_EN_MASK                                                            0x20000000L +//UVD_MEMCHECK_VCPU_INT_STAT +#define UVD_MEMCHECK_VCPU_INT_STAT__RE_LO_ERR__SHIFT                                                          0x0 +#define UVD_MEMCHECK_VCPU_INT_STAT__RE_HI_ERR__SHIFT                                                          0x1 +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_LO_ERR__SHIFT                                                          0x2 +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_HI_ERR__SHIFT                                                          0x3 +#define UVD_MEMCHECK_VCPU_INT_STAT__MP_LO_ERR__SHIFT                                                          0x4 +#define UVD_MEMCHECK_VCPU_INT_STAT__MP_HI_ERR__SHIFT                                                          0x5 +#define UVD_MEMCHECK_VCPU_INT_STAT__DB_LO_ERR__SHIFT                                                          0x6 +#define UVD_MEMCHECK_VCPU_INT_STAT__DB_HI_ERR__SHIFT                                                          0x7 +#define UVD_MEMCHECK_VCPU_INT_STAT__DBW_LO_ERR__SHIFT                                                         0x8 +#define UVD_MEMCHECK_VCPU_INT_STAT__DBW_HI_ERR__SHIFT                                                         0x9 +#define UVD_MEMCHECK_VCPU_INT_STAT__CM_LO_ERR__SHIFT                                                          0xa +#define UVD_MEMCHECK_VCPU_INT_STAT__CM_HI_ERR__SHIFT                                                          0xb +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_REF_LO_ERR__SHIFT                                                     0xc +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_REF_HI_ERR__SHIFT                                                     0xd +#define UVD_MEMCHECK_VCPU_INT_STAT__VCPU_LO_ERR__SHIFT                                                        0xe +#define UVD_MEMCHECK_VCPU_INT_STAT__VCPU_HI_ERR__SHIFT                                                        0xf +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_DBW_LO_ERR__SHIFT                                                     0x10 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_DBW_HI_ERR__SHIFT                                                     0x11 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_CM_COLOC_LO_ERR__SHIFT                                                0x12 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_CM_COLOC_HI_ERR__SHIFT                                                0x13 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP0_LO_ERR__SHIFT                                                    0x14 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP0_HI_ERR__SHIFT                                                    0x15 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP1_LO_ERR__SHIFT                                                    0x16 +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP1_HI_ERR__SHIFT                                                    0x17 +#define UVD_MEMCHECK_VCPU_INT_STAT__SRE_LO_ERR__SHIFT                                                         0x18 +#define UVD_MEMCHECK_VCPU_INT_STAT__SRE_HI_ERR__SHIFT                                                         0x19 +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_RD_LO_ERR__SHIFT                                                       0x1e +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_RD_HI_ERR__SHIFT                                                       0x1f +#define UVD_MEMCHECK_VCPU_INT_STAT__RE_LO_ERR_MASK                                                            0x00000001L +#define UVD_MEMCHECK_VCPU_INT_STAT__RE_HI_ERR_MASK                                                            0x00000002L +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_LO_ERR_MASK                                                            0x00000004L +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_HI_ERR_MASK                                                            0x00000008L +#define UVD_MEMCHECK_VCPU_INT_STAT__MP_LO_ERR_MASK                                                            0x00000010L +#define UVD_MEMCHECK_VCPU_INT_STAT__MP_HI_ERR_MASK                                                            0x00000020L +#define UVD_MEMCHECK_VCPU_INT_STAT__DB_LO_ERR_MASK                                                            0x00000040L +#define UVD_MEMCHECK_VCPU_INT_STAT__DB_HI_ERR_MASK                                                            0x00000080L +#define UVD_MEMCHECK_VCPU_INT_STAT__DBW_LO_ERR_MASK                                                           0x00000100L +#define UVD_MEMCHECK_VCPU_INT_STAT__DBW_HI_ERR_MASK                                                           0x00000200L +#define UVD_MEMCHECK_VCPU_INT_STAT__CM_LO_ERR_MASK                                                            0x00000400L +#define UVD_MEMCHECK_VCPU_INT_STAT__CM_HI_ERR_MASK                                                            0x00000800L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_REF_LO_ERR_MASK                                                       0x00001000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_REF_HI_ERR_MASK                                                       0x00002000L +#define UVD_MEMCHECK_VCPU_INT_STAT__VCPU_LO_ERR_MASK                                                          0x00004000L +#define UVD_MEMCHECK_VCPU_INT_STAT__VCPU_HI_ERR_MASK                                                          0x00008000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_DBW_LO_ERR_MASK                                                       0x00010000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_DBW_HI_ERR_MASK                                                       0x00020000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_CM_COLOC_LO_ERR_MASK                                                  0x00040000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_CM_COLOC_HI_ERR_MASK                                                  0x00080000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP0_LO_ERR_MASK                                                      0x00100000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP0_HI_ERR_MASK                                                      0x00200000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP1_LO_ERR_MASK                                                      0x00400000L +#define UVD_MEMCHECK_VCPU_INT_STAT__MIF_BSP1_HI_ERR_MASK                                                      0x00800000L +#define UVD_MEMCHECK_VCPU_INT_STAT__SRE_LO_ERR_MASK                                                           0x01000000L +#define UVD_MEMCHECK_VCPU_INT_STAT__SRE_HI_ERR_MASK                                                           0x02000000L +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_RD_LO_ERR_MASK                                                         0x40000000L +#define UVD_MEMCHECK_VCPU_INT_STAT__IT_RD_HI_ERR_MASK                                                         0x80000000L +//UVD_MEMCHECK_VCPU_INT_ACK +#define UVD_MEMCHECK_VCPU_INT_ACK__RE_LO_ACK__SHIFT                                                           0x0 +#define UVD_MEMCHECK_VCPU_INT_ACK__RE_HI_ACK__SHIFT                                                           0x1 +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_LO_ACK__SHIFT                                                           0x2 +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_HI_ACK__SHIFT                                                           0x3 +#define UVD_MEMCHECK_VCPU_INT_ACK__MP_LO_ACK__SHIFT                                                           0x4 +#define UVD_MEMCHECK_VCPU_INT_ACK__MP_HI_ACK__SHIFT                                                           0x5 +#define UVD_MEMCHECK_VCPU_INT_ACK__DB_LO_ACK__SHIFT                                                           0x6 +#define UVD_MEMCHECK_VCPU_INT_ACK__DB_HI_ACK__SHIFT                                                           0x7 +#define UVD_MEMCHECK_VCPU_INT_ACK__DBW_LO_ACK__SHIFT                                                          0x8 +#define UVD_MEMCHECK_VCPU_INT_ACK__DBW_HI_ACK__SHIFT                                                          0x9 +#define UVD_MEMCHECK_VCPU_INT_ACK__CM_LO_ACK__SHIFT                                                           0xa +#define UVD_MEMCHECK_VCPU_INT_ACK__CM_HI_ACK__SHIFT                                                           0xb +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_REF_LO_ACK__SHIFT                                                      0xc +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_REF_HI_ACK__SHIFT                                                      0xd +#define UVD_MEMCHECK_VCPU_INT_ACK__VCPU_LO_ACK__SHIFT                                                         0xe +#define UVD_MEMCHECK_VCPU_INT_ACK__VCPU_HI_ACK__SHIFT                                                         0xf +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_DBW_LO_ACK__SHIFT                                                      0x10 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_DBW_HI_ACK__SHIFT                                                      0x11 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_CM_COLOC_LO_ACK__SHIFT                                                 0x12 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_CM_COLOC_HI_ACK__SHIFT                                                 0x13 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP0_LO_ACK__SHIFT                                                     0x14 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP0_HI_ACK__SHIFT                                                     0x15 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP1_LO_ACK__SHIFT                                                     0x16 +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP1_HI_ACK__SHIFT                                                     0x17 +#define UVD_MEMCHECK_VCPU_INT_ACK__SRE_LO_ACK__SHIFT                                                          0x18 +#define UVD_MEMCHECK_VCPU_INT_ACK__SRE_HI_ACK__SHIFT                                                          0x19 +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_RD_LO_ACK__SHIFT                                                        0x1e +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_RD_HI_ACK__SHIFT                                                        0x1f +#define UVD_MEMCHECK_VCPU_INT_ACK__RE_LO_ACK_MASK                                                             0x00000001L +#define UVD_MEMCHECK_VCPU_INT_ACK__RE_HI_ACK_MASK                                                             0x00000002L +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_LO_ACK_MASK                                                             0x00000004L +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_HI_ACK_MASK                                                             0x00000008L +#define UVD_MEMCHECK_VCPU_INT_ACK__MP_LO_ACK_MASK                                                             0x00000010L +#define UVD_MEMCHECK_VCPU_INT_ACK__MP_HI_ACK_MASK                                                             0x00000020L +#define UVD_MEMCHECK_VCPU_INT_ACK__DB_LO_ACK_MASK                                                             0x00000040L +#define UVD_MEMCHECK_VCPU_INT_ACK__DB_HI_ACK_MASK                                                             0x00000080L +#define UVD_MEMCHECK_VCPU_INT_ACK__DBW_LO_ACK_MASK                                                            0x00000100L +#define UVD_MEMCHECK_VCPU_INT_ACK__DBW_HI_ACK_MASK                                                            0x00000200L +#define UVD_MEMCHECK_VCPU_INT_ACK__CM_LO_ACK_MASK                                                             0x00000400L +#define UVD_MEMCHECK_VCPU_INT_ACK__CM_HI_ACK_MASK                                                             0x00000800L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_REF_LO_ACK_MASK                                                        0x00001000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_REF_HI_ACK_MASK                                                        0x00002000L +#define UVD_MEMCHECK_VCPU_INT_ACK__VCPU_LO_ACK_MASK                                                           0x00004000L +#define UVD_MEMCHECK_VCPU_INT_ACK__VCPU_HI_ACK_MASK                                                           0x00008000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_DBW_LO_ACK_MASK                                                        0x00010000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_DBW_HI_ACK_MASK                                                        0x00020000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_CM_COLOC_LO_ACK_MASK                                                   0x00040000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_CM_COLOC_HI_ACK_MASK                                                   0x00080000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP0_LO_ACK_MASK                                                       0x00100000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP0_HI_ACK_MASK                                                       0x00200000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP1_LO_ACK_MASK                                                       0x00400000L +#define UVD_MEMCHECK_VCPU_INT_ACK__MIF_BSP1_HI_ACK_MASK                                                       0x00800000L +#define UVD_MEMCHECK_VCPU_INT_ACK__SRE_LO_ACK_MASK                                                            0x01000000L +#define UVD_MEMCHECK_VCPU_INT_ACK__SRE_HI_ACK_MASK                                                            0x02000000L +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_RD_LO_ACK_MASK                                                          0x40000000L +#define UVD_MEMCHECK_VCPU_INT_ACK__IT_RD_HI_ACK_MASK                                                          0x80000000L +//UVD_MEMCHECK2_SYS_INT_STAT +#define UVD_MEMCHECK2_SYS_INT_STAT__CM_RD_LO_ERR__SHIFT                                                       0x0 +#define UVD_MEMCHECK2_SYS_INT_STAT__CM_RD_HI_ERR__SHIFT                                                       0x1 +#define UVD_MEMCHECK2_SYS_INT_STAT__DB_RD_LO_ERR__SHIFT                                                       0x2 +#define UVD_MEMCHECK2_SYS_INT_STAT__DB_RD_HI_ERR__SHIFT                                                       0x3 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_RD_LO_ERR__SHIFT                                                      0x4 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_RD_HI_ERR__SHIFT                                                      0x5 +#define UVD_MEMCHECK2_SYS_INT_STAT__IDCT_RD_LO_ERR__SHIFT                                                     0x6 +#define UVD_MEMCHECK2_SYS_INT_STAT__IDCT_RD_HI_ERR__SHIFT                                                     0x7 +#define UVD_MEMCHECK2_SYS_INT_STAT__MPC_RD_LO_ERR__SHIFT                                                      0x8 +#define UVD_MEMCHECK2_SYS_INT_STAT__MPC_RD_HI_ERR__SHIFT                                                      0x9 +#define UVD_MEMCHECK2_SYS_INT_STAT__LBSI_RD_LO_ERR__SHIFT                                                     0xa +#define UVD_MEMCHECK2_SYS_INT_STAT__LBSI_RD_HI_ERR__SHIFT                                                     0xb +#define UVD_MEMCHECK2_SYS_INT_STAT__RBC_RD_LO_ERR__SHIFT                                                      0x10 +#define UVD_MEMCHECK2_SYS_INT_STAT__RBC_RD_HI_ERR__SHIFT                                                      0x11 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP2_LO_ERR__SHIFT                                                    0x16 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP2_HI_ERR__SHIFT                                                    0x17 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP3_LO_ERR__SHIFT                                                    0x18 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP3_HI_ERR__SHIFT                                                    0x19 +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR_LO_ERR__SHIFT                                                    0x1a +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR_HI_ERR__SHIFT                                                    0x1b +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR2_LO_ERR__SHIFT                                                   0x1c +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR2_HI_ERR__SHIFT                                                   0x1d +#define UVD_MEMCHECK2_SYS_INT_STAT__PREF_LO_ERR__SHIFT                                                        0x1e +#define UVD_MEMCHECK2_SYS_INT_STAT__PREF_HI_ERR__SHIFT                                                        0x1f +#define UVD_MEMCHECK2_SYS_INT_STAT__CM_RD_LO_ERR_MASK                                                         0x00000001L +#define UVD_MEMCHECK2_SYS_INT_STAT__CM_RD_HI_ERR_MASK                                                         0x00000002L +#define UVD_MEMCHECK2_SYS_INT_STAT__DB_RD_LO_ERR_MASK                                                         0x00000004L +#define UVD_MEMCHECK2_SYS_INT_STAT__DB_RD_HI_ERR_MASK                                                         0x00000008L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_RD_LO_ERR_MASK                                                        0x00000010L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_RD_HI_ERR_MASK                                                        0x00000020L +#define UVD_MEMCHECK2_SYS_INT_STAT__IDCT_RD_LO_ERR_MASK                                                       0x00000040L +#define UVD_MEMCHECK2_SYS_INT_STAT__IDCT_RD_HI_ERR_MASK                                                       0x00000080L +#define UVD_MEMCHECK2_SYS_INT_STAT__MPC_RD_LO_ERR_MASK                                                        0x00000100L +#define UVD_MEMCHECK2_SYS_INT_STAT__MPC_RD_HI_ERR_MASK                                                        0x00000200L +#define UVD_MEMCHECK2_SYS_INT_STAT__LBSI_RD_LO_ERR_MASK                                                       0x00000400L +#define UVD_MEMCHECK2_SYS_INT_STAT__LBSI_RD_HI_ERR_MASK                                                       0x00000800L +#define UVD_MEMCHECK2_SYS_INT_STAT__RBC_RD_LO_ERR_MASK                                                        0x00010000L +#define UVD_MEMCHECK2_SYS_INT_STAT__RBC_RD_HI_ERR_MASK                                                        0x00020000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP2_LO_ERR_MASK                                                      0x00400000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP2_HI_ERR_MASK                                                      0x00800000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP3_LO_ERR_MASK                                                      0x01000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_BSP3_HI_ERR_MASK                                                      0x02000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR_LO_ERR_MASK                                                      0x04000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR_HI_ERR_MASK                                                      0x08000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR2_LO_ERR_MASK                                                     0x10000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__MIF_SCLR2_HI_ERR_MASK                                                     0x20000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__PREF_LO_ERR_MASK                                                          0x40000000L +#define UVD_MEMCHECK2_SYS_INT_STAT__PREF_HI_ERR_MASK                                                          0x80000000L +//UVD_MEMCHECK2_SYS_INT_ACK +#define UVD_MEMCHECK2_SYS_INT_ACK__CM_RD_LO_ACK__SHIFT                                                        0x0 +#define UVD_MEMCHECK2_SYS_INT_ACK__CM_RD_HI_ACK__SHIFT                                                        0x1 +#define UVD_MEMCHECK2_SYS_INT_ACK__DB_RD_LO_ACK__SHIFT                                                        0x2 +#define UVD_MEMCHECK2_SYS_INT_ACK__DB_RD_HI_ACK__SHIFT                                                        0x3 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_RD_LO_ACK__SHIFT                                                       0x4 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_RD_HI_ACK__SHIFT                                                       0x5 +#define UVD_MEMCHECK2_SYS_INT_ACK__IDCT_RD_LO_ACK__SHIFT                                                      0x6 +#define UVD_MEMCHECK2_SYS_INT_ACK__IDCT_RD_HI_ACK__SHIFT                                                      0x7 +#define UVD_MEMCHECK2_SYS_INT_ACK__MPC_RD_LO_ACK__SHIFT                                                       0x8 +#define UVD_MEMCHECK2_SYS_INT_ACK__MPC_RD_HI_ACK__SHIFT                                                       0x9 +#define UVD_MEMCHECK2_SYS_INT_ACK__LBSI_RD_LO_ACK__SHIFT                                                      0xa +#define UVD_MEMCHECK2_SYS_INT_ACK__LBSI_RD_HI_ACK__SHIFT                                                      0xb +#define UVD_MEMCHECK2_SYS_INT_ACK__RBC_RD_LO_ACK__SHIFT                                                       0x10 +#define UVD_MEMCHECK2_SYS_INT_ACK__RBC_RD_HI_ACK__SHIFT                                                       0x11 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP2_LO_ACK__SHIFT                                                     0x16 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP2_HI_ACK__SHIFT                                                     0x17 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP3_LO_ACK__SHIFT                                                     0x18 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP3_HI_ACK__SHIFT                                                     0x19 +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR_LO_ACK__SHIFT                                                     0x1a +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR_HI_ACK__SHIFT                                                     0x1b +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR2_LO_ACK__SHIFT                                                    0x1c +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR2_HI_ACK__SHIFT                                                    0x1d +#define UVD_MEMCHECK2_SYS_INT_ACK__PREF_LO_ACK__SHIFT                                                         0x1e +#define UVD_MEMCHECK2_SYS_INT_ACK__PREF_HI_ACK__SHIFT                                                         0x1f +#define UVD_MEMCHECK2_SYS_INT_ACK__CM_RD_LO_ACK_MASK                                                          0x00000001L +#define UVD_MEMCHECK2_SYS_INT_ACK__CM_RD_HI_ACK_MASK                                                          0x00000002L +#define UVD_MEMCHECK2_SYS_INT_ACK__DB_RD_LO_ACK_MASK                                                          0x00000004L +#define UVD_MEMCHECK2_SYS_INT_ACK__DB_RD_HI_ACK_MASK                                                          0x00000008L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_RD_LO_ACK_MASK                                                         0x00000010L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_RD_HI_ACK_MASK                                                         0x00000020L +#define UVD_MEMCHECK2_SYS_INT_ACK__IDCT_RD_LO_ACK_MASK                                                        0x00000040L +#define UVD_MEMCHECK2_SYS_INT_ACK__IDCT_RD_HI_ACK_MASK                                                        0x00000080L +#define UVD_MEMCHECK2_SYS_INT_ACK__MPC_RD_LO_ACK_MASK                                                         0x00000100L +#define UVD_MEMCHECK2_SYS_INT_ACK__MPC_RD_HI_ACK_MASK                                                         0x00000200L +#define UVD_MEMCHECK2_SYS_INT_ACK__LBSI_RD_LO_ACK_MASK                                                        0x00000400L +#define UVD_MEMCHECK2_SYS_INT_ACK__LBSI_RD_HI_ACK_MASK                                                        0x00000800L +#define UVD_MEMCHECK2_SYS_INT_ACK__RBC_RD_LO_ACK_MASK                                                         0x00010000L +#define UVD_MEMCHECK2_SYS_INT_ACK__RBC_RD_HI_ACK_MASK                                                         0x00020000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP2_LO_ACK_MASK                                                       0x00400000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP2_HI_ACK_MASK                                                       0x00800000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP3_LO_ACK_MASK                                                       0x01000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_BSP3_HI_ACK_MASK                                                       0x02000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR_LO_ACK_MASK                                                       0x04000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR_HI_ACK_MASK                                                       0x08000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR2_LO_ACK_MASK                                                      0x10000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__MIF_SCLR2_HI_ACK_MASK                                                      0x20000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__PREF_LO_ACK_MASK                                                           0x40000000L +#define UVD_MEMCHECK2_SYS_INT_ACK__PREF_HI_ACK_MASK                                                           0x80000000L +//UVD_MEMCHECK2_VCPU_INT_STAT +#define UVD_MEMCHECK2_VCPU_INT_STAT__CM_RD_LO_ERR__SHIFT                                                      0x0 +#define UVD_MEMCHECK2_VCPU_INT_STAT__CM_RD_HI_ERR__SHIFT                                                      0x1 +#define UVD_MEMCHECK2_VCPU_INT_STAT__DB_RD_LO_ERR__SHIFT                                                      0x2 +#define UVD_MEMCHECK2_VCPU_INT_STAT__DB_RD_HI_ERR__SHIFT                                                      0x3 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_RD_LO_ERR__SHIFT                                                     0x4 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_RD_HI_ERR__SHIFT                                                     0x5 +#define UVD_MEMCHECK2_VCPU_INT_STAT__IDCT_RD_LO_ERR__SHIFT                                                    0x6 +#define UVD_MEMCHECK2_VCPU_INT_STAT__IDCT_RD_HI_ERR__SHIFT                                                    0x7 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MPC_RD_LO_ERR__SHIFT                                                     0x8 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MPC_RD_HI_ERR__SHIFT                                                     0x9 +#define UVD_MEMCHECK2_VCPU_INT_STAT__LBSI_RD_LO_ERR__SHIFT                                                    0xa +#define UVD_MEMCHECK2_VCPU_INT_STAT__LBSI_RD_HI_ERR__SHIFT                                                    0xb +#define UVD_MEMCHECK2_VCPU_INT_STAT__RBC_RD_LO_ERR__SHIFT                                                     0x10 +#define UVD_MEMCHECK2_VCPU_INT_STAT__RBC_RD_HI_ERR__SHIFT                                                     0x11 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP2_LO_ERR__SHIFT                                                   0x12 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP2_HI_ERR__SHIFT                                                   0x13 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP3_LO_ERR__SHIFT                                                   0x14 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP3_HI_ERR__SHIFT                                                   0x15 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR_LO_ERR__SHIFT                                                   0x16 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR_HI_ERR__SHIFT                                                   0x17 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR2_LO_ERR__SHIFT                                                  0x18 +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR2_HI_ERR__SHIFT                                                  0x19 +#define UVD_MEMCHECK2_VCPU_INT_STAT__PREF_LO_ERR__SHIFT                                                       0x1a +#define UVD_MEMCHECK2_VCPU_INT_STAT__PREF_HI_ERR__SHIFT                                                       0x1b +#define UVD_MEMCHECK2_VCPU_INT_STAT__CM_RD_LO_ERR_MASK                                                        0x00000001L +#define UVD_MEMCHECK2_VCPU_INT_STAT__CM_RD_HI_ERR_MASK                                                        0x00000002L +#define UVD_MEMCHECK2_VCPU_INT_STAT__DB_RD_LO_ERR_MASK                                                        0x00000004L +#define UVD_MEMCHECK2_VCPU_INT_STAT__DB_RD_HI_ERR_MASK                                                        0x00000008L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_RD_LO_ERR_MASK                                                       0x00000010L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_RD_HI_ERR_MASK                                                       0x00000020L +#define UVD_MEMCHECK2_VCPU_INT_STAT__IDCT_RD_LO_ERR_MASK                                                      0x00000040L +#define UVD_MEMCHECK2_VCPU_INT_STAT__IDCT_RD_HI_ERR_MASK                                                      0x00000080L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MPC_RD_LO_ERR_MASK                                                       0x00000100L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MPC_RD_HI_ERR_MASK                                                       0x00000200L +#define UVD_MEMCHECK2_VCPU_INT_STAT__LBSI_RD_LO_ERR_MASK                                                      0x00000400L +#define UVD_MEMCHECK2_VCPU_INT_STAT__LBSI_RD_HI_ERR_MASK                                                      0x00000800L +#define UVD_MEMCHECK2_VCPU_INT_STAT__RBC_RD_LO_ERR_MASK                                                       0x00010000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__RBC_RD_HI_ERR_MASK                                                       0x00020000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP2_LO_ERR_MASK                                                     0x00040000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP2_HI_ERR_MASK                                                     0x00080000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP3_LO_ERR_MASK                                                     0x00100000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_BSP3_HI_ERR_MASK                                                     0x00200000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR_LO_ERR_MASK                                                     0x00400000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR_HI_ERR_MASK                                                     0x00800000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR2_LO_ERR_MASK                                                    0x01000000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__MIF_SCLR2_HI_ERR_MASK                                                    0x02000000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__PREF_LO_ERR_MASK                                                         0x04000000L +#define UVD_MEMCHECK2_VCPU_INT_STAT__PREF_HI_ERR_MASK                                                         0x08000000L +//UVD_MEMCHECK2_VCPU_INT_ACK +#define UVD_MEMCHECK2_VCPU_INT_ACK__CM_RD_LO_ACK__SHIFT                                                       0x0 +#define UVD_MEMCHECK2_VCPU_INT_ACK__CM_RD_HI_ACK__SHIFT                                                       0x1 +#define UVD_MEMCHECK2_VCPU_INT_ACK__DB_RD_LO_ACK__SHIFT                                                       0x2 +#define UVD_MEMCHECK2_VCPU_INT_ACK__DB_RD_HI_ACK__SHIFT                                                       0x3 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_RD_LO_ACK__SHIFT                                                      0x4 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_RD_HI_ACK__SHIFT                                                      0x5 +#define UVD_MEMCHECK2_VCPU_INT_ACK__IDCT_RD_LO_ACK__SHIFT                                                     0x6 +#define UVD_MEMCHECK2_VCPU_INT_ACK__IDCT_RD_HI_ACK__SHIFT                                                     0x7 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MPC_RD_LO_ACK__SHIFT                                                      0x8 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MPC_RD_HI_ACK__SHIFT                                                      0x9 +#define UVD_MEMCHECK2_VCPU_INT_ACK__LBSI_RD_LO_ACK__SHIFT                                                     0xa +#define UVD_MEMCHECK2_VCPU_INT_ACK__LBSI_RD_HI_ACK__SHIFT                                                     0xb +#define UVD_MEMCHECK2_VCPU_INT_ACK__RBC_RD_LO_ACK__SHIFT                                                      0x10 +#define UVD_MEMCHECK2_VCPU_INT_ACK__RBC_RD_HI_ACK__SHIFT                                                      0x11 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP2_LO_ACK__SHIFT                                                    0x12 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP2_HI_ACK__SHIFT                                                    0x13 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP3_LO_ACK__SHIFT                                                    0x14 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP3_HI_ACK__SHIFT                                                    0x15 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR_LO_ACK__SHIFT                                                    0x16 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR_HI_ACK__SHIFT                                                    0x17 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR2_LO_ACK__SHIFT                                                   0x18 +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR2_HI_ACK__SHIFT                                                   0x19 +#define UVD_MEMCHECK2_VCPU_INT_ACK__PREF_LO_ACK__SHIFT                                                        0x1a +#define UVD_MEMCHECK2_VCPU_INT_ACK__PREF_HI_ACK__SHIFT                                                        0x1b +#define UVD_MEMCHECK2_VCPU_INT_ACK__CM_RD_LO_ACK_MASK                                                         0x00000001L +#define UVD_MEMCHECK2_VCPU_INT_ACK__CM_RD_HI_ACK_MASK                                                         0x00000002L +#define UVD_MEMCHECK2_VCPU_INT_ACK__DB_RD_LO_ACK_MASK                                                         0x00000004L +#define UVD_MEMCHECK2_VCPU_INT_ACK__DB_RD_HI_ACK_MASK                                                         0x00000008L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_RD_LO_ACK_MASK                                                        0x00000010L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_RD_HI_ACK_MASK                                                        0x00000020L +#define UVD_MEMCHECK2_VCPU_INT_ACK__IDCT_RD_LO_ACK_MASK                                                       0x00000040L +#define UVD_MEMCHECK2_VCPU_INT_ACK__IDCT_RD_HI_ACK_MASK                                                       0x00000080L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MPC_RD_LO_ACK_MASK                                                        0x00000100L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MPC_RD_HI_ACK_MASK                                                        0x00000200L +#define UVD_MEMCHECK2_VCPU_INT_ACK__LBSI_RD_LO_ACK_MASK                                                       0x00000400L +#define UVD_MEMCHECK2_VCPU_INT_ACK__LBSI_RD_HI_ACK_MASK                                                       0x00000800L +#define UVD_MEMCHECK2_VCPU_INT_ACK__RBC_RD_LO_ACK_MASK                                                        0x00010000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__RBC_RD_HI_ACK_MASK                                                        0x00020000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP2_LO_ACK_MASK                                                      0x00040000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP2_HI_ACK_MASK                                                      0x00080000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP3_LO_ACK_MASK                                                      0x00100000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_BSP3_HI_ACK_MASK                                                      0x00200000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR_LO_ACK_MASK                                                      0x00400000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR_HI_ACK_MASK                                                      0x00800000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR2_LO_ACK_MASK                                                     0x01000000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__MIF_SCLR2_HI_ACK_MASK                                                     0x02000000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__PREF_LO_ACK_MASK                                                          0x04000000L +#define UVD_MEMCHECK2_VCPU_INT_ACK__PREF_HI_ACK_MASK                                                          0x08000000L + + +#endif diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h index bbe1337a8cee..e68c1e280322 100644 --- a/drivers/gpu/drm/amd/include/atomfirmware.h +++ b/drivers/gpu/drm/amd/include/atomfirmware.h @@ -182,6 +182,7 @@ enum atom_dgpu_vram_type {    ATOM_DGPU_VRAM_TYPE_HBM2  = 0x60,    ATOM_DGPU_VRAM_TYPE_HBM2E = 0x61,    ATOM_DGPU_VRAM_TYPE_GDDR6 = 0x70, +  ATOM_DGPU_VRAM_TYPE_HBM3 = 0x80,  };  enum atom_dp_vs_preemph_def{ diff --git a/drivers/gpu/drm/amd/include/discovery.h b/drivers/gpu/drm/amd/include/discovery.h index f150404ffc68..f43e29722ef7 100644 --- a/drivers/gpu/drm/amd/include/discovery.h +++ b/drivers/gpu/drm/amd/include/discovery.h @@ -79,7 +79,14 @@ typedef struct ip_discovery_header  	uint32_t id;           /* Table ID */  	uint16_t num_dies;     /* Number of Dies */  	die_info die_info[16]; /* list die information for up to 16 dies */ -	uint16_t padding[1];   /* padding */ +	union { +		uint16_t padding[1];	/* version <= 3 */ +		struct {		/* version == 4 */ +			uint8_t base_addr_64_bit : 1; /* ip structures are using 64 bit base address */ +			uint8_t reserved : 7; +			uint8_t reserved2; +		}; +	};  } ip_discovery_header;  typedef struct ip @@ -115,9 +122,29 @@ typedef struct ip_v3  	uint8_t sub_revision : 4;               /* HCID Sub-Revision */  	uint8_t variant : 4;                    /* HW variant */  #endif -	uint32_t base_address[1];               /* Base Address list. Corresponds to the num_base_address field*/ +	uint32_t base_address[];		/* Base Address list. Corresponds to the num_base_address field*/  } ip_v3; +typedef struct ip_v4 { +	uint16_t hw_id;                         /* Hardware ID */ +	uint8_t instance_number;                /* Instance number for the IP */ +	uint8_t num_base_address;               /* Number of base addresses*/ +	uint8_t major;                          /* Hardware ID.major version */ +	uint8_t minor;                          /* Hardware ID.minor version */ +	uint8_t revision;                       /* Hardware ID.revision version */ +#if defined(LITTLEENDIAN_CPU) +	uint8_t sub_revision : 4;               /* HCID Sub-Revision */ +	uint8_t variant : 4;                    /* HW variant */ +#elif defined(BIGENDIAN_CPU) +	uint8_t variant : 4;                    /* HW variant */ +	uint8_t sub_revision : 4;               /* HCID Sub-Revision */ +#endif +	union { +		DECLARE_FLEX_ARRAY(uint32_t, base_address);	/* 32-bit Base Address list. Corresponds to the num_base_address field*/ +		DECLARE_FLEX_ARRAY(uint64_t, base_address_64);	/* 64-bit Base Address list. Corresponds to the num_base_address field*/ +	} __packed; +} ip_v4; +  typedef struct die_header  {  	uint16_t die_id; @@ -134,6 +161,7 @@ typedef struct ip_structure  		{  			ip *ip_list;  			ip_v3 *ip_v3_list; +			ip_v4 *ip_v4_list;  		};                                  /* IP list. Variable size*/  	} die;  } ip_structure; diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h index 5cb3e8634739..d0df3381539f 100644 --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h @@ -230,28 +230,30 @@ struct kfd2kgd_calls {  	/* Register access functions */  	void (*program_sh_mem_settings)(struct amdgpu_device *adev, uint32_t vmid,  			uint32_t sh_mem_config,	uint32_t sh_mem_ape1_base, -			uint32_t sh_mem_ape1_limit, uint32_t sh_mem_bases); +			uint32_t sh_mem_ape1_limit, uint32_t sh_mem_bases, +			uint32_t inst);  	int (*set_pasid_vmid_mapping)(struct amdgpu_device *adev, u32 pasid, -					unsigned int vmid); +					unsigned int vmid, uint32_t inst); -	int (*init_interrupts)(struct amdgpu_device *adev, uint32_t pipe_id); +	int (*init_interrupts)(struct amdgpu_device *adev, uint32_t pipe_id, +			uint32_t inst);  	int (*hqd_load)(struct amdgpu_device *adev, void *mqd, uint32_t pipe_id,  			uint32_t queue_id, uint32_t __user *wptr,  			uint32_t wptr_shift, uint32_t wptr_mask, -			struct mm_struct *mm); +			struct mm_struct *mm, uint32_t inst);  	int (*hiq_mqd_load)(struct amdgpu_device *adev, void *mqd,  			    uint32_t pipe_id, uint32_t queue_id, -			    uint32_t doorbell_off); +			    uint32_t doorbell_off, uint32_t inst);  	int (*hqd_sdma_load)(struct amdgpu_device *adev, void *mqd,  			     uint32_t __user *wptr, struct mm_struct *mm);  	int (*hqd_dump)(struct amdgpu_device *adev,  			uint32_t pipe_id, uint32_t queue_id, -			uint32_t (**dump)[2], uint32_t *n_regs); +			uint32_t (**dump)[2], uint32_t *n_regs, uint32_t inst);  	int (*hqd_sdma_dump)(struct amdgpu_device *adev,  			     uint32_t engine_id, uint32_t queue_id, @@ -259,12 +261,12 @@ struct kfd2kgd_calls {  	bool (*hqd_is_occupied)(struct amdgpu_device *adev,  				uint64_t queue_address, uint32_t pipe_id, -				uint32_t queue_id); +				uint32_t queue_id, uint32_t inst);  	int (*hqd_destroy)(struct amdgpu_device *adev, void *mqd,  				enum kfd_preempt_type reset_type,  				unsigned int timeout, uint32_t pipe_id, -				uint32_t queue_id); +				uint32_t queue_id, uint32_t inst);  	bool (*hqd_sdma_is_occupied)(struct amdgpu_device *adev, void *mqd); @@ -273,7 +275,7 @@ struct kfd2kgd_calls {  	int (*wave_control_execute)(struct amdgpu_device *adev,  					uint32_t gfx_index_val, -					uint32_t sq_cmd); +					uint32_t sq_cmd, uint32_t inst);  	bool (*get_atc_vmid_pasid_mapping_info)(struct amdgpu_device *adev,  					uint8_t vmid,  					uint16_t *p_pasid); @@ -289,10 +291,45 @@ struct kfd2kgd_calls {  			uint32_t vmid, uint64_t page_table_base);  	uint32_t (*read_vmid_from_vmfault_reg)(struct amdgpu_device *adev); +	uint32_t (*enable_debug_trap)(struct amdgpu_device *adev, +					bool restore_dbg_registers, +					uint32_t vmid); +	uint32_t (*disable_debug_trap)(struct amdgpu_device *adev, +					bool keep_trap_enabled, +					uint32_t vmid); +	int (*validate_trap_override_request)(struct amdgpu_device *adev, +					uint32_t trap_override, +					uint32_t *trap_mask_supported); +	uint32_t (*set_wave_launch_trap_override)(struct amdgpu_device *adev, +					     uint32_t vmid, +					     uint32_t trap_override, +					     uint32_t trap_mask_bits, +					     uint32_t trap_mask_request, +					     uint32_t *trap_mask_prev, +					     uint32_t kfd_dbg_trap_cntl_prev); +	uint32_t (*set_wave_launch_mode)(struct amdgpu_device *adev, +					uint8_t wave_launch_mode, +					uint32_t vmid); +	uint32_t (*set_address_watch)(struct amdgpu_device *adev, +					uint64_t watch_address, +					uint32_t watch_address_mask, +					uint32_t watch_id, +					uint32_t watch_mode, +					uint32_t debug_vmid); +	uint32_t (*clear_address_watch)(struct amdgpu_device *adev, +			uint32_t watch_id); +	void (*get_iq_wait_times)(struct amdgpu_device *adev, +			uint32_t *wait_times); +	void (*build_grace_period_packet_info)(struct amdgpu_device *adev, +			uint32_t wait_times, +			uint32_t grace_period, +			uint32_t *reg_offset, +			uint32_t *reg_data);  	void (*get_cu_occupancy)(struct amdgpu_device *adev, int pasid, -			int *wave_cnt, int *max_waves_per_cu); +			int *wave_cnt, int *max_waves_per_cu, uint32_t inst);  	void (*program_trap_handler_settings)(struct amdgpu_device *adev, -			uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr); +			uint32_t vmid, uint64_t tba_addr, uint64_t tma_addr, +			uint32_t inst);  };  #endif	/* KGD_KFD_INTERFACE_H_INCLUDED */ diff --git a/drivers/gpu/drm/amd/include/mes_v11_api_def.h b/drivers/gpu/drm/amd/include/mes_v11_api_def.h index dc694cb246d9..0997e999416a 100644 --- a/drivers/gpu/drm/amd/include/mes_v11_api_def.h +++ b/drivers/gpu/drm/amd/include/mes_v11_api_def.h @@ -274,7 +274,8 @@ union MESAPI__ADD_QUEUE {  			uint32_t is_kfd_process		: 1;  			uint32_t trap_en		: 1;  			uint32_t is_aql_queue		: 1; -			uint32_t reserved		: 20; +			uint32_t skip_process_ctx_clear : 1; +			uint32_t reserved		: 19;  		};  		struct MES_API_STATUS		api_status;  		uint64_t                        tma_addr; @@ -523,6 +524,7 @@ enum MESAPI_MISC_OPCODE {  	MESAPI_MISC__QUERY_STATUS,  	MESAPI_MISC__READ_REG,  	MESAPI_MISC__WAIT_REG_MEM, +	MESAPI_MISC__SET_SHADER_DEBUGGER,  	MESAPI_MISC__MAX,  }; @@ -561,6 +563,21 @@ struct QUERY_STATUS {  	uint32_t context_id;  }; +struct SET_SHADER_DEBUGGER { +	uint64_t process_context_addr; +	union { +		struct { +			uint32_t single_memop : 1;  /* SQ_DEBUG.single_memop */ +			uint32_t single_alu_op : 1; /* SQ_DEBUG.single_alu_op */ +			uint32_t reserved : 30; +		}; +		uint32_t u32all; +	} flags; +	uint32_t spi_gdbg_per_vmid_cntl; +	uint32_t tcp_watch_cntl[4]; /* TCP_WATCHx_CNTL */ +	uint32_t trap_en; +}; +  union MESAPI__MISC {  	struct {  		union MES_API_HEADER	header; @@ -573,6 +590,9 @@ union MESAPI__MISC {  			struct		QUERY_STATUS query_status;  			struct		READ_REG read_reg;  			struct          WAIT_REG_MEM wait_reg_mem; +			struct		SET_SHADER_DEBUGGER set_shader_debugger; +			enum MES_AMD_PRIORITY_LEVEL queue_sch_level; +  			uint32_t	data[MISC_DATA_MAX_SIZE_IN_DWORDS];  		};  	}; diff --git a/drivers/gpu/drm/amd/include/v9_structs.h b/drivers/gpu/drm/amd/include/v9_structs.h index a0c672889fe4..a2f81b9c38af 100644 --- a/drivers/gpu/drm/amd/include/v9_structs.h +++ b/drivers/gpu/drm/amd/include/v9_structs.h @@ -196,10 +196,20 @@ struct v9_mqd {  	uint32_t compute_wave_restore_addr_lo;  	uint32_t compute_wave_restore_addr_hi;  	uint32_t compute_wave_restore_control; -	uint32_t compute_static_thread_mgmt_se4; -	uint32_t compute_static_thread_mgmt_se5; -	uint32_t compute_static_thread_mgmt_se6; -	uint32_t compute_static_thread_mgmt_se7; +	union { +		struct { +			uint32_t compute_static_thread_mgmt_se4; +			uint32_t compute_static_thread_mgmt_se5; +			uint32_t compute_static_thread_mgmt_se6; +			uint32_t compute_static_thread_mgmt_se7; +		}; +		struct { +			uint32_t compute_current_logic_xcc_id; // offset: 39  (0x27) +			uint32_t compute_restart_cg_tg_id; // offset: 40  (0x28) +			uint32_t compute_tg_chunk_size; // offset: 41  (0x29) +			uint32_t compute_restore_tg_chunk_size; // offset: 42  (0x2A) +		}; +	};  	uint32_t reserved_43;  	uint32_t reserved_44;  	uint32_t reserved_45; @@ -382,8 +392,16 @@ struct v9_mqd {  	uint32_t iqtimer_pkt_dw29;  	uint32_t iqtimer_pkt_dw30;  	uint32_t iqtimer_pkt_dw31; -	uint32_t reserved_225; -	uint32_t reserved_226; +	union { +		struct { +			uint32_t reserved_225; +			uint32_t reserved_226; +		}; +		struct { +			uint32_t pm4_target_xcc_in_xcp; // offset: 225  (0xE1) +			uint32_t cp_mqd_stride_size; // offset: 226  (0xE2) +		}; +	};  	uint32_t reserved_227;  	uint32_t set_resources_header;  	uint32_t set_resources_dw1; diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c index 58c2246918fd..a57952b93e73 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c @@ -678,7 +678,12 @@ static ssize_t amdgpu_set_pp_table(struct device *dev,   *   clock labeled OD_MCLK   *   * - three <frequency, voltage> points labeled OD_VDDC_CURVE. - *   They can be used to calibrate the sclk voltage curve. + *   They can be used to calibrate the sclk voltage curve. This is + *   available for Vega20 and NV1X. + * + * - voltage offset for the six anchor points of the v/f curve labeled + *   OD_VDDC_CURVE. They can be used to calibrate the v/f curve. This + *   is only availabe for some SMU13 ASICs.   *   * - voltage offset(in mV) applied on target voltage calculation.   *   This is available for Sienna Cichlid, Navy Flounder and Dimgrey @@ -719,12 +724,19 @@ static ssize_t amdgpu_set_pp_table(struct device *dev,   *   E.g., "p 2 0 800" would set the minimum core clock on core   *   2 to 800Mhz.   * - *   For sclk voltage curve, enter the new values by writing a - *   string that contains "vc point clock voltage" to the file. The - *   points are indexed by 0, 1 and 2. E.g., "vc 0 300 600" will - *   update point1 with clock set as 300Mhz and voltage as - *   600mV. "vc 2 1000 1000" will update point3 with clock set - *   as 1000Mhz and voltage 1000mV. + *   For sclk voltage curve, + *     - For NV1X, enter the new values by writing a string that + *       contains "vc point clock voltage" to the file. The points + *       are indexed by 0, 1 and 2. E.g., "vc 0 300 600" will update + *       point1 with clock set as 300Mhz and voltage as 600mV. "vc 2 + *       1000 1000" will update point3 with clock set as 1000Mhz and + *       voltage 1000mV. + *     - For SMU13 ASICs, enter the new values by writing a string that + *       contains "vc anchor_point_index voltage_offset" to the file. + *       There are total six anchor points defined on the v/f curve with + *       index as 0 - 5. + *       - "vc 0 10" will update the voltage offset for point1 as 10mv. + *       - "vc 5 -10" will update the voltage offset for point6 as -10mv.   *   *   To update the voltage offset applied for gfxclk/voltage calculation,   *   enter the new value by writing a string that contains "vo offset". @@ -871,13 +883,11 @@ static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,  	}  	if (ret == -ENOENT) {  		size = amdgpu_dpm_print_clock_levels(adev, OD_SCLK, buf); -		if (size > 0) { -			size += amdgpu_dpm_print_clock_levels(adev, OD_MCLK, buf + size); -			size += amdgpu_dpm_print_clock_levels(adev, OD_VDDC_CURVE, buf + size); -			size += amdgpu_dpm_print_clock_levels(adev, OD_VDDGFX_OFFSET, buf + size); -			size += amdgpu_dpm_print_clock_levels(adev, OD_RANGE, buf + size); -			size += amdgpu_dpm_print_clock_levels(adev, OD_CCLK, buf + size); -		} +		size += amdgpu_dpm_print_clock_levels(adev, OD_MCLK, buf + size); +		size += amdgpu_dpm_print_clock_levels(adev, OD_VDDC_CURVE, buf + size); +		size += amdgpu_dpm_print_clock_levels(adev, OD_VDDGFX_OFFSET, buf + size); +		size += amdgpu_dpm_print_clock_levels(adev, OD_RANGE, buf + size); +		size += amdgpu_dpm_print_clock_levels(adev, OD_CCLK, buf + size);  	}  	if (size == 0) @@ -3362,7 +3372,8 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,  		return 0;  	/* Skip crit temp on APU */ -	if ((adev->flags & AMD_IS_APU) && (adev->family >= AMDGPU_FAMILY_CZ) && +	if ((((adev->flags & AMD_IS_APU) && (adev->family >= AMDGPU_FAMILY_CZ)) || +	    (gc_ver == IP_VERSION(9, 4, 3))) &&  	    (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr))  		return 0; @@ -3395,9 +3406,10 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,  	      attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr)) /* can't manage state */  		effective_mode &= ~S_IWUSR; -	/* In the case of APUs, this is only implemented on Vangogh */ +	/* not implemented yet for APUs other than GC 10.3.1 (vangogh) and 9.4.3 */  	if (((adev->family == AMDGPU_FAMILY_SI) || -	     ((adev->flags & AMD_IS_APU) && (gc_ver != IP_VERSION(10, 3, 1)))) && +	     ((adev->flags & AMD_IS_APU) && (gc_ver != IP_VERSION(10, 3, 1)) && +	      (gc_ver != IP_VERSION(9, 4, 3)))) &&  	    (attr == &sensor_dev_attr_power1_cap_max.dev_attr.attr ||  	     attr == &sensor_dev_attr_power1_cap_min.dev_attr.attr ||  	     attr == &sensor_dev_attr_power1_cap.dev_attr.attr || @@ -3426,36 +3438,48 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,  		return 0;  	if ((adev->family == AMDGPU_FAMILY_SI ||	/* not implemented yet */ -	     adev->family == AMDGPU_FAMILY_KV) &&	/* not implemented yet */ +	     adev->family == AMDGPU_FAMILY_KV ||	/* not implemented yet */ +	     (gc_ver == IP_VERSION(9, 4, 3))) &&  	    (attr == &sensor_dev_attr_in0_input.dev_attr.attr ||  	     attr == &sensor_dev_attr_in0_label.dev_attr.attr))  		return 0; -	/* only APUs have vddnb */ -	if (!(adev->flags & AMD_IS_APU) && +	/* only APUs other than gc 9,4,3 have vddnb */ +	if ((!(adev->flags & AMD_IS_APU) || (gc_ver == IP_VERSION(9, 4, 3))) &&  	    (attr == &sensor_dev_attr_in1_input.dev_attr.attr ||  	     attr == &sensor_dev_attr_in1_label.dev_attr.attr))  		return 0; -	/* no mclk on APUs */ -	if ((adev->flags & AMD_IS_APU) && +	/* no mclk on APUs other than gc 9,4,3*/ +	if (((adev->flags & AMD_IS_APU) && (gc_ver != IP_VERSION(9, 4, 3))) &&  	    (attr == &sensor_dev_attr_freq2_input.dev_attr.attr ||  	     attr == &sensor_dev_attr_freq2_label.dev_attr.attr))  		return 0; -	/* only SOC15 dGPUs support hotspot and mem temperatures */  	if (((adev->flags & AMD_IS_APU) || gc_ver < IP_VERSION(9, 0, 0)) && +	    (gc_ver != IP_VERSION(9, 4, 3)) && +	    (attr == &sensor_dev_attr_temp2_input.dev_attr.attr || +	     attr == &sensor_dev_attr_temp2_label.dev_attr.attr || +	     attr == &sensor_dev_attr_temp3_input.dev_attr.attr || +	     attr == &sensor_dev_attr_temp3_label.dev_attr.attr)) +		return 0; + +	/* hotspot temperature for gc 9,4,3*/ +	if ((gc_ver == IP_VERSION(9, 4, 3)) && +	    (attr == &sensor_dev_attr_temp1_input.dev_attr.attr || +	     attr == &sensor_dev_attr_temp1_label.dev_attr.attr)) +		return 0; + +	/* only SOC15 dGPUs support hotspot and mem temperatures */ +	if (((adev->flags & AMD_IS_APU) || gc_ver < IP_VERSION(9, 0, 0) || +	    (gc_ver == IP_VERSION(9, 4, 3))) &&  	    (attr == &sensor_dev_attr_temp2_crit.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp3_crit.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp1_emergency.dev_attr.attr ||  	     attr == &sensor_dev_attr_temp2_emergency.dev_attr.attr || -	     attr == &sensor_dev_attr_temp3_emergency.dev_attr.attr || -	     attr == &sensor_dev_attr_temp2_input.dev_attr.attr || -	     attr == &sensor_dev_attr_temp3_input.dev_attr.attr || -	     attr == &sensor_dev_attr_temp2_label.dev_attr.attr || -	     attr == &sensor_dev_attr_temp3_label.dev_attr.attr)) +	     attr == &sensor_dev_attr_temp3_emergency.dev_attr.attr))  		return 0;  	/* only Vangogh has fast PPT limit and power labels */ diff --git a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_0_pptable.h b/drivers/gpu/drm/amd/pm/inc/smu_v13_0_0_pptable.h index 566a0da59e53..1dc7a065a6d4 100644 --- a/drivers/gpu/drm/amd/pm/inc/smu_v13_0_0_pptable.h +++ b/drivers/gpu/drm/amd/pm/inc/smu_v13_0_0_pptable.h @@ -38,13 +38,12 @@  #define SMU_13_0_0_PP_THERMALCONTROLLER_NONE 0  #define SMU_13_0_0_PP_THERMALCONTROLLER_NAVI21 28 -#define SMU_13_0_0_PP_OVERDRIVE_VERSION 0x81        // OverDrive 8 Table Version 0.2 +#define SMU_13_0_0_PP_OVERDRIVE_VERSION 0x83        // OverDrive 8 Table Version 0.2  #define SMU_13_0_0_PP_POWERSAVINGCLOCK_VERSION 0x01 // Power Saving Clock Table Version 1.00  enum SMU_13_0_0_ODFEATURE_CAP  {      SMU_13_0_0_ODCAP_GFXCLK_LIMITS = 0, -    SMU_13_0_0_ODCAP_GFXCLK_CURVE,      SMU_13_0_0_ODCAP_UCLK_LIMITS,      SMU_13_0_0_ODCAP_POWER_LIMIT,      SMU_13_0_0_ODCAP_FAN_ACOUSTIC_LIMIT, @@ -59,13 +58,13 @@ enum SMU_13_0_0_ODFEATURE_CAP      SMU_13_0_0_ODCAP_FAN_CURVE,      SMU_13_0_0_ODCAP_AUTO_FAN_ACOUSTIC_LIMIT,      SMU_13_0_0_ODCAP_POWER_MODE, +    SMU_13_0_0_ODCAP_PER_ZONE_GFX_VOLTAGE_OFFSET,      SMU_13_0_0_ODCAP_COUNT,  };  enum SMU_13_0_0_ODFEATURE_ID  {      SMU_13_0_0_ODFEATURE_GFXCLK_LIMITS           = 1 << SMU_13_0_0_ODCAP_GFXCLK_LIMITS,           //GFXCLK Limit feature -    SMU_13_0_0_ODFEATURE_GFXCLK_CURVE            = 1 << SMU_13_0_0_ODCAP_GFXCLK_CURVE,            //GFXCLK Curve feature      SMU_13_0_0_ODFEATURE_UCLK_LIMITS             = 1 << SMU_13_0_0_ODCAP_UCLK_LIMITS,             //UCLK Limit feature      SMU_13_0_0_ODFEATURE_POWER_LIMIT             = 1 << SMU_13_0_0_ODCAP_POWER_LIMIT,             //Power Limit feature      SMU_13_0_0_ODFEATURE_FAN_ACOUSTIC_LIMIT      = 1 << SMU_13_0_0_ODCAP_FAN_ACOUSTIC_LIMIT,      //Fan Acoustic RPM feature @@ -80,6 +79,7 @@ enum SMU_13_0_0_ODFEATURE_ID      SMU_13_0_0_ODFEATURE_FAN_CURVE               = 1 << SMU_13_0_0_ODCAP_FAN_CURVE,               //Fan Curve feature      SMU_13_0_0_ODFEATURE_AUTO_FAN_ACOUSTIC_LIMIT = 1 << SMU_13_0_0_ODCAP_AUTO_FAN_ACOUSTIC_LIMIT, //Auto Fan Acoustic RPM feature      SMU_13_0_0_ODFEATURE_POWER_MODE              = 1 << SMU_13_0_0_ODCAP_POWER_MODE,              //Optimized GPU Power Mode feature +    SMU_13_0_0_ODFEATURE_PER_ZONE_GFX_VOLTAGE_OFFSET  = 1 << SMU_13_0_0_ODCAP_PER_ZONE_GFX_VOLTAGE_OFFSET,  //Perzone voltage offset feature      SMU_13_0_0_ODFEATURE_COUNT                   = 16,  }; @@ -89,10 +89,6 @@ enum SMU_13_0_0_ODSETTING_ID  {      SMU_13_0_0_ODSETTING_GFXCLKFMAX = 0,      SMU_13_0_0_ODSETTING_GFXCLKFMIN, -    SMU_13_0_0_ODSETTING_CUSTOM_GFX_VF_CURVE_A, -    SMU_13_0_0_ODSETTING_CUSTOM_GFX_VF_CURVE_B, -    SMU_13_0_0_ODSETTING_CUSTOM_GFX_VF_CURVE_C, -    SMU_13_0_0_ODSETTING_CUSTOM_CURVE_VFT_FMIN,      SMU_13_0_0_ODSETTING_UCLKFMIN,      SMU_13_0_0_ODSETTING_UCLKFMAX,      SMU_13_0_0_ODSETTING_POWERPERCENTAGE, @@ -117,6 +113,12 @@ enum SMU_13_0_0_ODSETTING_ID      SMU_13_0_0_ODSETTING_FAN_CURVE_SPEED_5,      SMU_13_0_0_ODSETTING_AUTO_FAN_ACOUSTIC_LIMIT,      SMU_13_0_0_ODSETTING_POWER_MODE, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_1, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_2, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_3, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_4, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_5, +    SMU_13_0_0_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_6,      SMU_13_0_0_ODSETTING_COUNT,  };  #define SMU_13_0_0_MAX_ODSETTING 64 //Maximum Number of ODSettings diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c index f5e08b60f66e..36c831b280ed 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c @@ -508,19 +508,19 @@ static int kv_enable_didt(struct amdgpu_device *adev, bool enable)  	    pi->caps_db_ramping ||  	    pi->caps_td_ramping ||  	    pi->caps_tcp_ramping) { -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  		if (enable) {  			ret = kv_program_pt_config_registers(adev, didt_config_kv);  			if (ret) { -				amdgpu_gfx_rlc_exit_safe_mode(adev); +				amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  				return ret;  			}  		}  		kv_do_enable_didt(adev, enable); -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	}  	return 0; diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c index d6d9e3b1b2c0..02e69ccff3ba 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c @@ -6925,23 +6925,6 @@ static int si_dpm_enable(struct amdgpu_device *adev)  	return 0;  } -static int si_set_temperature_range(struct amdgpu_device *adev) -{ -	int ret; - -	ret = si_thermal_enable_alert(adev, false); -	if (ret) -		return ret; -	ret = si_thermal_set_temperature_range(adev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX); -	if (ret) -		return ret; -	ret = si_thermal_enable_alert(adev, true); -	if (ret) -		return ret; - -	return ret; -} -  static void si_dpm_disable(struct amdgpu_device *adev)  {  	struct rv7xx_power_info *pi = rv770_get_pi(adev); @@ -7626,18 +7609,6 @@ static int si_dpm_process_interrupt(struct amdgpu_device *adev,  static int si_dpm_late_init(void *handle)  { -	int ret; -	struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -	if (!adev->pm.dpm_enabled) -		return 0; - -	ret = si_set_temperature_range(adev); -	if (ret) -		return ret; -#if 0 //TODO ? -	si_dpm_powergate_uvd(adev, true); -#endif  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.c index 32a5a00fd8ae..21be23ec3c79 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_powertune.c @@ -973,7 +973,7 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)  	    PP_CAP(PHM_PlatformCaps_TDRamping) ||  	    PP_CAP(PHM_PlatformCaps_TCPRamping)) { -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  		mutex_lock(&adev->grbm_idx_mutex);  		value = 0;  		value2 = cgs_read_register(hwmgr->device, mmGRBM_GFX_INDEX); @@ -1048,13 +1048,13 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)  		}  		mutex_unlock(&adev->grbm_idx_mutex); -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	}  	return 0;  error:  	mutex_unlock(&adev->grbm_idx_mutex); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return result;  } @@ -1068,7 +1068,7 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)  	    PP_CAP(PHM_PlatformCaps_TDRamping) ||  	    PP_CAP(PHM_PlatformCaps_TCPRamping)) { -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  		result = smu7_enable_didt(hwmgr, false);  		PP_ASSERT_WITH_CODE((result == 0), @@ -1081,12 +1081,12 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)  			PP_ASSERT_WITH_CODE((0 == result),  					"Failed to disable DPM DIDT.", goto error);  		} -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	}  	return 0;  error: -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return result;  } diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.c index 9757d47dd6b8..309a9d3bc1b7 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_powertune.c @@ -915,7 +915,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)  	num_se = adev->gfx.config.max_shader_engines; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	mutex_lock(&adev->grbm_idx_mutex);  	for (count = 0; count < num_se; count++) { @@ -940,7 +940,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)  	vega10_didt_set_mask(hwmgr, true); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -949,11 +949,11 @@ static int vega10_disable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)  {  	struct amdgpu_device *adev = hwmgr->adev; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	vega10_didt_set_mask(hwmgr, false); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -966,7 +966,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)  	num_se = adev->gfx.config.max_shader_engines; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	mutex_lock(&adev->grbm_idx_mutex);  	for (count = 0; count < num_se; count++) { @@ -985,7 +985,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)  	vega10_didt_set_mask(hwmgr, true); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	vega10_program_gc_didt_config_registers(hwmgr, GCDiDtDroopCtrlConfig_vega10);  	if (PP_CAP(PHM_PlatformCaps_GCEDC)) @@ -1002,11 +1002,11 @@ static int vega10_disable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)  	struct amdgpu_device *adev = hwmgr->adev;  	uint32_t data; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	vega10_didt_set_mask(hwmgr, false); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	if (PP_CAP(PHM_PlatformCaps_GCEDC)) {  		data = 0x00000000; @@ -1027,7 +1027,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)  	num_se = adev->gfx.config.max_shader_engines; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	mutex_lock(&adev->grbm_idx_mutex);  	for (count = 0; count < num_se; count++) { @@ -1048,7 +1048,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)  	vega10_didt_set_mask(hwmgr, true); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -1057,11 +1057,11 @@ static int vega10_disable_se_edc_config(struct pp_hwmgr *hwmgr)  {  	struct amdgpu_device *adev = hwmgr->adev; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	vega10_didt_set_mask(hwmgr, false); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -1075,7 +1075,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)  	num_se = adev->gfx.config.max_shader_engines; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	vega10_program_gc_didt_config_registers(hwmgr, AvfsPSMResetConfig_vega10); @@ -1096,7 +1096,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)  	vega10_didt_set_mask(hwmgr, true); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	vega10_program_gc_didt_config_registers(hwmgr, PSMGCEDCDroopCtrlConfig_vega10); @@ -1116,11 +1116,11 @@ static int vega10_disable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)  	struct amdgpu_device *adev = hwmgr->adev;  	uint32_t data; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	vega10_didt_set_mask(hwmgr, false); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	if (PP_CAP(PHM_PlatformCaps_GCEDC)) {  		data = 0x00000000; @@ -1138,7 +1138,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)  	struct amdgpu_device *adev = hwmgr->adev;  	int result; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	mutex_lock(&adev->grbm_idx_mutex);  	WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xE0000000); @@ -1151,7 +1151,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)  	vega10_didt_set_mask(hwmgr, false); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h index 5ce433e2c16a..f1580a26a850 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/pm/powerplay/inc/hwmgr.h @@ -359,7 +359,7 @@ struct pp_hwmgr_func {  	int (*set_ppfeature_status)(struct pp_hwmgr *hwmgr, uint64_t ppfeature_masks);  	int (*set_mp1_state)(struct pp_hwmgr *hwmgr, enum pp_mp1_state mp1_state);  	int (*asic_reset)(struct pp_hwmgr *hwmgr, enum SMU_ASIC_RESET_MODE mode); -	int (*smu_i2c_bus_access)(struct pp_hwmgr *hwmgr, bool aquire); +	int (*smu_i2c_bus_access)(struct pp_hwmgr *hwmgr, bool acquire);  	int (*set_df_cstate)(struct pp_hwmgr *hwmgr, enum pp_df_cstate state);  	int (*set_xgmi_pstate)(struct pp_hwmgr *hwmgr, uint32_t pstate);  	int (*disable_power_features_for_compute_performance)(struct pp_hwmgr *hwmgr, diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index 5633c5797e85..4dea79a0c5b5 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -733,6 +733,24 @@ static int smu_late_init(void *handle)  		return ret;  	} +	/* +	 * Explicitly notify PMFW the power mode the system in. Since +	 * the PMFW may boot the ASIC with a different mode. +	 * For those supporting ACDC switch via gpio, PMFW will +	 * handle the switch automatically. Driver involvement +	 * is unnecessary. +	 */ +	if (!smu->dc_controlled_by_gpio) { +		ret = smu_set_power_source(smu, +					   adev->pm.ac_power ? SMU_POWER_SOURCE_AC : +					   SMU_POWER_SOURCE_DC); +		if (ret) { +			dev_err(adev->dev, "Failed to switch to %s mode!\n", +				adev->pm.ac_power ? "AC" : "DC"); +			return ret; +		} +	} +  	if ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 1)) ||  	    (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 3)))  		return 0; @@ -804,11 +822,20 @@ static int smu_init_fb_allocations(struct smu_context *smu)  		}  	} +	driver_table->domain = AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT;  	/* VRAM allocation for driver table */  	for (i = 0; i < SMU_TABLE_COUNT; i++) {  		if (tables[i].size == 0)  			continue; +		/* If one of the tables has VRAM domain restriction, keep it in +		 * VRAM +		 */ +		if ((tables[i].domain & +		    (AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT)) == +			    AMDGPU_GEM_DOMAIN_VRAM) +			driver_table->domain = AMDGPU_GEM_DOMAIN_VRAM; +  		if (i == SMU_TABLE_PMSTATUSLOG)  			continue; @@ -818,7 +845,6 @@ static int smu_init_fb_allocations(struct smu_context *smu)  	driver_table->size = max_table_size;  	driver_table->align = PAGE_SIZE; -	driver_table->domain = AMDGPU_GEM_DOMAIN_VRAM;  	ret = amdgpu_bo_create_kernel(adev,  				      driver_table->size, diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_aldebaran.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_aldebaran.h index 90200f31ff52..cddf45eebee8 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_aldebaran.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_aldebaran.h @@ -24,6 +24,8 @@  #ifndef SMU13_DRIVER_IF_ALDEBARAN_H  #define SMU13_DRIVER_IF_ALDEBARAN_H +#define SMU13_DRIVER_IF_VERSION_ALDE 0x08 +  #define NUM_VCLK_DPM_LEVELS   8  #define NUM_DCLK_DPM_LEVELS   8  #define NUM_SOCCLK_DPM_LEVELS 8 diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h index b686fb68a6e7..9dd1ed5b8940 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h @@ -24,8 +24,10 @@  #ifndef SMU13_DRIVER_IF_V13_0_0_H  #define SMU13_DRIVER_IF_V13_0_0_H +#define SMU13_0_0_DRIVER_IF_VERSION 0x3D +  //Increment this version if SkuTable_t or BoardTable_t change -#define PPTABLE_VERSION 0x26 +#define PPTABLE_VERSION 0x2B  #define NUM_GFXCLK_DPM_LEVELS    16  #define NUM_SOCCLK_DPM_LEVELS    8 @@ -94,7 +96,7 @@  #define FEATURE_ATHUB_MMHUB_PG_BIT            48  #define FEATURE_SOC_PCC_BIT                   49  #define FEATURE_EDC_PWRBRK_BIT                50 -#define FEATURE_SPARE_51_BIT                  51 +#define FEATURE_BOMXCO_SVI3_PROG_BIT          51  #define FEATURE_SPARE_52_BIT                  52  #define FEATURE_SPARE_53_BIT                  53  #define FEATURE_SPARE_54_BIT                  54 @@ -310,6 +312,7 @@ typedef enum {  	I2C_CONTROLLER_PROTOCOL_VR_IR35217,  	I2C_CONTROLLER_PROTOCOL_TMP_MAX31875,  	I2C_CONTROLLER_PROTOCOL_INA3221, +	I2C_CONTROLLER_PROTOCOL_TMP_MAX6604,  	I2C_CONTROLLER_PROTOCOL_COUNT,  } I2cControllerProtocol_e; @@ -568,6 +571,7 @@ typedef enum {  } POWER_SOURCE_e;  typedef enum { +  MEM_VENDOR_PLACEHOLDER0,    MEM_VENDOR_SAMSUNG,    MEM_VENDOR_INFINEON,    MEM_VENDOR_ELPIDA, @@ -577,7 +581,6 @@ typedef enum {    MEM_VENDOR_MOSEL,    MEM_VENDOR_WINBOND,    MEM_VENDOR_ESMT, -  MEM_VENDOR_PLACEHOLDER0,    MEM_VENDOR_PLACEHOLDER1,    MEM_VENDOR_PLACEHOLDER2,    MEM_VENDOR_PLACEHOLDER3, @@ -665,7 +668,14 @@ typedef enum {  #define PP_NUM_RTAVFS_PWL_ZONES 5 - +#define PP_OD_FEATURE_GFX_VF_CURVE_BIT  0 +#define PP_OD_FEATURE_PPT_BIT       2 +#define PP_OD_FEATURE_FAN_CURVE_BIT 3 +#define PP_OD_FEATURE_GFXCLK_BIT      7 +#define PP_OD_FEATURE_UCLK_BIT      8 +#define PP_OD_FEATURE_ZERO_FAN_BIT      9 +#define PP_OD_FEATURE_TEMPERATURE_BIT 10 +#define PP_OD_FEATURE_COUNT 13  // VBIOS or PPLIB configures telemetry slope and offset. Only slope expected to be set for SVI3  // Slope Q1.7, Offset Q1.2 @@ -687,10 +697,8 @@ typedef struct {    //Voltage control    int16_t                VoltageOffsetPerZoneBoundary[PP_NUM_OD_VF_CURVE_POINTS]; -  uint16_t               VddGfxVmax;         // in mV -  uint8_t                IdlePwrSavingFeaturesCtrl; -  uint8_t                RuntimePwrSavingFeaturesCtrl; +  uint32_t               Reserved;    //Frequency changes    int16_t                GfxclkFmin;           // MHz @@ -727,10 +735,9 @@ typedef struct {    uint32_t FeatureCtrlMask;    int16_t VoltageOffsetPerZoneBoundary; -  uint16_t               VddGfxVmax;         // in mV +  uint16_t               Reserved1; -  uint8_t                IdlePwrSavingFeaturesCtrl; -  uint8_t                RuntimePwrSavingFeaturesCtrl; +  uint16_t               Reserved2;    int16_t               GfxclkFmin;           // MHz    int16_t               GfxclkFmax;           // MHz @@ -806,6 +813,9 @@ typedef enum {  #define INVALID_BOARD_GPIO 0xFF +#define MARKETING_BASE_CLOCKS         0 +#define MARKETING_GAME_CLOCKS         1 +#define MARKETING_BOOST_CLOCKS        2  typedef struct {    //PLL 0 @@ -1096,10 +1106,15 @@ typedef struct {    uint16_t        DcsExitHysteresis;    //The min amount of time power credit accumulator should have a value > 0 before SMU exits the DCS throttling phase.    uint16_t        DcsTimeout;           //This is the amount of time SMU FW waits for RLC to put GFX into GFXOFF before reverting to the fallback mechanism of throttling GFXCLK to Fmin. +  uint8_t         FoptEnabled; +  uint8_t         DcsSpare2[3]; +  uint32_t        DcsFoptM;             //Tuning paramters to shift Fopt calculation +  uint32_t        DcsFoptB;             //Tuning paramters to shift Fopt calculation -  uint32_t        DcsSpare[16]; +  uint32_t        DcsSpare[11];    // UCLK section +  uint16_t     ShadowFreqTableUclk[NUM_UCLK_DPM_LEVELS];     // In MHz    uint8_t      UseStrobeModeOptimizations; //Set to indicate that FW should use strobe mode optimizations    uint8_t      PaddingMem[3]; @@ -1245,8 +1260,13 @@ typedef struct {    QuadraticInt_t qFeffCoeffBaseClock[POWER_SOURCE_COUNT];    QuadraticInt_t qFeffCoeffBoostClock[POWER_SOURCE_COUNT]; +  uint16_t TemperatureLimit_Hynix; // In degrees Celsius. Memory temperature limit associated with Hynix +  uint16_t TemperatureLimit_Micron; // In degrees Celsius. Memory temperature limit associated with Micron +  uint16_t TemperatureFwCtfLimit_Hynix; +  uint16_t TemperatureFwCtfLimit_Micron; +    // SECTION: Sku Reserved -  uint32_t         Spare[43]; +  uint32_t         Spare[41];    // Padding for MMHUB - do not modify this    uint32_t     MmHubPadding[8]; @@ -1318,8 +1338,9 @@ typedef struct {    // UCLK Spread Spectrum    uint8_t      UclkSpreadPercent[MEM_VENDOR_COUNT]; +  uint8_t      GfxclkSpreadEnable; +    // FCLK Spread Spectrum -  uint8_t      FclkSpreadPadding;    uint8_t      FclkSpreadPercent;   // Q4.4    uint16_t     FclkSpreadFreq;      // kHz @@ -1444,6 +1465,8 @@ typedef struct {    uint8_t ThrottlingPercentage[THROTTLER_COUNT]; +  uint8_t VmaxThrottlingPercentage; +  uint8_t Padding1[3];    //metrics for D3hot entry/exit and driver ARM msgs    uint32_t D3HotEntryCountPerMode[D3HOT_SEQUENCE_COUNT]; @@ -1463,7 +1486,7 @@ typedef struct {  typedef struct {    SmuMetrics_t SmuMetrics; -  uint32_t Spare[30]; +  uint32_t Spare[29];    // Padding - ignore    uint32_t     MmHubPadding[8]; // SMU internal use diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_4.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_4.h index 2162ecd1057d..fee9293b3f97 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_4.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_4.h @@ -27,7 +27,7 @@  // *** IMPORTANT ***  // SMU TEAM: Always increment the interface version if  // any structure is changed in this file -#define PMFW_DRIVER_IF_VERSION 8 +#define SMU13_0_4_DRIVER_IF_VERSION 8  typedef struct {    int32_t value; diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_5.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_5.h index aa971412b434..7589faa0232d 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_5.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_5.h @@ -23,7 +23,7 @@  #ifndef __SMU13_DRIVER_IF_V13_0_5_H__  #define __SMU13_DRIVER_IF_V13_0_5_H__ -#define PMFW_DRIVER_IF_VERSION 4 +#define SMU13_0_5_DRIVER_IF_VERSION 4  // Throttler Status Bitmask  #define THROTTLER_STATUS_BIT_SPL            0 diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h index be596777cd2c..ca4a5e99ccd1 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_6.h @@ -26,7 +26,7 @@  // *** IMPORTANT ***  // PMFW TEAM: Always increment the interface version if  // anything is changed in this file -#define SMU13_0_6_DRIVER_IF_VERSION 0x08042022 +#define SMU13_0_6_DRIVER_IF_VERSION 0x08042024  //I2C Interface  #define NUM_I2C_CONTROLLERS                8 @@ -106,7 +106,7 @@ typedef enum {  } UCLK_DPM_MODE_e;  typedef struct { -  //0-26 SOC, 27-29 SOCIO +  //0-23 SOC, 24-26 SOCIO, 27-29 SOC    uint16_t avgPsmCount[30];    uint16_t minPsmCount[30];    float    avgPsmVoltage[30]; @@ -121,6 +121,17 @@ typedef struct {    float    minPsmVoltage[30];  } AvfsDebugTableXcd_t; +// Defines used for IH-based thermal interrupts to GFX driver - A/X only +#define IH_INTERRUPT_ID_TO_DRIVER                   0xFE +#define IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING  0x7 + +//thermal over-temp mask defines for IH interrupt to host +#define THROTTLER_PROCHOT_BIT           0 +#define THROTTLER_PPT_BIT               1 +#define THROTTLER_THERMAL_SOCKET_BIT    2//AID, XCD, CCD throttling +#define THROTTLER_THERMAL_VR_BIT        3//VRHOT +#define THROTTLER_THERMAL_HBM_BIT       4 +  // These defines are used with the following messages:  // SMC_MSG_TransferTableDram2Smu  // SMC_MSG_TransferTableSmu2Dram diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h index 4c46a0392451..62b7c0daff68 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h @@ -25,7 +25,7 @@  // *** IMPORTANT ***  // PMFW TEAM: Always increment the interface version on any change to this file -#define SMU13_DRIVER_IF_VERSION  0x35 +#define SMU13_0_7_DRIVER_IF_VERSION  0x35  //Increment this version if SkuTable_t or BoardTable_t change  #define PPTABLE_VERSION 0x27 @@ -683,18 +683,12 @@ typedef struct {  #define PP_OD_FEATURE_GFX_VF_CURVE_BIT  0 -#define PP_OD_FEATURE_VMAX_BIT      1  #define PP_OD_FEATURE_PPT_BIT       2  #define PP_OD_FEATURE_FAN_CURVE_BIT 3 -#define PP_OD_FEATURE_FREQ_DETER_BIT 4 -#define PP_OD_FEATURE_FULL_CTRL_BIT 5 -#define PP_OD_FEATURE_TDC_BIT      6  #define PP_OD_FEATURE_GFXCLK_BIT      7  #define PP_OD_FEATURE_UCLK_BIT      8  #define PP_OD_FEATURE_ZERO_FAN_BIT      9  #define PP_OD_FEATURE_TEMPERATURE_BIT 10 -#define PP_OD_FEATURE_POWER_FEATURE_CTRL_BIT 11 -#define PP_OD_FEATURE_ASIC_TDC_BIT 12  #define PP_OD_FEATURE_COUNT 13  typedef enum { @@ -713,10 +707,8 @@ typedef struct {    //Voltage control    int16_t                VoltageOffsetPerZoneBoundary[PP_NUM_OD_VF_CURVE_POINTS]; -  uint16_t               VddGfxVmax;         // in mV -  uint8_t                IdlePwrSavingFeaturesCtrl; -  uint8_t                RuntimePwrSavingFeaturesCtrl; +  uint32_t               Reserved;    //Frequency changes    int16_t                GfxclkFmin;           // MHz @@ -741,12 +733,7 @@ typedef struct {    uint8_t                MaxOpTemp;    uint8_t                Padding[4]; -  uint16_t               GfxVoltageFullCtrlMode; -  uint16_t               GfxclkFullCtrlMode; -  uint16_t               UclkFullCtrlMode; -  int16_t                AsicTdc; - -  uint32_t               Spare[10]; +  uint32_t               Spare[12];    uint32_t               MmHubPadding[8]; // SMU internal use. Adding here instead of external as a workaround  } OverDriveTable_t; @@ -759,10 +746,9 @@ typedef struct {    uint32_t FeatureCtrlMask;    int16_t VoltageOffsetPerZoneBoundary; -  uint16_t               VddGfxVmax;         // in mV +  uint16_t               Reserved1; -  uint8_t                IdlePwrSavingFeaturesCtrl; -  uint8_t                RuntimePwrSavingFeaturesCtrl; +  uint16_t               Reserved2;    int16_t                GfxclkFmin;           // MHz    int16_t                GfxclkFmax;           // MHz @@ -785,12 +771,7 @@ typedef struct {    uint8_t                MaxOpTemp;    uint8_t                Padding[4]; -  uint16_t               GfxVoltageFullCtrlMode; -  uint16_t               GfxclkFullCtrlMode; -  uint16_t               UclkFullCtrlMode; -  int16_t                AsicTdc; - -  uint32_t               Spare[10]; +  uint32_t               Spare[12];  } OverDriveLimits_t; diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_yellow_carp.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_yellow_carp.h index 25540cb28208..7417634827ad 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_yellow_carp.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_yellow_carp.h @@ -26,7 +26,7 @@  // *** IMPORTANT ***  // SMU TEAM: Always increment the interface version if  // any structure is changed in this file -#define SMU13_DRIVER_IF_VERSION 4 +#define SMU13_YELLOW_CARP_DRIVER_IF_VERSION 4  typedef struct {    int32_t value; diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h index bdccbb4a6276..252aef190c5c 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h @@ -123,9 +123,9 @@ typedef enum {    VOLTAGE_GUARDBAND_COUNT  } GFX_GUARDBAND_e; -#define SMU_METRICS_TABLE_VERSION 0x1 +#define SMU_METRICS_TABLE_VERSION 0x5 -typedef struct { +typedef struct __attribute__((packed, aligned(4))) {    uint32_t AccumulationCounter;    //TEMPERATURE @@ -198,11 +198,20 @@ typedef struct {    uint32_t SocketThmResidencyAcc;    uint32_t VrThmResidencyAcc;    uint32_t HbmThmResidencyAcc; +  uint32_t spare; + +  // New Items at end to maintain driver compatibility +  uint32_t GfxclkFrequency[8]; + +  //PSNs +  uint64_t PublicSerialNumber_AID[4]; +  uint64_t PublicSerialNumber_XCD[8]; +  uint64_t PublicSerialNumber_CCD[12];  } MetricsTable_t; -#define SMU_VF_METRICS_TABLE_VERSION 0x1 +#define SMU_VF_METRICS_TABLE_VERSION 0x3 -typedef struct { +typedef struct __attribute__((packed, aligned(4))) {    uint32_t AccumulationCounter;    uint32_t InstGfxclk_TargFreq;    uint64_t AccGfxclk_TargFreq; diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h index b838e8db395a..ae4f44c4b877 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_ppsmc.h @@ -82,7 +82,8 @@  #define PPSMC_MSG_SetSoftMaxGfxClk                  0x31  #define PPSMC_MSG_GetMinGfxDpmFreq                  0x32  #define PPSMC_MSG_GetMaxGfxDpmFreq                  0x33 -#define PPSMC_Message_Count                         0x34 +#define PPSMC_MSG_PrepareForDriverUnload            0x34 +#define PPSMC_Message_Count                         0x35  //PPSMC Reset Types for driver msg argument  #define PPSMC_RESET_TYPE_DRIVER_MODE_1_RESET        0x1 diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h index df3baaab0037..6a0ac0bbaace 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h @@ -25,17 +25,6 @@  #include "amdgpu_smu.h" -#define SMU13_DRIVER_IF_VERSION_INV 0xFFFFFFFF -#define SMU13_DRIVER_IF_VERSION_YELLOW_CARP 0x04 -#define SMU13_DRIVER_IF_VERSION_ALDE 0x08 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_0 0x37 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_4 0x08 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_5 0x04 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_10 0x32 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 0x37 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_10 0x1D -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_6 0x0 -  #define SMU13_MODE1_RESET_WAIT_TIME_IN_MS 500  //500ms  /* MP Apertures */ @@ -62,6 +51,8 @@  #define CTF_OFFSET_HOTSPOT		5  #define CTF_OFFSET_MEM			5 +#define SMU_13_VCLK_SHIFT		16 +  extern const int pmfw_decoded_link_speed[5];  extern const int pmfw_decoded_link_width[7]; @@ -130,6 +121,7 @@ struct smu_13_0_power_context {  	uint32_t	power_source;  	uint8_t		in_power_limit_boost_mode;  	enum smu_13_0_power_state power_state; +	atomic_t	throttle_status;  };  #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3) diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_7_pptable.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_7_pptable.h index 478862ded0bd..eadbe0149cae 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_7_pptable.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0_7_pptable.h @@ -38,13 +38,12 @@  #define SMU_13_0_7_PP_THERMALCONTROLLER_NONE 0  #define SMU_13_0_7_PP_THERMALCONTROLLER_NAVI21 28 -#define SMU_13_0_7_PP_OVERDRIVE_VERSION 0x81        // OverDrive 8 Table Version 0.2 +#define SMU_13_0_7_PP_OVERDRIVE_VERSION 0x83        // OverDrive 8 Table Version 0.2  #define SMU_13_0_7_PP_POWERSAVINGCLOCK_VERSION 0x01 // Power Saving Clock Table Version 1.00  enum SMU_13_0_7_ODFEATURE_CAP  {      SMU_13_0_7_ODCAP_GFXCLK_LIMITS = 0, -    SMU_13_0_7_ODCAP_GFXCLK_CURVE,      SMU_13_0_7_ODCAP_UCLK_LIMITS,      SMU_13_0_7_ODCAP_POWER_LIMIT,      SMU_13_0_7_ODCAP_FAN_ACOUSTIC_LIMIT, @@ -59,13 +58,13 @@ enum SMU_13_0_7_ODFEATURE_CAP      SMU_13_0_7_ODCAP_FAN_CURVE,      SMU_13_0_7_ODCAP_AUTO_FAN_ACOUSTIC_LIMIT,      SMU_13_0_7_ODCAP_POWER_MODE, +    SMU_13_0_7_ODCAP_PER_ZONE_GFX_VOLTAGE_OFFSET,      SMU_13_0_7_ODCAP_COUNT,  };  enum SMU_13_0_7_ODFEATURE_ID  {      SMU_13_0_7_ODFEATURE_GFXCLK_LIMITS           = 1 << SMU_13_0_7_ODCAP_GFXCLK_LIMITS,           //GFXCLK Limit feature -    SMU_13_0_7_ODFEATURE_GFXCLK_CURVE            = 1 << SMU_13_0_7_ODCAP_GFXCLK_CURVE,            //GFXCLK Curve feature      SMU_13_0_7_ODFEATURE_UCLK_LIMITS             = 1 << SMU_13_0_7_ODCAP_UCLK_LIMITS,             //UCLK Limit feature      SMU_13_0_7_ODFEATURE_POWER_LIMIT             = 1 << SMU_13_0_7_ODCAP_POWER_LIMIT,             //Power Limit feature      SMU_13_0_7_ODFEATURE_FAN_ACOUSTIC_LIMIT      = 1 << SMU_13_0_7_ODCAP_FAN_ACOUSTIC_LIMIT,      //Fan Acoustic RPM feature @@ -80,6 +79,7 @@ enum SMU_13_0_7_ODFEATURE_ID      SMU_13_0_7_ODFEATURE_FAN_CURVE               = 1 << SMU_13_0_7_ODCAP_FAN_CURVE,               //Fan Curve feature      SMU_13_0_7_ODFEATURE_AUTO_FAN_ACOUSTIC_LIMIT = 1 << SMU_13_0_7_ODCAP_AUTO_FAN_ACOUSTIC_LIMIT, //Auto Fan Acoustic RPM feature      SMU_13_0_7_ODFEATURE_POWER_MODE              = 1 << SMU_13_0_7_ODCAP_POWER_MODE,              //Optimized GPU Power Mode feature +    SMU_13_0_7_ODFEATURE_PER_ZONE_GFX_VOLTAGE_OFFSET  = 1 << SMU_13_0_7_ODCAP_PER_ZONE_GFX_VOLTAGE_OFFSET,  //Perzone voltage offset feature      SMU_13_0_7_ODFEATURE_COUNT                   = 16,  }; @@ -89,10 +89,6 @@ enum SMU_13_0_7_ODSETTING_ID  {      SMU_13_0_7_ODSETTING_GFXCLKFMAX = 0,      SMU_13_0_7_ODSETTING_GFXCLKFMIN, -    SMU_13_0_7_ODSETTING_CUSTOM_GFX_VF_CURVE_A, -    SMU_13_0_7_ODSETTING_CUSTOM_GFX_VF_CURVE_B, -    SMU_13_0_7_ODSETTING_CUSTOM_GFX_VF_CURVE_C, -    SMU_13_0_7_ODSETTING_CUSTOM_CURVE_VFT_FMIN,      SMU_13_0_7_ODSETTING_UCLKFMIN,      SMU_13_0_7_ODSETTING_UCLKFMAX,      SMU_13_0_7_ODSETTING_POWERPERCENTAGE, @@ -117,6 +113,12 @@ enum SMU_13_0_7_ODSETTING_ID      SMU_13_0_7_ODSETTING_FAN_CURVE_SPEED_5,      SMU_13_0_7_ODSETTING_AUTO_FAN_ACOUSTIC_LIMIT,      SMU_13_0_7_ODSETTING_POWER_MODE, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_1, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_2, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_3, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_4, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_5, +    SMU_13_0_7_ODSETTING_PER_ZONE_GFX_VOLTAGE_OFFSET_POINT_6,      SMU_13_0_7_ODSETTING_COUNT,  };  #define SMU_13_0_7_MAX_ODSETTING 64 //Maximum Number of ODSettings diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c index c4000518dc56..275f708db636 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c @@ -3413,26 +3413,8 @@ static int navi10_post_smu_init(struct smu_context *smu)  		return 0;  	ret = navi10_run_umc_cdr_workaround(smu); -	if (ret) { +	if (ret)  		dev_err(adev->dev, "Failed to apply umc cdr workaround!\n"); -		return ret; -	} - -	if (!smu->dc_controlled_by_gpio) { -		/* -		 * For Navi1X, manually switch it to AC mode as PMFW -		 * may boot it with DC mode. -		 */ -		ret = smu_v11_0_set_power_source(smu, -						 adev->pm.ac_power ? -						 SMU_POWER_SOURCE_AC : -						 SMU_POWER_SOURCE_DC); -		if (ret) { -			dev_err(adev->dev, "Failed to switch to %s mode!\n", -					adev->pm.ac_power ? "AC" : "DC"); -			return ret; -		} -	}  	return ret;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c index 75f18681e984..85d53597eb07 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c @@ -2067,33 +2067,94 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context  	return ret;  } +static void sienna_cichlid_get_override_pcie_settings(struct smu_context *smu, +						      uint32_t *gen_speed_override, +						      uint32_t *lane_width_override) +{ +	struct amdgpu_device *adev = smu->adev; + +	*gen_speed_override = 0xff; +	*lane_width_override = 0xff; + +	switch (adev->pdev->device) { +	case 0x73A0: +	case 0x73A1: +	case 0x73A2: +	case 0x73A3: +	case 0x73AB: +	case 0x73AE: +		/* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */ +		*lane_width_override = 6; +		break; +	case 0x73E0: +	case 0x73E1: +	case 0x73E3: +		*lane_width_override = 4; +		break; +	case 0x7420: +	case 0x7421: +	case 0x7422: +	case 0x7423: +	case 0x7424: +		*lane_width_override = 3; +		break; +	default: +		break; +	} +} + +#define MAX(a, b)	((a) > (b) ? (a) : (b)) +  static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,  					 uint32_t pcie_gen_cap,  					 uint32_t pcie_width_cap)  {  	struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; - -	uint32_t smu_pcie_arg; +	struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; +	uint32_t gen_speed_override, lane_width_override;  	uint8_t *table_member1, *table_member2; +	uint32_t min_gen_speed, max_gen_speed; +	uint32_t min_lane_width, max_lane_width; +	uint32_t smu_pcie_arg;  	int ret, i;  	GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);  	GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2); -	/* lclk dpm table setup */ -	for (i = 0; i < MAX_PCIE_CONF; i++) { -		dpm_context->dpm_tables.pcie_table.pcie_gen[i] = table_member1[i]; -		dpm_context->dpm_tables.pcie_table.pcie_lane[i] = table_member2[i]; +	sienna_cichlid_get_override_pcie_settings(smu, +						  &gen_speed_override, +						  &lane_width_override); + +	/* PCIE gen speed override */ +	if (gen_speed_override != 0xff) { +		min_gen_speed = MIN(pcie_gen_cap, gen_speed_override); +		max_gen_speed = MIN(pcie_gen_cap, gen_speed_override); +	} else { +		min_gen_speed = MAX(0, table_member1[0]); +		max_gen_speed = MIN(pcie_gen_cap, table_member1[1]); +		min_gen_speed = min_gen_speed > max_gen_speed ? +				max_gen_speed : min_gen_speed;  	} +	pcie_table->pcie_gen[0] = min_gen_speed; +	pcie_table->pcie_gen[1] = max_gen_speed; + +	/* PCIE lane width override */ +	if (lane_width_override != 0xff) { +		min_lane_width = MIN(pcie_width_cap, lane_width_override); +		max_lane_width = MIN(pcie_width_cap, lane_width_override); +	} else { +		min_lane_width = MAX(1, table_member2[0]); +		max_lane_width = MIN(pcie_width_cap, table_member2[1]); +		min_lane_width = min_lane_width > max_lane_width ? +				 max_lane_width : min_lane_width; +	} +	pcie_table->pcie_lane[0] = min_lane_width; +	pcie_table->pcie_lane[1] = max_lane_width;  	for (i = 0; i < NUM_LINK_LEVELS; i++) { -		smu_pcie_arg = (i << 16) | -			((table_member1[i] <= pcie_gen_cap) ? -			 (table_member1[i] << 8) : -			 (pcie_gen_cap << 8)) | -			((table_member2[i] <= pcie_width_cap) ? -			 table_member2[i] : -			 pcie_width_cap); +		smu_pcie_arg = (i << 16 | +				pcie_table->pcie_gen[i] << 8 | +				pcie_table->pcie_lane[i]);  		ret = smu_cmn_send_smc_msg_with_param(smu,  				SMU_MSG_OverridePcieParameters, @@ -2101,11 +2162,6 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,  				NULL);  		if (ret)  			return ret; - -		if (table_member1[i] > pcie_gen_cap) -			dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap; -		if (table_member2[i] > pcie_width_cap) -			dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;  	}  	return 0; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c index 7433dcaa16e0..067b4e0b026c 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c @@ -582,7 +582,7 @@ static int vangogh_print_legacy_clk_levels(struct smu_context *smu,  	DpmClocks_t *clk_table = smu->smu_table.clocks_table;  	SmuMetrics_legacy_t metrics;  	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0;  	bool cur_value_match_level = false; @@ -656,7 +656,8 @@ static int vangogh_print_legacy_clk_levels(struct smu_context *smu,  	case SMU_MCLK:  	case SMU_FCLK:  		for (i = 0; i < count; i++) { -			ret = vangogh_get_dpm_clk_limited(smu, clk_type, i, &value); +			idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = vangogh_get_dpm_clk_limited(smu, clk_type, idx, &value);  			if (ret)  				return ret;  			if (!value) @@ -683,7 +684,7 @@ static int vangogh_print_clk_levels(struct smu_context *smu,  	DpmClocks_t *clk_table = smu->smu_table.clocks_table;  	SmuMetrics_t metrics;  	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0;  	bool cur_value_match_level = false;  	uint32_t min, max; @@ -765,7 +766,8 @@ static int vangogh_print_clk_levels(struct smu_context *smu,  	case SMU_MCLK:  	case SMU_FCLK:  		for (i = 0; i < count; i++) { -			ret = vangogh_get_dpm_clk_limited(smu, clk_type, i, &value); +			idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = vangogh_get_dpm_clk_limited(smu, clk_type, idx, &value);  			if (ret)  				return ret;  			if (!value) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c index 5cdc07165480..8a8ba25c9ad7 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c @@ -494,7 +494,7 @@ static int renoir_set_fine_grain_gfx_freq_parameters(struct smu_context *smu)  static int renoir_print_clk_levels(struct smu_context *smu,  			enum smu_clk_type clk_type, char *buf)  { -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0, min = 0, max = 0;  	SmuMetrics_t metrics;  	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); @@ -594,7 +594,8 @@ static int renoir_print_clk_levels(struct smu_context *smu,  	case SMU_VCLK:  	case SMU_DCLK:  		for (i = 0; i < count; i++) { -			ret = renoir_get_dpm_clk_limited(smu, clk_type, i, &value); +			idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = renoir_get_dpm_clk_limited(smu, clk_type, idx, &value);  			if (ret)  				return ret;  			if (!value) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c index d30ec3005ea1..e80f122d8aec 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c @@ -2147,5 +2147,6 @@ void aldebaran_set_ppt_funcs(struct smu_context *smu)  	smu->clock_map = aldebaran_clk_map;  	smu->feature_map = aldebaran_feature_mask_map;  	smu->table_map = aldebaran_table_map; +	smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_ALDE;  	smu_v13_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c index 393c6a7b9609..e52c563f0dac 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c @@ -269,45 +269,10 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)  	smu_major = (smu_version >> 16) & 0xff;  	smu_minor = (smu_version >> 8) & 0xff;  	smu_debug = (smu_version >> 0) & 0xff; -	if (smu->is_apu) +	if (smu->is_apu || +	    adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 6))  		adev->pm.fw_version = smu_version; -	switch (adev->ip_versions[MP1_HWIP][0]) { -	case IP_VERSION(13, 0, 2): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_ALDE; -		break; -	case IP_VERSION(13, 0, 0): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_0; -		break; -	case IP_VERSION(13, 0, 10): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_10; -		break; -	case IP_VERSION(13, 0, 7): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_7; -		break; -	case IP_VERSION(13, 0, 1): -	case IP_VERSION(13, 0, 3): -	case IP_VERSION(13, 0, 8): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_YELLOW_CARP; -		break; -	case IP_VERSION(13, 0, 4): -	case IP_VERSION(13, 0, 11): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_4; -		break; -	case IP_VERSION(13, 0, 5): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_5; -		break; -	case IP_VERSION(13, 0, 6): -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_6; -		adev->pm.fw_version = smu_version; -		break; -	default: -		dev_err(adev->dev, "smu unsupported IP version: 0x%x.\n", -			adev->ip_versions[MP1_HWIP][0]); -		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_INV; -		break; -	} -  	/* only for dGPU w/ SMU13*/  	if (adev->pm.fw)  		dev_dbg(smu->adev->dev, "smu fw reported program %d, version = 0x%08x (%d.%d.%d)\n", @@ -502,17 +467,26 @@ int smu_v13_0_init_smc_tables(struct smu_context *smu)  			ret = -ENOMEM;  			goto err3_out;  		} + +		smu_table->user_overdrive_table = +			kzalloc(tables[SMU_TABLE_OVERDRIVE].size, GFP_KERNEL); +		if (!smu_table->user_overdrive_table) { +			ret = -ENOMEM; +			goto err4_out; +		}  	}  	smu_table->combo_pptable =  		kzalloc(tables[SMU_TABLE_COMBO_PPTABLE].size, GFP_KERNEL);  	if (!smu_table->combo_pptable) {  		ret = -ENOMEM; -		goto err4_out; +		goto err5_out;  	}  	return 0; +err5_out: +	kfree(smu_table->user_overdrive_table);  err4_out:  	kfree(smu_table->boot_overdrive_table);  err3_out: @@ -532,12 +506,14 @@ int smu_v13_0_fini_smc_tables(struct smu_context *smu)  	kfree(smu_table->gpu_metrics_table);  	kfree(smu_table->combo_pptable); +	kfree(smu_table->user_overdrive_table);  	kfree(smu_table->boot_overdrive_table);  	kfree(smu_table->overdrive_table);  	kfree(smu_table->max_sustainable_clocks);  	kfree(smu_table->driver_pptable);  	smu_table->gpu_metrics_table = NULL;  	smu_table->combo_pptable = NULL; +	smu_table->user_overdrive_table = NULL;  	smu_table->boot_overdrive_table = NULL;  	smu_table->overdrive_table = NULL;  	smu_table->max_sustainable_clocks = NULL; @@ -573,11 +549,11 @@ int smu_v13_0_init_power(struct smu_context *smu)  	if (smu_power->power_context || smu_power->power_context_size != 0)  		return -EINVAL; -	smu_power->power_context = kzalloc(sizeof(struct smu_13_0_dpm_context), +	smu_power->power_context = kzalloc(sizeof(struct smu_13_0_power_context),  					   GFP_KERNEL);  	if (!smu_power->power_context)  		return -ENOMEM; -	smu_power->power_context_size = sizeof(struct smu_13_0_dpm_context); +	smu_power->power_context_size = sizeof(struct smu_13_0_power_context);  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c index 09405ef1e3c8..4dd01b3f350f 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c @@ -237,6 +237,7 @@ static struct cmn2asic_mapping smu_v13_0_0_table_map[SMU_TABLE_COUNT] = {  	[SMU_TABLE_COMBO_PPTABLE] = {1, TABLE_COMBO_PPTABLE},  	TAB_MAP(I2C_COMMANDS),  	TAB_MAP(ECCINFO), +	TAB_MAP(OVERDRIVE),  };  static struct cmn2asic_mapping smu_v13_0_0_pwr_src_map[SMU_POWER_SOURCE_COUNT] = { @@ -331,6 +332,11 @@ static int smu_v13_0_0_check_powerplay_table(struct smu_context *smu)  	struct smu_13_0_0_powerplay_table *powerplay_table =  		table_context->power_play_table;  	struct smu_baco_context *smu_baco = &smu->smu_baco; +	PPTable_t *pptable = smu->smu_table.driver_pptable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&pptable->SkuTable.OverDriveLimitsBasicMax; +	const OverDriveLimits_t * const overdrive_lowerlimits = +				&pptable->SkuTable.OverDriveLimitsMin;  	if (powerplay_table->platform_caps & SMU_13_0_0_PP_PLATFORM_CAP_HARDWAREDC)  		smu->dc_controlled_by_gpio = true; @@ -342,6 +348,10 @@ static int smu_v13_0_0_check_powerplay_table(struct smu_context *smu)  	if (powerplay_table->platform_caps & SMU_13_0_0_PP_PLATFORM_CAP_MACO)  		smu_baco->maco_support = true; +	if (!overdrive_lowerlimits->FeatureCtrlMask || +	    !overdrive_upperlimits->FeatureCtrlMask) +		smu->od_enabled = false; +  	table_context->thermal_controller_type =  		powerplay_table->thermal_controller_type; @@ -461,7 +471,7 @@ static int smu_v13_0_0_tables_init(struct smu_context *smu)  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);  	SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t),  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); -	SMU_TABLE_INIT(tables, SMU_TABLE_OVERDRIVE, sizeof(OverDriveTable_t), +	SMU_TABLE_INIT(tables, SMU_TABLE_OVERDRIVE, sizeof(OverDriveTableExternal_t),  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);  	SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU13_TOOL_SIZE,  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); @@ -1022,17 +1032,119 @@ static int smu_v13_0_0_get_current_clk_freq_by_table(struct smu_context *smu,  						value);  } +static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu, +						int od_feature_bit) +{ +	PPTable_t *pptable = smu->smu_table.driver_pptable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&pptable->SkuTable.OverDriveLimitsBasicMax; + +	return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +} + +static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu, +					      int od_feature_bit, +					      bool lower_boundary, +					      int32_t *min, +					      int32_t *max) +{ +	PPTable_t *pptable = smu->smu_table.driver_pptable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&pptable->SkuTable.OverDriveLimitsBasicMax; +	const OverDriveLimits_t * const overdrive_lowerlimits = +				&pptable->SkuTable.OverDriveLimitsMin; +	int32_t od_min_setting, od_max_setting; + +	switch (od_feature_bit) { +	case PP_OD_FEATURE_GFXCLK_BIT: +		if (lower_boundary) { +			od_min_setting = overdrive_lowerlimits->GfxclkFmin; +			od_max_setting = overdrive_upperlimits->GfxclkFmin; +		} else { +			od_min_setting = overdrive_lowerlimits->GfxclkFmax; +			od_max_setting = overdrive_upperlimits->GfxclkFmax; +		} +		break; +	case PP_OD_FEATURE_UCLK_BIT: +		if (lower_boundary) { +			od_min_setting = overdrive_lowerlimits->UclkFmin; +			od_max_setting = overdrive_upperlimits->UclkFmin; +		} else { +			od_min_setting = overdrive_lowerlimits->UclkFmax; +			od_max_setting = overdrive_upperlimits->UclkFmax; +		} +		break; +	case PP_OD_FEATURE_GFX_VF_CURVE_BIT: +		od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary; +		od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary; +		break; +	default: +		break; +	} + +	if (min) +		*min = od_min_setting; +	if (max) +		*max = od_max_setting; +} + +static void smu_v13_0_0_dump_od_table(struct smu_context *smu, +				      OverDriveTableExternal_t *od_table) +{ +	struct amdgpu_device *adev = smu->adev; + +	dev_dbg(adev->dev, "OD: Gfxclk: (%d, %d)\n", od_table->OverDriveTable.GfxclkFmin, +						     od_table->OverDriveTable.GfxclkFmax); +	dev_dbg(adev->dev, "OD: Uclk: (%d, %d)\n", od_table->OverDriveTable.UclkFmin, +						   od_table->OverDriveTable.UclkFmax); +} + +static int smu_v13_0_0_get_overdrive_table(struct smu_context *smu, +					   OverDriveTableExternal_t *od_table) +{ +	int ret = 0; + +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_OVERDRIVE, +				   0, +				   (void *)od_table, +				   false); +	if (ret) +		dev_err(smu->adev->dev, "Failed to get overdrive table!\n"); + +	return ret; +} + +static int smu_v13_0_0_upload_overdrive_table(struct smu_context *smu, +					      OverDriveTableExternal_t *od_table) +{ +	int ret = 0; + +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_OVERDRIVE, +				   0, +				   (void *)od_table, +				   true); +	if (ret) +		dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); + +	return ret; +} +  static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,  					enum smu_clk_type clk_type,  					char *buf)  {  	struct smu_dpm_context *smu_dpm = &smu->smu_dpm;  	struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context; +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)smu->smu_table.overdrive_table;  	struct smu_13_0_dpm_table *single_dpm_table;  	struct smu_13_0_pcie_table *pcie_table;  	const int link_width[] = {0, 1, 2, 4, 8, 12, 16};  	uint32_t gen_speed, lane_width;  	int i, curr_freq, size = 0; +	int32_t min_value, max_value;  	int ret = 0;  	smu_cmn_get_sysfs_buf(&buf, &size); @@ -1149,6 +1261,89 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,  					"*" : "");  		break; +	case SMU_OD_SCLK: +		if (!smu_v13_0_0_is_od_feature_supported(smu, +							 PP_OD_FEATURE_GFXCLK_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_SCLK:\n"); +		size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n", +					od_table->OverDriveTable.GfxclkFmin, +					od_table->OverDriveTable.GfxclkFmax); +		break; + +	case SMU_OD_MCLK: +		if (!smu_v13_0_0_is_od_feature_supported(smu, +							 PP_OD_FEATURE_UCLK_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_MCLK:\n"); +		size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMHz\n", +					od_table->OverDriveTable.UclkFmin, +					od_table->OverDriveTable.UclkFmax); +		break; + +	case SMU_OD_VDDC_CURVE: +		if (!smu_v13_0_0_is_od_feature_supported(smu, +							 PP_OD_FEATURE_GFX_VF_CURVE_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n"); +		for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) +			size += sysfs_emit_at(buf, size, "%d: %dmv\n", +						i, +						od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]); +		break; + +	case SMU_OD_RANGE: +		if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) && +		    !smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && +		    !smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); + +		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { +			smu_v13_0_0_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFXCLK_BIT, +							  true, +							  &min_value, +							  NULL); +			smu_v13_0_0_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFXCLK_BIT, +							  false, +							  NULL, +							  &max_value); +			size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n", +					      min_value, max_value); +		} + +		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { +			smu_v13_0_0_get_od_setting_limits(smu, +							  PP_OD_FEATURE_UCLK_BIT, +							  true, +							  &min_value, +							  NULL); +			smu_v13_0_0_get_od_setting_limits(smu, +							  PP_OD_FEATURE_UCLK_BIT, +							  false, +							  NULL, +							  &max_value); +			size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n", +					      min_value, max_value); +		} + +		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { +			smu_v13_0_0_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFX_VF_CURVE_BIT, +							  true, +							  &min_value, +							  &max_value); +			size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", +					      min_value, max_value); +		} +		break; +  	default:  		break;  	} @@ -1156,6 +1351,222 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,  	return size;  } +static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu, +					 enum PP_OD_DPM_TABLE_COMMAND type, +					 long input[], +					 uint32_t size) +{ +	struct smu_table_context *table_context = &smu->smu_table; +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)table_context->overdrive_table; +	struct amdgpu_device *adev = smu->adev; +	uint32_t offset_of_featurectrlmask; +	int32_t minimum, maximum; +	uint32_t feature_ctrlmask; +	int i, ret = 0; + +	switch (type) { +	case PP_OD_EDIT_SCLK_VDDC_TABLE: +		if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { +			dev_warn(adev->dev, "GFXCLK_LIMITS setting not supported!\n"); +			return -ENOTSUPP; +		} + +		for (i = 0; i < size; i += 2) { +			if (i + 2 > size) { +				dev_info(adev->dev, "invalid number of input parameters %d\n", size); +				return -EINVAL; +			} + +			switch (input[i]) { +			case 0: +				smu_v13_0_0_get_od_setting_limits(smu, +								  PP_OD_FEATURE_GFXCLK_BIT, +								  true, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "GfxclkFmin (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.GfxclkFmin = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT; +				break; + +			case 1: +				smu_v13_0_0_get_od_setting_limits(smu, +								  PP_OD_FEATURE_GFXCLK_BIT, +								  false, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "GfxclkFmax (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.GfxclkFmax = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT; +				break; + +			default: +				dev_info(adev->dev, "Invalid SCLK_VDDC_TABLE index: %ld\n", input[i]); +				dev_info(adev->dev, "Supported indices: [0:min,1:max]\n"); +				return -EINVAL; +			} +		} + +		if (od_table->OverDriveTable.GfxclkFmin > od_table->OverDriveTable.GfxclkFmax) { +			dev_err(adev->dev, +				"Invalid setting: GfxclkFmin(%u) is bigger than GfxclkFmax(%u)\n", +				(uint32_t)od_table->OverDriveTable.GfxclkFmin, +				(uint32_t)od_table->OverDriveTable.GfxclkFmax); +			return -EINVAL; +		} +		break; + +	case PP_OD_EDIT_MCLK_VDDC_TABLE: +		if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { +			dev_warn(adev->dev, "UCLK_LIMITS setting not supported!\n"); +			return -ENOTSUPP; +		} + +		for (i = 0; i < size; i += 2) { +			if (i + 2 > size) { +				dev_info(adev->dev, "invalid number of input parameters %d\n", size); +				return -EINVAL; +			} + +			switch (input[i]) { +			case 0: +				smu_v13_0_0_get_od_setting_limits(smu, +								  PP_OD_FEATURE_UCLK_BIT, +								  true, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "UclkFmin (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.UclkFmin = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_UCLK_BIT; +				break; + +			case 1: +				smu_v13_0_0_get_od_setting_limits(smu, +								  PP_OD_FEATURE_UCLK_BIT, +								  false, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "UclkFmax (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.UclkFmax = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_UCLK_BIT; +				break; + +			default: +				dev_info(adev->dev, "Invalid MCLK_VDDC_TABLE index: %ld\n", input[i]); +				dev_info(adev->dev, "Supported indices: [0:min,1:max]\n"); +				return -EINVAL; +			} +		} + +		if (od_table->OverDriveTable.UclkFmin > od_table->OverDriveTable.UclkFmax) { +			dev_err(adev->dev, +				"Invalid setting: UclkFmin(%u) is bigger than UclkFmax(%u)\n", +				(uint32_t)od_table->OverDriveTable.UclkFmin, +				(uint32_t)od_table->OverDriveTable.UclkFmax); +			return -EINVAL; +		} +		break; + +	case PP_OD_EDIT_VDDC_CURVE: +		if (!smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { +			dev_warn(adev->dev, "VF curve setting not supported!\n"); +			return -ENOTSUPP; +		} + +		if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS || +		    input[0] < 0) +			return -EINVAL; + +		smu_v13_0_0_get_od_setting_limits(smu, +						  PP_OD_FEATURE_GFX_VF_CURVE_BIT, +						  true, +						  &minimum, +						  &maximum); +		if (input[1] < minimum || +		    input[1] > maximum) { +			dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n", +				 input[1], minimum, maximum); +			return -EINVAL; +		} + +		od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1]; +		od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; +		break; + +	case PP_OD_RESTORE_DEFAULT_TABLE: +		feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask; +		memcpy(od_table, +		       table_context->boot_overdrive_table, +		       sizeof(OverDriveTableExternal_t)); +		od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask; +		fallthrough; + +	case PP_OD_COMMIT_DPM_TABLE: +		/* +		 * The member below instructs PMFW the settings focused in +		 * this single operation. +		 * `uint32_t FeatureCtrlMask;` +		 * It does not contain actual informations about user's custom +		 * settings. Thus we do not cache it. +		 */ +		offset_of_featurectrlmask = offsetof(OverDriveTable_t, FeatureCtrlMask); +		if (memcmp((u8 *)od_table + offset_of_featurectrlmask, +			   table_context->user_overdrive_table + offset_of_featurectrlmask, +			   sizeof(OverDriveTableExternal_t) - offset_of_featurectrlmask)) { +			smu_v13_0_0_dump_od_table(smu, od_table); + +			ret = smu_v13_0_0_upload_overdrive_table(smu, od_table); +			if (ret) { +				dev_err(adev->dev, "Failed to upload overdrive table!\n"); +				return ret; +			} + +			od_table->OverDriveTable.FeatureCtrlMask = 0; +			memcpy(table_context->user_overdrive_table + offset_of_featurectrlmask, +			       (u8 *)od_table + offset_of_featurectrlmask, +			       sizeof(OverDriveTableExternal_t) - offset_of_featurectrlmask); + +			if (!memcmp(table_context->user_overdrive_table, +				    table_context->boot_overdrive_table, +				    sizeof(OverDriveTableExternal_t))) +				smu->user_dpm_profile.user_od = false; +			else +				smu->user_dpm_profile.user_od = true; +		} +		break; + +	default: +		return -ENOSYS; +	} + +	return ret; +} +  static int smu_v13_0_0_force_clk_levels(struct smu_context *smu,  					enum smu_clk_type clk_type,  					uint32_t mask) @@ -1384,6 +1795,78 @@ static ssize_t smu_v13_0_0_get_gpu_metrics(struct smu_context *smu,  	return sizeof(struct gpu_metrics_v1_3);  } +static int smu_v13_0_0_set_default_od_settings(struct smu_context *smu) +{ +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)smu->smu_table.overdrive_table; +	OverDriveTableExternal_t *boot_od_table = +		(OverDriveTableExternal_t *)smu->smu_table.boot_overdrive_table; +	OverDriveTableExternal_t *user_od_table = +		(OverDriveTableExternal_t *)smu->smu_table.user_overdrive_table; +	OverDriveTableExternal_t user_od_table_bak; +	int ret = 0; +	int i; + +	ret = smu_v13_0_0_get_overdrive_table(smu, boot_od_table); +	if (ret) +		return ret; + +	smu_v13_0_0_dump_od_table(smu, boot_od_table); + +	memcpy(od_table, +	       boot_od_table, +	       sizeof(OverDriveTableExternal_t)); + +	/* +	 * For S3/S4/Runpm resume, we need to setup those overdrive tables again, +	 * but we have to preserve user defined values in "user_od_table". +	 */ +	if (!smu->adev->in_suspend) { +		memcpy(user_od_table, +		       boot_od_table, +		       sizeof(OverDriveTableExternal_t)); +		smu->user_dpm_profile.user_od = false; +	} else if (smu->user_dpm_profile.user_od) { +		memcpy(&user_od_table_bak, +		       user_od_table, +		       sizeof(OverDriveTableExternal_t)); +		memcpy(user_od_table, +		       boot_od_table, +		       sizeof(OverDriveTableExternal_t)); +		user_od_table->OverDriveTable.GfxclkFmin = +				user_od_table_bak.OverDriveTable.GfxclkFmin; +		user_od_table->OverDriveTable.GfxclkFmax = +				user_od_table_bak.OverDriveTable.GfxclkFmax; +		user_od_table->OverDriveTable.UclkFmin = +				user_od_table_bak.OverDriveTable.UclkFmin; +		user_od_table->OverDriveTable.UclkFmax = +				user_od_table_bak.OverDriveTable.UclkFmax; +		for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) +			user_od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = +				user_od_table_bak.OverDriveTable.VoltageOffsetPerZoneBoundary[i]; +	} + +	return 0; +} + +static int smu_v13_0_0_restore_user_od_settings(struct smu_context *smu) +{ +	struct smu_table_context *table_context = &smu->smu_table; +	OverDriveTableExternal_t *od_table = table_context->overdrive_table; +	OverDriveTableExternal_t *user_od_table = table_context->user_overdrive_table; +	int res; + +	user_od_table->OverDriveTable.FeatureCtrlMask = 1U << PP_OD_FEATURE_GFXCLK_BIT | +							1U << PP_OD_FEATURE_UCLK_BIT | +							1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; +	res = smu_v13_0_0_upload_overdrive_table(smu, user_od_table); +	user_od_table->OverDriveTable.FeatureCtrlMask = 0; +	if (res == 0) +		memcpy(od_table, user_od_table, sizeof(OverDriveTableExternal_t)); + +	return res; +} +  static int smu_v13_0_0_populate_umd_state_clk(struct smu_context *smu)  {  	struct smu_13_0_dpm_context *dpm_context = @@ -1696,10 +2179,39 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,  		}  	} -	/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ -	workload_type = smu_cmn_to_asic_specific_index(smu, +	if (smu->power_profile_mode == PP_SMC_POWER_PROFILE_COMPUTE && +		(((smu->adev->pdev->device == 0x744C) && (smu->adev->pdev->revision == 0xC8)) || +		((smu->adev->pdev->device == 0x744C) && (smu->adev->pdev->revision == 0xCC)))) { +		ret = smu_cmn_update_table(smu, +					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +					   WORKLOAD_PPLIB_COMPUTE_BIT, +					   (void *)(&activity_monitor_external), +					   false); +		if (ret) { +			dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); +			return ret; +		} + +		ret = smu_cmn_update_table(smu, +					   SMU_TABLE_ACTIVITY_MONITOR_COEFF, +					   WORKLOAD_PPLIB_CUSTOM_BIT, +					   (void *)(&activity_monitor_external), +					   true); +		if (ret) { +			dev_err(smu->adev->dev, "[%s] Failed to set activity monitor!", __func__); +			return ret; +		} + +		workload_type = smu_cmn_to_asic_specific_index(smu, +						       CMN2ASIC_MAPPING_WORKLOAD, +						       PP_SMC_POWER_PROFILE_CUSTOM); +	} else { +		/* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ +		workload_type = smu_cmn_to_asic_specific_index(smu,  						       CMN2ASIC_MAPPING_WORKLOAD,  						       smu->power_profile_mode); +	} +  	if (workload_type < 0)  		return -EINVAL; @@ -2150,6 +2662,9 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {  	.notify_memory_pool_location = smu_v13_0_notify_memory_pool_location,  	.get_gpu_metrics = smu_v13_0_0_get_gpu_metrics,  	.set_soft_freq_limited_range = smu_v13_0_set_soft_freq_limited_range, +	.set_default_od_settings = smu_v13_0_0_set_default_od_settings, +	.restore_user_od_settings = smu_v13_0_0_restore_user_od_settings, +	.od_edit_dpm_table = smu_v13_0_0_od_edit_dpm_table,  	.init_pptable_microcode = smu_v13_0_init_pptable_microcode,  	.populate_umd_state_clk = smu_v13_0_0_populate_umd_state_clk,  	.set_performance_level = smu_v13_0_set_performance_level, @@ -2199,5 +2714,6 @@ void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)  	smu->table_map = smu_v13_0_0_table_map;  	smu->pwr_src_map = smu_v13_0_0_pwr_src_map;  	smu->workload_map = smu_v13_0_0_workload_map; +	smu->smc_driver_if_version = SMU13_0_0_DRIVER_IF_VERSION;  	smu_v13_0_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c index 8fa9a36c38b6..ef37dda9908f 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c @@ -54,6 +54,10 @@  #define FEATURE_MASK(feature) (1ULL << feature) +#define SMU_13_0_4_UMD_PSTATE_GFXCLK			938 +#define SMU_13_0_4_UMD_PSTATE_SOCCLK			938 +#define SMU_13_0_4_UMD_PSTATE_FCLK			1875 +  #define SMC_DPM_FEATURE ( \  	FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \  	FEATURE_MASK(FEATURE_VCN_DPM_BIT)	 | \ @@ -478,7 +482,7 @@ static int smu_v13_0_4_get_dpm_level_count(struct smu_context *smu,  static int smu_v13_0_4_print_clk_levels(struct smu_context *smu,  					enum smu_clk_type clk_type, char *buf)  { -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0;  	uint32_t min, max; @@ -512,7 +516,8 @@ static int smu_v13_0_4_print_clk_levels(struct smu_context *smu,  			break;  		for (i = 0; i < count; i++) { -			ret = smu_v13_0_4_get_dpm_freq_by_index(smu, clk_type, i, &value); +			idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = smu_v13_0_4_get_dpm_freq_by_index(smu, clk_type, idx, &value);  			if (ret)  				break; @@ -830,6 +835,8 @@ static int smu_v13_0_4_set_soft_freq_limited_range(struct smu_context *smu,  						   uint32_t max)  {  	enum smu_message_type msg_set_min, msg_set_max; +	uint32_t min_clk = min; +	uint32_t max_clk = max;  	int ret = 0;  	if (!smu_v13_0_4_clk_dpm_is_enabled(smu, clk_type)) @@ -858,12 +865,17 @@ static int smu_v13_0_4_set_soft_freq_limited_range(struct smu_context *smu,  		return -EINVAL;  	} -	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_min, min, NULL); +	if (clk_type == SMU_VCLK) { +		min_clk = min << SMU_13_VCLK_SHIFT; +		max_clk = max << SMU_13_VCLK_SHIFT; +	} + +	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_min, min_clk, NULL);  	if (ret)  		return ret;  	return smu_cmn_send_smc_msg_with_param(smu, msg_set_max, -					       max, NULL); +					       max_clk, NULL);  }  static int smu_v13_0_4_force_clk_levels(struct smu_context *smu, @@ -900,6 +912,50 @@ static int smu_v13_0_4_force_clk_levels(struct smu_context *smu,  	return ret;  } +static int smu_v13_0_4_get_dpm_profile_freq(struct smu_context *smu, +					enum amd_dpm_forced_level level, +					enum smu_clk_type clk_type, +					uint32_t *min_clk, +					uint32_t *max_clk) +{ +	int ret = 0; +	uint32_t clk_limit = 0; + +	switch (clk_type) { +	case SMU_GFXCLK: +	case SMU_SCLK: +		clk_limit = SMU_13_0_4_UMD_PSTATE_GFXCLK; +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &clk_limit); +		else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) +			smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, &clk_limit, NULL); +		break; +	case SMU_SOCCLK: +		clk_limit = SMU_13_0_4_UMD_PSTATE_SOCCLK; +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &clk_limit); +		break; +	case SMU_FCLK: +		clk_limit = SMU_13_0_4_UMD_PSTATE_FCLK; +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit); +		else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) +			smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, &clk_limit, NULL); +		break; +	case SMU_VCLK: +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &clk_limit); +		break; +	case SMU_DCLK: +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &clk_limit); +		break; +	default: +		ret = -EINVAL; +		break; +	} +	*min_clk = *max_clk = clk_limit; +	return ret; +} +  static int smu_v13_0_4_set_performance_level(struct smu_context *smu,  					     enum amd_dpm_forced_level level)  { @@ -907,6 +963,8 @@ static int smu_v13_0_4_set_performance_level(struct smu_context *smu,  	uint32_t sclk_min = 0, sclk_max = 0;  	uint32_t fclk_min = 0, fclk_max = 0;  	uint32_t socclk_min = 0, socclk_max = 0; +	uint32_t vclk_min = 0, vclk_max = 0; +	uint32_t dclk_min = 0, dclk_max = 0;  	int ret = 0;  	switch (level) { @@ -914,28 +972,42 @@ static int smu_v13_0_4_set_performance_level(struct smu_context *smu,  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &sclk_max);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &fclk_max);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &socclk_max); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &vclk_max); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &dclk_max);  		sclk_min = sclk_max;  		fclk_min = fclk_max;  		socclk_min = socclk_max; +		vclk_min = vclk_max; +		dclk_min = dclk_max;  		break;  	case AMD_DPM_FORCED_LEVEL_LOW:  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, &sclk_min, NULL);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, &fclk_min, NULL);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, &socclk_min, NULL); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, &vclk_min, NULL); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, &dclk_min, NULL);  		sclk_max = sclk_min;  		fclk_max = fclk_min;  		socclk_max = socclk_min; +		vclk_max = vclk_min; +		dclk_max = dclk_min;  		break;  	case AMD_DPM_FORCED_LEVEL_AUTO:  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SCLK, &sclk_min, &sclk_max);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_FCLK, &fclk_min, &fclk_max);  		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_SOCCLK, &socclk_min, &socclk_max); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_VCLK, &vclk_min, &vclk_max); +		smu_v13_0_4_get_dpm_ultimate_freq(smu, SMU_DCLK, &dclk_min, &dclk_max);  		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:  	case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: -		/* Temporarily do nothing since the optimal clocks haven't been provided yet */ +		smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SCLK, &sclk_min, &sclk_max); +		smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_FCLK, &fclk_min, &fclk_max); +		smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_SOCCLK, &socclk_min, &socclk_max); +		smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_VCLK, &vclk_min, &vclk_max); +		smu_v13_0_4_get_dpm_profile_freq(smu, level, SMU_DCLK, &dclk_min, &dclk_max);  		break;  	case AMD_DPM_FORCED_LEVEL_MANUAL:  	case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT: @@ -975,6 +1047,23 @@ static int smu_v13_0_4_set_performance_level(struct smu_context *smu,  			return ret;  	} +	if (vclk_min && vclk_max) { +		ret = smu_v13_0_4_set_soft_freq_limited_range(smu, +							      SMU_VCLK, +							      vclk_min, +							      vclk_max); +		if (ret) +			return ret; +	} + +	if (dclk_min && dclk_max) { +		ret = smu_v13_0_4_set_soft_freq_limited_range(smu, +							      SMU_DCLK, +							      dclk_min, +							      dclk_max); +		if (ret) +			return ret; +	}  	return ret;  } @@ -1043,6 +1132,7 @@ void smu_v13_0_4_set_ppt_funcs(struct smu_context *smu)  	smu->message_map = smu_v13_0_4_message_map;  	smu->feature_map = smu_v13_0_4_feature_mask_map;  	smu->table_map = smu_v13_0_4_table_map; +	smu->smc_driver_if_version = SMU13_0_4_DRIVER_IF_VERSION;  	smu->is_apu = true;  	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 4)) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c index 66445964efbd..7c3ac535f68a 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c @@ -866,7 +866,7 @@ out:  static int smu_v13_0_5_print_clk_levels(struct smu_context *smu,  				enum smu_clk_type clk_type, char *buf)  { -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0;  	uint32_t min = 0, max = 0; @@ -898,7 +898,8 @@ static int smu_v13_0_5_print_clk_levels(struct smu_context *smu,  			goto print_clk_out;  		for (i = 0; i < count; i++) { -			ret = smu_v13_0_5_get_dpm_freq_by_index(smu, clk_type, i, &value); +			idx = (clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = smu_v13_0_5_get_dpm_freq_by_index(smu, clk_type, idx, &value);  			if (ret)  				goto print_clk_out; @@ -1068,6 +1069,7 @@ void smu_v13_0_5_set_ppt_funcs(struct smu_context *smu)  	smu->feature_map = smu_v13_0_5_feature_mask_map;  	smu->table_map = smu_v13_0_5_table_map;  	smu->is_apu = true; +	smu->smc_driver_if_version = SMU13_0_5_DRIVER_IF_VERSION;  	smu->param_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_C2PMSG_34);  	smu->msg_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_C2PMSG_2);  	smu->resp_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_C2PMSG_33); diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c index ea8f3d6fb98b..a92ea4601ea4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c @@ -80,7 +80,10 @@  /* possible frequency drift (1Mhz) */  #define EPSILON 1 -#define smnPCIE_ESM_CTRL 0x111003D0 +#define smnPCIE_ESM_CTRL 0x193D0 +#define smnPCIE_LC_LINK_WIDTH_CNTL 0x1ab40288 +#define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK 0x00000070L +#define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT 0x4  static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COUNT] = {  	MSG_MAP(TestMessage,			     PPSMC_MSG_TestMessage,			0), @@ -122,6 +125,7 @@ static const struct cmn2asic_msg_mapping smu_v13_0_6_message_map[SMU_MSG_MAX_COU  	MSG_MAP(GetMaxGfxclkFrequency,               PPSMC_MSG_GetMaxGfxDpmFreq,                0),  	MSG_MAP(SetSoftMinGfxclk,                    PPSMC_MSG_SetSoftMinGfxClk,                0),  	MSG_MAP(SetSoftMaxGfxClk,                    PPSMC_MSG_SetSoftMaxGfxClk,                0), +	MSG_MAP(PrepareMp1ForUnload,                 PPSMC_MSG_PrepareForDriverUnload,          0),  };  static const struct cmn2asic_mapping smu_v13_0_6_clk_map[SMU_CLK_COUNT] = { @@ -171,18 +175,12 @@ static const struct cmn2asic_mapping smu_v13_0_6_table_map[SMU_TABLE_COUNT] = {  	TAB_MAP(I2C_COMMANDS),  }; -#define THROTTLER_PROCHOT_GFX_BIT  0 -#define THROTTLER_PPT_BIT 1 -#define THROTTLER_TEMP_SOC_BIT 2 -#define THROTTLER_TEMP_VR_GFX_BIT 3 -#define THROTTLER_TEMP_HBM_BIT 4 -  static const uint8_t smu_v13_0_6_throttler_map[] = {  	[THROTTLER_PPT_BIT]		= (SMU_THROTTLER_PPT0_BIT), -	[THROTTLER_TEMP_SOC_BIT]	= (SMU_THROTTLER_TEMP_GPU_BIT), -	[THROTTLER_TEMP_HBM_BIT]	= (SMU_THROTTLER_TEMP_MEM_BIT), -	[THROTTLER_TEMP_VR_GFX_BIT]	= (SMU_THROTTLER_TEMP_VR_GFX_BIT), -	[THROTTLER_PROCHOT_GFX_BIT]	= (SMU_THROTTLER_PROCHOT_GFX_BIT), +	[THROTTLER_THERMAL_SOCKET_BIT]	= (SMU_THROTTLER_TEMP_GPU_BIT), +	[THROTTLER_THERMAL_HBM_BIT]	= (SMU_THROTTLER_TEMP_MEM_BIT), +	[THROTTLER_THERMAL_VR_BIT]	= (SMU_THROTTLER_TEMP_VR_GFX_BIT), +	[THROTTLER_PROCHOT_BIT]		= (SMU_THROTTLER_PROCHOT_GFX_BIT),  };  struct PPTable_t { @@ -197,10 +195,12 @@ struct PPTable_t {  	uint32_t LclkFrequencyTable[4];  	uint32_t MaxLclkDpmRange;  	uint32_t MinLclkDpmRange; +	uint64_t PublicSerialNumber_AID;  	bool Init;  };  #define SMUQ10_TO_UINT(x) ((x) >> 10) +#define SMUQ16_TO_UINT(x) ((x) >> 16)  struct smu_v13_0_6_dpm_map {  	enum smu_clk_type clk_type; @@ -220,10 +220,12 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)  			       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);  	SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(MetricsTable_t), -		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); +		       PAGE_SIZE, +		       AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);  	SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t), -		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); +		       PAGE_SIZE, +		       AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);  	smu_table->metrics_table = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);  	if (!smu_table->metrics_table) @@ -355,6 +357,9 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)  				SMUQ10_TO_UINT(metrics->LclkFrequencyTable[i]);  		} +		/* use AID0 serial number by default */ +		pptable->PublicSerialNumber_AID = metrics->PublicSerialNumber_AID[0]; +  		pptable->Init = true;  	} @@ -385,7 +390,7 @@ static int smu_v13_0_6_get_dpm_ultimate_freq(struct smu_context *smu,  			break;  		case SMU_SOCCLK:  			if (pptable->Init) -				clock_limit = pptable->UclkFrequencyTable[0]; +				clock_limit = pptable->SocclkFrequencyTable[0];  			break;  		case SMU_FCLK:  			if (pptable->Init) @@ -638,16 +643,14 @@ static int smu_v13_0_6_freqs_in_same_level(int32_t frequency1,  	return (abs(frequency1 - frequency2) <= EPSILON);  } -static uint32_t smu_v13_0_6_get_throttler_status(struct smu_context *smu, -						 MetricsTable_t *metrics) +static uint32_t smu_v13_0_6_get_throttler_status(struct smu_context *smu)  { +	struct smu_power_context *smu_power = &smu->smu_power; +	struct smu_13_0_power_context *power_context = smu_power->power_context;  	uint32_t  throttler_status = 0; -	throttler_status |= metrics->ProchotResidencyAcc > 0 ? 1U << THROTTLER_PROCHOT_GFX_BIT : 0; -	throttler_status |= metrics->PptResidencyAcc > 0 ? 1U << THROTTLER_PPT_BIT : 0; -	throttler_status |= metrics->SocketThmResidencyAcc > 0 ?  1U << THROTTLER_TEMP_SOC_BIT : 0; -	throttler_status |= metrics->VrThmResidencyAcc > 0 ? 1U << THROTTLER_TEMP_VR_GFX_BIT : 0; -	throttler_status |= metrics->HbmThmResidencyAcc > 0 ? 1U << THROTTLER_TEMP_HBM_BIT : 0; +	throttler_status = atomic_read(&power_context->throttle_status); +	dev_dbg(smu->adev->dev, "SMU Throttler status: %u", throttler_status);  	return throttler_status;  } @@ -658,7 +661,10 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,  {  	struct smu_table_context *smu_table = &smu->smu_table;  	MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table; +	struct amdgpu_device *adev = smu->adev; +	uint32_t smu_version;  	int ret = 0; +	int xcc_id;  	ret = smu_v13_0_6_get_metrics_table(smu, NULL, false);  	if (ret) @@ -668,7 +674,13 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,  	switch (member) {  	case METRICS_CURR_GFXCLK:  	case METRICS_AVERAGE_GFXCLK: -		*value = 0; +		smu_cmn_get_smc_version(smu, NULL, &smu_version); +		if (smu_version >= 0x552F00) { +			xcc_id = GET_INST(GC, 0); +			*value = SMUQ10_TO_UINT(metrics->GfxclkFrequency[xcc_id]); +		} else { +			*value = 0; +		}  		break;  	case METRICS_CURR_SOCCLK:  	case METRICS_AVERAGE_SOCCLK: @@ -708,9 +720,6 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,  	case METRICS_TEMPERATURE_VRSOC:  		*value = SMUQ10_TO_UINT(metrics->MaxVrTemperature);  		break; -	case METRICS_THROTTLER_STATUS: -		*value = smu_v13_0_6_get_throttler_status(smu, metrics); -		break;  	default:  		*value = UINT_MAX;  		break; @@ -1246,21 +1255,6 @@ static int smu_v13_0_6_get_power_limit(struct smu_context *smu,  	uint32_t power_limit = 0;  	int ret; -	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT)) { -		if (current_power_limit) -			*current_power_limit = 0; -		if (default_power_limit) -			*default_power_limit = 0; -		if (max_power_limit) -			*max_power_limit = 0; - -		dev_warn( -			smu->adev->dev, -			"PPT feature is not enabled, power values can't be fetched."); - -		return 0; -	} -  	ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetPptLimit, &power_limit);  	if (ret) { @@ -1287,16 +1281,147 @@ static int smu_v13_0_6_set_power_limit(struct smu_context *smu,  	return smu_v13_0_set_power_limit(smu, limit_type, limit);  } -static int smu_v13_0_6_system_features_control(struct smu_context *smu, -					       bool enable) +static int smu_v13_0_6_irq_process(struct amdgpu_device *adev, +				   struct amdgpu_irq_src *source, +				   struct amdgpu_iv_entry *entry)  { -	int ret; +	struct smu_context *smu = adev->powerplay.pp_handle; +	struct smu_power_context *smu_power = &smu->smu_power; +	struct smu_13_0_power_context *power_context = smu_power->power_context; +	uint32_t client_id = entry->client_id; +	uint32_t ctxid = entry->src_data[0]; +	uint32_t src_id = entry->src_id; +	uint32_t data; + +	if (client_id == SOC15_IH_CLIENTID_MP1) { +		if (src_id == IH_INTERRUPT_ID_TO_DRIVER) { +			/* ACK SMUToHost interrupt */ +			data = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL); +			data = REG_SET_FIELD(data, MP1_SMN_IH_SW_INT_CTRL, INT_ACK, 1); +			WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, data); +			/* +			 * ctxid is used to distinguish different events for SMCToHost +			 * interrupt. +			 */ +			switch (ctxid) { +			case IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING: +				/* +				 * Increment the throttle interrupt counter +				 */ +				atomic64_inc(&smu->throttle_int_counter); + +				if (!atomic_read(&adev->throttling_logging_enabled)) +					return 0; + +				/* This uses the new method which fixes the +				 * incorrect throttling status reporting +				 * through metrics table. For older FWs, +				 * it will be ignored. +				 */ +				if (__ratelimit(&adev->throttling_logging_rs)) { +					atomic_set( +						&power_context->throttle_status, +							entry->src_data[1]); +					schedule_work(&smu->throttling_logging_work); +				} + +				break; +			} +		} +	} + +	return 0; +} + +static int smu_v13_0_6_set_irq_state(struct amdgpu_device *adev, +			      struct amdgpu_irq_src *source, +			      unsigned tyep, +			      enum amdgpu_interrupt_state state) +{ +	uint32_t val = 0; -	/* Nothing to be done for APU */ -	if (smu->adev->flags & AMD_IS_APU) +	switch (state) { +	case AMDGPU_IRQ_STATE_DISABLE: +		/* For MP1 SW irqs */ +		val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL); +		val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT_CTRL, INT_MASK, 1); +		WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, val); + +		break; +	case AMDGPU_IRQ_STATE_ENABLE: +		/* For MP1 SW irqs */ +		val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT); +		val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT, ID, 0xFE); +		val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT, VALID, 0); +		WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT, val); + +		val = RREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL); +		val = REG_SET_FIELD(val, MP1_SMN_IH_SW_INT_CTRL, INT_MASK, 0); +		WREG32_SOC15(MP1, 0, regMP1_SMN_IH_SW_INT_CTRL, val); + +		break; +	default: +		break; +	} + +	return 0; +} + +static const struct amdgpu_irq_src_funcs smu_v13_0_6_irq_funcs = +{ +	.set = smu_v13_0_6_set_irq_state, +	.process = smu_v13_0_6_irq_process, +}; + +static int smu_v13_0_6_register_irq_handler(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; +	struct amdgpu_irq_src *irq_src = &smu->irq_source; +	int ret = 0; + +	if (amdgpu_sriov_vf(adev))  		return 0; -	ret = smu_v13_0_system_features_control(smu, enable); +	irq_src->num_types = 1; +	irq_src->funcs = &smu_v13_0_6_irq_funcs; + +	ret = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_MP1, +				IH_INTERRUPT_ID_TO_DRIVER, +				irq_src); +	if (ret) +		return ret; + +	return ret; +} + +static int smu_v13_0_6_notify_unload(struct smu_context *smu) +{ +	uint32_t smu_version; + +	smu_cmn_get_smc_version(smu, NULL, &smu_version); +	if (smu_version <= 0x553500) +		return 0; + +	dev_dbg(smu->adev->dev, "Notify PMFW about driver unload"); +	/* Ignore return, just intimate FW that driver is not going to be there */ +	smu_cmn_send_smc_msg(smu, SMU_MSG_PrepareMp1ForUnload, NULL); + +	return 0; +} + +static int smu_v13_0_6_system_features_control(struct smu_context *smu, +					       bool enable) +{ +	struct amdgpu_device *adev = smu->adev; +	int ret = 0; + +	if (enable) { +		if (!(adev->flags & AMD_IS_APU)) +			ret = smu_v13_0_system_features_control(smu, enable); +	} else { +		/* Notify FW that the device is no longer driver managed */ +		smu_v13_0_6_notify_unload(smu); +	}  	return ret;  } @@ -1737,19 +1862,11 @@ static void smu_v13_0_6_i2c_control_fini(struct smu_context *smu)  static void smu_v13_0_6_get_unique_id(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; -	//SmuMetrics_t *metrics = smu->smu_table.metrics_table; -	uint32_t upper32 = 0, lower32 = 0; -	int ret; - -	ret = smu_cmn_get_metrics_table(smu, NULL, false); -	if (ret) -		goto out; - -	//upper32 = metrics->PublicSerialNumUpper32; -	//lower32 = metrics->PublicSerialNumLower32; +	struct smu_table_context *smu_table = &smu->smu_table; +	struct PPTable_t *pptable = +		(struct PPTable_t *)smu_table->driver_pptable; -out: -	adev->unique_id = ((uint64_t)upper32 << 32) | lower32; +	adev->unique_id = pptable->PublicSerialNumber_AID;  	if (adev->serial[0] == '\0')  		sprintf(adev->serial, "%016llx", adev->unique_id);  } @@ -1774,37 +1891,35 @@ static int smu_v13_0_6_allow_xgmi_power_down(struct smu_context *smu, bool en)  					       en ? 0 : 1, NULL);  } -static const struct throttling_logging_label { -	uint32_t feature_mask; -	const char *label; -} logging_label[] = { -	{ (1U << THROTTLER_TEMP_HBM_BIT), "HBM" }, -	{ (1U << THROTTLER_TEMP_SOC_BIT), "SOC" }, -	{ (1U << THROTTLER_TEMP_VR_GFX_BIT), "VR limit" }, +static const char *const throttling_logging_label[] = { +	[THROTTLER_PROCHOT_BIT] = "Prochot", +	[THROTTLER_PPT_BIT] = "PPT", +	[THROTTLER_THERMAL_SOCKET_BIT] = "SOC", +	[THROTTLER_THERMAL_VR_BIT] = "VR", +	[THROTTLER_THERMAL_HBM_BIT] = "HBM"  }; +  static void smu_v13_0_6_log_thermal_throttling_event(struct smu_context *smu)  { -	int ret;  	int throttler_idx, throtting_events = 0, buf_idx = 0;  	struct amdgpu_device *adev = smu->adev;  	uint32_t throttler_status;  	char log_buf[256]; -	ret = smu_v13_0_6_get_smu_metrics_data(smu, METRICS_THROTTLER_STATUS, -					      &throttler_status); -	if (ret) +	throttler_status = smu_v13_0_6_get_throttler_status(smu); +	if (!throttler_status)  		return;  	memset(log_buf, 0, sizeof(log_buf)); -	for (throttler_idx = 0; throttler_idx < ARRAY_SIZE(logging_label); +	for (throttler_idx = 0; +	     throttler_idx < ARRAY_SIZE(throttling_logging_label);  	     throttler_idx++) { -		if (throttler_status & -		    logging_label[throttler_idx].feature_mask) { +		if (throttler_status & (1U << throttler_idx)) {  			throtting_events++; -			buf_idx += snprintf(log_buf + buf_idx, -					    sizeof(log_buf) - buf_idx, "%s%s", -					    throtting_events > 1 ? " and " : "", -					    logging_label[throttler_idx].label); +			buf_idx += snprintf( +				log_buf + buf_idx, sizeof(log_buf) - buf_idx, +				"%s%s", throtting_events > 1 ? " and " : "", +				throttling_logging_label[throttler_idx]);  			if (buf_idx >= sizeof(log_buf)) {  				dev_err(adev->dev, "buffer overflow!\n");  				log_buf[sizeof(log_buf) - 1] = '\0'; @@ -1813,16 +1928,24 @@ static void smu_v13_0_6_log_thermal_throttling_event(struct smu_context *smu)  		}  	} -	dev_warn( -		adev->dev, -		"WARN: GPU thermal throttling temperature reached, expect performance decrease. %s.\n", -		log_buf); +	dev_warn(adev->dev, +		 "WARN: GPU is throttled, expect performance decrease. %s.\n", +		 log_buf);  	kgd2kfd_smi_event_throttle(  		smu->adev->kfd.dev,  		smu_cmn_get_indep_throttler_status(throttler_status,  						   smu_v13_0_6_throttler_map));  } +static int +smu_v13_0_6_get_current_pcie_link_width_level(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; + +	return REG_GET_FIELD(RREG32_PCIE(smnPCIE_LC_LINK_WIDTH_CNTL), +			     PCIE_LC_LINK_WIDTH_CNTL, LC_LINK_WIDTH_RD); +} +  static int smu_v13_0_6_get_current_pcie_link_speed(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; @@ -1841,8 +1964,12 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table  	struct smu_table_context *smu_table = &smu->smu_table;  	struct gpu_metrics_v1_3 *gpu_metrics =  		(struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table; +	struct amdgpu_device *adev = smu->adev; +	int ret = 0, inst0, xcc0;  	MetricsTable_t *metrics; -	int i, ret = 0; + +	inst0 = adev->sdma.instance[0].aid_id; +	xcc0 = GET_INST(GC, 0);  	metrics = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);  	ret = smu_v13_0_6_get_metrics_table(smu, metrics, true); @@ -1851,51 +1978,59 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table  	smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3); -	/* TODO: Decide on how to fill in zero value fields */ -	gpu_metrics->temperature_edge = 0; -	gpu_metrics->temperature_hotspot = 0; -	gpu_metrics->temperature_mem = 0; -	gpu_metrics->temperature_vrgfx = 0; -	gpu_metrics->temperature_vrsoc = 0; -	gpu_metrics->temperature_vrmem = 0; +	gpu_metrics->temperature_hotspot = +		SMUQ10_TO_UINT(metrics->MaxSocketTemperature); +	/* Individual HBM stack temperature is not reported */ +	gpu_metrics->temperature_mem = +		SMUQ10_TO_UINT(metrics->MaxHbmTemperature); +	/* Reports max temperature of all voltage rails */ +	gpu_metrics->temperature_vrsoc = +		SMUQ10_TO_UINT(metrics->MaxVrTemperature); -	gpu_metrics->average_gfx_activity = 0; -	gpu_metrics->average_umc_activity = 0; -	gpu_metrics->average_mm_activity = 0; +	gpu_metrics->average_gfx_activity = +		SMUQ10_TO_UINT(metrics->SocketGfxBusy); +	gpu_metrics->average_umc_activity = +		SMUQ10_TO_UINT(metrics->DramBandwidthUtilization); -	gpu_metrics->average_socket_power = 0; -	gpu_metrics->energy_accumulator = 0; +	gpu_metrics->average_socket_power = +		SMUQ10_TO_UINT(metrics->SocketPower); +	gpu_metrics->energy_accumulator = +		SMUQ16_TO_UINT(metrics->SocketEnergyAcc); -	gpu_metrics->average_gfxclk_frequency = 0; -	gpu_metrics->average_socclk_frequency = 0; -	gpu_metrics->average_uclk_frequency = 0; -	gpu_metrics->average_vclk0_frequency = 0; -	gpu_metrics->average_dclk0_frequency = 0; +	gpu_metrics->current_gfxclk = +		SMUQ10_TO_UINT(metrics->GfxclkFrequency[xcc0]); +	gpu_metrics->current_socclk = +		SMUQ10_TO_UINT(metrics->SocclkFrequency[inst0]); +	gpu_metrics->current_uclk = SMUQ10_TO_UINT(metrics->UclkFrequency); +	gpu_metrics->current_vclk0 = +		SMUQ10_TO_UINT(metrics->VclkFrequency[inst0]); +	gpu_metrics->current_dclk0 = +		SMUQ10_TO_UINT(metrics->DclkFrequency[inst0]); -	gpu_metrics->current_gfxclk = 0; -	gpu_metrics->current_socclk = 0; -	gpu_metrics->current_uclk = 0; -	gpu_metrics->current_vclk0 = 0; -	gpu_metrics->current_dclk0 = 0; +	gpu_metrics->average_gfxclk_frequency = gpu_metrics->current_gfxclk; +	gpu_metrics->average_socclk_frequency = gpu_metrics->current_socclk; +	gpu_metrics->average_uclk_frequency = gpu_metrics->current_uclk; +	gpu_metrics->average_vclk0_frequency = gpu_metrics->current_vclk0; +	gpu_metrics->average_dclk0_frequency = gpu_metrics->current_dclk0; +	/* Throttle status is not reported through metrics now */  	gpu_metrics->throttle_status = 0; -	gpu_metrics->indep_throttle_status = smu_cmn_get_indep_throttler_status( -		gpu_metrics->throttle_status, smu_v13_0_6_throttler_map); -	gpu_metrics->current_fan_speed = 0; - -	gpu_metrics->pcie_link_width = 0; -	gpu_metrics->pcie_link_speed = smu_v13_0_6_get_current_pcie_link_speed(smu); +	if (!(adev->flags & AMD_IS_APU)) { +		gpu_metrics->pcie_link_width = +			smu_v13_0_6_get_current_pcie_link_width_level(smu); +		gpu_metrics->pcie_link_speed = +			smu_v13_0_6_get_current_pcie_link_speed(smu); +	}  	gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); -	gpu_metrics->gfx_activity_acc = 0; -	gpu_metrics->mem_activity_acc = 0; +	gpu_metrics->gfx_activity_acc = +		SMUQ10_TO_UINT(metrics->SocketGfxBusyAcc); +	gpu_metrics->mem_activity_acc = +		SMUQ10_TO_UINT(metrics->DramBandwidthUtilizationAcc); -	for (i = 0; i < NUM_HBM_INSTANCES; i++) -		gpu_metrics->temperature_hbm[i] = 0; - -	gpu_metrics->firmware_timestamp = 0; +	gpu_metrics->firmware_timestamp = metrics->Timestamp;  	*table = (void *)gpu_metrics;  	kfree(metrics); @@ -1905,27 +2040,27 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table  static int smu_v13_0_6_mode2_reset(struct smu_context *smu)  { -	u32 smu_version;  	int ret = 0, index;  	struct amdgpu_device *adev = smu->adev;  	int timeout = 10; -	smu_cmn_get_smc_version(smu, NULL, &smu_version); -  	index = smu_cmn_to_asic_specific_index(smu, CMN2ASIC_MAPPING_MSG,  					       SMU_MSG_GfxDeviceDriverReset);  	mutex_lock(&smu->message_lock); +  	ret = smu_cmn_send_msg_without_waiting(smu, (uint16_t)index,  					       SMU_RESET_MODE_2); +  	/* This is similar to FLR, wait till max FLR timeout */  	msleep(100); +  	dev_dbg(smu->adev->dev, "restore config space...\n");  	/* Restore the config space saved during init */  	amdgpu_device_load_pci_state(adev->pdev);  	dev_dbg(smu->adev->dev, "wait for reset ack\n"); -	while (ret == -ETIME && timeout) { +	do {  		ret = smu_cmn_wait_for_response(smu);  		/* Wait a bit more time for getting ACK */  		if (ret == -ETIME) { @@ -1934,16 +2069,14 @@ static int smu_v13_0_6_mode2_reset(struct smu_context *smu)  			continue;  		} -		if (ret != 1) { +		if (ret) {  			dev_err(adev->dev, -				"failed to send mode2 message \tparam: 0x%08x response %#x\n", +				"failed to send mode2 message \tparam: 0x%08x error code %d\n",  				SMU_RESET_MODE_2, ret);  			goto out;  		} -	} +	} while (ret == -ETIME && timeout); -	if (ret == 1) -		ret = 0;  out:  	mutex_unlock(&smu->message_lock); @@ -2032,11 +2165,9 @@ static const struct pptable_funcs smu_v13_0_6_ppt_funcs = {  	.feature_is_enabled = smu_cmn_feature_is_enabled,  	.set_power_limit = smu_v13_0_6_set_power_limit,  	.set_xgmi_pstate = smu_v13_0_set_xgmi_pstate, -	/* TODO: Thermal limits unknown, skip these for now -	.register_irq_handler = smu_v13_0_register_irq_handler, +	.register_irq_handler = smu_v13_0_6_register_irq_handler,  	.enable_thermal_alert = smu_v13_0_enable_thermal_alert,  	.disable_thermal_alert = smu_v13_0_disable_thermal_alert, -	*/  	.setup_pptable = smu_v13_0_6_setup_pptable,  	.baco_is_support = smu_v13_0_6_is_baco_supported,  	.get_dpm_ultimate_freq = smu_v13_0_6_get_dpm_ultimate_freq, @@ -2065,5 +2196,6 @@ void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu)  	smu->clock_map = smu_v13_0_6_clk_map;  	smu->feature_map = smu_v13_0_6_feature_mask_map;  	smu->table_map = smu_v13_0_6_table_map; +	smu->smc_driver_if_version = SMU13_0_6_DRIVER_IF_VERSION;  	smu_v13_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c index 3d9ff46706fb..cda4e818aab7 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c @@ -125,6 +125,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] =  	MSG_MAP(ArmD3,				PPSMC_MSG_ArmD3,                       0),  	MSG_MAP(AllowGpo,			PPSMC_MSG_SetGpoAllow,           0),  	MSG_MAP(GetPptLimit,			PPSMC_MSG_GetPptLimit,                 0), +	MSG_MAP(NotifyPowerSource,		PPSMC_MSG_NotifyPowerSource,           0),  };  static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = { @@ -205,6 +206,7 @@ static struct cmn2asic_mapping smu_v13_0_7_table_map[SMU_TABLE_COUNT] = {  	TAB_MAP(DRIVER_SMU_CONFIG),  	TAB_MAP(ACTIVITY_MONITOR_COEFF),  	[SMU_TABLE_COMBO_PPTABLE] = {1, TABLE_COMBO_PPTABLE}, +	TAB_MAP(OVERDRIVE),  };  static struct cmn2asic_mapping smu_v13_0_7_pwr_src_map[SMU_POWER_SOURCE_COUNT] = { @@ -321,6 +323,10 @@ static int smu_v13_0_7_check_powerplay_table(struct smu_context *smu)  	struct smu_baco_context *smu_baco = &smu->smu_baco;  	PPTable_t *smc_pptable = table_context->driver_pptable;  	BoardTable_t *BoardTable = &smc_pptable->BoardTable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&smc_pptable->SkuTable.OverDriveLimitsBasicMax; +	const OverDriveLimits_t * const overdrive_lowerlimits = +				&smc_pptable->SkuTable.OverDriveLimitsMin;  	if (powerplay_table->platform_caps & SMU_13_0_7_PP_PLATFORM_CAP_HARDWAREDC)  		smu->dc_controlled_by_gpio = true; @@ -332,6 +338,10 @@ static int smu_v13_0_7_check_powerplay_table(struct smu_context *smu)  	if (smu_baco->platform_support && (BoardTable->HsrEnabled || BoardTable->VddqOffEnabled))  		smu_baco->maco_support = true; +	if (!overdrive_lowerlimits->FeatureCtrlMask || +	    !overdrive_upperlimits->FeatureCtrlMask) +		smu->od_enabled = false; +  	table_context->thermal_controller_type =  		powerplay_table->thermal_controller_type; @@ -478,7 +488,7 @@ static int smu_v13_0_7_tables_init(struct smu_context *smu)  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);  	SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t),  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); -	SMU_TABLE_INIT(tables, SMU_TABLE_OVERDRIVE, sizeof(OverDriveTable_t), +	SMU_TABLE_INIT(tables, SMU_TABLE_OVERDRIVE, sizeof(OverDriveTableExternal_t),  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);  	SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU13_TOOL_SIZE,  		       PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM); @@ -1012,16 +1022,118 @@ static int smu_v13_0_7_get_current_clk_freq_by_table(struct smu_context *smu,  						value);  } +static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu, +						int od_feature_bit) +{ +	PPTable_t *pptable = smu->smu_table.driver_pptable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&pptable->SkuTable.OverDriveLimitsBasicMax; + +	return overdrive_upperlimits->FeatureCtrlMask & (1U << od_feature_bit); +} + +static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu, +					      int od_feature_bit, +					      bool lower_boundary, +					      int32_t *min, +					      int32_t *max) +{ +	PPTable_t *pptable = smu->smu_table.driver_pptable; +	const OverDriveLimits_t * const overdrive_upperlimits = +				&pptable->SkuTable.OverDriveLimitsBasicMax; +	const OverDriveLimits_t * const overdrive_lowerlimits = +				&pptable->SkuTable.OverDriveLimitsMin; +	int32_t od_min_setting, od_max_setting; + +	switch (od_feature_bit) { +	case PP_OD_FEATURE_GFXCLK_BIT: +		if (lower_boundary) { +			od_min_setting = overdrive_lowerlimits->GfxclkFmin; +			od_max_setting = overdrive_upperlimits->GfxclkFmin; +		} else { +			od_min_setting = overdrive_lowerlimits->GfxclkFmax; +			od_max_setting = overdrive_upperlimits->GfxclkFmax; +		} +		break; +	case PP_OD_FEATURE_UCLK_BIT: +		if (lower_boundary) { +			od_min_setting = overdrive_lowerlimits->UclkFmin; +			od_max_setting = overdrive_upperlimits->UclkFmin; +		} else { +			od_min_setting = overdrive_lowerlimits->UclkFmax; +			od_max_setting = overdrive_upperlimits->UclkFmax; +		} +		break; +	case PP_OD_FEATURE_GFX_VF_CURVE_BIT: +		od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary; +		od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary; +		break; +	default: +		break; +	} + +	if (min) +		*min = od_min_setting; +	if (max) +		*max = od_max_setting; +} + +static void smu_v13_0_7_dump_od_table(struct smu_context *smu, +				      OverDriveTableExternal_t *od_table) +{ +	struct amdgpu_device *adev = smu->adev; + +	dev_dbg(adev->dev, "OD: Gfxclk: (%d, %d)\n", od_table->OverDriveTable.GfxclkFmin, +						     od_table->OverDriveTable.GfxclkFmax); +	dev_dbg(adev->dev, "OD: Uclk: (%d, %d)\n", od_table->OverDriveTable.UclkFmin, +						   od_table->OverDriveTable.UclkFmax); +} + +static int smu_v13_0_7_get_overdrive_table(struct smu_context *smu, +					   OverDriveTableExternal_t *od_table) +{ +	int ret = 0; + +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_OVERDRIVE, +				   0, +				   (void *)od_table, +				   false); +	if (ret) +		dev_err(smu->adev->dev, "Failed to get overdrive table!\n"); + +	return ret; +} + +static int smu_v13_0_7_upload_overdrive_table(struct smu_context *smu, +					      OverDriveTableExternal_t *od_table) +{ +	int ret = 0; + +	ret = smu_cmn_update_table(smu, +				   SMU_TABLE_OVERDRIVE, +				   0, +				   (void *)od_table, +				   true); +	if (ret) +		dev_err(smu->adev->dev, "Failed to upload overdrive table!\n"); + +	return ret; +} +  static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,  					enum smu_clk_type clk_type,  					char *buf)  {  	struct smu_dpm_context *smu_dpm = &smu->smu_dpm;  	struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context; +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)smu->smu_table.overdrive_table;  	struct smu_13_0_dpm_table *single_dpm_table;  	struct smu_13_0_pcie_table *pcie_table;  	uint32_t gen_speed, lane_width;  	int i, curr_freq, size = 0; +	int32_t min_value, max_value;  	int ret = 0;  	smu_cmn_get_sysfs_buf(&buf, &size); @@ -1138,6 +1250,89 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,  					"*" : "");  		break; +	case SMU_OD_SCLK: +		if (!smu_v13_0_7_is_od_feature_supported(smu, +							 PP_OD_FEATURE_GFXCLK_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_SCLK:\n"); +		size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n", +					od_table->OverDriveTable.GfxclkFmin, +					od_table->OverDriveTable.GfxclkFmax); +		break; + +	case SMU_OD_MCLK: +		if (!smu_v13_0_7_is_od_feature_supported(smu, +							 PP_OD_FEATURE_UCLK_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_MCLK:\n"); +		size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMHz\n", +					od_table->OverDriveTable.UclkFmin, +					od_table->OverDriveTable.UclkFmax); +		break; + +	case SMU_OD_VDDC_CURVE: +		if (!smu_v13_0_7_is_od_feature_supported(smu, +							 PP_OD_FEATURE_GFX_VF_CURVE_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "OD_VDDC_CURVE:\n"); +		for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) +			size += sysfs_emit_at(buf, size, "%d: %dmv\n", +						i, +						od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i]); +		break; + +	case SMU_OD_RANGE: +		if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT) && +		    !smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT) && +		    !smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) +			break; + +		size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE"); + +		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { +			smu_v13_0_7_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFXCLK_BIT, +							  true, +							  &min_value, +							  NULL); +			smu_v13_0_7_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFXCLK_BIT, +							  false, +							  NULL, +							  &max_value); +			size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n", +					      min_value, max_value); +		} + +		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { +			smu_v13_0_7_get_od_setting_limits(smu, +							  PP_OD_FEATURE_UCLK_BIT, +							  true, +							  &min_value, +							  NULL); +			smu_v13_0_7_get_od_setting_limits(smu, +							  PP_OD_FEATURE_UCLK_BIT, +							  false, +							  NULL, +							  &max_value); +			size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n", +					      min_value, max_value); +		} + +		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { +			smu_v13_0_7_get_od_setting_limits(smu, +							  PP_OD_FEATURE_GFX_VF_CURVE_BIT, +							  true, +							  &min_value, +							  &max_value); +			size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n", +					      min_value, max_value); +		} +		break; +  	default:  		break;  	} @@ -1145,6 +1340,222 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,  	return size;  } +static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu, +					 enum PP_OD_DPM_TABLE_COMMAND type, +					 long input[], +					 uint32_t size) +{ +	struct smu_table_context *table_context = &smu->smu_table; +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)table_context->overdrive_table; +	struct amdgpu_device *adev = smu->adev; +	uint32_t offset_of_featurectrlmask; +	int32_t minimum, maximum; +	uint32_t feature_ctrlmask; +	int i, ret = 0; + +	switch (type) { +	case PP_OD_EDIT_SCLK_VDDC_TABLE: +		if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) { +			dev_warn(adev->dev, "GFXCLK_LIMITS setting not supported!\n"); +			return -ENOTSUPP; +		} + +		for (i = 0; i < size; i += 2) { +			if (i + 2 > size) { +				dev_info(adev->dev, "invalid number of input parameters %d\n", size); +				return -EINVAL; +			} + +			switch (input[i]) { +			case 0: +				smu_v13_0_7_get_od_setting_limits(smu, +								  PP_OD_FEATURE_GFXCLK_BIT, +								  true, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "GfxclkFmin (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.GfxclkFmin = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT; +				break; + +			case 1: +				smu_v13_0_7_get_od_setting_limits(smu, +								  PP_OD_FEATURE_GFXCLK_BIT, +								  false, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "GfxclkFmax (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.GfxclkFmax = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT; +				break; + +			default: +				dev_info(adev->dev, "Invalid SCLK_VDDC_TABLE index: %ld\n", input[i]); +				dev_info(adev->dev, "Supported indices: [0:min,1:max]\n"); +				return -EINVAL; +			} +		} + +		if (od_table->OverDriveTable.GfxclkFmin > od_table->OverDriveTable.GfxclkFmax) { +			dev_err(adev->dev, +				"Invalid setting: GfxclkFmin(%u) is bigger than GfxclkFmax(%u)\n", +				(uint32_t)od_table->OverDriveTable.GfxclkFmin, +				(uint32_t)od_table->OverDriveTable.GfxclkFmax); +			return -EINVAL; +		} +		break; + +	case PP_OD_EDIT_MCLK_VDDC_TABLE: +		if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) { +			dev_warn(adev->dev, "UCLK_LIMITS setting not supported!\n"); +			return -ENOTSUPP; +		} + +		for (i = 0; i < size; i += 2) { +			if (i + 2 > size) { +				dev_info(adev->dev, "invalid number of input parameters %d\n", size); +				return -EINVAL; +			} + +			switch (input[i]) { +			case 0: +				smu_v13_0_7_get_od_setting_limits(smu, +								  PP_OD_FEATURE_UCLK_BIT, +								  true, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "UclkFmin (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.UclkFmin = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_UCLK_BIT; +				break; + +			case 1: +				smu_v13_0_7_get_od_setting_limits(smu, +								  PP_OD_FEATURE_UCLK_BIT, +								  false, +								  &minimum, +								  &maximum); +				if (input[i + 1] < minimum || +				    input[i + 1] > maximum) { +					dev_info(adev->dev, "UclkFmax (%ld) must be within [%u, %u]!\n", +						input[i + 1], minimum, maximum); +					return -EINVAL; +				} + +				od_table->OverDriveTable.UclkFmax = input[i + 1]; +				od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_UCLK_BIT; +				break; + +			default: +				dev_info(adev->dev, "Invalid MCLK_VDDC_TABLE index: %ld\n", input[i]); +				dev_info(adev->dev, "Supported indices: [0:min,1:max]\n"); +				return -EINVAL; +			} +		} + +		if (od_table->OverDriveTable.UclkFmin > od_table->OverDriveTable.UclkFmax) { +			dev_err(adev->dev, +				"Invalid setting: UclkFmin(%u) is bigger than UclkFmax(%u)\n", +				(uint32_t)od_table->OverDriveTable.UclkFmin, +				(uint32_t)od_table->OverDriveTable.UclkFmax); +			return -EINVAL; +		} +		break; + +	case PP_OD_EDIT_VDDC_CURVE: +		if (!smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) { +			dev_warn(adev->dev, "VF curve setting not supported!\n"); +			return -ENOTSUPP; +		} + +		if (input[0] >= PP_NUM_OD_VF_CURVE_POINTS || +		    input[0] < 0) +			return -EINVAL; + +		smu_v13_0_7_get_od_setting_limits(smu, +						  PP_OD_FEATURE_GFX_VF_CURVE_BIT, +						  true, +						  &minimum, +						  &maximum); +		if (input[1] < minimum || +		    input[1] > maximum) { +			dev_info(adev->dev, "Voltage offset (%ld) must be within [%d, %d]!\n", +				 input[1], minimum, maximum); +			return -EINVAL; +		} + +		od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[input[0]] = input[1]; +		od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; +		break; + +	case PP_OD_RESTORE_DEFAULT_TABLE: +		feature_ctrlmask = od_table->OverDriveTable.FeatureCtrlMask; +		memcpy(od_table, +		       table_context->boot_overdrive_table, +		       sizeof(OverDriveTableExternal_t)); +		od_table->OverDriveTable.FeatureCtrlMask = feature_ctrlmask; +		fallthrough; + +	case PP_OD_COMMIT_DPM_TABLE: +		/* +		 * The member below instructs PMFW the settings focused in +		 * this single operation. +		 * `uint32_t FeatureCtrlMask;` +		 * It does not contain actual informations about user's custom +		 * settings. Thus we do not cache it. +		 */ +		offset_of_featurectrlmask = offsetof(OverDriveTable_t, FeatureCtrlMask); +		if (memcmp((u8 *)od_table + offset_of_featurectrlmask, +			   table_context->user_overdrive_table + offset_of_featurectrlmask, +			   sizeof(OverDriveTableExternal_t) - offset_of_featurectrlmask)) { +			smu_v13_0_7_dump_od_table(smu, od_table); + +			ret = smu_v13_0_7_upload_overdrive_table(smu, od_table); +			if (ret) { +				dev_err(adev->dev, "Failed to upload overdrive table!\n"); +				return ret; +			} + +			od_table->OverDriveTable.FeatureCtrlMask = 0; +			memcpy(table_context->user_overdrive_table + offset_of_featurectrlmask, +			       (u8 *)od_table + offset_of_featurectrlmask, +			       sizeof(OverDriveTableExternal_t) - offset_of_featurectrlmask); + +			if (!memcmp(table_context->user_overdrive_table, +				    table_context->boot_overdrive_table, +				    sizeof(OverDriveTableExternal_t))) +				smu->user_dpm_profile.user_od = false; +			else +				smu->user_dpm_profile.user_od = true; +		} +		break; + +	default: +		return -ENOSYS; +	} + +	return ret; +} +  static int smu_v13_0_7_force_clk_levels(struct smu_context *smu,  					enum smu_clk_type clk_type,  					uint32_t mask) @@ -1370,6 +1781,78 @@ static ssize_t smu_v13_0_7_get_gpu_metrics(struct smu_context *smu,  	return sizeof(struct gpu_metrics_v1_3);  } +static int smu_v13_0_7_set_default_od_settings(struct smu_context *smu) +{ +	OverDriveTableExternal_t *od_table = +		(OverDriveTableExternal_t *)smu->smu_table.overdrive_table; +	OverDriveTableExternal_t *boot_od_table = +		(OverDriveTableExternal_t *)smu->smu_table.boot_overdrive_table; +	OverDriveTableExternal_t *user_od_table = +		(OverDriveTableExternal_t *)smu->smu_table.user_overdrive_table; +	OverDriveTableExternal_t user_od_table_bak; +	int ret = 0; +	int i; + +	ret = smu_v13_0_7_get_overdrive_table(smu, boot_od_table); +	if (ret) +		return ret; + +	smu_v13_0_7_dump_od_table(smu, boot_od_table); + +	memcpy(od_table, +	       boot_od_table, +	       sizeof(OverDriveTableExternal_t)); + +	/* +	 * For S3/S4/Runpm resume, we need to setup those overdrive tables again, +	 * but we have to preserve user defined values in "user_od_table". +	 */ +	if (!smu->adev->in_suspend) { +		memcpy(user_od_table, +		       boot_od_table, +		       sizeof(OverDriveTableExternal_t)); +		smu->user_dpm_profile.user_od = false; +	} else if (smu->user_dpm_profile.user_od) { +		memcpy(&user_od_table_bak, +		       user_od_table, +		       sizeof(OverDriveTableExternal_t)); +		memcpy(user_od_table, +		       boot_od_table, +		       sizeof(OverDriveTableExternal_t)); +		user_od_table->OverDriveTable.GfxclkFmin = +				user_od_table_bak.OverDriveTable.GfxclkFmin; +		user_od_table->OverDriveTable.GfxclkFmax = +				user_od_table_bak.OverDriveTable.GfxclkFmax; +		user_od_table->OverDriveTable.UclkFmin = +				user_od_table_bak.OverDriveTable.UclkFmin; +		user_od_table->OverDriveTable.UclkFmax = +				user_od_table_bak.OverDriveTable.UclkFmax; +		for (i = 0; i < PP_NUM_OD_VF_CURVE_POINTS; i++) +			user_od_table->OverDriveTable.VoltageOffsetPerZoneBoundary[i] = +				user_od_table_bak.OverDriveTable.VoltageOffsetPerZoneBoundary[i]; +	} + +	return 0; +} + +static int smu_v13_0_7_restore_user_od_settings(struct smu_context *smu) +{ +	struct smu_table_context *table_context = &smu->smu_table; +	OverDriveTableExternal_t *od_table = table_context->overdrive_table; +	OverDriveTableExternal_t *user_od_table = table_context->user_overdrive_table; +	int res; + +	user_od_table->OverDriveTable.FeatureCtrlMask = 1U << PP_OD_FEATURE_GFXCLK_BIT | +							1U << PP_OD_FEATURE_UCLK_BIT | +							1U << PP_OD_FEATURE_GFX_VF_CURVE_BIT; +	res = smu_v13_0_7_upload_overdrive_table(smu, user_od_table); +	user_od_table->OverDriveTable.FeatureCtrlMask = 0; +	if (res == 0) +		memcpy(od_table, user_od_table, sizeof(OverDriveTableExternal_t)); + +	return res; +} +  static int smu_v13_0_7_populate_umd_state_clk(struct smu_context *smu)  {  	struct smu_13_0_dpm_context *dpm_context = @@ -1759,6 +2242,9 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {  	.notify_memory_pool_location = smu_v13_0_notify_memory_pool_location,  	.get_gpu_metrics = smu_v13_0_7_get_gpu_metrics,  	.set_soft_freq_limited_range = smu_v13_0_set_soft_freq_limited_range, +	.set_default_od_settings = smu_v13_0_7_set_default_od_settings, +	.restore_user_od_settings = smu_v13_0_7_restore_user_od_settings, +	.od_edit_dpm_table = smu_v13_0_7_od_edit_dpm_table,  	.set_performance_level = smu_v13_0_set_performance_level,  	.gfx_off_control = smu_v13_0_gfx_off_control,  	.get_fan_speed_pwm = smu_v13_0_7_get_fan_speed_pwm, @@ -1770,6 +2256,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {  	.enable_mgpu_fan_boost = smu_v13_0_7_enable_mgpu_fan_boost,  	.get_power_limit = smu_v13_0_7_get_power_limit,  	.set_power_limit = smu_v13_0_set_power_limit, +	.set_power_source = smu_v13_0_set_power_source,  	.get_power_profile_mode = smu_v13_0_7_get_power_profile_mode,  	.set_power_profile_mode = smu_v13_0_7_set_power_profile_mode,  	.set_tool_table_location = smu_v13_0_set_tool_table_location, @@ -1796,5 +2283,6 @@ void smu_v13_0_7_set_ppt_funcs(struct smu_context *smu)  	smu->table_map = smu_v13_0_7_table_map;  	smu->pwr_src_map = smu_v13_0_7_pwr_src_map;  	smu->workload_map = smu_v13_0_7_workload_map; +	smu->smc_driver_if_version = SMU13_0_7_DRIVER_IF_VERSION;  	smu_v13_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c index 04e56b0b3033..a1be2029ba4a 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c @@ -47,6 +47,14 @@  #define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS_MASK		0x00000006L  #define SMUIO_GFX_MISC_CNTL__PWR_GFXOFF_STATUS__SHIFT          0x1L +#define SMU_13_0_8_UMD_PSTATE_GFXCLK                   533 +#define SMU_13_0_8_UMD_PSTATE_SOCCLK                   533 +#define SMU_13_0_8_UMD_PSTATE_FCLK                     800 + +#define SMU_13_0_1_UMD_PSTATE_GFXCLK					700 +#define SMU_13_0_1_UMD_PSTATE_SOCCLK		              678 +#define SMU_13_0_1_UMD_PSTATE_FCLK			          1800 +  #define FEATURE_MASK(feature) (1ULL << feature)  #define SMC_DPM_FEATURE ( \  	FEATURE_MASK(FEATURE_CCLK_DPM_BIT) | \ @@ -957,6 +965,9 @@ static int yellow_carp_set_soft_freq_limited_range(struct smu_context *smu,  							uint32_t max)  {  	enum smu_message_type msg_set_min, msg_set_max; +	uint32_t min_clk = min; +	uint32_t max_clk = max; +  	int ret = 0;  	if (!yellow_carp_clk_dpm_is_enabled(smu, clk_type)) @@ -985,11 +996,17 @@ static int yellow_carp_set_soft_freq_limited_range(struct smu_context *smu,  		return -EINVAL;  	} -	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_min, min, NULL); +	if (clk_type == SMU_VCLK) { +		min_clk = min << SMU_13_VCLK_SHIFT; +		max_clk = max << SMU_13_VCLK_SHIFT; +	} + +	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_min, min_clk, NULL); +  	if (ret)  		goto out; -	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_max, max, NULL); +	ret = smu_cmn_send_smc_msg_with_param(smu, msg_set_max, max_clk, NULL);  	if (ret)  		goto out; @@ -997,12 +1014,49 @@ out:  	return ret;  } +static uint32_t yellow_carp_get_umd_pstate_clk_default(struct smu_context *smu, +					enum smu_clk_type clk_type) +{ +	uint32_t clk_limit = 0; +	struct amdgpu_device *adev = smu->adev; + +	switch (clk_type) { +	case SMU_GFXCLK: +	case SMU_SCLK: +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 8)) +			clk_limit = SMU_13_0_8_UMD_PSTATE_GFXCLK; +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 1) || +			(adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 3)) +			clk_limit = SMU_13_0_1_UMD_PSTATE_GFXCLK; +		break; +	case SMU_SOCCLK: +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 8)) +			clk_limit = SMU_13_0_8_UMD_PSTATE_SOCCLK; +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 1) || +			(adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 3)) +			clk_limit = SMU_13_0_1_UMD_PSTATE_SOCCLK; +		break; +	case SMU_FCLK: +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 8)) +			clk_limit = SMU_13_0_8_UMD_PSTATE_FCLK; +		if ((adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 1) || +			(adev->ip_versions[MP1_HWIP][0]) == IP_VERSION(13, 0, 3)) +			clk_limit = SMU_13_0_1_UMD_PSTATE_FCLK; +		break; +	default: +		break; +	} + +	return clk_limit; +} +  static int yellow_carp_print_clk_levels(struct smu_context *smu,  				enum smu_clk_type clk_type, char *buf)  { -	int i, size = 0, ret = 0; +	int i, idx, size = 0, ret = 0;  	uint32_t cur_value = 0, value = 0, count = 0;  	uint32_t min, max; +	uint32_t clk_limit = 0;  	smu_cmn_get_sysfs_buf(&buf, &size); @@ -1033,7 +1087,8 @@ static int yellow_carp_print_clk_levels(struct smu_context *smu,  			goto print_clk_out;  		for (i = 0; i < count; i++) { -			ret = yellow_carp_get_dpm_freq_by_index(smu, clk_type, i, &value); +			idx = (clk_type == SMU_FCLK || clk_type == SMU_MCLK) ? (count - i - 1) : i; +			ret = yellow_carp_get_dpm_freq_by_index(smu, clk_type, idx, &value);  			if (ret)  				goto print_clk_out; @@ -1043,6 +1098,7 @@ static int yellow_carp_print_clk_levels(struct smu_context *smu,  		break;  	case SMU_GFXCLK:  	case SMU_SCLK: +		clk_limit = yellow_carp_get_umd_pstate_clk_default(smu, clk_type);  		ret = yellow_carp_get_current_clk_freq(smu, clk_type, &cur_value);  		if (ret)  			goto print_clk_out; @@ -1057,7 +1113,7 @@ static int yellow_carp_print_clk_levels(struct smu_context *smu,  		size += sysfs_emit_at(buf, size, "0: %uMhz %s\n", min,  				i == 0 ? "*" : "");  		size += sysfs_emit_at(buf, size, "1: %uMhz %s\n", -				i == 1 ? cur_value : YELLOW_CARP_UMD_PSTATE_GFXCLK, +				i == 1 ? cur_value : clk_limit,  				i == 1 ? "*" : "");  		size += sysfs_emit_at(buf, size, "2: %uMhz %s\n", max,  				i == 2 ? "*" : ""); @@ -1106,6 +1162,49 @@ force_level_out:  	return ret;  } +static int yellow_carp_get_dpm_profile_freq(struct smu_context *smu, +					enum amd_dpm_forced_level level, +					enum smu_clk_type clk_type, +					uint32_t *min_clk, +					uint32_t *max_clk) +{ +	int ret = 0; +	uint32_t clk_limit = 0; + +	clk_limit = yellow_carp_get_umd_pstate_clk_default(smu, clk_type); + +	switch (clk_type) { +	case SMU_GFXCLK: +	case SMU_SCLK: +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			yellow_carp_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &clk_limit); +		else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK) +			yellow_carp_get_dpm_ultimate_freq(smu, SMU_SCLK, &clk_limit, NULL); +		break; +	case SMU_SOCCLK: +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			yellow_carp_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &clk_limit); +		break; +	case SMU_FCLK: +		if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) +			yellow_carp_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &clk_limit); +		else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) +			yellow_carp_get_dpm_ultimate_freq(smu, SMU_FCLK, &clk_limit, NULL); +		break; +	case SMU_VCLK: +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &clk_limit); +		break; +	case SMU_DCLK: +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &clk_limit); +		break; +	default: +		ret = -EINVAL; +		break; +	} +	*min_clk = *max_clk = clk_limit; +	return ret; +} +  static int yellow_carp_set_performance_level(struct smu_context *smu,  						enum amd_dpm_forced_level level)  { @@ -1113,6 +1212,9 @@ static int yellow_carp_set_performance_level(struct smu_context *smu,  	uint32_t sclk_min = 0, sclk_max = 0;  	uint32_t fclk_min = 0, fclk_max = 0;  	uint32_t socclk_min = 0, socclk_max = 0; +	uint32_t vclk_min = 0, vclk_max = 0; +	uint32_t dclk_min = 0, dclk_max = 0; +  	int ret = 0;  	switch (level) { @@ -1120,28 +1222,42 @@ static int yellow_carp_set_performance_level(struct smu_context *smu,  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SCLK, NULL, &sclk_max);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_FCLK, NULL, &fclk_max);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SOCCLK, NULL, &socclk_max); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_VCLK, NULL, &vclk_max); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_DCLK, NULL, &dclk_max);  		sclk_min = sclk_max;  		fclk_min = fclk_max;  		socclk_min = socclk_max; +		vclk_min = vclk_max; +		dclk_min = dclk_max;  		break;  	case AMD_DPM_FORCED_LEVEL_LOW:  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SCLK, &sclk_min, NULL);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_FCLK, &fclk_min, NULL);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SOCCLK, &socclk_min, NULL); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_VCLK, &vclk_min, NULL); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_DCLK, &dclk_min, NULL);  		sclk_max = sclk_min;  		fclk_max = fclk_min;  		socclk_max = socclk_min; +		vclk_max = vclk_min; +		dclk_max = dclk_min;  		break;  	case AMD_DPM_FORCED_LEVEL_AUTO:  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SCLK, &sclk_min, &sclk_max);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_FCLK, &fclk_min, &fclk_max);  		yellow_carp_get_dpm_ultimate_freq(smu, SMU_SOCCLK, &socclk_min, &socclk_max); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_VCLK, &vclk_min, &vclk_max); +		yellow_carp_get_dpm_ultimate_freq(smu, SMU_DCLK, &dclk_min, &dclk_max);  		break;  	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:  	case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK: -		/* Temporarily do nothing since the optimal clocks haven't been provided yet */ +		yellow_carp_get_dpm_profile_freq(smu, level, SMU_SCLK, &sclk_min, &sclk_max); +		yellow_carp_get_dpm_profile_freq(smu, level, SMU_FCLK, &fclk_min, &fclk_max); +		yellow_carp_get_dpm_profile_freq(smu, level, SMU_SOCCLK, &socclk_min, &socclk_max); +		yellow_carp_get_dpm_profile_freq(smu, level, SMU_VCLK, &vclk_min, &vclk_max); +		yellow_carp_get_dpm_profile_freq(smu, level, SMU_DCLK, &dclk_min, &dclk_max);  		break;  	case AMD_DPM_FORCED_LEVEL_MANUAL:  	case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT: @@ -1181,6 +1297,24 @@ static int yellow_carp_set_performance_level(struct smu_context *smu,  			return ret;  	} +	if (vclk_min && vclk_max) { +		ret = yellow_carp_set_soft_freq_limited_range(smu, +							      SMU_VCLK, +							      vclk_min, +							      vclk_max); +		if (ret) +			return ret; +	} + +	if (dclk_min && dclk_max) { +		ret = yellow_carp_set_soft_freq_limited_range(smu, +							      SMU_DCLK, +							      dclk_min, +							      dclk_max); +		if (ret) +			return ret; +	} +  	return ret;  } @@ -1234,5 +1368,6 @@ void yellow_carp_set_ppt_funcs(struct smu_context *smu)  	smu->feature_map = yellow_carp_feature_mask_map;  	smu->table_map = yellow_carp_table_map;  	smu->is_apu = true; +	smu->smc_driver_if_version = SMU13_YELLOW_CARP_DRIVER_IF_VERSION;  	smu_v13_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.h b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.h index a9205a8ea3ad..b3ad8352c68a 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.h +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.h @@ -24,6 +24,5 @@  #define __YELLOW_CARP_PPT_H__  extern void yellow_carp_set_ppt_funcs(struct smu_context *smu); -#define YELLOW_CARP_UMD_PSTATE_GFXCLK       1100  #endif  | 
